Exclude agents directory

This commit is contained in:
2026-08-05 15:51:13 +09:00
parent 49769cae4f
commit 90e7dbd1c2
6 changed files with 0 additions and 301 deletions

View File

@@ -1,136 +0,0 @@
<#
.SYNOPSIS
src/main/java의 추가·수정 소스에 한글 Javadoc이 붙어 있는지 확인하는 PostToolUse hook.
.DESCRIPTION
`.agents/skills/verify-mcp-server-change/SKILL.md`의 "필수 한글 소스 주석" 규칙을 지침이 아니라
결정적 검사로 강제한다. 최상위 type 선언과 indent 4의 method/constructor 선언 바로 위에
Javadoc(`*/`로 끝나는 블록)이 있는지만 본다. 파일을 고치지 않으며 build에도 관여하지 않는다.
Hook 모드: Claude Code가 stdin으로 넘긴 JSON에서 tool_input.file_path를 읽는다.
누락이 있으면 stderr로 알리고 exit 2로 Claude에게 되돌린다.
수동 모드: -Path 로 파일 또는 디렉터리를 직접 검사한다. 예)
pwsh .claude/hooks/check-javadoc.ps1 -Path src/main/java
#>
param(
[string]$Path
)
$ErrorActionPreference = 'Stop'
function Get-MissingJavadoc {
param([string]$File)
$lines = Get-Content -LiteralPath $File -Encoding utf8
$findings = @()
for ($i = 0; $i -lt $lines.Count; $i++) {
$line = $lines[$i]
if ([string]::IsNullOrWhiteSpace($line)) { continue }
$kind = $null
# 최상위 type 선언 (indent 0). 중첩 type은 skill 규칙의 강제 대상이 아니다.
if ($line -match '^(?:(?:public|final|abstract|sealed|non-sealed)\s+)*(class|interface|record|enum)\s+\w') {
$kind = 'type'
}
# 정확히 indent 4인 선언만 본다. 8칸 이상은 method 본문이나 이어지는 인자 목록이다.
elseif ($line -match '^ {4}\S') {
$body = $line.Substring(4)
# 중첩 type 선언은 건너뛴다.
if ($body -match '^(?:(?:public|protected|private|static|final|abstract|sealed|non-sealed)\s+)*(class|interface|record|enum)\s+\w') {
continue
}
# compact record constructor: `public Protocol {`
if ($body -match '^(public|protected|private)\s+\w+\s*\{\s*$') {
$kind = 'method'
}
# method/constructor: `(` 앞에 토큰이 둘 이상이라 enum 상수(`NAME(...)`)와 구분된다.
elseif ($body -match '^([^(){};=]*\S)\s*\(' -and $matches[1] -match '\s' -and
($body -match '\{\s*$' -or $body -match ';\s*$' -or $body -match '\(\s*$')) {
$kind = 'method'
}
}
if (-not $kind) { continue }
# 선언 위로 올라가며 Javadoc 블록의 끝(`*/`)을 찾는다.
# 빈 줄, annotation, 그리고 선언보다 깊게 들여쓴 줄(여러 줄 annotation의 이어지는 인자)은 건너뛴다.
$declIndent = $line.Length - $line.TrimStart(' ').Length
$hasJavadoc = $false
$j = $i - 1
while ($j -ge 0) {
$prev = $lines[$j]
$trimmed = $prev.Trim()
if ($trimmed -match '\*/$') { $hasJavadoc = $true; break }
$prevIndent = $prev.Length - $prev.TrimStart(' ').Length
if ($trimmed -eq '' -or $trimmed -match '^@\w' -or $prevIndent -gt $declIndent) { $j--; continue }
break
}
if (-not $hasJavadoc) {
$findings += [pscustomobject]@{
File = $File
Line = $i + 1
Kind = $kind
Text = $line.Trim()
}
}
}
return $findings
}
function Test-Target {
param([string]$Candidate)
if ([string]::IsNullOrWhiteSpace($Candidate)) { return $false }
if ($Candidate -notmatch '\.java$') { return $false }
return ($Candidate -replace '\\', '/') -match 'src/main/java/'
}
# --- 대상 수집 ---
$targets = @()
if ($Path) {
if (Test-Path -LiteralPath $Path -PathType Container) {
$targets = Get-ChildItem -LiteralPath $Path -Recurse -Filter *.java |
ForEach-Object { $_.FullName } | Where-Object { Test-Target $_ }
}
elseif (Test-Target $Path) {
$targets = @($Path)
}
}
else {
try {
$raw = [Console]::In.ReadToEnd()
if ([string]::IsNullOrWhiteSpace($raw)) { exit 0 }
$event = $raw | ConvertFrom-Json
$file = $event.tool_input.file_path
if (Test-Target $file) { $targets = @($file) }
}
catch {
# Hook은 편집 흐름을 막지 않는다. 입력을 못 읽으면 조용히 통과시킨다.
exit 0
}
}
if ($targets.Count -eq 0) { exit 0 }
$all = @()
foreach ($t in $targets) {
if (Test-Path -LiteralPath $t) { $all += Get-MissingJavadoc -File $t }
}
if ($all.Count -eq 0) {
if ($Path) { Write-Host "javadoc ok: $($targets.Count) file(s)" }
exit 0
}
$report = ($all | ForEach-Object {
" {0}:{1} [{2}] {3}" -f (Resolve-Path -LiteralPath $_.File -Relative), $_.Line, $_.Kind, $_.Text
}) -join "`n"
[Console]::Error.WriteLine(
"한글 Javadoc 누락 ($($all.Count)건). " +
".agents/skills/verify-mcp-server-change/SKILL.md의 '필수 한글 소스 주석' 규칙에 따라 " +
"역할·처리 단계·협력 객체를 설명하는 주석을 선언 바로 위에 추가하세요.`n$report")
exit 2

