feat(parent): GUARDiA 부모 역할 4가지 구현 완성 [auto-sync]

This commit is contained in:
GUARDiA AutoDeploy 2026-06-03 15:07:28 +09:00 committed by DESKTOP-TKLFCPR\ython
parent 031882732e
commit 0f8d98074a
208 changed files with 1492 additions and 2463 deletions

View File

@ -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에게 "배포 블로킹 필요" 신호 전송

View File

@ -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 관련 항목 알림

View File

@ -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에게 배포 완료 이벤트 전달

View File

@ -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에게 최종 결과 요약

View File

@ -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에게 복구 완료 보고

View File

@ -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 캡처 요청)

View File

@ -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

View File

@ -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에게 장비 상태 이상 알림

View File

@ -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`

View File

@ -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에게 인시던트 생성 요청

View File

@ -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>` | URL 즉시 스크랩 |
| `!scrap list [n]` | 최근 n개 결과 목록 |
| `!scrap publish <id>` | 게시 + 메신저 알림 |
| `!scrap del <id>` | 삭제 (소프트) |
| `!scrap restore <id>` | 삭제→DRAFT 원복 |
| `!scrap status <id>` | 결과 상세 조회 |
## 팀 통신
- 수신: guardia-orchestrator, rpa-bot
- 발신: incident-responder (스크랩 반복 실패 시)

View File

@ -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에게 에스컬레이션 담당자 변경 요청

View File

@ -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이 반환된다. 해당 오류 수신 시 라이선스 업그레이드 안내 메시지를 포함해 보고한다.

View File

@ -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회 후 실패 목록 보고

View File

@ -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`

View File

@ -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);
```

View File

@ -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
```

View File

@ -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 | 예 | 필수 |

View File

@ -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
```

View File

@ -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 비교 스크린샷"

View File

@ -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건 수정 후 재요청" 안내
```

View File

@ -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
```

View File

@ -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 변경 이력 업데이트

View File

@ -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 그리드
<div style={{ display:'grid', gridTemplateColumns:'repeat(3,1fr)', gap:20, marginBottom:28 }}>
{/* StatCards */}
</div>
// 차트 카드
<div style={{
background:'#fff', borderRadius:'var(--m-radius)',
border:'1px solid var(--m-border)', boxShadow:'var(--m-shadow)',
padding:24,
}}>
```
## 배포 방법
```bash
cd manager/frontend && npm run build
# 빌드 결과를 /var/www/manager/에 복사 후 재시작
```

View File

@ -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 알림

View File

@ -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 인시던트 생성

View File

@ -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회 자동 재학습 (스케줄러)

View File

@ -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 <url>` | POST /api/scraping/run |
| `!scrap list [n]` | GET /api/scraping/results?size=n |
| `!scrap publish <id>` | POST /api/scraping/results/{id}/publish |
| `!scrap del <id>` | DELETE /api/scraping/results/{id} |
| `!scrap restore <id>` | POST /api/scraping/results/{id}/restore |
| `!scrap status <id>` | GET /api/scraping/results/{id} |
## 테스트 시나리오
정상: POST run → DRAFT → publish → PUBLISHED → messenger 수신
오류: 존재하지 않는 URL → status=FAILED, 서비스 무중단

View File

@ -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 처리는 정상 동작한다.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
guardia_itsm.db Normal file

Binary file not shown.

18
main.py
View File

@ -431,6 +431,24 @@ app.include_router(icon_generator.router) # SVG 아이콘 생성
app.include_router(css_generator.router) # 자연어→CSS/Tailwind
app.include_router(smart_ux.router) # 다음명령 제시 + 음성처리
# ── 부모 역할 4가지: 건강검진·성장일지·미래준비·독립지원 ─────────────────────
from routers import (
health_scheduler, self_healer,
changelog_tracker, manual_updater, growth_dashboard,
push_notify, i18n_engine, auto_finetune,
self_report, independence_meter,
)
app.include_router(health_scheduler.router) # 건강검진 — 정기 테스트 스케줄러
app.include_router(self_healer.router) # 건강검진 — 자가 수복
app.include_router(changelog_tracker.router) # 성장일지 — 변경이력 자동 수집
app.include_router(manual_updater.router) # 성장일지 — 매뉴얼 자동 업데이트
app.include_router(growth_dashboard.router) # 성장일지 — 기능 성장 대시보드
app.include_router(push_notify.router) # 미래준비 — 모바일 푸시알림
app.include_router(i18n_engine.router) # 미래준비 — 다국어 번역 관리
app.include_router(auto_finetune.router) # 미래준비 — LoRA 자동 파인튜닝
app.include_router(self_report.router) # 독립지원 — 자율 주간 보고서
app.include_router(independence_meter.router) # 독립지원 — 자립도 측정·추적
# ── 개방망 보안 헤더 미들웨어 ────────────────────────────────────────────────
@app.middleware("http")

Binary file not shown.

Binary file not shown.

Binary file not shown.

124
models.py
View File

