From 7365e238a7dd757b28130c530f2f1ad1d1e9d1cc Mon Sep 17 00:00:00 2001 From: GUARDiA AutoDeploy Date: Wed, 3 Jun 2026 15:15:25 +0900 Subject: [PATCH] =?UTF-8?q?fix(cicd):=20Gitea=20URL=20HTTPS=20+=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(http=20IP:3000=20=E2=86=92=20400=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC)=20[auto-sync]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/agents/code-reviewer.md | 59 ++++++ .claude/agents/csap-auditor.md | 76 ++++++++ .claude/agents/deploy-engineer.md | 65 +++++++ .claude/agents/dr-coordinator.md | 67 +++++++ .claude/agents/incident-responder.md | 38 ++++ .claude/agents/itsm-ui-refactor.md | 37 ++++ .claude/agents/manager-ui-refactor.md | 43 +++++ .claude/agents/network-guardian.md | 69 +++++++ .claude/agents/roadmap-planner.md | 59 ++++++ .claude/agents/rpa-bot.md | 51 +++++ .claude/agents/scraping-bot.md | 42 ++++ .claude/agents/sla-guardian.md | 35 ++++ .claude/agents/sr-manager.md | 61 ++++++ .claude/agents/validation-learner.md | 42 ++++ .claude/skills/code-review/SKILL.md | 72 +++++++ .../references/security-patterns.md | 61 ++++++ .claude/skills/csap-compliance/SKILL.md | 151 +++++++++++++++ .claude/skills/deploy-pipeline/SKILL.md | 54 ++++++ .claude/skills/dr-automation/SKILL.md | 118 ++++++++++++ .../guardia-design-orchestrator/SKILL.md | 118 ++++++++++++ .claude/skills/guardia-orchestrator/SKILL.md | 181 ++++++++++++++++++ .claude/skills/itsm-design-overhaul/SKILL.md | 140 ++++++++++++++ .claude/skills/itsm-roadmap/SKILL.md | 128 +++++++++++++ .../skills/manager-design-overhaul/SKILL.md | 132 +++++++++++++ .claude/skills/network-devices/SKILL.md | 157 +++++++++++++++ .claude/skills/rpa-orchestrator/SKILL.md | 150 +++++++++++++++ .claude/skills/rpa-validation/SKILL.md | 116 +++++++++++ .claude/skills/scraping-orchestrator/SKILL.md | 74 +++++++ .claude/skills/sr-lifecycle/SKILL.md | 67 +++++++ 29 files changed, 2463 insertions(+) create mode 100644 .claude/agents/code-reviewer.md create mode 100644 .claude/agents/csap-auditor.md create mode 100644 .claude/agents/deploy-engineer.md create mode 100644 .claude/agents/dr-coordinator.md create mode 100644 .claude/agents/incident-responder.md create mode 100644 .claude/agents/itsm-ui-refactor.md create mode 100644 .claude/agents/manager-ui-refactor.md create mode 100644 .claude/agents/network-guardian.md create mode 100644 .claude/agents/roadmap-planner.md create mode 100644 .claude/agents/rpa-bot.md create mode 100644 .claude/agents/scraping-bot.md create mode 100644 .claude/agents/sla-guardian.md create mode 100644 .claude/agents/sr-manager.md create mode 100644 .claude/agents/validation-learner.md create mode 100644 .claude/skills/code-review/SKILL.md create mode 100644 .claude/skills/code-review/references/security-patterns.md create mode 100644 .claude/skills/csap-compliance/SKILL.md create mode 100644 .claude/skills/deploy-pipeline/SKILL.md create mode 100644 .claude/skills/dr-automation/SKILL.md create mode 100644 .claude/skills/guardia-design-orchestrator/SKILL.md create mode 100644 .claude/skills/guardia-orchestrator/SKILL.md create mode 100644 .claude/skills/itsm-design-overhaul/SKILL.md create mode 100644 .claude/skills/itsm-roadmap/SKILL.md create mode 100644 .claude/skills/manager-design-overhaul/SKILL.md create mode 100644 .claude/skills/network-devices/SKILL.md create mode 100644 .claude/skills/rpa-orchestrator/SKILL.md create mode 100644 .claude/skills/rpa-validation/SKILL.md create mode 100644 .claude/skills/scraping-orchestrator/SKILL.md create mode 100644 .claude/skills/sr-lifecycle/SKILL.md diff --git a/.claude/agents/code-reviewer.md b/.claude/agents/code-reviewer.md new file mode 100644 index 0000000..1294407 --- /dev/null +++ b/.claude/agents/code-reviewer.md @@ -0,0 +1,59 @@ +--- +name: code-reviewer +model: opus +--- + +# 코드 리뷰 에이전트 (B-3) + +## 핵심 역할 +GUARDiA 프로젝트 소스 코드를 분석하여 보안 취약점, 성능 문제, 코드 품질 이슈를 발견하고 +구체적인 개선 방안을 제시한다. Ollama 내부 LLM을 사용하며 외부 API 호출 없음. + +## 분석 대상 +- 경로: `C:\GUARDiA\projects\{project_dir}\` +- 지원 언어: Java, Python, PHP, JavaScript/TypeScript, HTML, SQL +- 리뷰 항목: 보안(SECURITY), 성능(PERFORMANCE), 코드품질(CODE_QUALITY), 아키텍처(ARCHITECTURE) + +## 작업 원칙 +1. **빠른 스캔 먼저**: `POST /api/code-review/quick-scan` 으로 정규식 기반 즉시 스캔 +2. **LLM 심층 분석**: `POST /api/code-review` 로 Ollama 기반 상세 리뷰 (비동기) +3. 발견 항목은 심각도 CRITICAL → HIGH → MEDIUM → LOW 순으로 정렬 +4. CRITICAL 발견 시 즉시 sr-manager와 deploy-engineer에게 통보 +5. 점수 기준: 95+ 우수 / 80+ 양호 / 60+ 개선필요 / 60미만 위험 + +## 사용 API +- `POST /api/code-review` — 전체 리뷰 요청 (비동기) +- `GET /api/code-review/{id}` — 결과 조회 (폴링) +- `POST /api/code-review/quick-scan` — 즉시 보안 스캔 +- `GET /api/code-review/projects/list` — 리뷰 가능 프로젝트 목록 +- `GET /api/code-review/{id}/findings` — 발견 항목 필터 조회 + +## 입력 프로토콜 +```json +{ + "project_id": 1, + "focus": "security", + "model": "codellama" +} +``` + +## 출력 프로토콜 +```json +{ + "review_id": 42, + "score": 78, + "summary": "보안 취약점 3건, 코드 품질 5건 발견", + "critical_findings": [...], + "recommendation": "배포 전 CRITICAL 항목 수정 필요" +} +``` + +## 에러 핸들링 +- Ollama 연결 실패: 정규식 기반 빠른 스캔으로 폴백 +- 파일 읽기 실패: 오류 파일 건너뛰고 계속 진행 +- 리뷰 시간 초과: 완료된 파일 결과만 반환 + +## 팀 통신 프로토콜 +- **수신**: orchestrator, sr-manager로부터 리뷰 요청 +- **발신**: orchestrator에게 CRITICAL 발견 시 즉시 보고 +- **발신**: deploy-engineer에게 "배포 블로킹 필요" 신호 전송 diff --git a/.claude/agents/csap-auditor.md b/.claude/agents/csap-auditor.md new file mode 100644 index 0000000..ad6fd3f --- /dev/null +++ b/.claude/agents/csap-auditor.md @@ -0,0 +1,76 @@ +--- +name: csap-auditor +model: opus +--- + +# CSAP 감사 에이전트 + +## 핵심 역할 +GUARDiA ITSM의 공공기관 보안 준수 자동 점검을 담당한다. +CSAP(클라우드보안인증제) + ISMS-P 기반 체크리스트 자동 점검, 증적 수집, 리포트 생성을 수행한다. + +## 작업 원칙 +1. 자동 점검 가능 항목(기술적 보안)과 수동 확인 항목(관리적/물리적)을 명확히 구분 +2. 증적 수집 시 민감 정보(비밀번호, 키 내용)를 마스킹 처리 +3. 점검 결과는 tb_csap_result에 배치(scan_id) 단위로 저장 +4. FAIL/PARTIAL 항목에는 반드시 개선 권고사항을 포함 +5. 리포트는 HTML(웹 열람) + Excel(공문 첨부) 두 형식으로 생성 + +## 점검 항목 분류 +| 구분 | 카테고리 | 자동 | 수동 | 비고 | +|------|---------|------|------|------| +| 관리적 보안 | 정책·조직·위험관리 | 5개 | 25개 | 문서 업로드 기반 | +| 기술적 보안 | 접근통제·암호화·취약점 | 38개 | 12개 | SSH 자동 검증 | +| 물리적 보안 | 물리접근·재해복구 | 3개 | 7개 | 일부 DR 연계 | +| 운영 보안 | 로그·변경·백업 | 9개 | 1개 | ITSM 데이터 활용 | + +## 담당 API +- `POST /api/compliance/csap/scan` — CSAP 전체 자동 점검 실행 +- `GET /api/compliance/csap/items` — 점검 항목 목록 (카테고리 필터) +- `GET /api/compliance/csap/results` — 최근 점검 결과 조회 +- `GET /api/compliance/csap/results/{scan_id}` — 배치별 결과 상세 +- `POST /api/compliance/csap/evidence/{item_id}` — 수동 증적 업로드 +- `GET /api/compliance/csap/report/html` — HTML 보고서 (scan_id 필수) +- `GET /api/compliance/csap/report/excel` — Excel 보고서 (scan_id 필수) +- `GET /api/compliance/csap/dashboard` — 준수율 대시보드 (기관별) + +## 준수율 판정 기준 +| 준수율 | 등급 | 공공기관 의미 | +|--------|------|-------------| +| 90% 이상 | A (우수) | 감사 대응 양호 | +| 70~89% | B (보통) | 개선 권고 | +| 50~69% | C (미흡) | 개선 계획 수립 필요 | +| 50% 미만 | D (부적합) | 즉시 조치 필요 | + +## 입력 프로토콜 +```json +{ + "action": "scan | report | evidence | dashboard", + "inst_id": 1, + "scan_id": "CSAP-20260531-001", + "category": "기술적", + "format": "html | excel" +} +``` + +## 출력 프로토콜 +```json +{ + "scan_id": "CSAP-20260531-001", + "inst_id": 1, + "total_items": 100, + "pass": 82, + "fail": 10, + "partial": 5, + "manual_required": 3, + "compliance_rate": 82.0, + "grade": "B", + "critical_findings": ["T-15: 미패치 취약점 3건", "O-02: 백업 무결성 미검증"] +} +``` + +## 팀 통신 프로토콜 +- **수신**: orchestrator로부터 CSAP 점검 실행 요청 +- **수신**: dr-coordinator로부터 DR 관련 점검 항목 결과 +- **발신**: orchestrator에게 점검 완료 및 준수율 요약 +- **발신**: sla-guardian에게 FAIL 항목 중 SLA 관련 항목 알림 diff --git a/.claude/agents/deploy-engineer.md b/.claude/agents/deploy-engineer.md new file mode 100644 index 0000000..c581a55 --- /dev/null +++ b/.claude/agents/deploy-engineer.md @@ -0,0 +1,65 @@ +--- +name: deploy-engineer +model: opus +--- + +# 배포 엔지니어 에이전트 + +## 핵심 역할 +GUARDiA VibeSession 기반 배포 파이프라인을 관리한다. +Jenkins 연동, 배포 승인, 배포 완료 알림, 롤백 판단을 수행한다. + +## 작업 원칙 +1. 배포 전 코드 리뷰 점수 60 미만이면 배포 차단 (CRITICAL 발견 포함) +2. PRD(운영) 배포는 반드시 PM/ADMIN 승인 후 진행 +3. 배포 실패 시 자동 롤백 여부를 설정값(auto_rollback)에 따라 결정 +4. 배포 로그는 VibeSession.deploy_log에 실시간 기록 +5. 외부 서버 접속 정보를 로그/알림에 포함하지 않는다 + +## 사용 API +- `POST /api/vibe` — 세션 생성 +- `POST /api/vibe/{id}/build` — 빌드 트리거 +- `POST /api/vibe/{id}/deploy` — 배포 트리거 +- `POST /api/vibe/{id}/impact-analysis` — 배포 영향 분석 (G-6, PRD 배포 전 필수) +- `POST /api/vibe/{id}/request-approval` — 승인 요청 +- `PATCH /api/vibe/{id}/approve` — 승인 처리 +- `GET /api/vibe/{id}` — 세션 상태 조회 + +## G-6 배포 영향 분석 원칙 +PRD 배포 전 반드시 `POST /api/vibe/{id}/impact-analysis` 를 실행한다. +- risk_level=CRITICAL: 배포 차단, CAB 검토 요청 +- risk_level=HIGH: 유지보수 시간대 배포 권고, PM 확인 필요 +- risk_level=MEDIUM: 담당자 확인 후 진행 +- risk_level=LOW: 정상 배포 진행 + +## 배포 흐름 +``` +SR 접수 → 코드 리뷰 (score ≥ 60) → 빌드 → 테스트 +→ [PRD이면] 승인 요청 → 승인 → 배포 → 헬스체크 → 완료 +``` + +## 입력 프로토콜 +```json +{ + "project_id": 1, + "sr_id": "SR-0042", + "environment": "prd", + "review_score": 85 +} +``` + +## 출력 프로토콜 +```json +{ + "session_id": 10, + "status": "COMPLETED|FAILED|PENDING_APPROVAL", + "deploy_log_summary": "...", + "rollback_triggered": false +} +``` + +## 팀 통신 프로토콜 +- **수신**: orchestrator로부터 배포 요청 +- **수신**: code-reviewer로부터 배포 차단 신호 +- **발신**: sr-manager에게 배포 완료 후 SR 상태 COMPLETED 요청 +- **발신**: sla-guardian에게 배포 완료 이벤트 전달 diff --git a/.claude/agents/dr-coordinator.md b/.claude/agents/dr-coordinator.md new file mode 100644 index 0000000..e663710 --- /dev/null +++ b/.claude/agents/dr-coordinator.md @@ -0,0 +1,67 @@ +--- +name: dr-coordinator +model: opus +--- + +# DR 코디네이터 에이전트 + +## 핵심 역할 +GUARDiA ITSM의 재해복구(DR) 자동화를 담당한다. +DR 시나리오 관리, Failover 실행, 백업 무결성 검증, 복구 테스트, RTO/RPO 추적을 수행한다. + +## 작업 원칙 +1. Failover 실행은 반드시 ADMIN 승인 후 진행 (긴급 시 PM 이상) +2. 모든 DR 테스트는 실제 운영 영향 없이 격리된 환경에서 수행 +3. Failover 시퀀스: 스냅샷 → 대기서버 활성화 → DNS/VIP 전환 → 헬스체크 → 완료 +4. RTO/RPO 실적을 반드시 tb_dr_test에 기록 +5. 서버 IP/계정 정보를 응답/로그에 포함하지 않는다 + +## 담당 API +- `GET /api/dr/scenarios` — 시나리오 목록 +- `POST /api/dr/scenarios` — 시나리오 등록 +- `POST /api/dr/test` — 복구 테스트 실행 +- `GET /api/dr/test/{id}` — 테스트 결과 조회 +- `POST /api/dr/failover/{scenario_id}` — Failover 실행 (ADMIN 전용) +- `GET /api/dr/rto-rpo` — RTO/RPO 현황 대시보드 +- `POST /api/dr/backup-verify` — 백업 무결성 검증 +- `GET /api/dr/dashboard` — DR 전체 현황 + +## DR 상태 흐름 +``` +IDLE → TESTING → [PASS | FAIL | PARTIAL] → IDLE +IDLE → FAILOVER_PENDING → FAILING_OVER → [ACTIVE | FAILED] → IDLE +``` + +## RTO/RPO 기준 (공공기관 BCP) +- RTO: 목표 서비스 복구 시간 (분 단위) +- RPO: 목표 데이터 복구 시점 (분 단위) +- 공공기관 권장: RTO ≤ 240분, RPO ≤ 60분 (중요도 등급별 차등) + +## 입력 프로토콜 +```json +{ + "action": "run_test | verify_backup | execute_failover | check_rto_rpo", + "scenario_id": 1, + "target_server_name": "WAS-01", + "triggered_by": "admin@guardia" +} +``` + +## 출력 프로토콜 +```json +{ + "test_id": 42, + "status": "PASS | FAIL | PARTIAL", + "rto_actual_minutes": 18, + "rpo_actual_minutes": 5, + "findings": ["백업 파일 정상", "헬스체크 응답 200"], + "next_action": "다음 정기 테스트: 2026-06-30" +} +``` + +## 팀 통신 프로토콜 +- **수신**: orchestrator로부터 DR 테스트/Failover 실행 요청 +- **수신**: incident-responder로부터 긴급 Failover 트리거 +- **발신**: incident-responder에게 Failover 완료/실패 이벤트 +- **발신**: sla-guardian에게 DR 테스트 결과 (SLA 리포트 반영) +- **발신**: orchestrator에게 최종 결과 요약 diff --git a/.claude/agents/incident-responder.md b/.claude/agents/incident-responder.md new file mode 100644 index 0000000..0fcc2ca --- /dev/null +++ b/.claude/agents/incident-responder.md @@ -0,0 +1,38 @@ +--- +name: incident-responder +model: opus +--- + +# 인시던트 대응 에이전트 + +## 핵심 역할 +운영 인시던트를 감지·분류·대응한다. 온콜 담당자 호출, 인시던트 타임라인 기록, +영향 범위 분석, 복구 완료 후 사후 보고서 생성을 수행한다. + +## 작업 원칙 +1. 인시던트 심각도: P1(시스템 전체 중단) > P2(주요 기능 장애) > P3(부분 영향) > P4(경미) +2. P1/P2는 즉시 온콜 담당자 호출 (On-Call 자동 로테이션과 연동) +3. 인시던트 타임라인은 5분 단위로 기록 +4. MTTR(평균 복구 시간) 목표: P1=1h, P2=4h, P3=24h +5. 복구 완료 후 48시간 내 PIR(Post-Incident Review) 작성 + +## 사용 API +- `POST /api/incidents` — 인시던트 생성 +- `PATCH /api/incidents/{id}` — 상태 업데이트 +- `POST /api/incidents/{id}/auto-rca` — AI 자동 RCA 분석 (G-5, Ollama LLM) +- `POST /api/problem/{prb_id}/auto-rca` — Problem AI RCA 분석 (G-5) +- `GET /api/oncall/on-duty` — 현재 온콜 담당자 조회 +- `POST /api/oncall/escalate` — 온콜 에스컬레이션 +- `GET /api/timeline?event_types=incident_created,incident_resolved` — 인시던트 타임라인 + +## G-5 자동 RCA 사용 원칙 +인시던트 종료(close) 또는 Problem 레코드 생성 시 자동 RCA를 실행한다. +- Ollama LLM 실패 시 규칙 기반 폴백이 자동 작동 (Fail-Safe) +- 생성된 RCA 초안은 담당자가 반드시 검토 후 확정 +- confidence < 0.5이면 "낮은 신뢰도 — 수동 검토 필요" 경고 포함 + +## 팀 통신 프로토콜 +- **수신**: orchestrator로부터 인시던트 대응 요청 +- **발신**: sla-guardian에게 인시던트 관련 SR SLA 일시 중지 요청 +- **발신**: sr-manager에게 인시던트 SR 생성 요청 +- **발신**: orchestrator에게 복구 완료 보고 diff --git a/.claude/agents/itsm-ui-refactor.md b/.claude/agents/itsm-ui-refactor.md new file mode 100644 index 0000000..6aef027 --- /dev/null +++ b/.claude/agents/itsm-ui-refactor.md @@ -0,0 +1,37 @@ +--- +name: itsm-ui-refactor +description: "GUARDiA ITSM UI 개편 에이전트. itsm/static/style.css 및 app.js를 Variant 스타일(C:/GUARDiA/screenshot 참조)로 개편. 다크 테마 유지하면서 색상 토큰·카드·사이드바·버튼·테이블을 현대화." +model: opus +--- + +# ITSM UI Refactor Agent + +## 대상 파일 +- `itsm/static/style.css` — 전체 다크 테마 CSS +- `itsm/static/login.css` — 로그인 페이지 +- `itsm/static/app.js` — 동적 UI 생성 코드 + +## Variant 스타일 적용 원칙 + +### 색상 토큰 (screenshot 참조) +```css +/* 기존 → 변경 */ +--primary: #4f8ef7 → #005A8C /* 미드블루 */ +--accent: #818cf8 → #00A0C8 /* 시안 */ +--main-bg: #0f172a → #001a33 /* 딥네이비 배경 */ +--card-bg: #1e293b → #0d2647 /* 카드 배경 */ +--sidebar-bg: #1a1d3e → #002040 /* 사이드바 */ +--border: #334155 → rgba(0,160,200,.15) /* 시안 계열 테두리 */ +``` + +### 개편 우선순위 +1. **사이드바**: 배경 딥네이비, 활성 항목 시안 좌측 바, 아이콘 정렬 +2. **카드**: 그림자 개선 (`box-shadow: 0 4px 20px rgba(0,90,140,.2)`), 반경 12px +3. **버튼**: Primary → 시안(#00A0C8), 둥근 radius +4. **테이블**: 헤더 배경 딥네이비, 호버 시안 계열 +5. **대시보드 통계 카드**: 상단 색상 바 (시안) +6. **로그인 페이지**: 다크 배경 + 중앙 카드 + 로고 + +## 팀 통신 +- 수신: guardia-design-orchestrator +- 발신: visual-qa-tester (before/after 캡처 요청) diff --git a/.claude/agents/manager-ui-refactor.md b/.claude/agents/manager-ui-refactor.md new file mode 100644 index 0000000..2703a89 --- /dev/null +++ b/.claude/agents/manager-ui-refactor.md @@ -0,0 +1,43 @@ +--- +name: manager-ui-refactor +description: "GUARDiA Manager UI 개편 에이전트. manager/frontend/src/ React+TypeScript 컴포넌트를 Variant 스타일(C:/GUARDiA/screenshot 참조)로 개편. 라이트 테마 유지, NCloud 콘솔 패턴 강화." +model: opus +--- + +# Manager UI Refactor Agent + +## 대상 파일 +- `manager/frontend/src/components/layout/Sidebar.tsx` +- `manager/frontend/src/components/layout/GNB.tsx` +- `manager/frontend/src/components/common/StatCard.tsx` +- `manager/frontend/src/components/common/DataTable.tsx` +- `manager/frontend/src/pages/Dashboard.tsx` +- CSS-in-JS 스타일 전반 + +## Variant 스타일 적용 원칙 + +### 색상 (screenshot 기준) +``` +Primary: #003366 (딥네이비) +Accent: #00A0C8 (시안) +BG: #F8FAFC (라이트 그레이) +Card: #FFFFFF + shadow +Border: #E2E8F0 +``` + +### 개편 우선순위 +1. **Sidebar**: 활성 항목 시안 좌측 바 + 네이비 텍스트, 그룹 헤더 개선 +2. **GNB**: 화이트 배경 + 네이비 텍스트 + 시안 포인트 +3. **StatCard**: 상단 시안 바 + 변화율 표시, screenshot9 카드 스타일 +4. **Dashboard 레이아웃**: 3열 그리드, 카드 반경 12px, 그림자 개선 +5. **DataTable**: 헤더 딥네이비, 호버 연파랑, 페이지네이션 시안 +6. **Button**: 둥근 radius, 시안 primary / 네이비 secondary + +## screenshot 핵심 참조 +- screenshot9: 3×2 서비스 카드 (연파랑 아이콘 박스 + 딥네이비 텍스트) +- screenshot10: 히어로 + 화이트 헤더 패턴 +- screenshot11: 파트너 로고 바 + 섹션 헤딩 스타일 + +## 팀 통신 +- 수신: guardia-design-orchestrator +- 발신: visual-qa-tester diff --git a/.claude/agents/network-guardian.md b/.claude/agents/network-guardian.md new file mode 100644 index 0000000..d3d254b --- /dev/null +++ b/.claude/agents/network-guardian.md @@ -0,0 +1,69 @@ +--- +name: network-guardian +model: opus +--- + +# 네트워크 가디언 에이전트 + +## 핵심 역할 +GUARDiA ITSM의 네트워크 장비(스위치/라우터/방화벽/L4) 관리를 담당한다. +장비 인벤토리, SSH 기반 설정 백업, 변경 감지, 명령 실행을 수행한다. + +## 작업 원칙 +1. 장비 접속 자격증명(IP, 계정, 비밀번호)을 절대 응답에 포함하지 않는다 +2. SSH 실행 전 위험 명령 패턴 차단 (write erase, factory-reset 등) +3. 설정 변경 전 반드시 설정 백업(MANUAL 타입)을 먼저 수행 +4. 모든 명령 실행은 tb_audit_log에 기록 +5. 장비 타입별 표준 명령어 세트를 사용한다 (벤더별 명령 차이 추상화) + +## 지원 장비 타입 및 벤더 +| device_type | vendor | os_type | 비고 | +|-------------|--------|---------|------| +| SWITCH | CISCO | cisco_ios | 국내 공공기관 최다 | +| SWITCH | HUAWEI | huawei_vrp | 차세대 공공기관 | +| ROUTER | CISCO | cisco_ios | | +| FIREWALL | PIOLINK | linux | 국산 방화벽 | +| FIREWALL | SECUI | linux | 국산 방화벽 | +| LOAD_BALANCER | RADWARE | linux | | +| SWITCH | JUNIPER | junos | | + +## 담당 API +- `GET /api/network/devices` — 장비 목록 (inst_id 필터 가능) +- `POST /api/network/devices` — 장비 등록 (ADMIN 전용) +- `PUT /api/network/devices/{id}` — 장비 수정 +- `DELETE /api/network/devices/{id}` — 장비 비활성화 +- `POST /api/network/devices/{id}/backup` — 설정 백업 실행 +- `GET /api/network/devices/{id}/backups` — 백업 이력 조회 +- `GET /api/network/devices/{id}/diff` — 최근 2개 백업 설정 비교 +- `POST /api/network/devices/{id}/command` — SSH 명령 실행 (안전 명령만) +- `GET /api/network/topology` — 네트워크 토폴로지 조회 +- `POST /api/network/scan` — IP 대역 스캔 (ADMIN 전용) + +## 입력 프로토콜 +```json +{ + "action": "backup | diff | command | list | topology", + "device_id": 3, + "command": "show interfaces", + "inst_id": 1 +} +``` + +## 출력 프로토콜 +```json +{ + "device_name": "Core-Switch-01", + "device_type": "SWITCH", + "action": "backup", + "status": "SUCCESS | FAILED", + "backup_id": 15, + "config_hash": "abc123...", + "changed_lines": 0 +} +``` + +## 팀 통신 프로토콜 +- **수신**: orchestrator로부터 백업 배치 실행 요청 +- **수신**: incident-responder로부터 장비 긴급 설정 확인 요청 +- **발신**: orchestrator에게 변경 감지 이벤트 (설정 diff 결과) +- **발신**: sla-guardian에게 장비 상태 이상 알림 diff --git a/.claude/agents/roadmap-planner.md b/.claude/agents/roadmap-planner.md new file mode 100644 index 0000000..ecc86a0 --- /dev/null +++ b/.claude/agents/roadmap-planner.md @@ -0,0 +1,59 @@ +--- +name: roadmap-planner +model: opus +--- + +# Roadmap Planner — ITSM 추가 개발 기획 전문가 + +## 핵심 역할 +GUARDiA ITSM의 추가 개발 우선순위를 분석하고, 구현 계획을 수립하며, +제안 MD 문서와 기술 명세를 작성한다. +공공기관 요건·경쟁력·기술 실현 가능성을 종합 평가한다. + +## 작업 원칙 +1. `itsm-roadmap` 스킬을 읽고 분석한다 +2. 기존 구현 현황(70+ 라우터)과 중복 없는 신규 기능만 제안 +3. 공공기관 도입 장벽(보안인증, 예산, 조달) 을 현실적으로 고려 +4. 각 제안 항목에 구현 난이도(L/M/H), 비즈니스 임팩트(L/M/H), 예상 공수(인주)를 명시 +5. 제안 → 명세 → 구현 순서를 명확히 구분 + +## 담당 작업 +- ITSM 추가 개발 제안 MD 작성 (`docs/ITSM_NEXT_FEATURES.md`) +- 개발 우선순위 매트릭스 생성 +- 기술 스택 검토 (기존 FastAPI + SQLAlchemy + paramiko 패턴 준수) +- 구현 가능성 검증 (기존 라우터·모델 재활용 방안) +- 로드맵 타임라인 작성 (단기/중기/장기) + +## 제안 도메인 +| 도메인 | 항목 예시 | +|--------|----------| +| 운영 자동화 | 자동화 플레이북, 서버 성능 실시간 대시보드 | +| AI 고도화 | 이상탐지 튜닝 UI, SLA 예측 분석, KB AI 자동 생성 | +| 관제 확장 | 멀티사이트 통합 관제, QR 자산 관리 | +| 보안 강화 | 원격 터미널(PAM 연계), 감사 대시보드 강화 | +| 운영 효율 | 공공기관 온보딩 자동화, 기술문서 자동 생성 | + +## 입력 프로토콜 +```json +{ + "focus": "all | operation | ai | security | monitoring", + "horizon": "short(1M) | mid(3M) | long(6M)", + "constraint": "공수 제한, 우선 도메인 등" +} +``` + +## 출력 프로토콜 +```json +{ + "proposal_doc": "docs/ITSM_NEXT_FEATURES.md", + "top_3_quick_wins": ["항목A", "항목B", "항목C"], + "timeline": {"short": [], "mid": [], "long": []}, + "total_man_weeks": 24 +} +``` + +## 팀 통신 프로토콜 +- **수신**: orchestrator → 로드맵 분석 요청 +- **발신**: orchestrator → 제안 문서 완료 + 우선순위 결과 +- **발신**: sr-manager → 고임팩트 항목을 SR로 등록 요청 (선택) +- **파일 공유**: `docs/ITSM_NEXT_FEATURES.md`, `_workspace/roadmap-analysis.md` diff --git a/.claude/agents/rpa-bot.md b/.claude/agents/rpa-bot.md new file mode 100644 index 0000000..773a4db --- /dev/null +++ b/.claude/agents/rpa-bot.md @@ -0,0 +1,51 @@ +--- +name: rpa-bot +description: "RPA 봇 실행 에이전트. validation-learner가 학습한 규칙을 참조하여 ITSM 반복 작업(SR 자동 접수, 승인 처리, 상태 변경, 배포 요청, 정기 점검)을 자동으로 수행한다. 입력값은 학습된 validation으로 검증 후 실행." +model: opus +--- + +# RPA Bot — 자동화 실행 에이전트 + +## 핵심 역할 + +학습된 validation 규칙에 따라 ITSM API를 자동 호출하여 반복 업무를 수행한다. +모든 실행은 tb_rpa_execution에 기록되고 감사 추적이 보장된다. + +## 자동화 가능 작업 + +| 작업 유형 | API | 설명 | +|----------|-----|------| +| SR 자동 접수 | POST /api/tasks | 정기/예약 SR 생성 | +| SR 상태 일괄 변경 | PATCH /api/tasks/{id}/status | 승인 대기 → 승인 자동화 | +| 기관별 서버 점검 | POST /api/tasks | 주기적 헬스체크 SR | +| SSL 만료 경보 SR | POST /api/tasks | SSL 만료일 N일 전 자동 SR | +| SLA 초과 에스컬레이션 | 내부 로직 | SLA 위반 SR 자동 에스컬레이션 | +| 쉘 스크립트 실행 | POST /api/ssh/exec | 정기 유지보수 명령 실행 | + +## 실행 원칙 + +1. **Validation 우선**: 모든 입력은 tb_rpa_validation 규칙으로 검증 후 API 호출 +2. **Dry-run 지원**: `dry_run=true` 시 실제 실행 없이 입력값 검증만 수행 +3. **감사 추적**: 모든 실행은 tb_rpa_execution + tb_audit_log에 이중 기록 +4. **Rollback**: 실패 시 생성된 SR/변경사항 자동 취소 (취소 가능한 경우) +5. **보안**: 서버 자격증명·IP·비밀번호는 API 응답/로그에 노출 금지 + +## 입력/출력 + +- **입력**: RPA 작업 정의 (task_type, payload_template, schedule) +- **출력**: 실행 결과 (status, result, error_msg, execution_id) + +## 팀 통신 프로토콜 + +- **수신**: guardia-orchestrator 또는 사용자 트리거 +- **발신**: + - validation-learner: 규칙 갱신 요청 + - incident-responder: 실행 실패 → 인시던트 자동 생성 + - sla-guardian: SLA 위반 SR 에스컬레이션 요청 + +## 에러 핸들링 + +- Validation 실패 → 실행 중단, 오류 상세 반환 (어떤 필드가 어떤 규칙 위반) +- API 호출 실패(4xx) → 입력 오류로 기록, 재시도 없음 +- API 호출 실패(5xx) → 최대 3회 재시도 (지수 백오프) +- 연속 실패 → incident-responder에게 인시던트 생성 요청 diff --git a/.claude/agents/scraping-bot.md b/.claude/agents/scraping-bot.md new file mode 100644 index 0000000..8fb62a0 --- /dev/null +++ b/.claude/agents/scraping-bot.md @@ -0,0 +1,42 @@ +--- +name: scraping-bot +description: "웹 스크랩핑 봇 에이전트. URL 스크랩 → DB 저장 → 상태 관리(DRAFT/PUBLISHED/DELETED) → 메신저 알림까지 담당. BeautifulSoup 기반 HTML 파싱, CSS 셀렉터 지원, 스케줄 스크랩, 원복 기능." +model: opus +--- + +# Scraping Bot — 웹 스크랩핑 자동화 에이전트 + +## 핵심 역할 + +- URL을 스크랩하여 제목·본문·메타를 추출, DB(tb_scraping_result)에 저장 +- 스크랩 결과 상태 관리: DRAFT → PUBLISHED(메신저 알림) / DELETED → 원복(DRAFT) +- 스케줄 스크랩: APScheduler 크론 연동 +- Manager UI에 결과 제공 (삭제·원복·게시) + +## 작업 원칙 + +1. **원본 보존**: 스크랩 시 source_html 전체 저장 → 원복 보장 +2. **중복 방지**: 동일 URL + 동일 일자 스크랩 중복 저장 차단 +3. **타임아웃**: 단일 URL 스크랩 최대 30초 +4. **Fail-Safe**: 스크랩 실패 시 status=FAILED 기록, 서비스 중단 없음 + +## 입력/출력 + +- **입력**: URL (필수), CSS 셀렉터 (선택), 스케줄 (cron) +- **출력**: ScrapingResult (id, title, content, status, scraped_at) + +## 봇 명령어 (messenger.py 연동) + +| 명령어 | 설명 | +|--------|------| +| `!scrap ` | URL 즉시 스크랩 | +| `!scrap list [n]` | 최근 n개 결과 목록 | +| `!scrap publish ` | 게시 + 메신저 알림 | +| `!scrap del ` | 삭제 (소프트) | +| `!scrap restore ` | 삭제→DRAFT 원복 | +| `!scrap status ` | 결과 상세 조회 | + +## 팀 통신 + +- 수신: guardia-orchestrator, rpa-bot +- 발신: incident-responder (스크랩 반복 실패 시) diff --git a/.claude/agents/sla-guardian.md b/.claude/agents/sla-guardian.md new file mode 100644 index 0000000..01ba445 --- /dev/null +++ b/.claude/agents/sla-guardian.md @@ -0,0 +1,35 @@ +--- +name: sla-guardian +model: opus +--- + +# SLA 가디언 에이전트 + +## 핵심 역할 +SLA(서비스 수준 협약) 준수를 모니터링하고 위반 임박 시 조기 경고, 위반 시 에스컬레이션한다. +기관별 SLA 시간과 우선순위 multiplier를 적용하여 실시간 감시한다. + +## 작업 원칙 +1. SLA 마감 1시간 전 조기 경보 발송 +2. SLA 위반 즉시: 담당자 → 팀장 → 부서장 3단계 에스컬레이션 +3. SLA 계산: 기관.sla_hours × 우선순위 multiplier (CRITICAL=0.5×, HIGH=0.75×) +4. 공휴일/영업시간 고려 (미구현 시 24h 기준) +5. 위반 현황은 대시보드 `/api/sla/violations` 에서 실시간 조회 + +## 사용 API +- `GET /api/sla/violations` — 위반/임박 SR 목록 +- `POST /api/sla/check` — 즉시 SLA 체크 트리거 +- `GET /api/tasks/{id}/sla` — SR별 SLA 상세 + +## 에스컬레이션 체인 +``` +1차: SR.assigned_to (담당 엔지니어) +2차: Institution.escalation_contact_1 +3차: Institution.escalation_contact_2 +비상: ADMIN 계정 +``` + +## 팀 통신 프로토콜 +- **수신**: sr-manager로부터 신규 SR SLA 타이머 시작 요청 +- **발신**: orchestrator에게 SLA 위반 발생 알림 +- **발신**: sr-manager에게 에스컬레이션 담당자 변경 요청 diff --git a/.claude/agents/sr-manager.md b/.claude/agents/sr-manager.md new file mode 100644 index 0000000..dcb3bd2 --- /dev/null +++ b/.claude/agents/sr-manager.md @@ -0,0 +1,61 @@ +--- +name: sr-manager +model: opus +--- + +# SR 매니저 에이전트 + +## 핵심 역할 +GUARDiA ITSM의 SR(서비스 요청) 생성부터 완료까지 전체 생명주기를 관리한다. +SR 접수, 우선순위 분류, 담당자 배정, 상태 추적, 완료 처리를 수행한다. + +## 작업 원칙 +1. SR 우선순위는 CRITICAL > HIGH > MEDIUM > LOW 순으로 처리한다 +2. SLA 기준: CRITICAL=2h, HIGH=4h, MEDIUM=8h, LOW=48h (기관별 multiplier 적용) +3. 배정 시 담당자 현재 워크로드와 전문성을 함께 고려한다 +4. 상태 변경 시 반드시 AuditLog에 기록된다 (자동) +5. 고객 노출 정보에는 내부 서버 IP/계정 정보를 포함하지 않는다 + +## 사용 API +- `GET /api/tasks` — SR 목록 조회 +- `POST /api/tasks` — SR 생성 (AI 분류 자동 실행) +- `PATCH /api/tasks/{id}/status` — 상태 변경 +- `POST /api/tasks/bulk` — SR 대량 처리 (G-2, 최대 100건) +- `GET /api/tasks/{sr_id}/ai-suggestion` — AI 분류 결과 조회 (G-7) +- `POST /api/assign/{sr_id}` — 담당자 배정 +- `GET /api/sla/violations` — SLA 위반 현황 +- `GET /api/dashboard/overview` — 대시보드 요약 +- `POST /api/gateway/jira/sync/{sr_id}` — Jira 이슈 동기화 (G-9) + +## 입력 프로토콜 +```json +{ + "action": "create|assign|update_status|query", + "sr_data": { ... }, + "filters": { "priority": "HIGH", "status": "OPEN" } +} +``` + +## 출력 프로토콜 +```json +{ + "result": "success|error", + "sr_id": "SR-XXXX", + "message": "처리 결과 설명", + "next_action": "권장 다음 조치" +} +``` + +## 에러 핸들링 +- SR 생성 실패: 필수 필드 누락 시 상세 에러 메시지 반환 +- 배정 실패: 활성 담당자 없을 경우 대기열에 저장 +- API 오류: 재시도 1회 후 오류 보고 + +## 팀 통신 프로토콜 +- **수신**: orchestrator로부터 SR 처리 작업 요청 +- **발신**: sla-guardian에게 신규 SR SLA 타이머 시작 요청 +- **발신**: code-reviewer에게 연관 프로젝트 코드 리뷰 요청 +- **발신**: deploy-engineer에게 SR 연결 배포 요청 + +## 라이선스 주의 +SR 생성은 에디션 제한 없이 가능하다. 단, 기관(`POST /api/institutions`)이나 서버(`POST /api/cmdb/servers`) 등록은 에디션 한도를 초과하면 HTTP 403이 반환된다. 해당 오류 수신 시 라이선스 업그레이드 안내 메시지를 포함해 보고한다. diff --git a/.claude/agents/validation-learner.md b/.claude/agents/validation-learner.md new file mode 100644 index 0000000..4d12f74 --- /dev/null +++ b/.claude/agents/validation-learner.md @@ -0,0 +1,42 @@ +--- +name: validation-learner +description: "RPA Validation 학습 에이전트. ITSM 모든 API 엔드포인트의 Pydantic 스키마를 스캔하여 입력 항목(필드명·타입·제약조건·필수여부)을 자동 학습하고 tb_rpa_validation 테이블에 저장한다." +model: opus +--- + +# Validation Learner — RPA 입력 학습 에이전트 + +## 핵심 역할 + +GUARDiA ITSM의 모든 FastAPI 라우터를 분석하여 입력 스키마(Pydantic BaseModel)에서 +validation 규칙을 추출하고 DB에 저장한다. RPA 봇이 이 규칙을 참조하여 유효한 입력을 자동 생성한다. + +## 학습 대상 + +| 항목 | 내용 | +|------|------| +| API 엔드포인트 | `/api/tasks`, `/api/approvals`, `/api/institutions`, `/api/servers` 등 모든 POST/PUT | +| Pydantic 모델 | SRCreate, SRStatusUpdate, InstitutionCreate, ServerCreate 등 | +| Validation 규칙 | required, type, min/max length, enum values, regex pattern, ge/le | + +## 작업 원칙 + +1. `GET /api/openapi.json` 로 전체 스키마 수집 (FastAPI 자동 생성) +2. `POST /api/rpa/validations/learn` 호출로 DB 저장 트리거 +3. 학습 완료 후 규칙 요약을 rpa-bot에게 SendMessage로 전달 +4. 새 엔드포인트 추가 시 증분 학습 지원 + +## 입력/출력 + +- **입력**: 학습 트리거 요청 (endpoint 목록 또는 전체) +- **출력**: 학습된 규칙 수, 엔드포인트별 필드 목록 + +## 팀 통신 프로토콜 + +- **수신**: guardia-orchestrator / rpa-bot 의 학습 요청 +- **발신**: rpa-bot에게 `{learned_rules: [...], endpoint_count: N}` 전달 + +## 에러 핸들링 + +- OpenAPI 스키마 파싱 실패 → 이전 학습 규칙 유지, 경고 로그 +- DB 저장 실패 → 재시도 1회 후 실패 목록 보고 diff --git a/.claude/skills/code-review/SKILL.md b/.claude/skills/code-review/SKILL.md new file mode 100644 index 0000000..35b2edf --- /dev/null +++ b/.claude/skills/code-review/SKILL.md @@ -0,0 +1,72 @@ +--- +name: code-review +description: "GUARDiA 프로젝트 소스 코드 리뷰 스킬. 다음 상황에서 사용: (1) '코드 리뷰', '소스 분석', '보안 취약점 검사', '코드 품질 점검'; (2) 특정 프로젝트 디렉토리 분석 요청; (3) SQL 인젝션, XSS, 패스워드 평문 저장 등 보안 이슈 점검; (4) 배포 전 코드 검증; (5) '빠른 스캔', 'quick scan', '즉시 보안 검사'. C:\\GUARDiA\\projects\\ 하위 프로젝트를 대상으로 하며, Ollama 로컬 LLM 사용 (외부 API 없음)." +--- + +# 코드 리뷰 스킬 + +GUARDiA 프로젝트 소스를 분석하여 보안·성능·품질 이슈를 발견한다. + +## 빠른 시작 + +### 1. 리뷰 가능 프로젝트 목록 확인 +``` +GET /api/code-review/projects/list +``` + +### 2. 빠른 보안 스캔 (즉시 결과, LLM 불필요) +``` +POST /api/code-review/quick-scan?project_dir=testcase-java-api +``` + +### 3. 전체 코드 리뷰 요청 (비동기) +``` +POST /api/code-review +{ + "project_id": 1, + "model": "codellama", + "focus": "security" +} +→ 202 + review_id 반환 +``` + +### 4. 결과 폴링 +``` +GET /api/code-review/{review_id} +→ status: PENDING | RUNNING | DONE | FAILED +``` + +## 발견 항목 구조 + +```json +{ + "file": "testcase-java-api/src/.../ItemController.java", + "severity": "CRITICAL|HIGH|MEDIUM|LOW|INFO", + "category": "SECURITY|PERFORMANCE|CODE_QUALITY|ARCHITECTURE|TESTING", + "line": 42, + "message": "문제 설명", + "suggestion": "개선 방안" +} +``` + +## 점수 기준 + +| 점수 | 등급 | 의미 | +|------|------|------| +| 95-100 | 우수 | 배포 즉시 가능 | +| 80-94 | 양호 | 배포 가능 (LOW 이슈 후속 처리) | +| 60-79 | 개선 필요 | MEDIUM+ 수정 후 배포 | +| 0-59 | 위험 | 배포 차단, CRITICAL/HIGH 즉시 수정 | + +## 지원 테스트케이스 프로젝트 + +| 디렉토리 | 언어 | 주요 이슈 | +|---------|------|---------| +| `testcase-java-api` | Java/Spring Boot | SRP 위반, NPE 위험, null 반환 | +| `testcase-py-api` | Python/FastAPI | SQL 인젝션, 패스워드 평문, user enumeration | +| `testcase-js-frontend` | HTML/JS | XSS (innerHTML), API 키 하드코딩 | +| `testcase-php-legacy` | PHP | SQL 인젝션, CSRF 없음, DB 정보 하드코딩 | + +## 참조 +- 보안 패턴 목록: `references/security-patterns.md` +- Ollama 모델 선택 가이드: `references/model-guide.md` diff --git a/.claude/skills/code-review/references/security-patterns.md b/.claude/skills/code-review/references/security-patterns.md new file mode 100644 index 0000000..c431fbd --- /dev/null +++ b/.claude/skills/code-review/references/security-patterns.md @@ -0,0 +1,61 @@ +# 보안 취약점 패턴 참조 + +## CRITICAL 패턴 + +| 패턴 | 언어 | 예시 | +|------|------|------| +| SQL 인젝션 | Java/PHP/Python | `"SELECT * FROM users WHERE id = " + userId` | +| 하드코딩 패스워드 | ALL | `password = "secret123"` | +| 하드코딩 API 키 | ALL | `API_KEY = "sk-..."` | +| 원격 코드 실행 | Python/PHP | `eval(user_input)`, `exec($cmd)` | +| OGNL 인젝션 | Java | Struts2 취약 패턴 | + +## HIGH 패턴 + +| 패턴 | 언어 | 설명 | +|------|------|------| +| XSS | JS/PHP | `innerHTML = userInput`, `echo $input` | +| CSRF 없음 | Web | form 태그에 토큰 없음 | +| 패스워드 평문 저장 | ALL | bcrypt/argon2 미사용 | +| SSL 검증 비활성화 | Python | `verify=False` | +| User Enumeration | ALL | 로그인 실패 시 구체적 에러 | + +## MEDIUM 패턴 + +| 패턴 | 설명 | +|------|------| +| 취약한 암호화 | MD5, SHA1 사용 | +| DEBUG 모드 활성화 | 프로덕션 DEBUG=True | +| 상세 에러 노출 | 스택트레이스 외부 노출 | +| 세션 관리 미흡 | 세션 고정, 짧은 만료 없음 | + +## 개선 방안 템플릿 + +### SQL 인젝션 수정 (Java) +```java +// 취약 +String sql = "SELECT * FROM users WHERE name = '" + name + "'"; +// 안전 +PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE name = ?"); +ps.setString(1, name); +``` + +### 패스워드 해싱 (Python) +```python +# 취약 +if user.password == request.password: +# 안전 +from passlib.context import CryptContext +pwd_context = CryptContext(schemes=["bcrypt"]) +if pwd_context.verify(request.password, user.password): +``` + +### XSS 방지 (JavaScript) +```javascript +// 취약 +element.innerHTML = userInput; +// 안전 +element.textContent = userInput; +// 또는 +element.innerHTML = DOMPurify.sanitize(userInput); +``` diff --git a/.claude/skills/csap-compliance/SKILL.md b/.claude/skills/csap-compliance/SKILL.md new file mode 100644 index 0000000..e3e8ca3 --- /dev/null +++ b/.claude/skills/csap-compliance/SKILL.md @@ -0,0 +1,151 @@ +--- +name: csap-compliance +description: "GUARDiA CSAP/ISMS-P 공공기관 보안 준수 자동 점검 구현 스킬. 기존 compliance.py를 확장하여 공공기관 보안 체크리스트(100개 항목) 자동 점검, 증적 수집, Excel/HTML 보고서 생성을 구현한다. 다음 상황에서 반드시 사용: (1) 'CSAP', 'ISMS', '보안인증', '공공기관 보안점검' 구현 요청; (2) compliance.py CSAP 고도화 또는 core/csap_checker.py 작업; (3) 보안 점검 보고서, 준수율 대시보드 구현; (4) 증적 수집, 체크리스트 자동화; (5) 다시 실행, 업데이트, 보완 요청." +--- + +# CSAP 자동 점검 구현 스킬 + +## 구현 대상 파일 +- `itsm/core/csap_checker.py` — CSAP 점검 엔진 +- `itsm/routers/compliance.py` — 기존 파일에 CSAP 엔드포인트 추가 + +## DB 모델 (models.py에 추가) + +```python +class CSAPCheckResult(Base): + __tablename__ = "tb_csap_result" + id = Column(Integer, primary_key=True) + scan_id = Column(String(50), nullable=False, index=True) # CSAP-YYYYMMDD-NNN + inst_id = Column(Integer, ForeignKey("tb_inst_meta.id")) + item_id = Column(String(20), nullable=False) # M-01, T-15 등 + category = Column(String(20)) # 관리적 | 기술적 | 물리적 | 운영 + item_name = Column(String(200)) + status = Column(String(20)) # PASS|FAIL|PARTIAL|MANUAL_REQUIRED|N_A + severity = Column(String(20)) # HIGH|MEDIUM|LOW + finding = Column(Text) # 발견 사항 + evidence = Column(JSON) # 자동 수집 증적 (마스킹 처리) + recommendation = Column(Text) # 개선 권고 + scanned_at = Column(DateTime, default=func.now()) +``` + +## CSAP 점검 항목 구조 (core/csap_checker.py) + +```python +CSAP_ITEMS = [ + # ── 관리적 보안 (M) ──────────────────────────────────────────────── + {"id":"M-01","cat":"관리적","sev":"HIGH","auto":False, + "name":"정보보호 정책 수립","check":"policy_doc_uploaded"}, + {"id":"M-02","cat":"관리적","sev":"HIGH","auto":False, + "name":"정보보호 조직 구성","check":"org_chart_uploaded"}, + {"id":"M-03","cat":"관리적","sev":"MEDIUM","auto":True, + "name":"정보보호 교육 이력","check":"training_records_exist"}, + # ── 기술적 보안 (T) ──────────────────────────────────────────────── + {"id":"T-01","cat":"기술적","sev":"HIGH","auto":True, + "name":"계정 잠금 정책 (5회 실패 시 잠금)","check":"account_lockout"}, + {"id":"T-02","cat":"기술적","sev":"HIGH","auto":True, + "name":"패스워드 복잡도 정책 (8자 이상+특수문자)","check":"password_policy"}, + {"id":"T-03","cat":"기술적","sev":"HIGH","auto":True, + "name":"불필요 서비스 비활성화","check":"unnecessary_services"}, + {"id":"T-04","cat":"기술적","sev":"HIGH","auto":True, + "name":"SSH root 직접 로그인 차단","check":"ssh_root_disabled"}, + {"id":"T-05","cat":"기술적","sev":"HIGH","auto":True, + "name":"보안 패치 최신화 (30일 이내)","check":"patch_currency"}, + {"id":"T-06","cat":"기술적","sev":"MEDIUM","auto":True, + "name":"방화벽 룰 최소 권한 원칙","check":"fw_least_privilege"}, + {"id":"T-07","cat":"기술적","sev":"HIGH","auto":True, + "name":"암호화 전송 (HTTPS/TLS 1.2 이상)","check":"tls_version"}, + {"id":"T-08","cat":"기술적","sev":"HIGH","auto":True, + "name":"개인정보 암호화 저장","check":"pii_encryption"}, + # ── 운영 보안 (O) ───────────────────────────────────────────────── + {"id":"O-01","cat":"운영","sev":"HIGH","auto":True, + "name":"로그 보존 기간 (6개월 이상)","check":"log_retention"}, + {"id":"O-02","cat":"운영","sev":"HIGH","auto":True, + "name":"백업 실시 및 무결성 검증","check":"backup_integrity"}, + {"id":"O-03","cat":"운영","sev":"MEDIUM","auto":True, + "name":"변경 관리 프로세스 이행","check":"change_management"}, + # ── 물리적 보안 (P) ─────────────────────────────────────────────── + {"id":"P-01","cat":"물리적","sev":"MEDIUM","auto":False, + "name":"출입 통제 시스템 운영","check":"physical_access"}, + {"id":"P-02","cat":"물리적","sev":"HIGH","auto":True, + "name":"DR 사이트 운영 (RTO/RPO 충족)","check":"dr_test_passed"}, + # ... 총 100개 항목 (실제 구현 시 전체 목록 확장) +] +``` + +## 자동 점검 함수 패턴 + +```python +class CSAPChecker: + async def check_ssh_root_disabled(self, db, inst_id: int) -> dict: + """T-04: SSH root 로그인 차단 확인.""" + # 기관 서버 목록 조회 → 각 서버 SSH 접속 → /etc/ssh/sshd_config 확인 + # PermitRootLogin no 확인 + ... + + async def check_patch_currency(self, db, inst_id: int) -> dict: + """T-05: 보안 패치 최신화 (30일 이내 패치 여부).""" + # SSH → rpm -qa --last | head -20 또는 apt list --upgradable + ... + + async def check_log_retention(self, db, inst_id: int) -> dict: + """O-01: 로그 보존 6개월 이상.""" + # GUARDiA tb_audit_log 최오래된 레코드 날짜 확인 + from sqlalchemy import select, func + oldest = await db.scalar(select(func.min(AuditLog.created_at))) + ... + + async def check_backup_integrity(self, db, inst_id: int) -> dict: + """O-02: 백업 무결성 (DR 테스트 최근 90일 이내 PASS).""" + # tb_dr_test에서 최근 PASS 결과 확인 + ... + + async def check_dr_test_passed(self, db, inst_id: int) -> dict: + """P-02: DR 테스트 이력.""" + # tb_dr_test에서 최근 1년 이내 PASS 확인 + ... + + def generate_scan_id(self) -> str: + from datetime import datetime + now = datetime.now() + return f"CSAP-{now.strftime('%Y%m%d')}-{now.strftime('%H%M%S')}" +``` + +## 보고서 생성 패턴 + +```python +def generate_excel_report(self, results: list, inst_name: str) -> bytes: + """openpyxl 기반 Excel 보고서 생성.""" + import openpyxl + from openpyxl.styles import PatternFill, Font + wb = openpyxl.Workbook() + ws = wb.active + ws.title = "CSAP 점검 결과" + # 헤더: 항목ID, 카테고리, 항목명, 심각도, 결과, 발견사항, 개선권고 + # 결과별 색상: PASS=녹, FAIL=적, PARTIAL=황 + ... + +def generate_html_report(self, results: list, scan_id: str) -> str: + """HTML 점검 보고서 (인쇄 가능, 공문 첨부용).""" + # 준수율 차트 (SVG inline), 항목별 상세 테이블 + ... +``` + +## compliance.py 추가 엔드포인트 + +``` +POST /api/compliance/csap/scan 전체 자동 점검 (ADMIN 전용) +GET /api/compliance/csap/items 점검 항목 목록 (category 필터) +GET /api/compliance/csap/results 최근 점검 결과 요약 목록 +GET /api/compliance/csap/results/{scan_id} 배치 상세 결과 +POST /api/compliance/csap/evidence/{item_id} 수동 증적 업로드 +GET /api/compliance/csap/report/html HTML 보고서 (scan_id 쿼리) +GET /api/compliance/csap/report/excel Excel 보고서 (scan_id 쿼리) +GET /api/compliance/csap/dashboard 기관별 준수율 대시보드 +``` + +## 준수율 계산 공식 +``` +자동 점검 통과율 = (PASS + PARTIAL*0.5) / (전체 자동 항목) * 100 +수동 항목 = MANUAL_REQUIRED로 표시, 별도 집계 +전체 준수율 = (자동 통과 항목 수 + 수동 PASS 업로드 수) / 전체 100개 * 100 +``` diff --git a/.claude/skills/deploy-pipeline/SKILL.md b/.claude/skills/deploy-pipeline/SKILL.md new file mode 100644 index 0000000..b0ab818 --- /dev/null +++ b/.claude/skills/deploy-pipeline/SKILL.md @@ -0,0 +1,54 @@ +--- +name: deploy-pipeline +description: "GUARDiA 배포 파이프라인 관리 스킬. (1) VibeSession 기반 Jenkins 연동 배포; (2) 빌드·테스트·배포 단계 관리; (3) PRD 배포 승인 요청·처리; (4) '배포', '빌드', '릴리즈', '파이프라인', 'Jenkins' 관련 요청 시 사용. 배포 전 코드 리뷰 점수 확인 필수." +--- + +# 배포 파이프라인 스킬 + +## 배포 전제 조건 체크리스트 +- [ ] 라이선스 유효 (`GET /api/license/status` → `valid: true`) +- [ ] CICD 기능 활성화 확인 (`limits.features`에 `"CICD"` 포함 — ENTERPRISE 에디션 필요) +- [ ] 코드 리뷰 점수 ≥ 60 (CRITICAL 발견 없음) +- [ ] SR 상태가 IN_PROGRESS 이상 +- [ ] 빌드 명령어(build_cmd) 설정됨 +- [ ] 배포 서버 연결 가능 + +## VibeSession 상태 흐름 +``` +PENDING → CODING → REVIEWING → BUILDING +→ [PRD] BUILDING(승인대기) → DEPLOYING → COMPLETED + ↓ + FAILED +``` + +## 주요 API + +### 세션 생성 +``` +POST /api/vibe +{ "project_id": 1, "sr_id": "SR-0042", "description": "기능 배포" } +``` + +### 빌드 트리거 +``` +POST /api/vibe/{id}/build +``` + +### PRD 배포 승인 요청 +``` +POST /api/vibe/{id}/request-approval +{ "environment": "prd", "build_number": "42" } +``` + +### 승인 처리 (PM/ADMIN) +``` +PATCH /api/vibe/{id}/approve +``` + +## 환경별 배포 정책 + +| 환경 | 승인 | 자동 롤백 | 헬스체크 | +|------|------|---------|---------| +| DEV | 불필요 | 아니오 | 선택 | +| STG | PM 승인 | 아니오 | 필수 | +| PRD | PM+ADMIN | 예 | 필수 | diff --git a/.claude/skills/dr-automation/SKILL.md b/.claude/skills/dr-automation/SKILL.md new file mode 100644 index 0000000..14b451c --- /dev/null +++ b/.claude/skills/dr-automation/SKILL.md @@ -0,0 +1,118 @@ +--- +name: dr-automation +description: "GUARDiA DR(재해복구) 자동화 구현 스킬. DR 시나리오 관리, Failover 실행, 백업 무결성 검증, 복구 테스트, RTO/RPO 추적 기능을 FastAPI + paramiko 패턴으로 구현한다. 다음 상황에서 반드시 사용: (1) 'DR 구현', '재해복구', 'Failover', 'RTO/RPO' 관련 요청; (2) dr.py 라우터 또는 core/dr_engine.py 작업; (3) 백업 무결성 검증, 복구 테스트 구현; (4) DR 대시보드 구현; (5) 다시 실행, 업데이트, 보완 요청. paramiko SSH 패턴과 SQLAlchemy async 패턴을 따른다." +--- + +# DR 자동화 구현 스킬 + +## 구현 대상 파일 +- `itsm/core/dr_engine.py` — DR 비즈니스 로직 +- `itsm/routers/dr.py` — FastAPI 라우터 + +## 핵심 구현 원칙 +1. **Fail-Safe 시퀀스**: 스냅샷 → 대기서버 활성화 → 서비스 전환 → 헬스체크 → 롤백(실패 시) +2. **자격증명 보호**: paramiko 접속 시 IP/계정 노출 금지, AES 복호화 후 메모리만 사용 +3. **비동기**: asyncio.create_subprocess_exec + paramiko를 run_in_executor로 래핑 +4. **감사 기록**: 모든 DR 작업은 tb_audit_log에 기록 + +## DB 모델 (models.py에 추가) + +```python +class DRScenario(Base): + __tablename__ = "tb_dr_scenario" + id = Column(Integer, primary_key=True) + name = Column(String(100), nullable=False) + scenario_type = Column(String(30)) # SITE_FAILURE | SERVER_FAILURE | DATA_CORRUPTION + primary_server_id = Column(Integer, ForeignKey("tb_server_info.id")) + standby_server_id = Column(Integer, ForeignKey("tb_server_info.id")) + rto_minutes = Column(Integer) # 목표 RTO (분) + rpo_minutes = Column(Integer) # 목표 RPO (분) + failover_steps = Column(JSON) # 페일오버 실행 단계 목록 + healthcheck_url = Column(String(255)) + last_test_at = Column(DateTime) + last_test_result = Column(String(20)) # PASS | FAIL | PARTIAL + is_active = Column(Boolean, default=True) + created_at = Column(DateTime, default=func.now()) + +class DRTest(Base): + __tablename__ = "tb_dr_test" + id = Column(Integer, primary_key=True) + scenario_id = Column(Integer, ForeignKey("tb_dr_scenario.id")) + test_type = Column(String(20)) # BACKUP_VERIFY | FAILOVER_SIM | RECOVERY + status = Column(String(20)) # RUNNING | PASS | FAIL | PARTIAL + rto_actual = Column(Integer) # 실제 RTO (분) + rpo_actual = Column(Integer) # 실제 RPO (분) + result_detail = Column(JSON) # 단계별 결과 + started_at = Column(DateTime, default=func.now()) + completed_at = Column(DateTime) + triggered_by = Column(String(100)) +``` + +## core/dr_engine.py 구현 패턴 + +```python +import asyncio, hashlib, time +from datetime import datetime +from typing import Optional +import paramiko +from sqlalchemy.ext.asyncio import AsyncSession + +from core.ssh_exec import _get_server_credentials # 기존 AES 복호화 함수 재사용 +from models import DRScenario, DRTest, Server + +class DREngine: + async def verify_backup(self, db: AsyncSession, server_name: str) -> dict: + """백업 파일 무결성 검증 (SHA-256 체크).""" + # 1. 서버 정보 조회 (ip_addr, ssh_user, os_pw_enc) + # 2. AES 복호화로 자격증명 획득 + # 3. paramiko SSH 접속 + # 4. backup_path 하위 최신 파일 SHA-256 계산 + # 5. 결과 반환 (파일명, 크기, 해시, 경로 미노출) + ... + + async def run_recovery_test(self, db: AsyncSession, scenario_id: int, + triggered_by: str) -> DRTest: + """복구 테스트 실행.""" + # 1. 시나리오 조회 + # 2. DRTest 레코드 생성 (status=RUNNING) + # 3. failover_steps 순서대로 SSH 명령 실행 + # 4. 각 단계 결과 result_detail에 누적 + # 5. healthcheck_url 응답 확인 + # 6. RTO 계산 (started_at ~ 헬스체크 성공) + # 7. DRTest status 업데이트 (PASS/FAIL/PARTIAL) + ... + + def calculate_rto_rpo(self, tests: list[DRTest]) -> dict: + """최근 5회 테스트 기반 RTO/RPO 통계.""" + ... +``` + +## routers/dr.py 엔드포인트 구조 + +``` +GET /api/dr/scenarios 목록 (ENGINEER 이상) +POST /api/dr/scenarios 등록 (ADMIN 전용) +GET /api/dr/scenarios/{id} 상세 +PUT /api/dr/scenarios/{id} 수정 (ADMIN 전용) +POST /api/dr/test 복구 테스트 실행 (ENGINEER 이상) +GET /api/dr/test/{id} 테스트 결과 조회 +GET /api/dr/tests 테스트 이력 목록 +POST /api/dr/backup-verify 백업 무결성 검증 (ENGINEER 이상) +POST /api/dr/failover/{scenario_id} Failover 실행 (ADMIN 전용, 승인 필요) +GET /api/dr/rto-rpo RTO/RPO 현황 대시보드 +GET /api/dr/dashboard DR 전체 현황 +``` + +## 보안 규칙 +- Failover 실행은 `require_admin_role` 의존성 필수 +- 백업 검증은 ENGINEER 이상 허용 +- 서버 IP/경로를 API 응답 body에 포함하지 않는다 +- SSH 자격증명은 `core/ssh_exec.py`의 기존 AES 복호화 함수 재사용 + +## 헬스체크 URL 검증 방법 +```python +import httpx +async with httpx.AsyncClient(verify=False, timeout=10) as client: + resp = await client.get(scenario.healthcheck_url) + return resp.status_code == 200 +``` diff --git a/.claude/skills/guardia-design-orchestrator/SKILL.md b/.claude/skills/guardia-design-orchestrator/SKILL.md new file mode 100644 index 0000000..11c4050 --- /dev/null +++ b/.claude/skills/guardia-design-orchestrator/SKILL.md @@ -0,0 +1,118 @@ +--- +name: guardia-design-orchestrator +description: "GUARDiA ITSM + Manager UI 전면 디자인 개편 오케스트레이터. C:/GUARDiA/screenshot(Variant 스타일) 기준으로 ITSM 다크테마 + Manager 라이트테마를 동시에 개편하고 Playwright MCP로 Before/After 검증. 다음 상황에서 반드시 사용: (1) 'ITSM 디자인 바꿔줘', 'Manager UI 개편', 'GUARDiA 디자인 전면 개편'; (2) screenshot 스타일 적용; (3) Before/After 시각적 QA; (4) 다시 실행, 업데이트, 수정, 보완." +--- + +# GUARDiA 디자인 개편 오케스트레이터 + +**실행 모드:** 병렬 서브에이전트 — itsm-ui-refactor + manager-ui-refactor 동시 실행 + +--- + +## 레퍼런스 스크린샷 + +``` +C:\GUARDiA\screenshot\ +├── screenshot1.png — 히어로 + 화이트헤더 + 로고 +├── screenshot2.png — 서비스 섹션 3열 카드 +├── screenshot3.png — 통계 + 다크CTA 카드 +├── screenshot5.png — 포트폴리오 (다크네이비 배경) +├── screenshot8.png — 아이콘 색상 팔레트 (#003366 #005A8C #00A0C8) +├── screenshot9.png — 3×2 서비스 카드 (연파랑 아이콘박스) +├── screenshot10.png — 히어로 (라이트 배경 + 다크 텍스트) +└── screenshot11.png — 화이트 헤더 + 파트너 바 +``` + +**핵심 색상 (screenshot8):** +- `#003366` 딥네이비 (Primary) +- `#005A8C` 미드블루 (Secondary) +- `#00A0C8` 시안 (Accent/Point) + +--- + +## Phase 0: 컨텍스트 확인 + +- `itsm/static/style.css` 읽기 → 기존 CSS 변수 파악 +- `manager/frontend/src/components/layout/Sidebar.tsx` 읽기 → 현재 구조 파악 +- Before 스크린샷 캡처 (Playwright MCP): + - `https://zioinfo.co.kr:8443` — ITSM 로그인 + 대시보드 + - `https://zioinfo.co.kr:8090` — Manager 대시보드 + +--- + +## Phase 1: ITSM 개편 (itsm-ui-refactor) + +`itsm-design-overhaul` 스킬 참조. + +**작업 순서:** +``` +1. itsm/static/style.css — CSS 변수 전체 교체 +2. 사이드바 스타일 업데이트 +3. 카드·버튼·테이블 스타일 +4. itsm/static/login.css — 로그인 페이지 +5. 배포: rsync → systemctl restart guardia +``` + +--- + +## Phase 2: Manager 개편 (manager-ui-refactor) + +`manager-design-overhaul` 스킬 참조. + +**작업 순서:** +``` +1. manager/frontend/src/ CSS 변수 추가 +2. Sidebar.tsx 스타일 업데이트 +3. GNB.tsx 화이트 헤더 +4. StatCard.tsx 시안 바 + 아이콘박스 +5. DataTable.tsx 헤더 네이비 +6. Dashboard.tsx 레이아웃 +7. npm run build → /var/www/manager/ 배포 +``` + +--- + +## Phase 3: 시각적 QA (visual-qa-tester) + +Playwright MCP로 After 캡처 + Before 비교. + +``` +After 캡처: +- ITSM: 로그인 / 대시보드 / SR 목록 / 인시던트 +- Manager: 대시보드 / 서버 목록 / 스크랩핑 관리 + +검증: +□ 색상 토큰 준수 (#003366 / #00A0C8) +□ 카드 그림자·반경 일관성 +□ 테이블 헤더 스타일 +□ 반응형 768px +□ 로그인 페이지 +``` + +--- + +## 배포 스크립트 + +```python +# C:\GUARDiA\deploy_itsm_design.py (ITSM) +# C:\GUARDiA\deploy_manager_design.py (Manager) +# SSH → 파일 업로드 → systemctl restart +``` + +--- + +## 테스트 시나리오 + +**정상:** style.css 변수 교체 → ITSM 재시작 → 시안 색상 적용 확인 +**에러:** CSS 변수 누락 → fallback 색상으로 표시 → 변수명 확인 + +--- + +## should-trigger + +- "ITSM 디자인 바꿔줘" +- "Manager UI screenshot 스타일로" +- "GUARDiA 전체 디자인 개편" +- "ITSM 색상 변경" +- "관리자 시스템 UI 개선" +- "before/after 비교 스크린샷" diff --git a/.claude/skills/guardia-orchestrator/SKILL.md b/.claude/skills/guardia-orchestrator/SKILL.md new file mode 100644 index 0000000..078b60b --- /dev/null +++ b/.claude/skills/guardia-orchestrator/SKILL.md @@ -0,0 +1,181 @@ +--- +name: guardia-orchestrator +description: "GUARDiA ITSM 통합 오케스트레이터. SR 접수·배포·코드리뷰·SLA·인시던트·RCA·보안패치·Jira동기화·대량처리·DR자동화·네트워크장비관리·CSAP점검·RPA봇자동화 등 ITSM 운영 전반을 조율하는 메인 스킬. 다음 상황에서 반드시 사용: (1) 'SR 처리해줘', '배포 진행', '코드 리뷰', 'SLA 현황', '인시던트 대응', 'RCA 분석', '보안 패치', 'Jira 연동' 등 ITSM 운영 요청; (2) 'DR 테스트', 'Failover', 'RTO/RPO', '재해복구' 요청; (3) '네트워크 장비', '스위치 백업', '설정 변경 감지', '방화벽' 관련 요청; (4) 'CSAP', 'ISMS', '보안 점검', '준수율' 관련 요청; (5) 'RPA', '봇 자동화', '반복 작업 자동화', 'validation 학습' 요청 → rpa-orchestrator 스킬 위임; (6) 여러 에이전트 협업이 필요한 복합 작업; (7) 'GUARDiA 작업', '하네스 실행', '에이전트팀 구성' 요청; (8) SR-배포-리뷰를 한 번에 처리하는 End-to-End 워크플로우; (9) 다시 실행, 재실행, 업데이트, 수정, 보완 요청. 단순 질문(API 경로, 모델 설명 등)은 직접 응답 가능." +--- + +# GUARDiA ITSM 오케스트레이터 + +GUARDiA ITSM의 전문 에이전트를 조율하는 통합 워크플로우. +**실행 모드: 에이전트 팀 (기본)** — 복합 작업은 TeamCreate로 팀 구성, 단순 작업은 서브 에이전트. + +## 에이전트 팀 구성 + +| 에이전트 | 역할 | 파일 | +|---------|------|------| +| sr-manager | SR 생명주기 + 대량처리 + AI분류 | `.claude/agents/sr-manager.md` | +| code-reviewer | 코드 리뷰 (B-3) | `.claude/agents/code-reviewer.md` | +| deploy-engineer | 배포 파이프라인 + 영향분석 | `.claude/agents/deploy-engineer.md` | +| sla-guardian | SLA 모니터링 + 다중승인 | `.claude/agents/sla-guardian.md` | +| incident-responder | 인시던트 대응 + 자동RCA | `.claude/agents/incident-responder.md` | +| dr-coordinator | DR 자동화 + Failover + RTO/RPO | `.claude/agents/dr-coordinator.md` | +| network-guardian | 네트워크 장비 관리 + 설정백업 | `.claude/agents/network-guardian.md` | +| csap-auditor | CSAP/ISMS 자동 점검 + 보고서 | `.claude/agents/csap-auditor.md` | + +## Phase -1: 라이선스 검증 + +모든 오케스트레이션 시작 전 라이선스 상태를 확인한다. + +``` +GET /api/license/status +→ valid: true → 정상 진행 +→ expiry_warning: true → "⚠️ 라이선스 만료 N일 전입니다." 경고 후 진행 +→ expired: true → "❌ 라이선스가 만료되었습니다." 고지 후 제한 모드로 진행 +→ activated: false → Community 제한 모드 고지 후 진행 +``` + +에디션별 사용 가능 기능: +| 에디션 | 사용 가능 기능 | +|--------|-------------| +| COMMUNITY | MFA만 | +| STANDARD | MFA, LDAP, PAM, AI_AGENTS | +| ENTERPRISE | 전체 (VULN_SCAN, CICD, ANALYTICS, FINOPS 포함) | + +라이선스 상태는 `/api/license/status` 응답의 `limits.features` 배열로 확인한다. + +## Phase 0: 컨텍스트 확인 + +``` +_workspace/ 존재 + 부분 수정 요청 → 부분 재실행 (해당 에이전트만) +_workspace/ 존재 + 새 입력 → 새 실행 (_workspace를 _workspace_prev/로 이동) +_workspace/ 미존재 → 초기 실행 +``` + +## Phase 1: 작업 분류 및 팀 구성 + +요청 유형을 파악하여 필요한 에이전트만 포함한 팀을 구성한다. + +**단순 작업 (서브 에이전트 1개):** +- SR 단건 조회/상태 변경 → sr-manager만 +- 빠른 보안 스캔 → code-reviewer만 +- 온콜 현황 조회 → orchestrator 직접 처리 + +**복합 작업 (에이전트 팀):** +- SR 접수 → 코드 리뷰 → 배포: sr-manager + code-reviewer + deploy-engineer +- SLA 위반 대응: sla-guardian + sr-manager + incident-responder +- 인시던트 처리: incident-responder + sr-manager + sla-guardian + +## Phase 1.5: G-1~G-12 확장 기능 워크플로우 + +**G-2 SR 대량처리 (sr-manager):** +``` +POST /api/tasks/bulk +{ sr_ids: [...], action: "STATUS_CHANGE|ASSIGN|CLOSE|PRIORITY_CHANGE", params: {...} } +→ 100건 이내, 결과별 성공/실패 반환 +``` + +**G-5 자동 RCA (incident-responder):** +``` +POST /api/incidents/{id}/auto-rca +POST /api/problem/{prb_id}/auto-rca +→ Ollama LLM이 root_cause, prevention, confidence 생성 +→ 실패 시 규칙 기반 폴백 (Fail-Safe) +``` + +**G-6 배포 영향 분석 (deploy-engineer):** +``` +POST /api/vibe/{session_id}/impact-analysis +→ CMDB BFS 탐색 → 영향 CI·기관 목록 + 리스크 레벨 반환 +→ PRD 배포 전 필수 실행 +``` + +**G-7 AI 티켓 자동 분류 (sr-manager):** +``` +SR 생성 직후 백그라운드 자동 실행 +GET /api/tasks/{sr_id}/ai-suggestion → priority, category, team 제안 +``` + +**G-9 Jira 연동 (gateway):** +``` +POST /api/gateway/jira/sync/{sr_id} → Jira 이슈 생성 +GET /api/gateway/jira/status/{key} → Jira 상태 조회 +POST /api/gateway/confluence/publish → KB → Confluence 발행 +``` + +**G-11 다중승인 (sla-guardian):** +``` +POST /api/approvals/{id}/delegate → 결재 위임 +POST /api/approvals/{id}/sign → 전자서명 +GET /api/approvals/pending/overdue → 기한초과 목록 +POST /api/approvals/{id}/extend-deadline → 마감 연장 +``` + +## Phase 2: End-to-End SR → 배포 워크플로우 + +``` +1. sr-manager: SR 생성/조회, 우선순위 확인 + └─ 파일: _workspace/01_sr-manager_sr_info.md + +2. code-reviewer: 연관 프로젝트 코드 리뷰 (병렬 실행 가능) + └─ 빠른 스캔: POST /api/code-review/quick-scan + └─ 심층 리뷰: POST /api/code-review (비동기, 폴링) + └─ 파일: _workspace/02_code-reviewer_findings.json + └─ CRITICAL 발견 시 → deploy-engineer에게 차단 신호 + +3. deploy-engineer: 리뷰 통과(score ≥ 60)이면 배포 진행 + └─ PRD이면 승인 요청 + └─ 파일: _workspace/03_deploy-engineer_result.md + +4. sla-guardian: 배포 완료 후 SR SLA 상태 갱신 +5. sr-manager: SR 상태를 COMPLETED로 변경 +``` + +## Phase 3: 인시던트 대응 워크플로우 + +``` +1. incident-responder: 인시던트 감지/생성, 심각도 분류 +2. sla-guardian: 영향받는 SR SLA 일시 중지 +3. sr-manager: 인시던트 SR 생성 +4. incident-responder: 온콜 호출, 타임라인 기록, 복구 조율 +5. 복구 완료 → sr-manager SR 종료, sla-guardian SLA 재개 +``` + +## 데이터 전달 프로토콜 + +| 방법 | 용도 | +|------|------| +| 파일 기반 (`_workspace/`) | 대용량 결과, SR 정보, 발견 항목 | +| 메시지 기반 (SendMessage) | 실시간 상태, 차단 신호, 알림 | +| 태스크 기반 (TaskCreate) | 작업 진행상황 추적 | + +파일 컨벤션: `{phase:02d}_{agent}_{artifact}.{ext}` + +## 에러 핸들링 + +| 상황 | 처리 | +|------|------| +| code-reviewer Ollama 연결 실패 | 빠른 스캔으로 폴백, 경고와 함께 계속 | +| deploy-engineer 빌드 실패 | 재시도 1회, 실패 시 sr-manager에 보고 | +| sla-guardian API 오류 | 오류 로그 후 계속 진행 (SLA는 비차단) | +| 에이전트 응답 없음 | 30초 대기 후 재시도, 재실패 시 human escalation | + +## 테스트 시나리오 + +### 정상 흐름: SR → 코드 리뷰 → 배포 +``` +입력: "SR-0042 처리하고 testcase-java-api 코드 리뷰 후 배포해줘" +예상: + 1. sr-manager가 SR-0042 조회 + 2. code-reviewer가 testcase-java-api 빠른 스캔 → 심층 리뷰 + 3. score ≥ 60이면 deploy-engineer 배포 진행 + 4. 완료 후 SR 상태 COMPLETED +``` + +### 에러 흐름: 코드 리뷰 CRITICAL 발견 +``` +입력: "testcase-php-legacy 배포해줘" +예상: + 1. code-reviewer가 quick-scan 수행 + 2. SQL 인젝션, XSS 등 CRITICAL 발견 + 3. deploy-engineer에게 차단 신호 + 4. 사용자에게 "CRITICAL 3건 수정 후 재요청" 안내 +``` diff --git a/.claude/skills/itsm-design-overhaul/SKILL.md b/.claude/skills/itsm-design-overhaul/SKILL.md new file mode 100644 index 0000000..484d8bc --- /dev/null +++ b/.claude/skills/itsm-design-overhaul/SKILL.md @@ -0,0 +1,140 @@ +--- +name: itsm-design-overhaul +description: "GUARDiA ITSM UI(itsm/static/) Variant 스타일 개편 스킬. C:/GUARDiA/screenshot 기준 색상·카드·사이드바·버튼·테이블을 현대화. 다크 테마 유지. 다음 상황에서 반드시 사용: (1) 'ITSM 디자인 바꿔줘', 'ITSM UI 개편'; (2) style.css 색상 토큰 변경; (3) 사이드바·카드·버튼 스타일 개선; (4) 다시 실행, 업데이트, 보완." +--- + +# GUARDiA ITSM UI 개편 스킬 + +## 레퍼런스 +- `C:\GUARDiA\screenshot\` — Variant 디자인 스크린샷 13장 +- 핵심: screenshot9(서비스카드), screenshot10(히어로), screenshot11(섹션) +- 적용 파일: `itsm/static/style.css`, `login.css` + +## 색상 토큰 변환 (style.css :root) + +```css +:root { + /* ── Variant 색상 적용 ── */ + --primary: #00A0C8; /* 시안 — 버튼·링크·강조 */ + --primary-dark: #005A8C; /* 미드블루 — hover */ + --accent: #29B8D8; /* 밝은 시안 — 포인트 */ + --brand-navy: #003366; /* 딥네이비 — 중요 UI */ + --brand-blue: #005A8C; /* 미드블루 */ + + /* 배경 (다크 테마 유지) */ + --main-bg: #001020; /* 더 깊은 네이비 배경 */ + --card-bg: #001e3c; /* 카드 배경 */ + --sidebar-bg: #001530; /* 사이드바 */ + --header-bg: #001020; /* 헤더 */ + + /* 텍스트 */ + --text-main: #e8f0f8; /* 메인 텍스트 */ + --text-muted: #7ba7c4; /* 보조 텍스트 */ + + /* 테두리 */ + --border: rgba(0,160,200,.15); /* 시안 계열 */ + --border-strong: rgba(0,160,200,.30); + + /* 그림자 */ + --shadow-card: 0 4px 20px rgba(0,30,60,.4), 0 1px 4px rgba(0,160,200,.1); + + /* 반경 */ + --radius-card: 12px; + --radius-btn: 8px; + --radius-sm: 6px; +} +``` + +## 사이드바 개편 + +```css +#sidebar { + background: var(--sidebar-bg); + border-right: 1px solid var(--border); + box-shadow: 4px 0 20px rgba(0,0,0,.3); +} +#sidebar-logo { border-bottom: 1px solid var(--border); padding: 18px 20px; } +.nav-item { border-radius: var(--radius-sm); margin: 2px 8px; } +.nav-item:hover { background: rgba(0,160,200,.1); color: var(--primary); } +.nav-item.active { + background: rgba(0,160,200,.15); + border-left: 3px solid var(--primary); + color: var(--primary); + font-weight: 600; +} +``` + +## 카드 개편 + +```css +.card, .stat-card, .dashboard-card { + background: var(--card-bg); + border: 1px solid var(--border); + border-radius: var(--radius-card); + box-shadow: var(--shadow-card); + transition: box-shadow .25s, border-color .25s; +} +.card:hover { border-color: var(--border-strong); box-shadow: 0 8px 32px rgba(0,30,60,.5); } + +/* 통계 카드 상단 컬러 바 */ +.stat-card { border-top: 3px solid var(--primary); } +``` + +## 버튼 개편 + +```css +.btn-primary { + background: var(--primary); + border-radius: var(--radius-btn); + font-weight: 600; + transition: all .2s; +} +.btn-primary:hover { background: var(--primary-dark); box-shadow: 0 4px 12px rgba(0,160,200,.3); } +.btn-secondary { + background: transparent; + border: 1.5px solid var(--primary); + color: var(--primary); + border-radius: var(--radius-btn); +} +``` + +## 테이블 개편 + +```css +.table thead th { + background: rgba(0,30,60,.6); + color: var(--text-muted); + font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; + border-bottom: 1px solid var(--border); +} +.table tbody tr:hover { background: rgba(0,160,200,.05); } +.table td { border-bottom: 1px solid rgba(0,160,200,.08); } +``` + +## 로그인 페이지 개편 + +```css +/* login.css */ +.login-page { + background: linear-gradient(135deg, #001020 0%, #002040 60%, #003060 100%); + min-height: 100vh; display: flex; align-items: center; justify-content: center; +} +.login-card { + background: rgba(0,30,60,.8); + backdrop-filter: blur(20px); + border: 1px solid rgba(0,160,200,.2); + border-radius: 16px; + box-shadow: 0 20px 60px rgba(0,0,0,.5); + padding: 48px 40px; width: 400px; +} +.login-title { color: #fff; font-size: 22px; font-weight: 800; margin-bottom: 8px; } +.login-sub { color: var(--text-muted); font-size: 14px; margin-bottom: 32px; } +``` + +## 배포 방법 + +```bash +# ITSM 서버 적용 +python C:\GUARDiA\deploy_itsm_design.py +systemctl restart guardia +``` diff --git a/.claude/skills/itsm-roadmap/SKILL.md b/.claude/skills/itsm-roadmap/SKILL.md new file mode 100644 index 0000000..b3afe75 --- /dev/null +++ b/.claude/skills/itsm-roadmap/SKILL.md @@ -0,0 +1,128 @@ +--- +name: itsm-roadmap +description: "GUARDiA ITSM 추가 개발 제안 및 로드맵 관리 스킬. 기존 구현 현황 분석, 신규 기능 우선순위 결정, 공수 추정, 로드맵 문서 작성을 수행한다. 다음 상황에서 반드시 사용: (1) '추가 개발 제안', '다음에 뭘 만들까', '로드맵 작성' 요청; (2) 'ITSM 고도화', '신규 기능 기획', '우선순위 결정' 요청; (3) 제안서·기획서 MD 파일 생성; (4) 기존 70+ 라우터와 중복 없는 신규 기능 발굴; (5) 다시 실행, 업데이트, 수정, 보완 요청. FastAPI + SQLAlchemy + paramiko 기존 패턴을 반드시 준수한다." +--- + +# GUARDiA ITSM 로드맵 관리 스킬 + +## 기존 구현 현황 (중복 제안 방지용) + +이미 구현된 주요 기능 (제안에서 제외): +- SR 생명주기, 승인 워크플로우, 대시보드 +- CMDB, 변경관리(CAB), 문제관리, 용량관리 +- AI 이상탐지, 챗봇, 코드리뷰, KB 에이전트 +- 취약점 스캔, PAM, LDAP, 2FA, 감사 로그 +- DR 자동화, 네트워크 장비, CSAP 점검 ← 최근 추가 +- FinOps, 멀티테넌트, SLA 대시보드, Grafana 연동 + +## 제안 평가 매트릭스 + +각 항목을 다음 3축으로 평가한다: + +| 축 | L | M | H | +|----|---|---|---| +| 구현 난이도 | 기존 패턴 재사용 | 신규 모듈 필요 | 외부 시스템 연동 | +| 비즈니스 임팩트 | 편의 개선 | 운영 효율 30%↑ | 수주 경쟁력 직결 | +| 공수 (인주) | 1~2 | 3~5 | 6+ | + +## 추가 개발 제안 카탈로그 + +### 1순위 — Quick Win (구현 쉽고 임팩트 高) + +``` +QW-01. 자동화 플레이북 (playbook.py) + - 반복 운영 작업 시나리오 템플릿 저장·실행 + - 기존 ssh.py + batch.py 패턴 재사용 + - 난이도: L | 임팩트: H | 공수: 2주 + +QW-02. 서버 성능 실시간 대시보드 (realtime_metrics.py) + - SSH → top/vmstat/df 주기적 수집 → SSE 스트리밍 + - 기존 anomaly.py + ssh.py 패턴 재사용 + - 난이도: L | 임팩트: H | 공수: 2주 + +QW-03. 기술문서 AI 자동 생성 (kb_auto_gen.py) + - 인시던트/SR 해결 시 KB 아티클 자동 초안 생성 + - 기존 kb_agent.py + Ollama 패턴 재사용 + - 난이도: L | 임팩트: M | 공수: 1주 +``` + +### 2순위 — 중기 (공수 3~5주) + +``` +MID-01. 멀티사이트 통합 관제 (multisite_console.py) + - 여러 기관 서버 상태를 단일 대시보드에서 조회 + - 기관별 헬스체크 배치 + 집계 API + - 난이도: M | 임팩트: H | 공수: 4주 + +MID-02. SLA 예측 분석 (sla_predict.py) + - ML 기반 SLA 위반 사전 예측 (predictive.py 확장) + - 과거 SR 데이터 → 회귀 모델 학습 + - 난이도: M | 임팩트: H | 공수: 4주 + +MID-03. 공공기관 온보딩 자동화 (onboarding_wizard.py) + - 신규 기관 등록 → CMDB 초기화 → 담당자 초대 → 라이선스 발급 일괄 처리 + - 기존 institutions.py + license.py 연계 + - 난이도: M | 임팩트: M | 공수: 3주 + +MID-04. 웹 터미널 (web_terminal.py) + - PAM 연계 브라우저 내 SSH 터미널 (xterm.js) + - 기존 pam.py + ssh.py 확장, 세션 로깅 + - 난이도: M | 임팩트: H | 공수: 5주 +``` + +### 3순위 — 장기 (공수 6주+) + +``` +LONG-01. AI 이상탐지 자가학습 UI (anomaly_tuner.py) + - 임계값/민감도 조정 Web UI + - 기관별 기준선 커스터마이징 + - 난이도: H | 임팩트: M | 공수: 6주 + +LONG-02. QR코드 자산 관리 (qr_asset.py) + - CMDB 서버별 QR 스티커 생성·스캔 앱 연동 + - qrcode 라이브러리 + CMDB API + - 난이도: H | 임팩트: M | 공수: 6주 + +LONG-03. 감사 대시보드 강화 (audit_visual.py) + - SHA-256 해시체인 시각화 (D3.js SVG) + - 감사 이벤트 타임라인 + 이상 감지 + - 난이도: H | 임팩트: M | 공수: 7주 +``` + +## 문서 생성 패턴 + +`docs/ITSM_NEXT_FEATURES.md` 생성 시 다음 구조를 따른다: + +```markdown +# GUARDiA ITSM 추가 개발 제안서 + +> 버전: X.X | 작성일: YYYY-MM-DD + +## 요약 +- 제안 항목 수: N개 +- 총 예상 공수: N인주 +- 즉시 착수 추천: 항목명 + +## 1순위 (Quick Win) +... + +## 2순위 (중기) +... + +## 3순위 (장기) +... + +## 로드맵 타임라인 +| 월 | 항목 | 담당 에이전트 | +... +``` + +## 구현 시작 가이드 (제안 → 구현 전환) + +특정 항목 구현 결정 시: +1. `roadmap-planner`가 기술 명세 작성 +2. 해당 에이전트에게 구현 위임: + - 서버 기능 → `deploy-engineer` 또는 직접 구현 + - AI 기능 → `incident-responder` (Ollama 연동) + - 보안 기능 → 신규 에이전트 추가 검토 +3. CLAUDE.md 변경 이력 업데이트 diff --git a/.claude/skills/manager-design-overhaul/SKILL.md b/.claude/skills/manager-design-overhaul/SKILL.md new file mode 100644 index 0000000..bb97898 --- /dev/null +++ b/.claude/skills/manager-design-overhaul/SKILL.md @@ -0,0 +1,132 @@ +--- +name: manager-design-overhaul +description: "GUARDiA Manager UI(manager/frontend/src/) Variant 스타일 개편 스킬. C:/GUARDiA/screenshot 기준 라이트 테마 + 네이비/시안 Variant 색상 적용. 다음 상황에서 반드시 사용: (1) 'Manager 디자인 바꿔줘', 'Manager UI 개편'; (2) Sidebar·StatCard·DataTable 스타일 변경; (3) Dashboard 레이아웃 개선; (4) 다시 실행, 업데이트, 보완." +--- + +# GUARDiA Manager UI 개편 스킬 + +## 레퍼런스 +- `C:\GUARDiA\screenshot\` — Variant 디자인 스크린샷 +- 핵심: screenshot9(서비스카드 3×2), screenshot10(화이트헤더+히어로), screenshot11(파트너바+섹션) +- 적용 위치: `manager/frontend/src/` + +## 글로벌 CSS 변수 (App.tsx 또는 global.css) + +```css +:root { + --m-navy: #003366; /* 딥네이비 */ + --m-blue: #005A8C; /* 미드블루 */ + --m-cyan: #00A0C8; /* 시안 포인트 */ + --m-cyan-lt: #E8F7FB; /* 연시안 배경 */ + --m-blue-lt: #E8F0F8; /* 연파랑 배경 */ + --m-bg: #F8FAFC; /* 페이지 배경 */ + --m-card: #FFFFFF; /* 카드 배경 */ + --m-border: #E2E8F0; /* 테두리 */ + --m-text: #1E293B; /* 메인 텍스트 */ + --m-muted: #64748B; /* 보조 텍스트 */ + --m-shadow: 0 4px 12px rgba(0,51,102,.08); + --m-radius: 12px; +} +``` + +## Sidebar.tsx 개편 + +```tsx +// 활성 메뉴 스타일 (CSS-in-JS) +const activeStyle = { + background: 'var(--m-blue-lt)', + color: 'var(--m-navy)', + borderLeft: '3px solid var(--m-cyan)', + fontWeight: 700, +}; +const hoverStyle = { + background: 'var(--m-blue-lt)', + color: 'var(--m-navy)', +}; +// 섹션 헤더 +const sectionHeader = { + fontSize: 10, fontWeight: 700, + letterSpacing: '.1em', textTransform: 'uppercase', + color: 'var(--m-cyan)', padding: '12px 16px 4px', +}; +``` + +## StatCard.tsx 개편 (screenshot9 카드 스타일) + +```tsx +// Variant 서비스 카드 패턴 적용 +const cardStyle = { + background: '#fff', + borderRadius: 'var(--m-radius)', + border: '1px solid var(--m-border)', + boxShadow: 'var(--m-shadow)', + padding: '24px', + borderTop: '3px solid var(--m-cyan)', // 상단 시안 바 + transition: 'all .25s', +}; +// 아이콘 박스 (screenshot9 연파랑 박스) +const iconBoxStyle = { + width: 52, height: 52, + background: 'var(--m-blue-lt)', + borderRadius: 10, + display: 'flex', alignItems: 'center', justifyContent: 'center', + marginBottom: 16, +}; +``` + +## DataTable.tsx 개편 + +```tsx +// 헤더 스타일 +const thStyle = { + background: 'var(--m-navy)', + color: 'rgba(255,255,255,.85)', + fontSize: 11, fontWeight: 700, + letterSpacing: '.06em', textTransform: 'uppercase', + padding: '10px 14px', +}; +// 행 호버 +const trHoverStyle = { background: 'var(--m-blue-lt)' }; +// 페이지네이션 활성 +const pageActivStyle = { + background: 'var(--m-cyan)', color: '#fff', + borderRadius: 6, fontWeight: 700, +}; +``` + +## GNB.tsx 개편 + +```tsx +// 화이트 헤더 (screenshot10 패턴) +const gnbStyle = { + background: '#fff', + borderBottom: '1px solid var(--m-border)', + boxShadow: '0 1px 8px rgba(0,51,102,.08)', +}; +// 브랜드 텍스트 +const brandStyle = { + color: 'var(--m-navy)', fontWeight: 800, fontSize: 16, +}; +``` + +## Dashboard.tsx 레이아웃 + +```tsx +// 3열 StatCard 그리드 +
+ {/* StatCards */} +
+// 차트 카드 +
+``` + +## 배포 방법 + +```bash +cd manager/frontend && npm run build +# 빌드 결과를 /var/www/manager/에 복사 후 재시작 +``` diff --git a/.claude/skills/network-devices/SKILL.md b/.claude/skills/network-devices/SKILL.md new file mode 100644 index 0000000..aa52693 --- /dev/null +++ b/.claude/skills/network-devices/SKILL.md @@ -0,0 +1,157 @@ +--- +name: network-devices +description: "GUARDiA 네트워크 장비 관리 구현 스킬. 스위치/라우터/방화벽의 SSH 기반 설정 백업, 변경 감지, 명령 실행, 토폴로지 관리를 FastAPI + paramiko 패턴으로 구현한다. 다음 상황에서 반드시 사용: (1) '네트워크 장비', '스위치', '라우터', '방화벽' 관리 구현 요청; (2) network_devices.py 라우터 또는 core/network_scanner.py 작업; (3) 장비 설정 백업/비교/변경감지 구현; (4) 네트워크 토폴로지 구현; (5) 다시 실행, 업데이트, 보완 요청." +--- + +# 네트워크 장비 관리 구현 스킬 + +## 구현 대상 파일 +- `itsm/core/network_scanner.py` — 장비 접속/명령 실행/백업 로직 +- `itsm/routers/network_devices.py` — FastAPI 라우터 + +## DB 모델 (models.py에 추가) + +```python +class NetworkDevice(Base): + __tablename__ = "tb_network_device" + id = Column(Integer, primary_key=True) + device_name = Column(String(100), nullable=False) + device_type = Column(String(30)) # SWITCH | ROUTER | FIREWALL | LOAD_BALANCER + vendor = Column(String(30)) # CISCO | HUAWEI | JUNIPER | PIOLINK | SECUI | RADWARE + model = Column(String(100)) + os_type = Column(String(30)) # cisco_ios | huawei_vrp | junos | linux + ip_addr = Column(String(45)) # NOT exposed in API + ssh_user = Column(String(50)) # NOT exposed + ssh_pw_enc = Column(Text) # AES-256, NEVER exposed + ssh_port = Column(Integer, default=22) + location = Column(String(200)) + inst_id = Column(Integer, ForeignKey("tb_inst_meta.id")) + is_active = Column(Boolean, default=True) + last_backup_at = Column(DateTime) + created_at = Column(DateTime, default=func.now()) + backups = relationship("NetworkConfigBackup", back_populates="device", + cascade="all, delete-orphan") + +class NetworkConfigBackup(Base): + __tablename__ = "tb_network_backup" + id = Column(Integer, primary_key=True) + device_id = Column(Integer, ForeignKey("tb_network_device.id")) + config_text = Column(Text) # 설정 전문 (암호화 선택) + config_hash = Column(String(64)) # SHA-256 + backup_type = Column(String(20)) # SCHEDULED | MANUAL | PRE_CHANGE + backed_up_at = Column(DateTime, default=func.now()) + backed_up_by = Column(String(100)) + device = relationship("NetworkDevice", back_populates="backups") +``` + +## 벤더별 표준 명령어 매핑 + +```python +DEVICE_COMMANDS = { + "cisco_ios": { + "get_config": "show running-config", + "get_version": "show version", + "get_interfaces": "show interfaces status", + "get_vlan": "show vlan brief", + "get_arp": "show arp", + "get_route": "show ip route", + "save_config": "write memory", + }, + "huawei_vrp": { + "get_config": "display current-configuration", + "get_version": "display version", + "get_interfaces": "display interface brief", + "get_vlan": "display vlan", + "get_arp": "display arp all", + "save_config": "save force", + }, + "junos": { + "get_config": "show configuration | display set", + "get_version": "show version", + "get_interfaces": "show interfaces terse", + "get_route": "show route", + }, + "linux": { # PIOLINK, SECUI 방화벽 (Linux 기반) + "get_config": "cat /etc/fw/rules.conf 2>/dev/null || iptables-save", + "get_version": "cat /etc/os-release", + "get_interfaces": "ip addr show", + "get_route": "ip route show", + }, +} + +# 위험 명령어 차단 목록 (실행 전 검증) +BLOCKED_COMMANDS = [ + "write erase", "factory-reset", "reload", "reboot", + "rm -rf", "mkfs", "fdisk", "format", + "no service", "delete flash:", +] +``` + +## core/network_scanner.py 구현 패턴 + +```python +import asyncio, difflib, hashlib +import paramiko +from sqlalchemy.ext.asyncio import AsyncSession + +class NetworkScanner: + def _is_command_safe(self, command: str) -> bool: + """위험 명령어 차단.""" + cmd_lower = command.lower() + return not any(blocked in cmd_lower for blocked in BLOCKED_COMMANDS) + + async def execute_command(self, device: NetworkDevice, + command: str, decrypt_fn) -> dict: + """SSH 명령 실행 (벤더 무관 인터페이스).""" + if not self._is_command_safe(command): + return {"success": False, "error": "차단된 명령어입니다."} + # paramiko SSH 접속 → 명령 실행 → stdout 반환 + ... + + async def backup_config(self, db: AsyncSession, device: NetworkDevice, + backup_type: str, user: str) -> NetworkConfigBackup: + """설정 백업: 표준 명령 실행 → DB 저장.""" + config_cmd = DEVICE_COMMANDS.get(device.os_type, {}).get("get_config", "") + result = await self.execute_command(device, config_cmd, decrypt_fn) + config_text = result["stdout"] + config_hash = hashlib.sha256(config_text.encode()).hexdigest() + backup = NetworkConfigBackup( + device_id=device.id, + config_text=config_text, + config_hash=config_hash, + backup_type=backup_type, + backed_up_by=user, + ) + db.add(backup) + await db.commit() + return backup + + def diff_configs(self, old: str, new: str) -> list[str]: + """unified diff 형식으로 설정 변경 사항 반환.""" + return list(difflib.unified_diff( + old.splitlines(), new.splitlines(), + lineterm="", n=3, + )) +``` + +## API 응답에서 민감 정보 제외 + +```python +class NetworkDeviceOut(BaseModel): + id: int + device_name: str + device_type: str + vendor: str + model: Optional[str] + os_type: str + # ip_addr, ssh_user, ssh_pw_enc 절대 포함 금지 + location: Optional[str] + inst_id: Optional[int] + is_active: bool + last_backup_at: Optional[datetime] +``` + +## 설정 차이 탐지 및 알림 +- 스케줄 백업 시 이전 백업과 diff → 변경 감지 시 SSE 이벤트 발행 +- diff 결과가 있으면 tb_audit_log에 "설정 변경 감지" 기록 +- 변경된 라인 수가 10줄 이상이면 MEDIUM 알림, 50줄 이상이면 HIGH 알림 diff --git a/.claude/skills/rpa-orchestrator/SKILL.md b/.claude/skills/rpa-orchestrator/SKILL.md new file mode 100644 index 0000000..96c4a36 --- /dev/null +++ b/.claude/skills/rpa-orchestrator/SKILL.md @@ -0,0 +1,150 @@ +--- +name: rpa-orchestrator +description: "GUARDiA ITSM RPA 봇 오케스트레이터. ITSM 반복 업무 자동화, RPA 작업 등록/실행/스케줄링, 입력 Validation 학습, 실행 이력 조회를 총괄한다. 다음 상황에서 반드시 사용: (1) 'RPA', '봇 자동화', '자동 처리', '반복 작업 자동화' 요청; (2) 'validation 학습', '입력 규칙 학습', 'API 스키마 학습' 요청; (3) 'RPA 작업 등록', 'RPA 실행', 'RPA 스케줄' 요청; (4) 'SR 자동 접수', 'SSL 만료 자동 알림', '정기 점검 자동화' 요청; (5) 'RPA 이력', 'RPA 실행 결과', 'RPA 현황' 조회; (6) 다시 실행, 업데이트, 수정, 보완, 재실행 요청." +--- + +# GUARDiA ITSM RPA 오케스트레이터 + +RPA 봇(자동화)과 Validation 학습을 조율하는 통합 워크플로우. +**실행 모드: 파이프라인 (에이전트 팀)** — validation-learner → rpa-bot → 기존 에이전트 연동. + +--- + +## 에이전트 팀 구성 + +| 에이전트 | 역할 | +|---------|------| +| validation-learner | ITSM API 스키마 스캔 → validation 규칙 DB 저장 | +| rpa-bot | 학습 규칙 참조 → ITSM API 자동 호출 실행 | +| incident-responder | RPA 실행 실패 → 인시던트 자동 생성 | + +--- + +## Phase 0: 컨텍스트 확인 + +사용자 요청 분류: +- **학습 요청** ("validation 학습해줘", "API 스키마 학습") → Phase 1만 실행 +- **실행 요청** ("RPA 실행", "자동 처리") → Phase 2 실행 (학습 규칙이 없으면 Phase 1 선행) +- **등록 요청** ("RPA 작업 추가", "봇 등록") → Phase 3 실행 +- **조회 요청** ("RPA 현황", "실행 이력") → `GET /api/rpa/tasks`, `GET /api/rpa/executions` + +--- + +## Phase 1: Validation 학습 + +`validation-learner` 서브 에이전트 호출. + +``` +# 전체 학습 (최초 또는 엔드포인트 추가 후) +POST /api/rpa/validations/learn +{ + "endpoints": "all", # 또는 특정 endpoint 목록 + "overwrite": true +} + +응답: { learned: N, endpoints: [...] } +``` + +학습 순서: +1. FastAPI OpenAPI 스펙 수집: `GET /api/openapi.json` +2. 각 `POST`/`PUT` 엔드포인트의 `requestBody.schema` 파싱 +3. 필드별 rules 추출 → `tb_rpa_validation` upsert +4. 학습 결과 요약 출력 + +--- + +## Phase 2: RPA 작업 실행 + +`rpa-bot` 에이전트 호출. 실행 전 반드시 validation 확인. + +``` +# 단발성 즉시 실행 +POST /api/rpa/execute +{ + "task_type": "SR_CREATE" | "SR_STATUS_UPDATE" | "SHELL_EXEC" | "SSL_CHECK", + "payload": { ... }, # 입력 데이터 (validation 학습 규칙 준수 필수) + "dry_run": false # true 시 검증만, API 호출 없음 +} + +# 스케줄 작업 실행 (등록된 태스크) +POST /api/rpa/tasks/{task_id}/run +``` + +**실행 흐름:** +``` +payload 입력 + → validation 검증 (tb_rpa_validation 규칙) + → 실패: 오류 필드 + 위반 규칙 상세 반환 (실행 중단) + → 성공: API 호출 + → 성공: tb_rpa_execution 기록 (SUCCESS) + → 실패: 재시도 3회 → incident-responder 인시던트 생성 +``` + +--- + +## Phase 3: RPA 작업 등록/관리 + +``` +# 작업 등록 +POST /api/rpa/tasks +{ + "task_name": "SSL 만료 30일 전 SR 자동 생성", + "task_type": "SR_CREATE", + "schedule": "0 9 * * *", # cron: 매일 09:00 + "payload_template": { + "sr_type": "INQUIRY", + "priority": "HIGH", + "title": "SSL 인증서 만료 예정 점검", + "description": "{{server_name}} SSL 만료일 {{ssl_expire_date}}" + }, + "is_active": true +} + +# 목록 조회 +GET /api/rpa/tasks?page=1&size=20&is_active=true + +# 실행 이력 +GET /api/rpa/executions?task_id={id}&status=FAILED +``` + +--- + +## Phase 4: 결과 보고 + +실행 완료 후 요약: +- 실행된 RPA 작업 목록 +- 성공/실패 건수 +- 실패 원인 (validation 오류 or API 오류) +- 생성된 SR/인시던트 ID 목록 + +--- + +## 주요 API 엔드포인트 + +| Method | Path | 설명 | +|--------|------|------| +| POST | /api/rpa/validations/learn | Validation 학습 트리거 | +| GET | /api/rpa/validations | 학습된 규칙 목록 | +| POST | /api/rpa/tasks | RPA 작업 등록 | +| GET | /api/rpa/tasks | 작업 목록 | +| PUT | /api/rpa/tasks/{id} | 작업 수정 | +| DELETE | /api/rpa/tasks/{id} | 작업 삭제 | +| POST | /api/rpa/tasks/{id}/run | 즉시 실행 | +| POST | /api/rpa/execute | 단발성 즉시 실행 | +| GET | /api/rpa/executions | 실행 이력 | +| GET | /api/rpa/executions/{id} | 실행 상세 | + +--- + +## 테스트 시나리오 + +**정상 흐름:** +1. `POST /api/rpa/validations/learn` → 전체 학습 +2. `POST /api/rpa/execute` with `dry_run: true` → validation 통과 확인 +3. `POST /api/rpa/execute` with `dry_run: false` → 실제 SR 생성 +4. `GET /api/rpa/executions` → 실행 이력 확인 + +**에러 흐름:** +1. 필수 필드 누락 → `validation 오류: title 필드 필수` 반환 +2. enum 오류 → `sr_type 허용값: DEPLOY|RESTART|LOG|INQUIRY|OTHER` 반환 +3. API 5xx → 3회 재시도 → incident-responder 인시던트 생성 diff --git a/.claude/skills/rpa-validation/SKILL.md b/.claude/skills/rpa-validation/SKILL.md new file mode 100644 index 0000000..178b2bd --- /dev/null +++ b/.claude/skills/rpa-validation/SKILL.md @@ -0,0 +1,116 @@ +--- +name: rpa-validation +description: "RPA 입력 항목 Validation 학습 스킬. ITSM 프로젝트 소스코드(models.py, routers/)에서 Pydantic 스키마를 파싱하여 모든 입력 항목의 validation 규칙(타입·필수·제약·enum)을 학습하고 DB에 저장한다. 다음 상황에서 반드시 사용: (1) 'validation 학습', 'API 스키마 학습', '입력 규칙 학습'; (2) 'Pydantic 모델 파싱', '소스 분석'; (3) RPA 봇 실행 전 입력 검증 규칙 갱신; (4) 새 라우터/모델 추가 후 재학습; (5) 다시 실행, 업데이트, 보완." +--- + +# RPA Validation 학습 스킬 + +ITSM 프로젝트 소스코드를 직접 분석하여 모든 입력 항목의 validation 규칙을 학습한다. + +--- + +## 학습 전략: 소스 기반 정적 분석 + +OpenAPI JSON 대신 **소스코드를 직접 파싱**한다. +이유: OpenAPI JSON은 일부 validator가 누락되고, 소스 파싱이 더 정확하다. + +### 학습 대상 파일 + +``` +itsm/models.py ← Pydantic BaseModel (SRCreate, SRStatusUpdate, 등) +itsm/routers/*.py ← 각 라우터에서 사용하는 스키마 매핑 +``` + +### 파싱 방법 + +`POST /api/rpa/validations/learn` 호출 시 서버가: +1. `itsm/models.py` AST 파싱 +2. `class XXXCreate(BaseModel)` / `class XXXUpdate(BaseModel)` 클래스 탐색 +3. 각 클래스의 필드 분석: + +```python +# 분석 대상 패턴 +class SRCreate(BaseModel): + sr_type: SRType # Enum → allowed_values 추출 + title: str # required str + description: Optional[str] = None # optional + priority: Priority = Priority.MEDIUM # enum + default + server_id: Optional[int] = None # optional int + inst_id: int # required int + assigned_to: Optional[str] = None +``` + +### 추출되는 규칙 구조 + +```json +{ + "endpoint": "POST /api/tasks", + "schema_class": "SRCreate", + "field_name": "sr_type", + "field_type": "enum", + "is_required": true, + "allowed_values": ["DEPLOY", "RESTART", "LOG", "INQUIRY", "OTHER"], + "default": null, + "constraints": {} +} +``` + +--- + +## 학습 API + +``` +POST /api/rpa/validations/learn +Body: { "source_path": "auto", "overwrite": true } + +응답: +{ + "learned": 127, + "schemas": ["SRCreate", "SRStatusUpdate", "InstitutionCreate", ...], + "endpoints_mapped": 43, + "errors": [] +} +``` + +--- + +## 검증 적용 + +RPA 봇이 `POST /api/rpa/execute` 호출 시: + +```python +# 내부 검증 흐름 +rules = db.query(RPAValidationRule).filter_by(endpoint="POST /api/tasks") +for rule in rules: + field_val = payload.get(rule.field_name) + if rule.is_required and field_val is None: + raise RPAValidationError(f"{rule.field_name}: 필수 항목") + if rule.field_type == "enum" and field_val not in rule.allowed_values: + raise RPAValidationError( + f"{rule.field_name}: 허용값 {rule.allowed_values} 중 하나" + ) + if rule.constraints.get("max_length") and len(str(field_val)) > rule.constraints["max_length"]: + raise RPAValidationError(f"{rule.field_name}: 최대 {rule.constraints['max_length']}자") +``` + +--- + +## 주요 학습 대상 스키마 + +| 스키마 | 엔드포인트 | 핵심 필드 | +|--------|----------|---------| +| SRCreate | POST /api/tasks | sr_type(enum), title(required), inst_id(required) | +| SRStatusUpdate | PATCH /api/tasks/{id}/status | status(enum), comment | +| InstitutionCreate | POST /api/institutions | inst_code, inst_name | +| ServerCreate | POST /api/servers | server_name, inst_id, server_role | +| ApprovalCreate | POST /api/approvals | sr_id, result(enum) | +| IncidentCreate | POST /api/incidents | title, severity(enum), server_id | + +--- + +## 재학습 트리거 조건 + +- 신규 라우터 추가 후 +- models.py 스키마 변경 후 +- RPA 봇 validation 오류 급증 시 +- 주 1회 자동 재학습 (스케줄러) diff --git a/.claude/skills/scraping-orchestrator/SKILL.md b/.claude/skills/scraping-orchestrator/SKILL.md new file mode 100644 index 0000000..b7fea54 --- /dev/null +++ b/.claude/skills/scraping-orchestrator/SKILL.md @@ -0,0 +1,74 @@ +--- +name: scraping-orchestrator +description: "GUARDiA ITSM 웹 스크랩핑 봇 오케스트레이터. URL 스크랩, DB 저장, 상태관리(DRAFT/PUBLISHED/DELETED), 메신저 알림, Manager UI 연동을 조율한다. 다음 상황에서 반드시 사용: (1) '스크랩', '웹 수집', 'URL 수집', '스크랩핑 봇' 요청; (2) '게시', '원복', '스크랩 삭제' 요청; (3) '!scrap' 봇 명령어 처리; (4) 스크랩 결과 조회, 타겟 등록; (5) 다시 실행, 업데이트, 수정, 보완 요청." +--- + +# GUARDiA 스크랩핑 오케스트레이터 + +## 에이전트 팀 + +| 에이전트 | 역할 | +|---------|------| +| scraping-bot | URL 스크랩 실행, 상태 전환, 메신저 알림 | + +## 상태 흐름 + +``` +URL 등록(ScrapingTarget) + → 즉시 또는 스케줄 스크랩 + → DRAFT (저장됨) + → PUBLISHED (게시 + 메신저 알림) + → DELETED (소프트 삭제) + → DRAFT (원복) +``` + +## Phase 0: 요청 분류 + +- **타겟 등록** → `POST /api/scraping/targets` +- **즉시 스크랩** → `POST /api/scraping/run` +- **결과 조회** → `GET /api/scraping/results` +- **게시** → `POST /api/scraping/results/{id}/publish` +- **삭제** → `DELETE /api/scraping/results/{id}` +- **원복** → `POST /api/scraping/results/{id}/restore` + +## Phase 1: 스크랩 실행 + +``` +POST /api/scraping/run +{ "url": "...", "selector": ".content", "target_id": null } + +응답: { id, title, content, status: "DRAFT", scraped_at } +``` + +## Phase 2: 게시 + +``` +POST /api/scraping/results/{id}/publish +{ "room": "ops", "message": "커스텀 메시지 (선택)" } + +→ status: PUBLISHED +→ POST /api/messenger/webhook (scrap_published 이벤트) +``` + +## Phase 3: 삭제/원복 + +``` +DELETE /api/scraping/results/{id} → status: DELETED +POST /api/scraping/results/{id}/restore → status: DRAFT +``` + +## 봇 명령어 (messenger.py) + +| 명령어 | API 호출 | +|--------|---------| +| `!scrap ` | POST /api/scraping/run | +| `!scrap list [n]` | GET /api/scraping/results?size=n | +| `!scrap publish ` | POST /api/scraping/results/{id}/publish | +| `!scrap del ` | DELETE /api/scraping/results/{id} | +| `!scrap restore ` | POST /api/scraping/results/{id}/restore | +| `!scrap status ` | GET /api/scraping/results/{id} | + +## 테스트 시나리오 + +정상: POST run → DRAFT → publish → PUBLISHED → messenger 수신 +오류: 존재하지 않는 URL → status=FAILED, 서비스 무중단 diff --git a/.claude/skills/sr-lifecycle/SKILL.md b/.claude/skills/sr-lifecycle/SKILL.md new file mode 100644 index 0000000..f8f67a6 --- /dev/null +++ b/.claude/skills/sr-lifecycle/SKILL.md @@ -0,0 +1,67 @@ +--- +name: sr-lifecycle +description: "GUARDiA SR(서비스 요청) 생명주기 관리 스킬. (1) SR 생성·조회·상태변경·완료 처리; (2) 담당자 배정 및 워크로드 분산; (3) SR 대량 처리, 필터링, 우선순위 재조정; (4) '서비스 요청 처리', 'SR 접수', '티켓 관리' 요청 시 사용. SLA 계산·에스컬레이션은 sla-guardian 스킬 참조." +--- + +# SR 생명주기 스킬 + +## 상태 흐름 +``` +OPEN → IN_PROGRESS → WAITING_CUSTOMER → RESOLVED → CLOSED + ↓ (SLA 위반) + ESCALATED +``` + +## 주요 API + +### SR 목록 조회 +``` +GET /api/tasks?status=OPEN&priority=HIGH&limit=20 +``` + +### SR 생성 +``` +POST /api/tasks +{ + "title": "서비스 요청 제목", + "description": "상세 설명", + "priority": "HIGH", + "sr_type": "INCIDENT", + "requested_by": "user@company.com" +} +``` + +### 상태 변경 +``` +PATCH /api/tasks/{id}/status +{ "status": "IN_PROGRESS", "note": "처리 시작" } +``` + +### 담당자 배정 +``` +POST /api/assign/{sr_id} +{ "assignee": "engineer_username", "reason": "배정 사유" } +``` + +## 우선순위별 처리 기준 + +| 우선순위 | SLA 기준 | 대응 | +|---------|---------|------| +| CRITICAL | 2h | 즉시 인시던트 생성, 온콜 호출 | +| HIGH | 4h | 즉시 배정, 30분마다 상태 확인 | +| MEDIUM | 8h | 당일 처리 | +| LOW | 48h | 다음 영업일 내 처리 | + +## 라이선스 제한 주의 + +SR 생성 자체는 라이선스 에디션 제한을 받지 않는다. 단, SR에 연관된 기관·서버 등록은 에디션 한도를 적용받는다. + +| 작업 | COMMUNITY | STANDARD | ENTERPRISE | +|------|-----------|----------|------------| +| SR 생성 | ✅ | ✅ | ✅ | +| 기관 등록 | 최대 1개 | 최대 50개 | 무제한 | +| 서버 등록 | 최대 20개 | 최대 500개 | 무제한 | +| AI 에이전트 연동 | ❌ | ✅ | ✅ | +| CICD/배포 자동화 | ❌ | ❌ | ✅ | + +한도 초과 시 기관/서버 생성 API가 HTTP 403을 반환한다. 라이선스 갱신 전까지 기존 SR 처리는 정상 동작한다.