View File

@@ -1,38 +0,0 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"permissions": {
"allow": [
"Bash(./gradlew test:*)",
"Bash(./gradlew clean test:*)",
"Bash(./gradlew build:*)",
"Bash(./gradlew check:*)",
"Bash(./gradlew clean check:*)",
"Bash(./gradlew ideaFormat:*)",
"PowerShell(.\\gradlew.bat test:*)",
"PowerShell(.\\gradlew.bat clean test:*)",
"PowerShell(.\\gradlew.bat build:*)",
"PowerShell(.\\gradlew.bat check:*)",
"PowerShell(.\\gradlew.bat clean check:*)",
"PowerShell(.\\gradlew.bat ideaFormat:*)",
"Bash(git status:*)",
"Bash(git diff:*)",
"Bash(git log:*)",
"PowerShell(git status:*)",
"PowerShell(git diff:*)",
"PowerShell(git log:*)"
]
},
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File .claude/hooks/check-javadoc.ps1"
}
]
}
]
}
}

View File

@@ -1,25 +0,0 @@
---
name: verify-mcp-server-change
description: Review, implement, and verify changes to the AX HUB Java MCP server, including mandatory Korean class and method comments for added or modified production source. Use for JSON-RPC parsing or errors, MCP method handlers, Tool Registry metadata or fallback, tool execution planning and routing, streaming responses, trace or audit behavior, Spring profiles, and OpenShift deployment changes. Do not use for documentation-only edits unrelated to server behavior.
---
# Verify MCP Server Change
이 skill의 정본은 `.agents/skills/verify-mcp-server-change/`다. Codex와 Claude Code가 같은 절차를 쓰도록
내용을 복제하지 않고 참조한다.
## 시작할 때 읽을 파일
1. [.agents/skills/verify-mcp-server-change/SKILL.md](../../../.agents/skills/verify-mcp-server-change/SKILL.md)
— workflow 9단계와 필수 한글 소스 주석 규칙.
2. [.agents/skills/verify-mcp-server-change/references/change-checklist.md](../../../.agents/skills/verify-mcp-server-change/references/change-checklist.md)
— 변경 성격에 해당하는 절만 골라 읽는다.
두 파일을 읽고 그 절차를 그대로 따른다. 아래는 Claude Code 환경에서만 다른 점이다.
## Claude Code 실행 메모
- 검증 명령: `.\gradlew.bat test` (의존성·packaging·profile·배포 변경은 `clean test`)
- 공개 응답 모양을 바꾸면 `docs/contracts/agent-builder-mcp/examples/agentbuilder-v0.3/`의 JSON과
`AgentBuilderContractExampleTest`가 함께 바뀌어야 한다. 예제만 고치고 코드를 두거나 그 반대로 두지 않는다.
- 한글 Javadoc 누락은 `.claude/hooks/check-javadoc.ps1`이 편집 직후 알려 준다. hook 경고를 무시한 채 완료 보고하지 않는다.

