diff --git a/.claude/agents/code-reviewer.md b/.claude/agents/code-reviewer.md deleted file mode 100644 index 1294407..0000000 --- a/.claude/agents/code-reviewer.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -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 deleted file mode 100644 index ad6fd3f..0000000 --- a/.claude/agents/csap-auditor.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -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 deleted file mode 100644 index c581a55..0000000 --- a/.claude/agents/deploy-engineer.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -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 deleted file mode 100644 index e663710..0000000 --- a/.claude/agents/dr-coordinator.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -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 deleted file mode 100644 index 0fcc2ca..0000000 --- a/.claude/agents/incident-responder.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -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 deleted file mode 100644 index 6aef027..0000000 --- a/.claude/agents/itsm-ui-refactor.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -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 deleted file mode 100644 index 2703a89..0000000 --- a/.claude/agents/manager-ui-refactor.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -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 deleted file mode 100644 index d3d254b..0000000 --- a/.claude/agents/network-guardian.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -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 deleted file mode 100644 index ecc86a0..0000000 --- a/.claude/agents/roadmap-planner.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -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 deleted file mode 100644 index 773a4db..0000000 --- a/.claude/agents/rpa-bot.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -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 deleted file mode 100644 index 8fb62a0..0000000 --- a/.claude/agents/scraping-bot.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -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 deleted file mode 100644 index 01ba445..0000000 --- a/.claude/agents/sla-guardian.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -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 deleted file mode 100644 index dcb3bd2..0000000 --- a/.claude/agents/sr-manager.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -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 deleted file mode 100644 index 4d12f74..0000000 --- a/.claude/agents/validation-learner.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -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 deleted file mode 100644 index 35b2edf..0000000 --- a/.claude/skills/code-review/SKILL.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -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 deleted file mode 100644 index c431fbd..0000000 --- a/.claude/skills/code-review/references/security-patterns.md +++ /dev/null @@ -1,61 +0,0 @@ -# 보안 취약점 패턴 참조 - -## 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 deleted file mode 100644 index e3e8ca3..0000000 --- a/.claude/skills/csap-compliance/SKILL.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -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 deleted file mode 100644 index b0ab818..0000000 --- a/.claude/skills/deploy-pipeline/SKILL.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -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 deleted file mode 100644 index 14b451c..0000000 --- a/.claude/skills/dr-automation/SKILL.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -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 deleted file mode 100644 index 11c4050..0000000 --- a/.claude/skills/guardia-design-orchestrator/SKILL.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -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 deleted file mode 100644 index 078b60b..0000000 --- a/.claude/skills/guardia-orchestrator/SKILL.md +++ /dev/null @@ -1,181 +0,0 @@ ---- -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 deleted file mode 100644 index 484d8bc..0000000 --- a/.claude/skills/itsm-design-overhaul/SKILL.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -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 deleted file mode 100644 index b3afe75..0000000 --- a/.claude/skills/itsm-roadmap/SKILL.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -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 deleted file mode 100644 index bb97898..0000000 --- a/.claude/skills/manager-design-overhaul/SKILL.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -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 deleted file mode 100644 index aa52693..0000000 --- a/.claude/skills/network-devices/SKILL.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -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 deleted file mode 100644 index 96c4a36..0000000 --- a/.claude/skills/rpa-orchestrator/SKILL.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -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 deleted file mode 100644 index 178b2bd..0000000 --- a/.claude/skills/rpa-validation/SKILL.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -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 deleted file mode 100644 index b7fea54..0000000 --- a/.claude/skills/scraping-orchestrator/SKILL.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -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 deleted file mode 100644 index f8f67a6..0000000 --- a/.claude/skills/sr-lifecycle/SKILL.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -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 처리는 정상 동작한다. diff --git a/core/__pycache__/__init__.cpython-314.pyc b/core/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..e40168f Binary files /dev/null and b/core/__pycache__/__init__.cpython-314.pyc differ diff --git a/core/__pycache__/agents.cpython-314.pyc b/core/__pycache__/agents.cpython-314.pyc new file mode 100644 index 0000000..70b1c3c Binary files /dev/null and b/core/__pycache__/agents.cpython-314.pyc differ diff --git a/core/__pycache__/anomaly.cpython-314.pyc b/core/__pycache__/anomaly.cpython-314.pyc new file mode 100644 index 0000000..fa27a08 Binary files /dev/null and b/core/__pycache__/anomaly.cpython-314.pyc differ diff --git a/core/__pycache__/auth.cpython-314.pyc b/core/__pycache__/auth.cpython-314.pyc new file mode 100644 index 0000000..fbf1c56 Binary files /dev/null and b/core/__pycache__/auth.cpython-314.pyc differ diff --git a/core/__pycache__/auto_processor.cpython-314.pyc b/core/__pycache__/auto_processor.cpython-314.pyc new file mode 100644 index 0000000..e2a7214 Binary files /dev/null and b/core/__pycache__/auto_processor.cpython-314.pyc differ diff --git a/core/__pycache__/auto_rca.cpython-314.pyc b/core/__pycache__/auto_rca.cpython-314.pyc new file mode 100644 index 0000000..ce046af Binary files /dev/null and b/core/__pycache__/auto_rca.cpython-314.pyc differ diff --git a/core/__pycache__/cache.cpython-314.pyc b/core/__pycache__/cache.cpython-314.pyc new file mode 100644 index 0000000..2d2ad7b Binary files /dev/null and b/core/__pycache__/cache.cpython-314.pyc differ diff --git a/core/__pycache__/chatbot.cpython-314.pyc b/core/__pycache__/chatbot.cpython-314.pyc new file mode 100644 index 0000000..a9667ad Binary files /dev/null and b/core/__pycache__/chatbot.cpython-314.pyc differ diff --git a/core/__pycache__/cicd.cpython-314.pyc b/core/__pycache__/cicd.cpython-314.pyc new file mode 100644 index 0000000..9f73717 Binary files /dev/null and b/core/__pycache__/cicd.cpython-314.pyc differ diff --git a/core/__pycache__/code_review.cpython-314.pyc b/core/__pycache__/code_review.cpython-314.pyc new file mode 100644 index 0000000..fae0f02 Binary files /dev/null and b/core/__pycache__/code_review.cpython-314.pyc differ diff --git a/core/__pycache__/compliance_check.cpython-314.pyc b/core/__pycache__/compliance_check.cpython-314.pyc new file mode 100644 index 0000000..c7ec2da Binary files /dev/null and b/core/__pycache__/compliance_check.cpython-314.pyc differ diff --git a/core/__pycache__/csap_checker.cpython-314.pyc b/core/__pycache__/csap_checker.cpython-314.pyc new file mode 100644 index 0000000..8156431 Binary files /dev/null and b/core/__pycache__/csap_checker.cpython-314.pyc differ diff --git a/core/__pycache__/deploy_impact.cpython-314.pyc b/core/__pycache__/deploy_impact.cpython-314.pyc new file mode 100644 index 0000000..ec9ec6d Binary files /dev/null and b/core/__pycache__/deploy_impact.cpython-314.pyc differ diff --git a/core/__pycache__/dr_engine.cpython-314.pyc b/core/__pycache__/dr_engine.cpython-314.pyc new file mode 100644 index 0000000..b58f12f Binary files /dev/null and b/core/__pycache__/dr_engine.cpython-314.pyc differ diff --git a/core/__pycache__/events.cpython-314.pyc b/core/__pycache__/events.cpython-314.pyc new file mode 100644 index 0000000..3a39959 Binary files /dev/null and b/core/__pycache__/events.cpython-314.pyc differ diff --git a/core/__pycache__/jira_sync.cpython-314.pyc b/core/__pycache__/jira_sync.cpython-314.pyc new file mode 100644 index 0000000..ff5901b Binary files /dev/null and b/core/__pycache__/jira_sync.cpython-314.pyc differ diff --git a/core/__pycache__/kb_agent.cpython-314.pyc b/core/__pycache__/kb_agent.cpython-314.pyc new file mode 100644 index 0000000..59d80c6 Binary files /dev/null and b/core/__pycache__/kb_agent.cpython-314.pyc differ diff --git a/core/__pycache__/ldap_auth.cpython-314.pyc b/core/__pycache__/ldap_auth.cpython-314.pyc new file mode 100644 index 0000000..5053eed Binary files /dev/null and b/core/__pycache__/ldap_auth.cpython-314.pyc differ diff --git a/core/__pycache__/learning.cpython-314.pyc b/core/__pycache__/learning.cpython-314.pyc new file mode 100644 index 0000000..6bf2749 Binary files /dev/null and b/core/__pycache__/learning.cpython-314.pyc differ diff --git a/core/__pycache__/license.cpython-314.pyc b/core/__pycache__/license.cpython-314.pyc new file mode 100644 index 0000000..88eae2a Binary files /dev/null and b/core/__pycache__/license.cpython-314.pyc differ diff --git a/core/__pycache__/llm_client.cpython-314.pyc b/core/__pycache__/llm_client.cpython-314.pyc new file mode 100644 index 0000000..6b15de2 Binary files /dev/null and b/core/__pycache__/llm_client.cpython-314.pyc differ diff --git a/core/__pycache__/mfa.cpython-314.pyc b/core/__pycache__/mfa.cpython-314.pyc new file mode 100644 index 0000000..40eec99 Binary files /dev/null and b/core/__pycache__/mfa.cpython-314.pyc differ diff --git a/core/__pycache__/network_scanner.cpython-314.pyc b/core/__pycache__/network_scanner.cpython-314.pyc new file mode 100644 index 0000000..e3cfb74 Binary files /dev/null and b/core/__pycache__/network_scanner.cpython-314.pyc differ diff --git a/core/__pycache__/nlu.cpython-314.pyc b/core/__pycache__/nlu.cpython-314.pyc new file mode 100644 index 0000000..bdebf56 Binary files /dev/null and b/core/__pycache__/nlu.cpython-314.pyc differ diff --git a/core/__pycache__/notify.cpython-314.pyc b/core/__pycache__/notify.cpython-314.pyc new file mode 100644 index 0000000..da09594 Binary files /dev/null and b/core/__pycache__/notify.cpython-314.pyc differ diff --git a/core/__pycache__/oauth.cpython-314.pyc b/core/__pycache__/oauth.cpython-314.pyc new file mode 100644 index 0000000..08f8553 Binary files /dev/null and b/core/__pycache__/oauth.cpython-314.pyc differ diff --git a/core/__pycache__/oncall_rotate.cpython-314.pyc b/core/__pycache__/oncall_rotate.cpython-314.pyc new file mode 100644 index 0000000..2806296 Binary files /dev/null and b/core/__pycache__/oncall_rotate.cpython-314.pyc differ diff --git a/core/__pycache__/orchestrator.cpython-314.pyc b/core/__pycache__/orchestrator.cpython-314.pyc new file mode 100644 index 0000000..b29741f Binary files /dev/null and b/core/__pycache__/orchestrator.cpython-314.pyc differ diff --git a/core/__pycache__/predictive.cpython-314.pyc b/core/__pycache__/predictive.cpython-314.pyc new file mode 100644 index 0000000..6d57a11 Binary files /dev/null and b/core/__pycache__/predictive.cpython-314.pyc differ diff --git a/core/__pycache__/push_notify.cpython-314.pyc b/core/__pycache__/push_notify.cpython-314.pyc new file mode 100644 index 0000000..95962e8 Binary files /dev/null and b/core/__pycache__/push_notify.cpython-314.pyc differ diff --git a/core/__pycache__/ratelimit.cpython-314.pyc b/core/__pycache__/ratelimit.cpython-314.pyc new file mode 100644 index 0000000..0a96d25 Binary files /dev/null and b/core/__pycache__/ratelimit.cpython-314.pyc differ diff --git a/core/__pycache__/scheduler.cpython-314.pyc b/core/__pycache__/scheduler.cpython-314.pyc new file mode 100644 index 0000000..491ecc4 Binary files /dev/null and b/core/__pycache__/scheduler.cpython-314.pyc differ diff --git a/core/__pycache__/scouter.cpython-314.pyc b/core/__pycache__/scouter.cpython-314.pyc new file mode 100644 index 0000000..7950735 Binary files /dev/null and b/core/__pycache__/scouter.cpython-314.pyc differ diff --git a/core/__pycache__/seed.cpython-314.pyc b/core/__pycache__/seed.cpython-314.pyc new file mode 100644 index 0000000..654f5e7 Binary files /dev/null and b/core/__pycache__/seed.cpython-314.pyc differ diff --git a/core/__pycache__/si_report.cpython-314.pyc b/core/__pycache__/si_report.cpython-314.pyc new file mode 100644 index 0000000..58f3df9 Binary files /dev/null and b/core/__pycache__/si_report.cpython-314.pyc differ diff --git a/core/__pycache__/sla.cpython-314.pyc b/core/__pycache__/sla.cpython-314.pyc new file mode 100644 index 0000000..327b159 Binary files /dev/null and b/core/__pycache__/sla.cpython-314.pyc differ diff --git a/core/__pycache__/ssh_exec.cpython-314.pyc b/core/__pycache__/ssh_exec.cpython-314.pyc new file mode 100644 index 0000000..c11df1b Binary files /dev/null and b/core/__pycache__/ssh_exec.cpython-314.pyc differ diff --git a/core/__pycache__/ticket_classifier.cpython-314.pyc b/core/__pycache__/ticket_classifier.cpython-314.pyc new file mode 100644 index 0000000..526da2d Binary files /dev/null and b/core/__pycache__/ticket_classifier.cpython-314.pyc differ diff --git a/core/__pycache__/vuln_scan.cpython-314.pyc b/core/__pycache__/vuln_scan.cpython-314.pyc new file mode 100644 index 0000000..1cc2aaa Binary files /dev/null and b/core/__pycache__/vuln_scan.cpython-314.pyc differ diff --git a/middleware/__pycache__/__init__.cpython-314.pyc b/middleware/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..1f1ac64 Binary files /dev/null and b/middleware/__pycache__/__init__.cpython-314.pyc differ diff --git a/middleware/__pycache__/license_guard.cpython-314.pyc b/middleware/__pycache__/license_guard.cpython-314.pyc new file mode 100644 index 0000000..fdba36c Binary files /dev/null and b/middleware/__pycache__/license_guard.cpython-314.pyc differ diff --git a/middleware/__pycache__/tenant.cpython-314.pyc b/middleware/__pycache__/tenant.cpython-314.pyc new file mode 100644 index 0000000..eeb1976 Binary files /dev/null and b/middleware/__pycache__/tenant.cpython-314.pyc differ diff --git a/routers/__pycache__/__init__.cpython-314.pyc b/routers/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..a89b055 Binary files /dev/null and b/routers/__pycache__/__init__.cpython-314.pyc differ diff --git a/routers/__pycache__/admin.cpython-314.pyc b/routers/__pycache__/admin.cpython-314.pyc new file mode 100644 index 0000000..20ed7c3 Binary files /dev/null and b/routers/__pycache__/admin.cpython-314.pyc differ diff --git a/routers/__pycache__/agents.cpython-314.pyc b/routers/__pycache__/agents.cpython-314.pyc new file mode 100644 index 0000000..aecc338 Binary files /dev/null and b/routers/__pycache__/agents.cpython-314.pyc differ diff --git a/routers/__pycache__/ai_insights.cpython-314.pyc b/routers/__pycache__/ai_insights.cpython-314.pyc new file mode 100644 index 0000000..120485a Binary files /dev/null and b/routers/__pycache__/ai_insights.cpython-314.pyc differ diff --git a/routers/__pycache__/analytics.cpython-314.pyc b/routers/__pycache__/analytics.cpython-314.pyc new file mode 100644 index 0000000..0369fe0 Binary files /dev/null and b/routers/__pycache__/analytics.cpython-314.pyc differ diff --git a/routers/__pycache__/anomaly.cpython-314.pyc b/routers/__pycache__/anomaly.cpython-314.pyc new file mode 100644 index 0000000..b77c3ee Binary files /dev/null and b/routers/__pycache__/anomaly.cpython-314.pyc differ diff --git a/routers/__pycache__/approvals.cpython-314.pyc b/routers/__pycache__/approvals.cpython-314.pyc new file mode 100644 index 0000000..1d02bbf Binary files /dev/null and b/routers/__pycache__/approvals.cpython-314.pyc differ diff --git a/routers/__pycache__/assign.cpython-314.pyc b/routers/__pycache__/assign.cpython-314.pyc new file mode 100644 index 0000000..a045377 Binary files /dev/null and b/routers/__pycache__/assign.cpython-314.pyc differ diff --git a/routers/__pycache__/attachments.cpython-314.pyc b/routers/__pycache__/attachments.cpython-314.pyc new file mode 100644 index 0000000..3c476dd Binary files /dev/null and b/routers/__pycache__/attachments.cpython-314.pyc differ diff --git a/routers/__pycache__/audit.cpython-314.pyc b/routers/__pycache__/audit.cpython-314.pyc new file mode 100644 index 0000000..92bef53 Binary files /dev/null and b/routers/__pycache__/audit.cpython-314.pyc differ diff --git a/routers/__pycache__/auth.cpython-314.pyc b/routers/__pycache__/auth.cpython-314.pyc new file mode 100644 index 0000000..c277e81 Binary files /dev/null and b/routers/__pycache__/auth.cpython-314.pyc differ diff --git a/routers/__pycache__/auto_remediation.cpython-314.pyc b/routers/__pycache__/auto_remediation.cpython-314.pyc new file mode 100644 index 0000000..149e37b Binary files /dev/null and b/routers/__pycache__/auto_remediation.cpython-314.pyc differ diff --git a/routers/__pycache__/auto_report.cpython-314.pyc b/routers/__pycache__/auto_report.cpython-314.pyc new file mode 100644 index 0000000..29142ea Binary files /dev/null and b/routers/__pycache__/auto_report.cpython-314.pyc differ diff --git a/routers/__pycache__/autodiscovery.cpython-314.pyc b/routers/__pycache__/autodiscovery.cpython-314.pyc new file mode 100644 index 0000000..68637df Binary files /dev/null and b/routers/__pycache__/autodiscovery.cpython-314.pyc differ diff --git a/routers/__pycache__/autonomous.cpython-314.pyc b/routers/__pycache__/autonomous.cpython-314.pyc new file mode 100644 index 0000000..68fea45 Binary files /dev/null and b/routers/__pycache__/autonomous.cpython-314.pyc differ diff --git a/routers/__pycache__/autonomous_workflow.cpython-314.pyc b/routers/__pycache__/autonomous_workflow.cpython-314.pyc new file mode 100644 index 0000000..9f86a61 Binary files /dev/null and b/routers/__pycache__/autonomous_workflow.cpython-314.pyc differ diff --git a/routers/__pycache__/aws_connector.cpython-314.pyc b/routers/__pycache__/aws_connector.cpython-314.pyc new file mode 100644 index 0000000..66407c9 Binary files /dev/null and b/routers/__pycache__/aws_connector.cpython-314.pyc differ diff --git a/routers/__pycache__/batch.cpython-314.pyc b/routers/__pycache__/batch.cpython-314.pyc new file mode 100644 index 0000000..210b4fd Binary files /dev/null and b/routers/__pycache__/batch.cpython-314.pyc differ diff --git a/routers/__pycache__/benchmark.cpython-314.pyc b/routers/__pycache__/benchmark.cpython-314.pyc new file mode 100644 index 0000000..3eeeeff Binary files /dev/null and b/routers/__pycache__/benchmark.cpython-314.pyc differ diff --git a/routers/__pycache__/bi_dashboard.cpython-314.pyc b/routers/__pycache__/bi_dashboard.cpython-314.pyc new file mode 100644 index 0000000..cf9034b Binary files /dev/null and b/routers/__pycache__/bi_dashboard.cpython-314.pyc differ diff --git a/routers/__pycache__/billing.cpython-314.pyc b/routers/__pycache__/billing.cpython-314.pyc new file mode 100644 index 0000000..1256f6c Binary files /dev/null and b/routers/__pycache__/billing.cpython-314.pyc differ diff --git a/routers/__pycache__/capacity.cpython-314.pyc b/routers/__pycache__/capacity.cpython-314.pyc new file mode 100644 index 0000000..124dd6d Binary files /dev/null and b/routers/__pycache__/capacity.cpython-314.pyc differ diff --git a/routers/__pycache__/catalog.cpython-314.pyc b/routers/__pycache__/catalog.cpython-314.pyc new file mode 100644 index 0000000..a9aa86a Binary files /dev/null and b/routers/__pycache__/catalog.cpython-314.pyc differ diff --git a/routers/__pycache__/change.cpython-314.pyc b/routers/__pycache__/change.cpython-314.pyc new file mode 100644 index 0000000..8af353a Binary files /dev/null and b/routers/__pycache__/change.cpython-314.pyc differ diff --git a/routers/__pycache__/chatbot.cpython-314.pyc b/routers/__pycache__/chatbot.cpython-314.pyc new file mode 100644 index 0000000..d528aeb Binary files /dev/null and b/routers/__pycache__/chatbot.cpython-314.pyc differ diff --git a/routers/__pycache__/cloud_migration.cpython-314.pyc b/routers/__pycache__/cloud_migration.cpython-314.pyc new file mode 100644 index 0000000..ec715b1 Binary files /dev/null and b/routers/__pycache__/cloud_migration.cpython-314.pyc differ diff --git a/routers/__pycache__/cmdb.cpython-314.pyc b/routers/__pycache__/cmdb.cpython-314.pyc new file mode 100644 index 0000000..425b5d9 Binary files /dev/null and b/routers/__pycache__/cmdb.cpython-314.pyc differ diff --git a/routers/__pycache__/code_review.cpython-314.pyc b/routers/__pycache__/code_review.cpython-314.pyc new file mode 100644 index 0000000..7c602a4 Binary files /dev/null and b/routers/__pycache__/code_review.cpython-314.pyc differ diff --git a/routers/__pycache__/cohort_analysis.cpython-314.pyc b/routers/__pycache__/cohort_analysis.cpython-314.pyc new file mode 100644 index 0000000..506de0f Binary files /dev/null and b/routers/__pycache__/cohort_analysis.cpython-314.pyc differ diff --git a/routers/__pycache__/compliance.cpython-314.pyc b/routers/__pycache__/compliance.cpython-314.pyc new file mode 100644 index 0000000..155a977 Binary files /dev/null and b/routers/__pycache__/compliance.cpython-314.pyc differ diff --git a/routers/__pycache__/config_inventory.cpython-314.pyc b/routers/__pycache__/config_inventory.cpython-314.pyc new file mode 100644 index 0000000..08b1cf0 Binary files /dev/null and b/routers/__pycache__/config_inventory.cpython-314.pyc differ diff --git a/routers/__pycache__/container_alerts.cpython-314.pyc b/routers/__pycache__/container_alerts.cpython-314.pyc new file mode 100644 index 0000000..5ef9aa9 Binary files /dev/null and b/routers/__pycache__/container_alerts.cpython-314.pyc differ diff --git a/routers/__pycache__/cost_optimizer.cpython-314.pyc b/routers/__pycache__/cost_optimizer.cpython-314.pyc new file mode 100644 index 0000000..a931309 Binary files /dev/null and b/routers/__pycache__/cost_optimizer.cpython-314.pyc differ diff --git a/routers/__pycache__/customer_portal.cpython-314.pyc b/routers/__pycache__/customer_portal.cpython-314.pyc new file mode 100644 index 0000000..4412233 Binary files /dev/null and b/routers/__pycache__/customer_portal.cpython-314.pyc differ diff --git a/routers/__pycache__/dashboard.cpython-314.pyc b/routers/__pycache__/dashboard.cpython-314.pyc new file mode 100644 index 0000000..8be06bc Binary files /dev/null and b/routers/__pycache__/dashboard.cpython-314.pyc differ diff --git a/routers/__pycache__/deliverables.cpython-314.pyc b/routers/__pycache__/deliverables.cpython-314.pyc new file mode 100644 index 0000000..59ef5da Binary files /dev/null and b/routers/__pycache__/deliverables.cpython-314.pyc differ diff --git a/routers/__pycache__/dependency_map.cpython-314.pyc b/routers/__pycache__/dependency_map.cpython-314.pyc new file mode 100644 index 0000000..4196aac Binary files /dev/null and b/routers/__pycache__/dependency_map.cpython-314.pyc differ diff --git a/routers/__pycache__/doc_template.cpython-314.pyc b/routers/__pycache__/doc_template.cpython-314.pyc new file mode 100644 index 0000000..5a14a8b Binary files /dev/null and b/routers/__pycache__/doc_template.cpython-314.pyc differ diff --git a/routers/__pycache__/doc_workflow.cpython-314.pyc b/routers/__pycache__/doc_workflow.cpython-314.pyc new file mode 100644 index 0000000..4413bf2 Binary files /dev/null and b/routers/__pycache__/doc_workflow.cpython-314.pyc differ diff --git a/routers/__pycache__/dr.cpython-314.pyc b/routers/__pycache__/dr.cpython-314.pyc new file mode 100644 index 0000000..fef8cbe Binary files /dev/null and b/routers/__pycache__/dr.cpython-314.pyc differ diff --git a/routers/__pycache__/drift_detection.cpython-314.pyc b/routers/__pycache__/drift_detection.cpython-314.pyc new file mode 100644 index 0000000..1c1df09 Binary files /dev/null and b/routers/__pycache__/drift_detection.cpython-314.pyc differ diff --git a/routers/__pycache__/e_procurement.cpython-314.pyc b/routers/__pycache__/e_procurement.cpython-314.pyc new file mode 100644 index 0000000..9c693aa Binary files /dev/null and b/routers/__pycache__/e_procurement.cpython-314.pyc differ diff --git a/routers/__pycache__/erp_connector.cpython-314.pyc b/routers/__pycache__/erp_connector.cpython-314.pyc new file mode 100644 index 0000000..44ba75c Binary files /dev/null and b/routers/__pycache__/erp_connector.cpython-314.pyc differ diff --git a/routers/__pycache__/export_import.cpython-314.pyc b/routers/__pycache__/export_import.cpython-314.pyc new file mode 100644 index 0000000..5460ff4 Binary files /dev/null and b/routers/__pycache__/export_import.cpython-314.pyc differ diff --git a/routers/__pycache__/finops.cpython-314.pyc b/routers/__pycache__/finops.cpython-314.pyc new file mode 100644 index 0000000..d3cc807 Binary files /dev/null and b/routers/__pycache__/finops.cpython-314.pyc differ diff --git a/routers/__pycache__/gateway.cpython-314.pyc b/routers/__pycache__/gateway.cpython-314.pyc new file mode 100644 index 0000000..d53cf88 Binary files /dev/null and b/routers/__pycache__/gateway.cpython-314.pyc differ diff --git a/routers/__pycache__/golden_config.cpython-314.pyc b/routers/__pycache__/golden_config.cpython-314.pyc new file mode 100644 index 0000000..c6b57f5 Binary files /dev/null and b/routers/__pycache__/golden_config.cpython-314.pyc differ diff --git a/routers/__pycache__/groupware.cpython-314.pyc b/routers/__pycache__/groupware.cpython-314.pyc new file mode 100644 index 0000000..b15d707 Binary files /dev/null and b/routers/__pycache__/groupware.cpython-314.pyc differ diff --git a/routers/__pycache__/incidents.cpython-314.pyc b/routers/__pycache__/incidents.cpython-314.pyc new file mode 100644 index 0000000..382f2cd Binary files /dev/null and b/routers/__pycache__/incidents.cpython-314.pyc differ diff --git a/routers/__pycache__/infra_ext.cpython-314.pyc b/routers/__pycache__/infra_ext.cpython-314.pyc new file mode 100644 index 0000000..7dd12e3 Binary files /dev/null and b/routers/__pycache__/infra_ext.cpython-314.pyc differ diff --git a/routers/__pycache__/institutions.cpython-314.pyc b/routers/__pycache__/institutions.cpython-314.pyc new file mode 100644 index 0000000..24f5e3b Binary files /dev/null and b/routers/__pycache__/institutions.cpython-314.pyc differ diff --git a/routers/__pycache__/isp_support.cpython-314.pyc b/routers/__pycache__/isp_support.cpython-314.pyc new file mode 100644 index 0000000..9df3f5d Binary files /dev/null and b/routers/__pycache__/isp_support.cpython-314.pyc differ diff --git a/routers/__pycache__/jira_sync.cpython-314.pyc b/routers/__pycache__/jira_sync.cpython-314.pyc new file mode 100644 index 0000000..a4735a3 Binary files /dev/null and b/routers/__pycache__/jira_sync.cpython-314.pyc differ diff --git a/routers/__pycache__/jmeter.cpython-314.pyc b/routers/__pycache__/jmeter.cpython-314.pyc new file mode 100644 index 0000000..b654d6b Binary files /dev/null and b/routers/__pycache__/jmeter.cpython-314.pyc differ diff --git a/routers/__pycache__/k_cloud.cpython-314.pyc b/routers/__pycache__/k_cloud.cpython-314.pyc new file mode 100644 index 0000000..bfb0dfa Binary files /dev/null and b/routers/__pycache__/k_cloud.cpython-314.pyc differ diff --git a/routers/__pycache__/kakao_notify.cpython-314.pyc b/routers/__pycache__/kakao_notify.cpython-314.pyc new file mode 100644 index 0000000..83a8ec3 Binary files /dev/null and b/routers/__pycache__/kakao_notify.cpython-314.pyc differ diff --git a/routers/__pycache__/kb.cpython-314.pyc b/routers/__pycache__/kb.cpython-314.pyc new file mode 100644 index 0000000..cd15fd9 Binary files /dev/null and b/routers/__pycache__/kb.cpython-314.pyc differ diff --git a/routers/__pycache__/kb_agent.cpython-314.pyc b/routers/__pycache__/kb_agent.cpython-314.pyc new file mode 100644 index 0000000..9b5ae05 Binary files /dev/null and b/routers/__pycache__/kb_agent.cpython-314.pyc differ diff --git a/routers/__pycache__/kpi_engine.cpython-314.pyc b/routers/__pycache__/kpi_engine.cpython-314.pyc new file mode 100644 index 0000000..563c03b Binary files /dev/null and b/routers/__pycache__/kpi_engine.cpython-314.pyc differ diff --git a/routers/__pycache__/kubernetes.cpython-314.pyc b/routers/__pycache__/kubernetes.cpython-314.pyc new file mode 100644 index 0000000..8448875 Binary files /dev/null and b/routers/__pycache__/kubernetes.cpython-314.pyc differ diff --git a/routers/__pycache__/ldap.cpython-314.pyc b/routers/__pycache__/ldap.cpython-314.pyc new file mode 100644 index 0000000..b602838 Binary files /dev/null and b/routers/__pycache__/ldap.cpython-314.pyc differ diff --git a/routers/__pycache__/learning.cpython-314.pyc b/routers/__pycache__/learning.cpython-314.pyc new file mode 100644 index 0000000..000601e Binary files /dev/null and b/routers/__pycache__/learning.cpython-314.pyc differ diff --git a/routers/__pycache__/learning_loop.cpython-314.pyc b/routers/__pycache__/learning_loop.cpython-314.pyc new file mode 100644 index 0000000..70721f5 Binary files /dev/null and b/routers/__pycache__/learning_loop.cpython-314.pyc differ diff --git a/routers/__pycache__/license.cpython-314.pyc b/routers/__pycache__/license.cpython-314.pyc new file mode 100644 index 0000000..7339c13 Binary files /dev/null and b/routers/__pycache__/license.cpython-314.pyc differ diff --git a/routers/__pycache__/messenger.cpython-314.pyc b/routers/__pycache__/messenger.cpython-314.pyc new file mode 100644 index 0000000..c8ce2bb Binary files /dev/null and b/routers/__pycache__/messenger.cpython-314.pyc differ diff --git a/routers/__pycache__/metrics.cpython-314.pyc b/routers/__pycache__/metrics.cpython-314.pyc new file mode 100644 index 0000000..6eb220c Binary files /dev/null and b/routers/__pycache__/metrics.cpython-314.pyc differ diff --git a/routers/__pycache__/multicloud.cpython-314.pyc b/routers/__pycache__/multicloud.cpython-314.pyc new file mode 100644 index 0000000..bd9b62f Binary files /dev/null and b/routers/__pycache__/multicloud.cpython-314.pyc differ diff --git a/routers/__pycache__/multimodal.cpython-314.pyc b/routers/__pycache__/multimodal.cpython-314.pyc new file mode 100644 index 0000000..d67ea06 Binary files /dev/null and b/routers/__pycache__/multimodal.cpython-314.pyc differ diff --git a/routers/__pycache__/narasajang.cpython-314.pyc b/routers/__pycache__/narasajang.cpython-314.pyc new file mode 100644 index 0000000..5d4f1ff Binary files /dev/null and b/routers/__pycache__/narasajang.cpython-314.pyc differ diff --git a/routers/__pycache__/ncloud.cpython-314.pyc b/routers/__pycache__/ncloud.cpython-314.pyc new file mode 100644 index 0000000..a1e4196 Binary files /dev/null and b/routers/__pycache__/ncloud.cpython-314.pyc differ diff --git a/routers/__pycache__/network_devices.cpython-314.pyc b/routers/__pycache__/network_devices.cpython-314.pyc new file mode 100644 index 0000000..343c355 Binary files /dev/null and b/routers/__pycache__/network_devices.cpython-314.pyc differ diff --git a/routers/__pycache__/network_zone.cpython-314.pyc b/routers/__pycache__/network_zone.cpython-314.pyc new file mode 100644 index 0000000..b75a939 Binary files /dev/null and b/routers/__pycache__/network_zone.cpython-314.pyc differ diff --git a/routers/__pycache__/nlcmd.cpython-314.pyc b/routers/__pycache__/nlcmd.cpython-314.pyc new file mode 100644 index 0000000..d021bf9 Binary files /dev/null and b/routers/__pycache__/nlcmd.cpython-314.pyc differ diff --git a/routers/__pycache__/nlquery.cpython-314.pyc b/routers/__pycache__/nlquery.cpython-314.pyc new file mode 100644 index 0000000..45fd8e5 Binary files /dev/null and b/routers/__pycache__/nlquery.cpython-314.pyc differ diff --git a/routers/__pycache__/notifications.cpython-314.pyc b/routers/__pycache__/notifications.cpython-314.pyc new file mode 100644 index 0000000..2293b37 Binary files /dev/null and b/routers/__pycache__/notifications.cpython-314.pyc differ diff --git a/routers/__pycache__/onboarding.cpython-314.pyc b/routers/__pycache__/onboarding.cpython-314.pyc new file mode 100644 index 0000000..66c0067 Binary files /dev/null and b/routers/__pycache__/onboarding.cpython-314.pyc differ diff --git a/routers/__pycache__/oncall.cpython-314.pyc b/routers/__pycache__/oncall.cpython-314.pyc new file mode 100644 index 0000000..4fd54fc Binary files /dev/null and b/routers/__pycache__/oncall.cpython-314.pyc differ diff --git a/routers/__pycache__/op_assistant.cpython-314.pyc b/routers/__pycache__/op_assistant.cpython-314.pyc new file mode 100644 index 0000000..c916ff6 Binary files /dev/null and b/routers/__pycache__/op_assistant.cpython-314.pyc differ diff --git a/routers/__pycache__/orchestrator.cpython-314.pyc b/routers/__pycache__/orchestrator.cpython-314.pyc new file mode 100644 index 0000000..87b0a3e Binary files /dev/null and b/routers/__pycache__/orchestrator.cpython-314.pyc differ diff --git a/routers/__pycache__/pam.cpython-314.pyc b/routers/__pycache__/pam.cpython-314.pyc new file mode 100644 index 0000000..b610fe0 Binary files /dev/null and b/routers/__pycache__/pam.cpython-314.pyc differ diff --git a/routers/__pycache__/pm.cpython-314.pyc b/routers/__pycache__/pm.cpython-314.pyc new file mode 100644 index 0000000..305605f Binary files /dev/null and b/routers/__pycache__/pm.cpython-314.pyc differ diff --git a/routers/__pycache__/portfolio.cpython-314.pyc b/routers/__pycache__/portfolio.cpython-314.pyc new file mode 100644 index 0000000..9a6b8a7 Binary files /dev/null and b/routers/__pycache__/portfolio.cpython-314.pyc differ diff --git a/routers/__pycache__/predictive.cpython-314.pyc b/routers/__pycache__/predictive.cpython-314.pyc new file mode 100644 index 0000000..c586fa4 Binary files /dev/null and b/routers/__pycache__/predictive.cpython-314.pyc differ diff --git a/routers/__pycache__/predictive_ops.cpython-314.pyc b/routers/__pycache__/predictive_ops.cpython-314.pyc new file mode 100644 index 0000000..ac24429 Binary files /dev/null and b/routers/__pycache__/predictive_ops.cpython-314.pyc differ diff --git a/routers/__pycache__/problem.cpython-314.pyc b/routers/__pycache__/problem.cpython-314.pyc new file mode 100644 index 0000000..9da1b12 Binary files /dev/null and b/routers/__pycache__/problem.cpython-314.pyc differ diff --git a/routers/__pycache__/projects.cpython-314.pyc b/routers/__pycache__/projects.cpython-314.pyc new file mode 100644 index 0000000..10c46e0 Binary files /dev/null and b/routers/__pycache__/projects.cpython-314.pyc differ diff --git a/routers/__pycache__/public_api_hub.cpython-314.pyc b/routers/__pycache__/public_api_hub.cpython-314.pyc new file mode 100644 index 0000000..7c442bb Binary files /dev/null and b/routers/__pycache__/public_api_hub.cpython-314.pyc differ diff --git a/routers/__pycache__/public_checklist.cpython-314.pyc b/routers/__pycache__/public_checklist.cpython-314.pyc new file mode 100644 index 0000000..c43dd02 Binary files /dev/null and b/routers/__pycache__/public_checklist.cpython-314.pyc differ diff --git a/routers/__pycache__/push.cpython-314.pyc b/routers/__pycache__/push.cpython-314.pyc new file mode 100644 index 0000000..45979cd Binary files /dev/null and b/routers/__pycache__/push.cpython-314.pyc differ diff --git a/routers/__pycache__/query_history.cpython-314.pyc b/routers/__pycache__/query_history.cpython-314.pyc new file mode 100644 index 0000000..2934107 Binary files /dev/null and b/routers/__pycache__/query_history.cpython-314.pyc differ diff --git a/routers/__pycache__/rag_engine.cpython-314.pyc b/routers/__pycache__/rag_engine.cpython-314.pyc new file mode 100644 index 0000000..8ebeecd Binary files /dev/null and b/routers/__pycache__/rag_engine.cpython-314.pyc differ diff --git a/routers/__pycache__/rating.cpython-314.pyc b/routers/__pycache__/rating.cpython-314.pyc new file mode 100644 index 0000000..bc49f06 Binary files /dev/null and b/routers/__pycache__/rating.cpython-314.pyc differ diff --git a/routers/__pycache__/report.cpython-314.pyc b/routers/__pycache__/report.cpython-314.pyc new file mode 100644 index 0000000..49a5c12 Binary files /dev/null and b/routers/__pycache__/report.cpython-314.pyc differ diff --git a/routers/__pycache__/scouter.cpython-314.pyc b/routers/__pycache__/scouter.cpython-314.pyc new file mode 100644 index 0000000..f245542 Binary files /dev/null and b/routers/__pycache__/scouter.cpython-314.pyc differ diff --git a/routers/__pycache__/servicenow.cpython-314.pyc b/routers/__pycache__/servicenow.cpython-314.pyc new file mode 100644 index 0000000..8e3aa90 Binary files /dev/null and b/routers/__pycache__/servicenow.cpython-314.pyc differ diff --git a/routers/__pycache__/shell_scripts.cpython-314.pyc b/routers/__pycache__/shell_scripts.cpython-314.pyc new file mode 100644 index 0000000..375af5d Binary files /dev/null and b/routers/__pycache__/shell_scripts.cpython-314.pyc differ diff --git a/routers/__pycache__/si_change_requests.cpython-314.pyc b/routers/__pycache__/si_change_requests.cpython-314.pyc new file mode 100644 index 0000000..cf0250a Binary files /dev/null and b/routers/__pycache__/si_change_requests.cpython-314.pyc differ diff --git a/routers/__pycache__/si_issues.cpython-314.pyc b/routers/__pycache__/si_issues.cpython-314.pyc new file mode 100644 index 0000000..87389eb Binary files /dev/null and b/routers/__pycache__/si_issues.cpython-314.pyc differ diff --git a/routers/__pycache__/si_milestones.cpython-314.pyc b/routers/__pycache__/si_milestones.cpython-314.pyc new file mode 100644 index 0000000..6a3177f Binary files /dev/null and b/routers/__pycache__/si_milestones.cpython-314.pyc differ diff --git a/routers/__pycache__/si_projects.cpython-314.pyc b/routers/__pycache__/si_projects.cpython-314.pyc new file mode 100644 index 0000000..251f95c Binary files /dev/null and b/routers/__pycache__/si_projects.cpython-314.pyc differ diff --git a/routers/__pycache__/si_report.cpython-314.pyc b/routers/__pycache__/si_report.cpython-314.pyc new file mode 100644 index 0000000..58f1ec9 Binary files /dev/null and b/routers/__pycache__/si_report.cpython-314.pyc differ diff --git a/routers/__pycache__/si_requirements.cpython-314.pyc b/routers/__pycache__/si_requirements.cpython-314.pyc new file mode 100644 index 0000000..5fb8c1c Binary files /dev/null and b/routers/__pycache__/si_requirements.cpython-314.pyc differ diff --git a/routers/__pycache__/si_risks.cpython-314.pyc b/routers/__pycache__/si_risks.cpython-314.pyc new file mode 100644 index 0000000..6f9339e Binary files /dev/null and b/routers/__pycache__/si_risks.cpython-314.pyc differ diff --git a/routers/__pycache__/si_tests.cpython-314.pyc b/routers/__pycache__/si_tests.cpython-314.pyc new file mode 100644 index 0000000..57ffe87 Binary files /dev/null and b/routers/__pycache__/si_tests.cpython-314.pyc differ diff --git a/routers/__pycache__/si_wbs.cpython-314.pyc b/routers/__pycache__/si_wbs.cpython-314.pyc new file mode 100644 index 0000000..f082aa3 Binary files /dev/null and b/routers/__pycache__/si_wbs.cpython-314.pyc differ diff --git a/routers/__pycache__/siem.cpython-314.pyc b/routers/__pycache__/siem.cpython-314.pyc new file mode 100644 index 0000000..dfcf4d4 Binary files /dev/null and b/routers/__pycache__/siem.cpython-314.pyc differ diff --git a/routers/__pycache__/slack_connector.cpython-314.pyc b/routers/__pycache__/slack_connector.cpython-314.pyc new file mode 100644 index 0000000..c23ab75 Binary files /dev/null and b/routers/__pycache__/slack_connector.cpython-314.pyc differ diff --git a/routers/__pycache__/snmp_discovery.cpython-314.pyc b/routers/__pycache__/snmp_discovery.cpython-314.pyc new file mode 100644 index 0000000..3d6b58e Binary files /dev/null and b/routers/__pycache__/snmp_discovery.cpython-314.pyc differ diff --git a/routers/__pycache__/ssh.cpython-314.pyc b/routers/__pycache__/ssh.cpython-314.pyc new file mode 100644 index 0000000..4edc0a5 Binary files /dev/null and b/routers/__pycache__/ssh.cpython-314.pyc differ diff --git a/routers/__pycache__/ssl_manager.cpython-314.pyc b/routers/__pycache__/ssl_manager.cpython-314.pyc new file mode 100644 index 0000000..baa300a Binary files /dev/null and b/routers/__pycache__/ssl_manager.cpython-314.pyc differ diff --git a/routers/__pycache__/sso_provider.cpython-314.pyc b/routers/__pycache__/sso_provider.cpython-314.pyc new file mode 100644 index 0000000..224263b Binary files /dev/null and b/routers/__pycache__/sso_provider.cpython-314.pyc differ diff --git a/routers/__pycache__/tasks.cpython-314.pyc b/routers/__pycache__/tasks.cpython-314.pyc new file mode 100644 index 0000000..5f3fc8c Binary files /dev/null and b/routers/__pycache__/tasks.cpython-314.pyc differ diff --git a/routers/__pycache__/tenant_mgmt.cpython-314.pyc b/routers/__pycache__/tenant_mgmt.cpython-314.pyc new file mode 100644 index 0000000..1f663f6 Binary files /dev/null and b/routers/__pycache__/tenant_mgmt.cpython-314.pyc differ diff --git a/routers/__pycache__/tenant_portal.cpython-314.pyc b/routers/__pycache__/tenant_portal.cpython-314.pyc new file mode 100644 index 0000000..7bca710 Binary files /dev/null and b/routers/__pycache__/tenant_portal.cpython-314.pyc differ diff --git a/routers/__pycache__/timeline.cpython-314.pyc b/routers/__pycache__/timeline.cpython-314.pyc new file mode 100644 index 0000000..b958ab3 Binary files /dev/null and b/routers/__pycache__/timeline.cpython-314.pyc differ diff --git a/routers/__pycache__/timetable.cpython-314.pyc b/routers/__pycache__/timetable.cpython-314.pyc new file mode 100644 index 0000000..8cb9e7d Binary files /dev/null and b/routers/__pycache__/timetable.cpython-314.pyc differ diff --git a/routers/__pycache__/topology.cpython-314.pyc b/routers/__pycache__/topology.cpython-314.pyc new file mode 100644 index 0000000..64eca94 Binary files /dev/null and b/routers/__pycache__/topology.cpython-314.pyc differ diff --git a/routers/__pycache__/upstage_ocr.cpython-314.pyc b/routers/__pycache__/upstage_ocr.cpython-314.pyc new file mode 100644 index 0000000..8c248c6 Binary files /dev/null and b/routers/__pycache__/upstage_ocr.cpython-314.pyc differ diff --git a/routers/__pycache__/vibe.cpython-314.pyc b/routers/__pycache__/vibe.cpython-314.pyc new file mode 100644 index 0000000..8dca340 Binary files /dev/null and b/routers/__pycache__/vibe.cpython-314.pyc differ diff --git a/routers/__pycache__/vuln_scan.cpython-314.pyc b/routers/__pycache__/vuln_scan.cpython-314.pyc new file mode 100644 index 0000000..ca58e6d Binary files /dev/null and b/routers/__pycache__/vuln_scan.cpython-314.pyc differ diff --git a/routers/__pycache__/white_label.cpython-314.pyc b/routers/__pycache__/white_label.cpython-314.pyc new file mode 100644 index 0000000..4f0f981 Binary files /dev/null and b/routers/__pycache__/white_label.cpython-314.pyc differ diff --git a/routers/__pycache__/work.cpython-314.pyc b/routers/__pycache__/work.cpython-314.pyc new file mode 100644 index 0000000..4dd397a Binary files /dev/null and b/routers/__pycache__/work.cpython-314.pyc differ diff --git a/routers/__pycache__/ws.cpython-314.pyc b/routers/__pycache__/ws.cpython-314.pyc new file mode 100644 index 0000000..8d7d24c Binary files /dev/null and b/routers/__pycache__/ws.cpython-314.pyc differ diff --git a/routers/cicd_deploy.py b/routers/cicd_deploy.py index cd3bb60..2c48bcf 100644 --- a/routers/cicd_deploy.py +++ b/routers/cicd_deploy.py @@ -15,7 +15,7 @@ logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/cicd", tags=["CI/CD 자동배포"]) MONOREPO = Path("/opt/guardia") # 서버 소스 루트 -GITEA_BASE = "http://zio:Zio%40Admin2026%21@101.79.17.164:3000/zio" +GITEA_BASE = "https://zio:Zio%40Admin2026%21@zioinfo.co.kr:3000/zio" REPO_MAP = { "guardia-itsm": {"src": "/opt/guardia/workspace/guardia-itsm", "service": "guardia"},