feat(parent): GUARDiA 부모 역할 4가지 구현 완성 [auto-sync]
This commit is contained in:
parent
031882732e
commit
0f8d98074a
@ -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에게 "배포 블로킹 필요" 신호 전송
|
||||
@ -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 관련 항목 알림
|
||||
@ -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에게 배포 완료 이벤트 전달
|
||||
@ -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에게 최종 결과 요약
|
||||
@ -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에게 복구 완료 보고
|
||||
@ -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 캡처 요청)
|
||||
@ -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
|
||||
@ -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에게 장비 상태 이상 알림
|
||||
@ -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`
|
||||
@ -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에게 인시던트 생성 요청
|
||||
@ -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 (스크랩 반복 실패 시)
|
||||
@ -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에게 에스컬레이션 담당자 변경 요청
|
||||
@ -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이 반환된다. 해당 오류 수신 시 라이선스 업그레이드 안내 메시지를 포함해 보고한다.
|
||||
@ -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회 후 실패 목록 보고
|
||||
@ -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`
|
||||
@ -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);
|
||||
```
|
||||
@ -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
|
||||
```
|
||||
@ -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 | 예 | 필수 |
|
||||
@ -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
|
||||
```
|
||||
@ -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 비교 스크린샷"
|
||||
@ -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건 수정 후 재요청" 안내
|
||||
```
|
||||
@ -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
|
||||
```
|
||||
@ -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 변경 이력 업데이트
|
||||
@ -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/에 복사 후 재시작
|
||||
```
|
||||
@ -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 알림
|
||||
@ -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 인시던트 생성
|
||||
@ -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회 자동 재학습 (스케줄러)
|
||||
@ -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, 서비스 무중단
|
||||
@ -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 처리는 정상 동작한다.
|
||||
BIN
core/__pycache__/__init__.cpython-314.pyc
Normal file
BIN
core/__pycache__/__init__.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/agents.cpython-314.pyc
Normal file
BIN
core/__pycache__/agents.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/anomaly.cpython-314.pyc
Normal file
BIN
core/__pycache__/anomaly.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/auth.cpython-314.pyc
Normal file
BIN
core/__pycache__/auth.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/auto_processor.cpython-314.pyc
Normal file
BIN
core/__pycache__/auto_processor.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/auto_rca.cpython-314.pyc
Normal file
BIN
core/__pycache__/auto_rca.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/cache.cpython-314.pyc
Normal file
BIN
core/__pycache__/cache.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/chatbot.cpython-314.pyc
Normal file
BIN
core/__pycache__/chatbot.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/cicd.cpython-314.pyc
Normal file
BIN
core/__pycache__/cicd.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/code_review.cpython-314.pyc
Normal file
BIN
core/__pycache__/code_review.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/compliance_check.cpython-314.pyc
Normal file
BIN
core/__pycache__/compliance_check.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/csap_checker.cpython-314.pyc
Normal file
BIN
core/__pycache__/csap_checker.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/deploy_impact.cpython-314.pyc
Normal file
BIN
core/__pycache__/deploy_impact.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/dr_engine.cpython-314.pyc
Normal file
BIN
core/__pycache__/dr_engine.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/events.cpython-314.pyc
Normal file
BIN
core/__pycache__/events.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/jira_sync.cpython-314.pyc
Normal file
BIN
core/__pycache__/jira_sync.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/kb_agent.cpython-314.pyc
Normal file
BIN
core/__pycache__/kb_agent.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/ldap_auth.cpython-314.pyc
Normal file
BIN
core/__pycache__/ldap_auth.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/learning.cpython-314.pyc
Normal file
BIN
core/__pycache__/learning.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/license.cpython-314.pyc
Normal file
BIN
core/__pycache__/license.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/llm_client.cpython-314.pyc
Normal file
BIN
core/__pycache__/llm_client.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/mfa.cpython-314.pyc
Normal file
BIN
core/__pycache__/mfa.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/network_scanner.cpython-314.pyc
Normal file
BIN
core/__pycache__/network_scanner.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/nlu.cpython-314.pyc
Normal file
BIN
core/__pycache__/nlu.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/notify.cpython-314.pyc
Normal file
BIN
core/__pycache__/notify.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/oauth.cpython-314.pyc
Normal file
BIN
core/__pycache__/oauth.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/oncall_rotate.cpython-314.pyc
Normal file
BIN
core/__pycache__/oncall_rotate.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/orchestrator.cpython-314.pyc
Normal file
BIN
core/__pycache__/orchestrator.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/predictive.cpython-314.pyc
Normal file
BIN
core/__pycache__/predictive.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/push_notify.cpython-314.pyc
Normal file
BIN
core/__pycache__/push_notify.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/ratelimit.cpython-314.pyc
Normal file
BIN
core/__pycache__/ratelimit.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/scheduler.cpython-314.pyc
Normal file
BIN
core/__pycache__/scheduler.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/scouter.cpython-314.pyc
Normal file
BIN
core/__pycache__/scouter.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/seed.cpython-314.pyc
Normal file
BIN
core/__pycache__/seed.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/si_report.cpython-314.pyc
Normal file
BIN
core/__pycache__/si_report.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/sla.cpython-314.pyc
Normal file
BIN
core/__pycache__/sla.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/ssh_exec.cpython-314.pyc
Normal file
BIN
core/__pycache__/ssh_exec.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/ticket_classifier.cpython-314.pyc
Normal file
BIN
core/__pycache__/ticket_classifier.cpython-314.pyc
Normal file
Binary file not shown.
BIN
core/__pycache__/vuln_scan.cpython-314.pyc
Normal file
BIN
core/__pycache__/vuln_scan.cpython-314.pyc
Normal file
Binary file not shown.
BIN
guardia_itsm.db
Normal file
BIN
guardia_itsm.db
Normal file
Binary file not shown.
18
main.py
18
main.py
@ -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")
|
||||
|
||||
BIN
middleware/__pycache__/__init__.cpython-314.pyc
Normal file
BIN
middleware/__pycache__/__init__.cpython-314.pyc
Normal file
Binary file not shown.
BIN
middleware/__pycache__/license_guard.cpython-314.pyc
Normal file
BIN
middleware/__pycache__/license_guard.cpython-314.pyc
Normal file
Binary file not shown.
BIN
middleware/__pycache__/tenant.cpython-314.pyc
Normal file
BIN
middleware/__pycache__/tenant.cpython-314.pyc
Normal file
Binary file not shown.
124
models.py
124
models.py
@ -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())
|
||||
|
||||
BIN
routers/__pycache__/__init__.cpython-314.pyc
Normal file
BIN
routers/__pycache__/__init__.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/admin.cpython-314.pyc
Normal file
BIN
routers/__pycache__/admin.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/agents.cpython-314.pyc
Normal file
BIN
routers/__pycache__/agents.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/ai_insights.cpython-314.pyc
Normal file
BIN
routers/__pycache__/ai_insights.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/analytics.cpython-314.pyc
Normal file
BIN
routers/__pycache__/analytics.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/anomaly.cpython-314.pyc
Normal file
BIN
routers/__pycache__/anomaly.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/approvals.cpython-314.pyc
Normal file
BIN
routers/__pycache__/approvals.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/assign.cpython-314.pyc
Normal file
BIN
routers/__pycache__/assign.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/attachments.cpython-314.pyc
Normal file
BIN
routers/__pycache__/attachments.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/audit.cpython-314.pyc
Normal file
BIN
routers/__pycache__/audit.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/auth.cpython-314.pyc
Normal file
BIN
routers/__pycache__/auth.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/auto_remediation.cpython-314.pyc
Normal file
BIN
routers/__pycache__/auto_remediation.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/auto_report.cpython-314.pyc
Normal file
BIN
routers/__pycache__/auto_report.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/autodiscovery.cpython-314.pyc
Normal file
BIN
routers/__pycache__/autodiscovery.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/autonomous.cpython-314.pyc
Normal file
BIN
routers/__pycache__/autonomous.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/autonomous_workflow.cpython-314.pyc
Normal file
BIN
routers/__pycache__/autonomous_workflow.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/aws_connector.cpython-314.pyc
Normal file
BIN
routers/__pycache__/aws_connector.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/batch.cpython-314.pyc
Normal file
BIN
routers/__pycache__/batch.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/benchmark.cpython-314.pyc
Normal file
BIN
routers/__pycache__/benchmark.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/bi_dashboard.cpython-314.pyc
Normal file
BIN
routers/__pycache__/bi_dashboard.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/billing.cpython-314.pyc
Normal file
BIN
routers/__pycache__/billing.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/capacity.cpython-314.pyc
Normal file
BIN
routers/__pycache__/capacity.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/catalog.cpython-314.pyc
Normal file
BIN
routers/__pycache__/catalog.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/change.cpython-314.pyc
Normal file
BIN
routers/__pycache__/change.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/chatbot.cpython-314.pyc
Normal file
BIN
routers/__pycache__/chatbot.cpython-314.pyc
Normal file
Binary file not shown.
BIN
routers/__pycache__/cloud_migration.cpython-314.pyc
Normal file
BIN
routers/__pycache__/cloud_migration.cpython-314.pyc
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user