@ -6136,3 +6136,127 @@ class CommandHistory(Base):
room = Column(String(100), default="general")
success = Column(Boolean, default=True)
used_at = Column(DateTime, default=func.now())
# ── 부모 역할 4가지: 건강검진·성장일지·미래준비·독립지원 ──────────────────
class HealthCheckResult(Base):
"""건강검진 — 전체 테스트 실행 이력."""
__tablename__ = "tb_health_check_result"
id = Column(Integer, primary_key=True, index=True)
triggered_by = Column(String(100), default="schedule")
total = Column(Integer, default=69)
passed = Column(Integer, default=0)
failed = Column(Integer, default=0)
success = Column(Boolean, default=False)
duration_sec = Column(Float, default=0.0)
output_summary = Column(Text, nullable=True)
created_at = Column(DateTime, default=func.now())
class ChangelogEntry(Base):
"""성장일지 — 변경이력 자동 기록."""
__tablename__ = "tb_changelog_entry"
id = Column(Integer, primary_key=True, index=True)
version = Column(String(20), nullable=False)
category = Column(String(50), default="feat")
title = Column(String(300), nullable=False)
description = Column(Text, nullable=True)
files = Column(Text, nullable=True)
commit_hash = Column(String(40), nullable=True)
author = Column(String(100), nullable=True)
created_at = Column(DateTime, default=func.now())
class PushDevice(Base):
"""미래 준비 — 푸시알림 디바이스 토큰."""
__tablename__ = "tb_push_device"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("tb_user.id"), nullable=False, index=True)
token = Column(String(500), nullable=False, unique=True)
platform = Column(String(20), default="android")
active = Column(Boolean, default=True)
registered_at = Column(DateTime, default=func.now())
last_used_at = Column(DateTime, nullable=True)
class PushLog(Base):
"""미래 준비 — 푸시알림 발송 이력."""
__tablename__ = "tb_push_log"
id = Column(Integer, primary_key=True, index=True)
device_id = Column(Integer, ForeignKey("tb_push_device.id"), nullable=True)
title = Column(String(200), nullable=False)
body = Column(Text, nullable=False)
category = Column(String(50), default="general")
success = Column(Boolean, default=True)
error_msg = Column(Text, nullable=True)
sent_at = Column(DateTime, default=func.now())
class I18nEntry(Base):
"""미래 준비 — 다국어 번역 데이터."""
__tablename__ = "tb_i18n_entry"
id = Column(Integer, primary_key=True, index=True)
key = Column(String(300), nullable=False, index=True)
locale = Column(String(10), nullable=False, index=True)
value = Column(Text, nullable=False)
namespace = Column(String(100), default="common")
verified = Column(Boolean, default=False)
created_at = Column(DateTime, default=func.now())
updated_at = Column(DateTime, onupdate=func.now())
class AutoFinetuneJob(Base):
"""미래 준비 — LoRA 자동 파인튜닝 작업."""
__tablename__ = "tb_auto_finetune_job"
id = Column(Integer, primary_key=True, index=True)
model_name = Column(String(100), default="llama3")
dataset_size = Column(Integer, default=0)
status = Column(String(20), default="pending")
loss = Column(Float, nullable=True)
epochs = Column(Integer, default=3)
output_path = Column(String(500), nullable=True)
error_msg = Column(Text, nullable=True)
started_at = Column(DateTime, nullable=True)
finished_at = Column(DateTime, nullable=True)
created_at = Column(DateTime, default=func.now())
class AutonomousAction(Base):
"""독립 지원 — 자율 실행 이력."""
__tablename__ = "tb_autonomous_action"
id = Column(Integer, primary_key=True, index=True)
trigger_type = Column(String(50), nullable=False)
trigger_data = Column(Text, nullable=True)
action_type = Column(String(50), nullable=False)
action_cmd = Column(Text, nullable=True)
result = Column(Text, nullable=True)
success = Column(Boolean, default=False)
approved_by = Column(String(100), nullable=True)
executed_at = Column(DateTime, default=func.now())
class SelfReport(Base):
"""독립 지원 — 자율 주간 보고서."""
__tablename__ = "tb_self_report"
id = Column(Integer, primary_key=True, index=True)
period = Column(String(20), nullable=False)
sr_total = Column(Integer, default=0)
sr_auto_handled = Column(Integer, default=0)
health_score = Column(Float, default=0.0)
auto_heals = Column(Integer, default=0)
incidents = Column(Integer, default=0)
summary = Column(Text, nullable=True)
sent_to = Column(String(200), nullable=True)
created_at = Column(DateTime, default=func.now())
class IndependenceScore(Base):
"""독립 지원 — 자립도 점수 추적."""
__tablename__ = "tb_independence_score"
id = Column(Integer, primary_key=True, index=True)
score = Column(Float, nullable=False)
dimension = Column(String(50), default="overall")
details = Column(Text, nullable=True)
target_score = Column(Float, default=85.0)
measured_at = Column(DateTime, default=func.now())

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More