route:cache 가 걸리면 RouteServiceProvider 가 캐시 로드로 분기해 라우트 파일이 실행되지 않는다. routes/devtools.php 는 전역 함수 5개를 정의하고 핸들러가 호출했고, boost 의 browser-logs 는 프로바이더 boot 등록분이라 setCompiledRoutes 교체로 폐기됐다. 7.0.6 의 RouteCacheHelper 가 12개 라이프사이클 지점에서 캐시를 자동 생성하면서, 확장을 한 번이라도 건드린 사이트에서 항상 재현됐다. 로직을 오토로드되는 App\Support\DevTools\* 로 옮기고 browser-logs URI 를 G7 가 직접 소유해 캐시에 함께 구워지게 했다. 게이트가 참조하던 App\Models\Setting 은 저장소에 없는 유물이라 ConfigRepositoryInterface 로 교체했다. 같은 부류의 재발은 정적 검사(route-file-local-function)로 차단하고, 재현이 in-process 로 불가능하므로 서브프로세스 하네스로 회귀를 고정했다.
356 lines
15 KiB
Markdown
356 lines
15 KiB
Markdown
# 그누보드7 DevTools MCP 서버
|
|
|
|
그누보드7 템플릿 엔진의 런타임 디버깅 정보를 MCP 지원 AI 코딩 도구에서 조회할 수 있는 [MCP(Model Context Protocol)](https://modelcontextprotocol.io/) 서버입니다.
|
|
|
|
## 아키텍처
|
|
|
|
```
|
|
┌─────────────────────┐ HTTP POST ┌─────────────────────┐
|
|
│ 브라우저 (프론트) │ ─────────────▶ │ Laravel 백엔드 │
|
|
│ G7DevToolsCore │ 상태 덤프 │ /_boost/g7-debug │
|
|
│ (코어 빌드에 포함) │ │ → storage/debug-dump/ │
|
|
└─────────────────────┘ └──────────┬──────────┘
|
|
│ 파일 저장
|
|
▼
|
|
┌─────────────────────┐ 파일 읽기 ┌─────────────────────┐
|
|
│ AI 코딩 도구 │ ◀───────────── │ MCP 서버 │
|
|
│ (AI 코딩 도구) │ MCP 프로토콜 │ g7-devtools-server │
|
|
└─────────────────────┘ └─────────────────────┘
|
|
```
|
|
|
|
**브라우저 측 (G7DevToolsCore)**: 코어 템플릿 엔진에 내장된 디버깅 수집기. 디버그 모드 활성화 시 상태, 액션, 캐시, 네트워크 등 30여 개 카테고리의 런타임 정보를 수집하여 서버로 전송합니다.
|
|
|
|
**MCP 서버 (g7-devtools-server)**: 서버에 저장된 디버그 데이터를 읽어 AI 도구에게 구조화된 형태로 제공합니다.
|
|
|
|
---
|
|
|
|
## 전제 조건
|
|
|
|
- **Node.js** 18 이상
|
|
- **그누보드7 프로젝트**가 설치되어 있고, 개발 서버(`php artisan serve` 등)가 실행 중
|
|
- **Laravel Boost** (`laravel/boost`) — `require-dev`에 포함되어 개발 환경에서 자동 설치됨
|
|
- **AI 코딩 도구** — Cursor, VS Code Copilot 등 MCP를 지원하는 도구
|
|
|
|
---
|
|
|
|
## 설치 및 설정
|
|
|
|
### Step 1. 의존성 설치
|
|
|
|
```bash
|
|
cd docs/ai-tools/agents
|
|
npm install
|
|
```
|
|
|
|
### Step 2. MCP 서버 등록
|
|
|
|
사용하는 AI 도구에 따라 등록 방법이 다릅니다.
|
|
|
|
#### MCP 지원 AI 도구 (CLI 기반)
|
|
|
|
프로젝트 루트에 `.mcp.json` 파일을 생성합니다:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"g7-devtools": {
|
|
"type": "stdio",
|
|
"command": "npx",
|
|
"args": [
|
|
"tsx",
|
|
"docs/ai-tools/agents/src/mcp/g7-devtools-server.ts"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
#### VS Code Copilot / Cursor
|
|
|
|
`.vscode/mcp.json` 파일에 등록합니다:
|
|
|
|
```json
|
|
{
|
|
"servers": {
|
|
"g7-devtools": {
|
|
"command": "npx",
|
|
"args": [
|
|
"tsx",
|
|
"docs/ai-tools/agents/src/mcp/g7-devtools-server.ts"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
> **Windows 환경**: `npx`가 동작하지 않으면 `docs/ai-tools/agents/node_modules/.bin/tsx.cmd`를 command로 직접 지정하세요.
|
|
|
|
### Step 3. 환경 변수 설정
|
|
|
|
`docs/ai-tools/agents/.env` 파일을 생성하여 프로젝트 루트 경로를 설정합니다:
|
|
|
|
```env
|
|
# 그누보드7 프로젝트 루트 경로
|
|
G7_PROJECT_ROOT=/path/to/your/g7/project
|
|
```
|
|
|
|
> 이 설정을 생략하면 MCP 서버가 올바른 디버그 디렉토리를 찾지 못할 수 있으므로 반드시 설정하세요.
|
|
|
|
### Step 4. 활성화 확인
|
|
|
|
AI 도구를 리로드(VS Code: `Ctrl+Shift+P` → `Developer: Reload Window`)한 후, MCP 서버 목록에서 `g7-devtools`가 연결됨(Connected) 상태인지 확인합니다.
|
|
|
|
---
|
|
|
|
## 디버그 모드 활성화
|
|
|
|
그누보드7 DevTools가 데이터를 수집하려면 **디버그 모드**가 활성화되어 있어야 합니다.
|
|
|
|
| 방법 | 설정 | 비고 |
|
|
|------|------|------|
|
|
| `.env` 파일 | `APP_DEBUG=true` | 개발 환경 기본 설정 |
|
|
| 환경설정 UI | 관리자 > 고급 설정 > 디버그 모드 | 런타임 토글 가능 |
|
|
|
|
> **주의**: 프로덕션 환경에서는 반드시 디버그 모드를 비활성화하세요. 디버그 데이터에 민감한 정보가 포함될 수 있습니다.
|
|
|
|
---
|
|
|
|
## 사용 방법
|
|
|
|
### 1. 상태 덤프 (브라우저 → 서버)
|
|
|
|
디버그 모드가 활성화된 상태에서 브라우저 개발자 도구(F12) 콘솔에서:
|
|
|
|
```javascript
|
|
// 현재 상태를 서버로 덤프
|
|
window.__G7_DEVTOOLS__.connector.dumpState();
|
|
```
|
|
|
|
또는 그누보드7 DevTools 패널(우측 하단 플로팅 버튼)에서 "상태 덤프" 버튼을 클릭합니다.
|
|
|
|
덤프된 데이터는 `storage/debug-dump/` 디렉토리에 카테고리별 JSON 파일로 저장됩니다:
|
|
|
|
```
|
|
storage/debug-dump/
|
|
├── state-latest.json # 상태 스냅샷
|
|
├── actions-latest.json # 액션 이력
|
|
├── cache-latest.json # 캐시 통계
|
|
├── network-latest.json # 네트워크 요청
|
|
├── expressions-latest.json # 표현식 평가
|
|
├── lifecycle-latest.json # 컴포넌트 생명주기
|
|
├── form-latest.json # 폼 바인딩
|
|
├── conditionals-latest.json # 조건부/반복 렌더링
|
|
├── datasources-latest.json # 데이터소스 구조
|
|
├── handlers-latest.json # 등록된 핸들러
|
|
├── component-events-latest.json # 컴포넌트 이벤트
|
|
├── performance-latest.json # 렌더링 성능
|
|
├── state-rendering-latest.json # 상태-렌더링 추적
|
|
├── state-hierarchy-latest.json # 상태 계층
|
|
├── context-flow-latest.json # 컨텍스트 전파
|
|
├── style-validation-latest.json # 스타일 이슈
|
|
├── auth-debug-latest.json # 인증 상태
|
|
├── layout-latest.json # 레이아웃 JSON
|
|
├── computed-dependency-latest.json # Computed 의존성
|
|
├── nested-context-latest.json # 중첩 컨텍스트
|
|
├── modal-state-scope-latest.json # 모달 상태 스코프
|
|
├── sequence-latest.json # Sequence 실행
|
|
├── stale-closure-latest.json # Stale Closure 감지
|
|
├── change-detection-latest.json # 변경 감지
|
|
├── logs-latest.json # Logger 로그
|
|
└── sessions/ # 세션별 이력
|
|
```
|
|
|
|
### 2. AI 도구에서 조회
|
|
|
|
MCP 서버가 등록되어 있으면, AI 코딩 도구에서 자연어로 요청하거나 도구를 직접 호출할 수 있습니다.
|
|
|
|
**자연어 요청 예시**:
|
|
- "현재 _global 상태 확인해줘"
|
|
- "에러가 난 액션이 있는지 확인해"
|
|
- "네트워크 요청 중 실패한 것 있어?"
|
|
- "폼 바인딩 상태 보여줘"
|
|
|
|
---
|
|
|
|
## MCP 도구 레퍼런스
|
|
|
|
### 기본 디버깅 도구
|
|
|
|
| 도구 | 설명 | 주요 파라미터 |
|
|
|------|------|-------------|
|
|
| `g7-state` | 현재 상태 조회 (`_global`, `_local`, `_computed`) | `path` (경로), `search` (검색) |
|
|
| `g7-actions` | 액션 실행 이력 | `filter` (핸들러 타입), `showParams`, `search` |
|
|
| `g7-cache` | 캐시 통계 (Hit/Miss 비율) | - |
|
|
| `g7-diagnose` | 증상 기반 자동 진단 | `symptoms` (증상 배열, 필수) |
|
|
| `g7-lifecycle` | 컴포넌트 생명주기 (마운트/언마운트) | - |
|
|
| `g7-network` | API 요청 이력 및 데이터소스 상태 | `status` (success/error), `showResponse`, `search` |
|
|
| `g7-form` | Form/Input 바인딩 정보 | - |
|
|
| `g7-expressions` | 표현식 평가 이력 및 경고 | - |
|
|
| `g7-logs` | Logger 로그 이력 | `search` |
|
|
|
|
### 고급 분석 도구
|
|
|
|
| 도구 | 설명 | 주요 파라미터 |
|
|
|------|------|-------------|
|
|
| `g7-datasources` | 데이터소스 정의 및 구조, 경로 변환 추적 | `search` |
|
|
| `g7-handlers` | 등록된 액션 핸들러 목록 | `search` |
|
|
| `g7-events` | 컴포넌트 이벤트 구독/발행 이력 | - |
|
|
| `g7-performance` | 렌더링 성능, 메모리 경고 | - |
|
|
| `g7-conditionals` | 조건부(`if`)/반복(`iteration`) 렌더링 평가 정보 | - |
|
|
| `g7-websocket` | WebSocket 연결 상태 및 메시지 | - |
|
|
| `g7-named-actions` | named_actions 정의 및 참조 현황 | `search` |
|
|
|
|
### 상태 계층 및 스타일 도구
|
|
|
|
| 도구 | 설명 | 주요 파라미터 |
|
|
|------|------|-------------|
|
|
| `g7-renders` | setState 호출 → 렌더링 상관관계 | - |
|
|
| `g7-state-hierarchy` | 상태 계층 및 우선순위 시각화, 충돌 감지 | `conflictsOnly`, `path`, `showValues` |
|
|
| `g7-context-flow` | componentContext 전파 추적 | - |
|
|
| `g7-styles` | CSS 스타일 이슈 감지 (보이지 않는 요소, 다크모드 누락) | - |
|
|
| `g7-auth` | 인증 상태 및 토큰 정보 | - |
|
|
| `g7-tailwind` | Tailwind CSS 빌드/퍼지 검증 | - |
|
|
| `g7-layout` | 현재 렌더링 중인 레이아웃 JSON | - |
|
|
|
|
### 상태 추적 심화 도구
|
|
|
|
| 도구 | 설명 | 주요 파라미터 |
|
|
|------|------|-------------|
|
|
| `g7-computed` | Computed 속성 의존성 추적, 순환 감지 | - |
|
|
| `g7-nested-context` | 중첩 컨텍스트 전파 (expandChildren, iteration, modal, slot) | - |
|
|
| `g7-modal-state` | 모달 스코프 상태 추적 (격리, 유출 감지, 중첩 모달) | - |
|
|
| `g7-sequence` | Sequence 핸들러 실행 추적 (각 액션별 상태 변화) | - |
|
|
| `g7-stale-closure` | Stale Closure 감지 및 경고 | - |
|
|
| `g7-change-detection` | 핸들러 실행 시 변경 감지 (상태 변경 없는 핸들러, early return) | - |
|
|
|
|
### 페이지네이션
|
|
|
|
모든 도구는 `offset`과 `limit` 파라미터를 지원합니다:
|
|
|
|
```
|
|
g7-logs limit=20 offset=0 # 첫 페이지 (1~20)
|
|
g7-logs limit=20 offset=20 # 두 번째 페이지 (21~40)
|
|
g7-actions limit=10 offset=30 # 31~40번째 항목
|
|
```
|
|
|
|
출력 예시:
|
|
```
|
|
📄 페이지네이션: 21~40 / 총 249개 로그
|
|
➡️ 다음 페이지: offset: 40, limit: 20
|
|
⬅️ 이전 페이지: offset: 0, limit: 20
|
|
```
|
|
|
|
---
|
|
|
|
## 디버깅 워크플로우
|
|
|
|
### 기본 흐름
|
|
|
|
```
|
|
1. 디버그 모드 활성화 (APP_DEBUG=true)
|
|
2. 브라우저에서 문제가 발생하는 페이지 열기
|
|
3. 문제 재현 후, 개발자 도구 콘솔에서 상태 덤프 실행
|
|
4. AI 도구에서 g7-diagnose 호출 (증상 목록 전달)
|
|
5. 진단 결과에 따라 세부 도구로 심층 분석
|
|
```
|
|
|
|
### 증상별 도구 선택 가이드
|
|
|
|
| 증상 | 1차 도구 | 2차 도구 |
|
|
|------|---------|---------|
|
|
| 상태가 반영되지 않음 | `g7-state` | `g7-state-hierarchy`, `g7-stale-closure` |
|
|
| 액션 실행 후 변화 없음 | `g7-actions` | `g7-change-detection`, `g7-handlers` |
|
|
| API 데이터 미표시 | `g7-network` | `g7-datasources`, `g7-expressions` |
|
|
| 폼 값이 전송되지 않음 | `g7-form` | `g7-state`, `g7-actions` |
|
|
| 조건부 렌더링 오류 | `g7-conditionals` | `g7-expressions`, `g7-computed` |
|
|
| 모달 내 상태 이상 | `g7-modal-state` | `g7-nested-context`, `g7-state-hierarchy` |
|
|
| 스타일/CSS 문제 | `g7-styles` | `g7-tailwind` |
|
|
| 렌더링 성능 저하 | `g7-performance` | `g7-renders`, `g7-computed` |
|
|
| 이전 값이 남아있음 | `g7-stale-closure` | `g7-state`, `g7-change-detection` |
|
|
| 인증/401 오류 | `g7-auth` | `g7-network` |
|
|
| Sequence 중간 실패 | `g7-sequence` | `g7-actions` |
|
|
|
|
---
|
|
|
|
## 프로젝트 내 관련 파일
|
|
|
|
```
|
|
docs/ai-tools/agents/
|
|
└── src/mcp/
|
|
└── g7-devtools-server.ts # MCP 서버 (도구 정의 및 데이터 파싱)
|
|
|
|
resources/js/core/devtools/ # 브라우저 측 DevTools 코어
|
|
├── G7DevToolsCore.ts # 싱글톤 디버깅 수집기
|
|
├── ServerConnector.ts # 서버 전송 (상태 덤프)
|
|
├── DiagnosticEngine.ts # 자동 진단 엔진
|
|
├── StyleTracker.ts # 스타일 이슈 추적
|
|
├── TailwindValidator.ts # Tailwind CSS 검증
|
|
├── types.ts # 타입 정의
|
|
├── index.ts # 엔트리포인트
|
|
└── ui/ # DevTools 패널 UI (React)
|
|
|
|
routes/devtools.php # 상태 덤프 API 엔드포인트
|
|
app/Support/DevTools/ # 엔드포인트 실제 구현 (덤프 기록 · 브라우저 로그 · 디버그 게이트)
|
|
storage/debug-dump/ # 디버그 데이터 저장 (자동 생성, Git 제외)
|
|
```
|
|
|
|
라우트 파일은 위임만 하고 로직은 `app/Support/DevTools/` 의 클래스가 갖는다. 라우트 캐시가
|
|
걸리면 라우트 파일이 로드되지 않으므로, 파일 안에 정의된 심볼은 핸들러가 호출하는 순간
|
|
사라진다 (상세: [routing.md "캐시 안전한 라우트 작성"](../../backend/routing.md)).
|
|
|
|
### 브라우저 콘솔 로그 수집 (`_boost/browser-logs`)
|
|
|
|
이 엔드포인트는 원래 Laravel Boost 패키지가 등록했으나 G7 가 `routes/devtools.php` 에서 직접
|
|
소유한다. 패키지는 서비스 프로바이더 부팅 시점에 라우트를 등록하는데, 라우트 캐시가 있으면
|
|
그 시점의 등록이 캐시 교체로 폐기되어 엔드포인트가 사라졌다. 그 결과 브라우저가 보낸 로그
|
|
요청이 조용히 실패하고 — 실패는 스크립트 안에서 삼켜져 화면에도 로그에도 아무 흔적이 남지
|
|
않는다 — `storage/logs/browser.log` 만 비어 있었다.
|
|
|
|
URI 는 `_boost/browser-logs` 로 고정한다. 이미 배포된 주입 스크립트가 이 주소를 사용하므로
|
|
바꾸면 로그 수집이 다시 끊긴다. 디버그 모드가 꺼져 있으면 403 을 반환한다.
|
|
|
|
---
|
|
|
|
## 트러블슈팅
|
|
|
|
### MCP 서버가 시작되지 않는 경우
|
|
|
|
1. `docs/ai-tools/agents/node_modules/`가 존재하는지 확인 → `cd docs/ai-tools/agents && npm install`
|
|
2. Node.js 18 이상인지 확인 → `node --version`
|
|
3. AI 도구를 리로드했는지 확인 (VS Code: `Ctrl+Shift+P` → `Developer: Reload Window`)
|
|
|
|
### Windows에서 `npx` 실행 오류
|
|
|
|
Windows 환경에서 AI 도구가 `npx`를 찾지 못하는 경우:
|
|
|
|
```json
|
|
{
|
|
"g7-devtools": {
|
|
"command": "docs/ai-tools/agents/node_modules/.bin/tsx.cmd",
|
|
"args": [
|
|
"docs/ai-tools/agents/src/mcp/g7-devtools-server.ts"
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### 상태 덤프가 실패하는 경우
|
|
|
|
1. **디버그 모드 확인**: `.env`에서 `APP_DEBUG=true`인지 확인
|
|
2. **서버 실행 확인**: 개발 서버(`php artisan serve` 등)가 실행 중인지 확인
|
|
3. **콘솔 로그 확인**: 브라우저 콘솔에서 `[G7DevTools]` 로그로 오류 원인 파악
|
|
4. **엔드포인트 확인**: `/_boost/g7-debug/dump-state`에 POST 요청이 정상 도달하는지 확인
|
|
|
|
### 도구 호출 시 "데이터 없음"
|
|
|
|
1. **상태 덤프 선행 필수**: 브라우저에서 상태 덤프를 먼저 실행해야 합니다
|
|
2. **파일 존재 확인**: `storage/debug-dump/` 디렉토리에 `*-latest.json` 파일이 있는지 확인
|
|
3. **경로 확인**: `G7_PROJECT_ROOT` 환경 변수가 올바른 프로젝트 경로를 가리키는지 확인
|
|
4. **덤프 시간 확인**: 도구 출력의 "📅 덤프 시간" 표시가 너무 오래된 경우 재덤프 필요
|
|
|
|
### 대용량 데이터 조회 시 응답 잘림
|
|
|
|
- 모든 도구에서 `limit`과 `offset` 파라미터로 페이지네이션 사용
|
|
- `g7-state`는 `path` 파라미터로 특정 경로만 조회 (예: `path: "_global.user"`)
|
|
- `g7-actions`는 `filter`로 핸들러 타입 필터링 (예: `filter: "apiCall"`)
|