View File

@@ -1,19 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="RIGHT_MARGIN" value="160" />
<option name="WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN" value="true" />
<JavaCodeStyleSettings>
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
</JavaCodeStyleSettings>
<codeStyleSettings language="JAVA">
<option name="RIGHT_MARGIN" value="160" />
<option name="CALL_PARAMETERS_WRAP" value="1" />
<option name="METHOD_PARAMETERS_WRAP" value="1" />
<option name="METHOD_CALL_CHAIN_WRAP" value="1" />
<option name="WRAP_COMMENTS" value="true" />
<option name="WRAP_LONG_LINES" value="true" />
<option name="WRAP_ON_TYPING" value="1" />
</codeStyleSettings>
</code_scheme>
</component>

View File

@@ -1,6 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Project" />
</state>
</component>

View File

@@ -1,77 +0,0 @@
# AX HUB MCP Server 작업 안내
상세 설계서가 아니라 작업 전에 확인할 **지도**다. **80줄을 넘기지 않는다.** 길어지면 설명을 연결 문서로 옮기고 링크만 남긴다.
## 1. 경계 — 하지 않는 것과, 그럼 누가 하는가
Agent Builder와 Tool Service 사이의 **stateless MCP 실행 계층**이다. Agent Builder가 `tools/call`에 명시한 단일 Tool만 검증하고 실행한다.
| 하지 않는 것 | 하는 곳 |
|---|---|
| Tool 선택, 의도 분류, LLM 추론 | Agent Builder |
| 인증·인가 | NetworkPolicy(호출자 제한) · Agent Builder(Tool 권한) · Tool Service(업무 권한) |
| 업무 규칙, 사원 식별자 복호화 | Tool Service |
근거: [ADR-0001](docs/decisions/ADR-0001-stateless-execution-boundary.md) · [ADR-0006](docs/decisions/ADR-0006-no-authentication-in-mcp.md)
## 2. 불변식 — 깨면 안 되는 것
**값이 아니라 규칙만 적는다.** 실제 숫자는 정본에 있고 여기 옮기지 않는다.
| 영역 | 불변식 |
|---|---|
| 보안 | 요청·응답 body, credential, 사원 식별자는 **암호문이라도** 로그에 남기지 않는다 |
| 보안 | outbound 주소는 설정에서만 온다. 요청 값도 매니페스트도 호출 대상을 바꾸지 못한다 |
| 상태 | 요청 경로는 in-memory snapshot만 읽는다. Redis 실패는 언제나 cache miss다 |
| 상태 | 조회에 **성공했을 때만** 목록을 교체한다. 어떤 실패도 목록을 비우지 않는다 |
| 시간 | `Agent Builder 대기 > MCP 예산 > Tool timeout`, `drain < grace period` |
정본은 [architecture.md](docs/architecture.md)와 [Tool Service 계약 v0.2](docs/contracts/tool-service-mcp/protocol-v0.2-bundle-discovery.md)다. Redis·부분 실패·시간 예산 처리는 **방어 코드가 아니라 계약이다.** 단순화 대상이 아니다.
## 3. 작업 절차
### 시작 전
| 작업 성격 | 볼 것 |
|---|---|
| 전체 구조·요청 흐름·장애 동작 | [docs/architecture.md](docs/architecture.md) |
| MCP/JSON-RPC, Registry, Tool 실행, trace, profile·배포 변경 | `verify-mcp-server-change` skill |
| Agent Builder / Tool Service 공개 계약 | [docs/contracts/](docs/contracts/) |
### 변경 중
1. 가까운 테스트를 먼저 보고, 가장 작은 일관된 변경만 한다. Java 21, constructor injection, 가능한 immutable model.
2. **손대는 대상의 이름을 문서에서 grep해 그 서술이 아직 참인지 확인한다.** 실패는 대개 누락이 아니라 낡음이다.
3. **`docs/contracts/*/examples/`의 JSON은 테스트 fixture다.** 공개 응답을 바꾸면 예제와 계약 테스트를 같은 변경에서 고친다. 테스트는 fallback이 아니라 **운영에서 실제로 도는 경로**를 태워야 한다.
4. 추가·수정한 production class와 method에는 역할·처리 단계·협력 객체를 설명하는 **한글 Javadoc**을 단다. 주변에 주석이 없어도 예외가 아니다. 상세 규칙은 skill의 `references/`에 있다.
5. public endpoint·header·config·배포 기본값을 바꾸기 전에는 운영 영향을 설명한다.
### 완료
- 동작 변경에는 테스트를 추가·수정하고 **`.\gradlew.bat check`** 를 실행한다. 서식 검사는 `CodeStyleContractTest`가 소유해 항상 돌고, 들여쓰기·줄바꿈은 `IDEA_FORMATTER`가 있을 때만 검증된다([README](README.md)).
- 책임·흐름 변경은 `docs/architecture.md`, 운영·인터페이스 지침은 `docs/extension-points.md`에 반영한다.
- **확정된 항목을 `extension-points.md`에서 지우고 ADR이나 계약으로 옮겼는지** 확인한다.
- 검증을 실행할 수 없으면 실행 명령, 실패 원인, 남은 위험을 남긴다.
## 4. 문서 소유 경계
같은 사실을 여러 문서에 적지 않는다. 하나가 정본이고 나머지는 링크한다. 고치기 전에 **그 사실의 정본인지 먼저 확인한다.** 정본이 아니면 링크로 바꾼다. **[README](README.md)의 문서 표는 "읽을 때 어디를 보나", 아래 표는 "쓸 때 어디에 쓰나"다.**
| 사실의 종류 | 정본 |
|---|---|
| 외부와 약속한 요청·응답 모양 | `docs/contracts/` |
| 내부 흐름·클래스 책임·장애 시 동작 | `docs/architecture.md` |
| 실행 방법·endpoint·환경변수 | `README.md` |
| 아직 확정되지 않은 협의·보완 항목 | `docs/extension-points.md` |
| 되돌리지 않을 설계 판단과 근거 | `docs/decisions/` (ADR) |
## 5. 무엇을 만들 것인가
- **ADR**: 되돌리지 않을 판단을 할 때. 기존 ADR은 덮어쓰지 않고 새 ADR에서 대체 관계를 적는다.
- **테스트**: 문서로만 지키는 규칙은 결국 깨진다. 잠글 수 있는 불변식은 계약 테스트로 고정한다.
- **skill·hook**: 특정 영역에 독립적인 규칙이 반복될 때만. 일회성 지침은 만들지 않는다.
## 6. 이 저장소의 조건
- 폐쇄망 반입 대상이다. 외부 네트워크를 요구하는 의존성·플러그인·마켓플레이스를 추가하기 전에 반입 환경에서 동작하는지 먼저 확인한다.
- **아직 git 저장소가 초기화되지 않았다.** `git log`로 변경 이유를 찾을 수 없고, 되돌릴 이력도 없다. 파일을 지우거나 크게 바꾸기 전에 그 사실을 먼저 알린다. 왜 그렇게 되어 있는지는 코드가 아니라 `docs/decisions/`의 ADR에 있다.