feat(harness): system-sync-orchestrator + deploy agents + zioinfo assets
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
63
.claude/agents/deploy-fixer.md
Normal file
@ -0,0 +1,63 @@
|
||||
# deploy-fixer
|
||||
|
||||
## 핵심 역할
|
||||
deploy-verifier의 검증 보고서를 받아 각 시스템의 배포 이슈를 수정한다. workspace → repos → Gitea push, 서버 빌드·배포, stash 복원, /var/www 갱신을 처리한다.
|
||||
|
||||
## 수정 유형별 처리
|
||||
|
||||
### TYPE-1: workspace → repos → Gitea 미동기화
|
||||
```
|
||||
1. workspace/{system}/ 변경 파일 → repos/{system}/ 복사
|
||||
2. repos/{system} git commit
|
||||
3. bundle → 서버 → Gitea push (push_jenkinsfiles_api 패턴)
|
||||
```
|
||||
|
||||
### TYPE-2: 서버 /var/www 구버전 (정적 파일 미갱신)
|
||||
```
|
||||
시스템별 처리:
|
||||
- zioinfo-web: npm build → cp -r backend/static/. /var/www/zioinfo/
|
||||
- guardia-manager: npm build(frontend/) → cp -r frontend/dist/. /var/www/manager/
|
||||
```
|
||||
|
||||
### TYPE-3: 서버 app vs src 미동기화 (ITSM rpa/ 등)
|
||||
```
|
||||
rsync -a --exclude=__pycache__ --exclude=.git --exclude=*.db
|
||||
/opt/guardia/src/ /opt/guardia/app/
|
||||
systemctl restart guardia
|
||||
```
|
||||
|
||||
### TYPE-4: 서버 stash 잔존
|
||||
```
|
||||
1. git stash show --stat 으로 내용 파악
|
||||
2. frontend 파일만 선별 checkout: git checkout stash -- frontend/src/
|
||||
3. 빌드 후 배포
|
||||
4. workspace에 다운로드하여 git 반영
|
||||
```
|
||||
|
||||
### TYPE-5: uncommitted 변경 (빌드 산출물 아닌 것)
|
||||
```
|
||||
1. 변경 내용 확인
|
||||
2. 중요 파일이면 로컬로 다운로드 → workspace 반영
|
||||
3. 서버에서 commit 또는 stash clear
|
||||
```
|
||||
|
||||
## 수정 원칙
|
||||
1. 수정 전 현재 상태를 백업한다 (git stash 또는 cp)
|
||||
2. 한 시스템씩 수정하고 서비스 재기동 후 health check 확인
|
||||
3. 수정 완료 후 `_workspace/fix_report.json` 에 결과 기록
|
||||
4. 서비스가 active 확인될 때까지 재기동 재시도 (최대 3회)
|
||||
5. 실패 시 rollback하고 orchestrator에 보고
|
||||
|
||||
## 접속 정보
|
||||
- 서버: 101.79.17.164, root, 1q2w3e!Q (paramiko)
|
||||
- Gitea: 127.0.0.1:9003, `base64(zio:Zio@Admin2026!)`
|
||||
- Gitea git URL: `http://zio:Zio%40Admin2026%21@127.0.0.1:9003/zio/{repo}.git`
|
||||
|
||||
## 사용 스킬
|
||||
`deploy-fix` 스킬 참조
|
||||
|
||||
## 팀 통신 프로토콜
|
||||
- **수신**: deploy-verifier로부터 `verify_report.json` + 이슈 목록
|
||||
- **수신**: orchestrator로부터 "수정 시작" 메시지
|
||||
- **발신**: orchestrator에게 각 수정 완료 시 진행상황 보고
|
||||
- **발신**: 수정 완료 후 `fix_report.json` 경로 전달
|
||||
58
.claude/agents/deploy-verifier.md
Normal file
@ -0,0 +1,58 @@
|
||||
# deploy-verifier
|
||||
|
||||
## 핵심 역할
|
||||
GUARDiA 5개 시스템(guardia-itsm, zioinfo-web, guardia-manager, guardia-messenger, guardia-docs)의 배포 상태를 검증한다. workspace ↔ repos ↔ Gitea ↔ 서버 4-way 동기화 상태를 점검하고 이슈를 구조화된 보고서로 출력한다.
|
||||
|
||||
## 검증 항목
|
||||
각 시스템에 대해 다음을 확인한다:
|
||||
|
||||
| 항목 | 확인 방법 |
|
||||
|------|----------|
|
||||
| 서비스 활성 여부 | `systemctl is-active` |
|
||||
| 서버 배포 커밋 | `git log -1 --oneline` on `/opt/{app}/src` |
|
||||
| Gitea 최신 커밋 | Gitea API `/api/v1/repos/zio/{repo}/commits?limit=1` |
|
||||
| 커밋 일치 여부 | 서버 커밋 SHA == Gitea 커밋 SHA |
|
||||
| /var/www 최신 여부 | 정적 파일 날짜 vs 최근 빌드 |
|
||||
| app vs src 동기화 | `diff -rq` (ITSM만) |
|
||||
| 서버 stash 잔존 | `git stash list` |
|
||||
| uncommitted 변경 | `git status --short` (빌드 산출물 제외) |
|
||||
|
||||
## 출력 형식
|
||||
`C:/GUARDiA/.claude/agents/_workspace/verify_report.json` 에 저장:
|
||||
|
||||
```json
|
||||
{
|
||||
"timestamp": "2026-06-01T20:00:00",
|
||||
"systems": {
|
||||
"guardia-itsm": {
|
||||
"service": "active",
|
||||
"server_commit": "abc1234",
|
||||
"gitea_commit": "abc1234",
|
||||
"in_sync": true,
|
||||
"issues": []
|
||||
},
|
||||
"zioinfo-web": {
|
||||
"service": "active",
|
||||
"issues": ["stash 잔존", "www May31 구버전"]
|
||||
}
|
||||
},
|
||||
"action_required": ["zioinfo-web", "guardia-manager"],
|
||||
"critical": [],
|
||||
"warnings": []
|
||||
}
|
||||
```
|
||||
|
||||
## 작업 원칙
|
||||
1. 서버 접속은 paramiko SSH (101.79.17.164, root, 1q2w3e!Q)
|
||||
2. 검증만 수행한다 — 절대 수정하지 않는다
|
||||
3. 빌드 산출물(`.pyc`, `__pycache__`, `static/assets/`)은 diff에서 제외
|
||||
4. Gitea API 인증: `base64(zio:Zio@Admin2026!)` Basic auth
|
||||
5. 이슈를 발견하면 심각도(critical/warning/info)로 분류한다
|
||||
|
||||
## 사용 스킬
|
||||
`deploy-verify` 스킬 참조
|
||||
|
||||
## 팀 통신 프로토콜
|
||||
- **수신**: orchestrator로부터 "검증 시작" 메시지
|
||||
- **발신**: deploy-fixer에게 `verify_report.json` 경로와 이슈 목록 전달
|
||||
- **보고**: orchestrator에게 완료 후 요약 (이슈 수, critical 항목)
|
||||
191
.claude/skills/system-sync-orchestrator/SKILL.md
Normal file
@ -0,0 +1,191 @@
|
||||
---
|
||||
name: system-sync-orchestrator
|
||||
description: >
|
||||
GUARDiA 5개 시스템(guardia-itsm, zioinfo-web, guardia-manager, guardia-messenger, guardia-docs)
|
||||
배포 상태를 검증하고 이슈를 자동 수정하는 오케스트레이터.
|
||||
workspace ↔ repos ↔ Gitea ↔ 서버 4-way 동기화 불일치, /var/www 구버전,
|
||||
서버 stash 잔존, app vs src 미동기화, uncommitted 변경을 탐지·수정한다.
|
||||
다음 상황에서 반드시 사용:
|
||||
(1) '5개 시스템 확인', '배포 상태 점검', '서버 최신 확인';
|
||||
(2) '동기화', 'sync', '최신본 올려줘', '배포 맞춰줘';
|
||||
(3) Manager/ITSM/홈페이지/Messenger/Docs 배포 이슈;
|
||||
(4) 다시 실행, 업데이트, 수정, 보완.
|
||||
---
|
||||
|
||||
# GUARDiA 5개 시스템 배포 동기화 오케스트레이터
|
||||
|
||||
**실행 모드:** 하이브리드
|
||||
- Phase 1 (검증): 서브 에이전트 (deploy-verifier)
|
||||
- Phase 2 (수정): 에이전트 팀 (deploy-verifier + deploy-fixer 협업)
|
||||
- Phase 3 (재검증): 서브 에이전트
|
||||
|
||||
---
|
||||
|
||||
## Phase 0: 컨텍스트 확인
|
||||
|
||||
```
|
||||
_workspace/ 존재 여부 확인:
|
||||
- 없음 → 초기 실행 (Phase 1부터)
|
||||
- 있음 + 사용자가 특정 시스템만 지정 → 부분 재실행 (해당 시스템만)
|
||||
- 있음 + 전체 재검증 요청 → 전체 재실행
|
||||
```
|
||||
|
||||
`_workspace/` 디렉토리:
|
||||
```
|
||||
C:/GUARDiA/.claude/agents/_workspace/
|
||||
├── verify_report.json ← deploy-verifier 출력
|
||||
└── fix_report.json ← deploy-fixer 출력
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: 전체 검증 (서브 에이전트)
|
||||
|
||||
**deploy-verifier** 서브 에이전트로 실행:
|
||||
|
||||
### 5개 시스템 검증 항목
|
||||
|
||||
| 시스템 | 서비스 | 경로 | 정적 경로 |
|
||||
|--------|--------|------|-----------|
|
||||
| guardia-itsm | `guardia` | `/opt/guardia/src` + `/opt/guardia/app` | — |
|
||||
| zioinfo-web | `zioinfo` | `/opt/zioinfo/src` | `/var/www/zioinfo` |
|
||||
| guardia-manager | `guardia-manager` | `/opt/manager/src` or `/opt/manager/backend` | `/var/www/manager` |
|
||||
| guardia-messenger | EAS 빌드 | Gitea only | — |
|
||||
| guardia-docs | — | Gitea only | `/var/www/docs` (선택) |
|
||||
|
||||
### 검증 스크립트 패턴
|
||||
`C:/GUARDiA/scripts/check/verify_all_systems.py` 참조.
|
||||
Gitea API 인증: `base64.b64encode(b'zio:Zio@Admin2026!').decode()`
|
||||
|
||||
### 이슈 분류
|
||||
|
||||
| 코드 | 설명 | 심각도 |
|
||||
|------|------|--------|
|
||||
| `STALE_WWW` | /var/www 파일이 최근 배포보다 오래됨 | critical |
|
||||
| `APP_SRC_DRIFT` | /opt/{app}/app vs src 미동기화 | critical |
|
||||
| `STASH_EXISTS` | 서버 git stash 잔존 | warning |
|
||||
| `UNCOMMITTED` | 비빌드 파일 uncommitted | warning |
|
||||
| `COMMIT_MISMATCH` | 서버 커밋 != Gitea 커밋 | critical |
|
||||
| `SERVICE_DOWN` | systemctl not active | critical |
|
||||
| `WORKSPACE_DRIFT` | workspace != repos | info |
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: 이슈 수정 (에이전트 팀)
|
||||
|
||||
Phase 1에서 이슈가 없으면 → 완료 보고 후 종료.
|
||||
이슈 있으면 → deploy-fixer와 팀 구성.
|
||||
|
||||
### 수정 우선순위
|
||||
|
||||
```
|
||||
1. SERVICE_DOWN → 서비스 재기동 먼저
|
||||
2. APP_SRC_DRIFT → rsync + restart
|
||||
3. STASH_EXISTS → stash 내용 평가 → 복원 또는 삭제
|
||||
4. COMMIT_MISMATCH → git fetch + reset --hard origin/main
|
||||
5. STALE_WWW → npm/mvn 빌드 + www 복사
|
||||
6. UNCOMMITTED → 파일 분류 (중요/임시) → workspace 반영 또는 clean
|
||||
7. WORKSPACE_DRIFT → sync_workspace_to_repos.py 실행
|
||||
```
|
||||
|
||||
### 시스템별 수정 처리
|
||||
|
||||
**guardia-itsm (APP_SRC_DRIFT 표준 처리):**
|
||||
```bash
|
||||
rsync -a --exclude=__pycache__ --exclude=.git \
|
||||
--exclude="*.db" --exclude="uploads" \
|
||||
/opt/guardia/src/ /opt/guardia/app/
|
||||
systemctl restart guardia
|
||||
sleep 4 && systemctl is-active guardia
|
||||
```
|
||||
|
||||
**zioinfo-web (STALE_WWW 표준 처리):**
|
||||
```bash
|
||||
cd /opt/zioinfo/src
|
||||
git fetch origin main && git reset --hard origin/main
|
||||
# stash 있으면 핵심 파일 cherry-pick
|
||||
cd frontend && npm run build
|
||||
cp -r ../backend/src/main/resources/static/. /var/www/zioinfo/
|
||||
systemctl restart zioinfo
|
||||
```
|
||||
|
||||
**guardia-manager (STALE_WWW 표준 처리):**
|
||||
```bash
|
||||
cd /opt/manager/src/frontend # or /opt/manager/backend
|
||||
# workspace/guardia-manager의 최신 frontend를 서버에 업로드
|
||||
npm ci && npm run build
|
||||
cp -r dist/. /var/www/manager/
|
||||
systemctl restart guardia-manager
|
||||
```
|
||||
|
||||
**stash 처리 원칙:**
|
||||
- `git stash show --stat` 으로 변경 파일 목록 확인
|
||||
- `frontend/src/` 파일 포함 → `git checkout stash -- frontend/src/` 로 선별 복원 후 빌드
|
||||
- 빌드 산출물(`static/assets/`)만 있으면 → `git stash drop`
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: 재검증 (서브 에이전트)
|
||||
|
||||
Phase 2 완료 후 deploy-verifier 재실행.
|
||||
모든 `action_required` 항목이 비어있으면 성공.
|
||||
|
||||
---
|
||||
|
||||
## 결과 보고 형식
|
||||
|
||||
```
|
||||
=== GUARDiA 5개 시스템 배포 상태 ===
|
||||
|
||||
✅ guardia-itsm — active | 커밋 일치 | app 동기화
|
||||
✅ zioinfo-web — active | 커밋 일치 | www Jun 1 최신
|
||||
✅ guardia-manager— active | 커밋 일치 | www Jun 1 최신
|
||||
✅ guardia-messenger — EAS v1.0.0 | Gitea 최신
|
||||
✅ guardia-docs — 36개 md | Gitea 최신
|
||||
|
||||
수정된 이슈: X개
|
||||
남은 이슈: 0개
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 에러 핸들링
|
||||
|
||||
| 에러 | 처리 |
|
||||
|------|------|
|
||||
| 서비스 재기동 실패 | `journalctl -u {service} -n 20` 로그 수집 후 보고 |
|
||||
| npm build 실패 | `node_modules` 삭제 후 `npm ci` 재시도 |
|
||||
| git reset 충돌 | `git clean -fd` 후 재시도 |
|
||||
| Gitea push 실패 | bundle → 서버 → push 방식 (push_jenkinsfiles_api 패턴) |
|
||||
| rsync 권한 오류 | `chown -R root:root /opt/{app}` 후 재시도 |
|
||||
|
||||
---
|
||||
|
||||
## 테스트 시나리오
|
||||
|
||||
**정상 흐름:**
|
||||
1. 검증 실행 → 이슈 탐지 (Manager STALE_WWW, ITSM APP_SRC_DRIFT)
|
||||
2. 수정 팀 실행 → Manager npm build, ITSM rsync
|
||||
3. 재검증 → 모두 ✅
|
||||
|
||||
**에러 흐름:**
|
||||
- Manager npm build 실패 → `npm ci` 재시도 → 실패 시 보고서에 기록 후 다음 시스템 진행
|
||||
|
||||
---
|
||||
|
||||
## should-trigger
|
||||
|
||||
- "5개 시스템 배포 확인해줘"
|
||||
- "서버에 최신본 올라간 거 맞아?"
|
||||
- "Manager 구버전 올라가 있는데 수정해줘"
|
||||
- "guardia-itsm 배포 상태 점검"
|
||||
- "홈페이지 최신 코드 반영됐나?"
|
||||
- "전체 동기화 해줘"
|
||||
- "다시 실행", "수정", "보완"
|
||||
|
||||
## should-NOT-trigger
|
||||
|
||||
- "guardia-itsm 새 기능 만들어줘" → itsm-dev 에이전트
|
||||
- "홈페이지 디자인 바꿔줘" → ui-overhaul-orchestrator
|
||||
- "Jenkins 파이프라인 설정" → cicd-pipeline-orchestrator
|
||||
- "코드 리뷰해줘" → code-review 스킬
|
||||
@ -0,0 +1,147 @@
|
||||
"""
|
||||
deploy-verifier 에이전트가 사용하는 5개 시스템 검증 스크립트.
|
||||
verify_all_systems.py 기반으로 JSON 보고서를 출력한다.
|
||||
"""
|
||||
import paramiko, sys, json, base64, os
|
||||
from datetime import datetime
|
||||
|
||||
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
||||
|
||||
c = paramiko.SSHClient()
|
||||
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
c.connect('101.79.17.164', username='root', password='1q2w3e!Q', timeout=15)
|
||||
G = base64.b64encode(b'zio:Zio@Admin2026!').decode()
|
||||
|
||||
def ssh(cmd, timeout=15):
|
||||
_, o, _ = c.exec_command(cmd, timeout=timeout)
|
||||
return o.read().decode('utf-8', 'replace').strip()
|
||||
|
||||
def gitea_commit(repo):
|
||||
out = ssh(f"curl -sf 'http://127.0.0.1:9003/api/v1/repos/zio/{repo}/commits?limit=1' "
|
||||
f"-H 'Authorization: Basic {G}' 2>/dev/null | "
|
||||
"python3 -c \"import sys,json; d=json.load(sys.stdin); "
|
||||
"c=d[0]; print(c['sha'][:8]+'|'+c['commit']['message'][:50])\" 2>/dev/null")
|
||||
return out.split('|') if '|' in out else ['unknown', 'unknown']
|
||||
|
||||
report = {
|
||||
"timestamp": datetime.now().isoformat(),
|
||||
"systems": {},
|
||||
"action_required": [],
|
||||
"critical": [],
|
||||
"warnings": [],
|
||||
}
|
||||
|
||||
SYSTEMS = {
|
||||
"guardia-itsm": {
|
||||
"service": "guardia",
|
||||
"src_path": "/opt/guardia/src",
|
||||
"app_path": "/opt/guardia/app",
|
||||
"www_path": None,
|
||||
"port": "9001",
|
||||
},
|
||||
"zioinfo-web": {
|
||||
"service": "zioinfo",
|
||||
"src_path": "/opt/zioinfo/src",
|
||||
"app_path": None,
|
||||
"www_path": "/var/www/zioinfo",
|
||||
"port": "8082",
|
||||
},
|
||||
"guardia-manager": {
|
||||
"service": "guardia-manager",
|
||||
"src_path": "/opt/manager/backend",
|
||||
"app_path": None,
|
||||
"www_path": "/var/www/manager",
|
||||
"port": "8090",
|
||||
},
|
||||
"guardia-messenger": {
|
||||
"service": None,
|
||||
"src_path": None,
|
||||
"app_path": None,
|
||||
"www_path": None,
|
||||
"port": None,
|
||||
},
|
||||
"guardia-docs": {
|
||||
"service": None,
|
||||
"src_path": None,
|
||||
"app_path": None,
|
||||
"www_path": "/var/www/docs",
|
||||
"port": None,
|
||||
},
|
||||
}
|
||||
|
||||
for name, cfg in SYSTEMS.items():
|
||||
issues = []
|
||||
info = {"issues": [], "status": {}}
|
||||
|
||||
# 서비스 상태
|
||||
if cfg["service"]:
|
||||
svc = ssh(f'systemctl is-active {cfg["service"]} 2>/dev/null')
|
||||
info["status"]["service"] = svc
|
||||
if svc != "active":
|
||||
issues.append(f"SERVICE_DOWN:{cfg['service']}")
|
||||
report["critical"].append(f"{name}: service not active")
|
||||
|
||||
# 서버 커밋
|
||||
if cfg["src_path"]:
|
||||
src_commit = ssh(f'git -C {cfg["src_path"]} log -1 --format="%H|%s" 2>/dev/null')
|
||||
info["status"]["server_commit"] = src_commit[:8] if src_commit else "none"
|
||||
|
||||
# Gitea 커밋
|
||||
g_sha, g_msg = gitea_commit(name)
|
||||
info["status"]["gitea_commit"] = g_sha
|
||||
|
||||
if src_commit and g_sha != "unknown":
|
||||
if not src_commit.startswith(g_sha):
|
||||
issues.append(f"COMMIT_MISMATCH:server={src_commit[:8]} gitea={g_sha}")
|
||||
report["critical"].append(f"{name}: commit mismatch")
|
||||
|
||||
# stash 확인
|
||||
stash = ssh(f'git -C {cfg["src_path"]} stash list 2>/dev/null')
|
||||
if stash:
|
||||
issues.append(f"STASH_EXISTS:{stash[:80]}")
|
||||
report["warnings"].append(f"{name}: stash exists")
|
||||
|
||||
# uncommitted 확인 (빌드 산출물 제외)
|
||||
uncommit = ssh(f'git -C {cfg["src_path"]} status --short 2>/dev/null | '
|
||||
"grep -v 'static/assets/' | grep -v '.pyc' | grep -v '__pycache__'")
|
||||
if uncommit:
|
||||
issues.append(f"UNCOMMITTED:{uncommit[:120]}")
|
||||
report["warnings"].append(f"{name}: uncommitted changes")
|
||||
|
||||
# app vs src 비교 (ITSM)
|
||||
if cfg["app_path"] and cfg["src_path"]:
|
||||
diff = ssh(f'diff -rq {cfg["src_path"]} {cfg["app_path"]} '
|
||||
'--exclude="*.pyc" --exclude="__pycache__" --exclude=".git" '
|
||||
'--exclude="*.db" --exclude="uploads" --exclude=".env" '
|
||||
'--exclude=".pytest_cache" 2>/dev/null | head -5')
|
||||
if diff:
|
||||
issues.append(f"APP_SRC_DRIFT:{diff[:150]}")
|
||||
report["critical"].append(f"{name}: app/src drift")
|
||||
|
||||
# /var/www 날짜 확인
|
||||
if cfg["www_path"]:
|
||||
www_date = ssh(f'stat {cfg["www_path"]}/index.html 2>/dev/null | grep Modify | cut -d" " -f2,3 || echo "missing"')
|
||||
info["status"]["www_date"] = www_date
|
||||
# 오늘 날짜(Jun 1 = 2026-06-01) 또는 최근 3일 이내면 최신으로 간주
|
||||
import re as _re
|
||||
today_str = __import__('datetime').datetime.now().strftime('%Y-%m-%d')
|
||||
is_recent = (today_str in www_date or
|
||||
"Jun 1" in www_date or "Jun 1" in www_date or
|
||||
"missing" in www_date or not www_date.strip())
|
||||
if not is_recent and www_date.strip():
|
||||
issues.append(f"STALE_WWW:{www_date}")
|
||||
report["critical"].append(f"{name}: stale www ({www_date})")
|
||||
|
||||
info["issues"] = issues
|
||||
report["systems"][name] = info
|
||||
if issues:
|
||||
report["action_required"].append(name)
|
||||
|
||||
c.close()
|
||||
|
||||
# 저장
|
||||
os.makedirs("C:/GUARDiA/.claude/agents/_workspace", exist_ok=True)
|
||||
with open("C:/GUARDiA/.claude/agents/_workspace/verify_report.json", "w", encoding="utf-8") as f:
|
||||
json.dump(report, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(json.dumps(report, ensure_ascii=False, indent=2))
|
||||
15
CLAUDE.md
@ -279,6 +279,21 @@ GUARDiA ITSM (허브, :9001/:8443)
|
||||
|
||||
---
|
||||
|
||||
## 하네스: 5개 시스템 배포 동기화
|
||||
|
||||
**목표:** guardia-itsm·zioinfo-web·guardia-manager·guardia-messenger·guardia-docs 5개 시스템의 workspace↔repos↔Gitea↔서버 4-way 동기화 상태를 검증하고 이슈를 자동 수정한다.
|
||||
|
||||
**트리거:** 배포 상태 확인, 서버 동기화, 최신본 확인 요청 시 `system-sync-orchestrator` 스킬을 사용하라. "5개 시스템", "배포 확인", "서버 최신", "동기화", "전체 확인" 요청 포함.
|
||||
|
||||
**에이전트:** deploy-verifier (검증), deploy-fixer (수정)
|
||||
|
||||
**변경 이력:**
|
||||
| 날짜 | 변경 내용 | 대상 | 사유 |
|
||||
|------|----------|------|------|
|
||||
| 2026-06-01 | 초기 하네스 구성 | 전체 | 5개 시스템 배포 상태 점검 자동화 |
|
||||
|
||||
---
|
||||
|
||||
## 하네스: 폴더 정리
|
||||
|
||||
**목표:** 루트에 쌓이는 임시 Python 스크립트·구버전 소스·로그 파일을 용도별로 분류·이동·아카이브.
|
||||
|
||||
@ -87,8 +87,8 @@
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700;900&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
<script type="module" crossorigin src="/assets/index-CpO7mTKO.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-Dk81znn6.css">
|
||||
<script type="module" crossorigin src="/assets/index-UKcaZfRq.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-Dsb9GBih.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
||||
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 278 KiB |
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 203 KiB |
|
After Width: | Height: | Size: 181 KiB |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 345 KiB |
|
After Width: | Height: | Size: 188 KiB |
|
After Width: | Height: | Size: 364 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 170 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 170 KiB |
|
After Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 170 KiB |
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 140 KiB |