Skip to content

Commit c52fc82

Browse files
committed
Apply Dark Tech Editorial CLI design system
0 parents  commit c52fc82

99 files changed

Lines changed: 19997 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/commands/deploy.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# 커밋 + 푸시 + Fly.io 배포
2+
3+
변경사항을 커밋, 푸시하고 Fly.io에 배포합니다.
4+
5+
## 실행할 작업
6+
7+
### 1단계: 커밋 & 푸시
8+
1. `git status`로 변경된 파일 확인
9+
2. `git diff`로 변경 내용 확인
10+
3. `git log -3 --oneline`로 최근 커밋 스타일 확인
11+
4. 변경사항 분석 후 적절한 커밋 메시지 작성
12+
5. `git add`로 변경사항 스테이징 (단, `.claude/memory/` 폴더는 `git reset -- .claude/memory/`로 제외)
13+
6. `git commit`으로 커밋
14+
7. `git push`로 원격에 푸시
15+
16+
### 2단계: 빌드 검증
17+
8. `npm run build`로 빌드 확인 (실패 시 중단)
18+
19+
### 3단계: Fly.io 배포
20+
9. flyctl로 배포 실행:
21+
```
22+
"C:\Users\Chris\AppData\Local\Microsoft\WinGet\Packages\Fly-io.flyctl_Microsoft.Winget.Source_8wekyb3d8bbwe\flyctl.exe" deploy
23+
```
24+
- flyctl이 PATH에 없으므로 반드시 위 전체 경로 사용
25+
- `fly` 또는 `flyctl` 명령은 실패함 → 전체 경로 필수
26+
10. 배포 결과 확인 및 요약
27+
28+
## 제외 대상
29+
- `.claude/memory/` 폴더: 메모리 파일은 로컬 전용 (커밋 금지)
30+
31+
## 커밋 메시지 형식
32+
- 한글로 작성
33+
- prefix 사용: feat, fix, refactor, docs, style, chore
34+
- 예: `feat: 별표 텍스트 추출 기능 추가`
35+
36+
## 배포 환경
37+
- 플랫폼: Fly.io (앱: korean-law-mcp)
38+
- 리전: nrt (도쿄)
39+
- Dockerfile: node:20-alpine, SSE 모드
40+
- URL: https://korean-law-mcp.fly.dev/

.claude/next-sessions.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# 다음 세션 프롬프트
2+
3+
## 세션 2: 호출 테스트 검증
4+
5+
```
6+
korean-law-mcp v2.2 업그레이드 세션 2 — 호출 테스트.
7+
8+
커밋 88f94a5에서 65→88개 도구로 확장했어. 신규 23개 도구를 전수 호출 테스트해서 검증해줘.
9+
10+
테스트 대상 (신규 도구):
11+
1. date-parser: "최근 3년 음주운전 판례" CLI 실행
12+
2. analyze_document: 샘플 계약서 텍스트로 테스트
13+
3. chain_document_review: 엔드투엔드
14+
4. search_treaties / get_treaty_text
15+
5. get_linked_ordinances / get_linked_ordinance_articles / get_delegated_laws / get_linked_laws_from_ordinance
16+
6. get_article_detail (조항호목)
17+
7. compare_admin_rule_old_new
18+
8. get_law_abbreviations
19+
9. search_school_rules / get_school_rule_text
20+
10. search_public_corp_rules / get_public_corp_rule_text
21+
11. search_public_institution_rules / get_public_institution_rule_text
22+
12. search_acr_decisions / get_acr_decision_text
23+
13. search_appeal_review_decisions / get_appeal_review_decision_text
24+
14. search_acr_special_appeals / get_acr_special_appeal_text
25+
15. precedents/interpretations 날짜 필터 테스트
26+
27+
방법: MCP 도구 직접 호출 또는 CLI로 테스트. 실패하는 건 즉시 수정.
28+
끝나면 메모리 저장 + 세션 3 프롬프트 확인 + 커밋/푸시.
29+
```
30+
31+
## 세션 3: 프로덕션 리뷰 + 배포
32+
33+
```
34+
korean-law-mcp v2.2 업그레이드 세션 3 — 프로덕션 리뷰 + 배포.
35+
36+
세션 2에서 88개 도구 호출 테스트 완료. 이제 최종 마무리:
37+
38+
1. 코드 품질 리뷰
39+
- 보안 (API 키 노출, 입력 검증)
40+
- 에러 처리 (엣지 케이스)
41+
- 파일 크기 200줄 규칙 준수
42+
- risk-rules.ts 543줄 → 분리 필요 여부
43+
44+
2. 문서 업데이트
45+
- CLAUDE.md: 88개 도구 반영
46+
- README.md / README-KR.md: 신규 도구 카테고리 추가
47+
- docs/API.md: 신규 도구 레퍼런스
48+
49+
3. 버전 범프 + 배포
50+
- package.json → 2.2.0
51+
- npm publish
52+
- fly deploy (원격 서버)
53+
54+
끝나면 메모리 저장 + 커밋/푸시.
55+
```

.claude/plans/web-ui-chatbot.md

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# 한국 법령 챗봇 웹 UI 개발 계획
2+
3+
## 목표
4+
5+
**MCP 서버는 이미 배포됨** → 웹 UI만 Vercel로 새로 만들기
6+
7+
**사용자**: 와이프 + 지인들 (법령 조회가 필요한 일반인)
8+
**배포**: Vercel (무료 Hobby 플랜)
9+
**LLM**: Gemini 2.0 Flash (무료 tier)
10+
**백엔드**: 기존 korean-law-mcp HTTP 엔드포인트 활용
11+
12+
---
13+
14+
## 사용자별 API 키 처리 방식
15+
16+
### 결정: 사용자가 직접 입력
17+
18+
**흐름:**
19+
1. 웹 UI 첫 접속 시 법제처 API 키 입력 모달 표시
20+
2. 사용자가 본인의 API 키 입력 (법제처에서 무료 발급)
21+
3. API 키는 **브라우저 localStorage**에 저장 (서버 저장 X)
22+
4. 모든 MCP 요청 시 헤더 또는 파라미터로 API 키 전달
23+
5. MCP 서버는 요청마다 전달받은 키로 법제처 API 호출
24+
25+
**장점:**
26+
- 서버에 민감 정보 저장 안 함
27+
- 사용량 제한 걱정 없음 (각자 본인 할당량 사용)
28+
- GDPR/개인정보 이슈 없음
29+
30+
**MCP 서버 수정 필요:**
31+
- 요청 헤더/파라미터에서 `LAW_OC` 키 수신
32+
- 환경변수 대신 요청별 키 사용
33+
34+
**웹 UI 추가 구현:**
35+
- API 키 입력 모달 컴포넌트
36+
- localStorage 저장/로드 로직
37+
- API 키 발급 안내 링크 (https://www.law.go.kr/DRF/lawService.do)
38+
39+
---
40+
41+
## 전제 조건
42+
43+
- ✅ korean-law-mcp 서버는 이미 배포돼 있음 (HTTP 모드)
44+
- ✅ MCP 엔드포인트: `https://your-deployed-mcp.com/mcp`
45+
- ✅ Bearer Token 인증 이미 적용됨
46+
- ⚠️ **MCP 서버 수정 필요** - 요청별 API 키 처리 추가
47+
48+
---
49+
50+
## 프로젝트 구조
51+
**새 저장소**: `korean-law-chatbot`
52+
53+
```
54+
korean-law-chatbot/
55+
├── app/
56+
│ ├── api/
57+
│ │ └── chat/
58+
│ │ └── route.ts # Vercel AI SDK 엔드포인트
59+
│ ├── page.tsx # 메인 채팅 UI
60+
│ └── layout.tsx
61+
├── lib/
62+
│ ├── mcp-client.ts # korean-law-mcp HTTP 클라이언트
63+
│ └── gemini.ts # Gemini API 설정
64+
├── components/
65+
│ ├── chat-interface.tsx # 카카오톡 스타일 채팅
66+
│ ├── law-card.tsx # 법령 조회 결과 카드
67+
│ └── message-bubble.tsx # 메시지 말풍선
68+
└── package.json
69+
```
70+
71+
## 기술 스택
72+
- **Frontend**: Next.js 15 App Router + Tailwind CSS
73+
- **LLM**: Gemini 2.0 Flash (무료 tier, Vercel AI SDK)
74+
- **MCP 연결**: 기존 korean-law-mcp HTTP 엔드포인트
75+
- **배포**: Vercel (무료 Hobby 플랜)
76+
- **디자인**: 카카오톡 스타일 채팅 UI
77+
78+
---
79+
80+
## 구현 단계별 작업
81+
82+
### 1단계: 프로젝트 초기 설정 (1시간)
83+
```bash
84+
npx create-next-app@latest korean-law-chatbot --typescript --tailwind --app
85+
cd korean-law-chatbot
86+
npm install ai @ai-sdk/google
87+
```
88+
89+
**package.json 의존성**:
90+
- `next`: ^15.0.0
91+
- `react`: ^19.0.0
92+
- `ai`: ^4.0.0
93+
- `@ai-sdk/google`: ^1.0.0
94+
- `tailwindcss`: ^3.4.0
95+
96+
### 2단계: MCP 클라이언트 구현 (2시간)
97+
**파일**: `lib/mcp-client.ts`
98+
- MCP HTTP 엔드포인트 연결
99+
- Bearer Token 인증 헤더
100+
- 33개 도구 → Vercel AI SDK 형식 변환
101+
- JSON-RPC 2.0 호출 로직
102+
103+
### 3단계: 채팅 UI 컴포넌트 (3시간)
104+
**파일**:
105+
- `app/page.tsx` - 메인 레이아웃
106+
- `components/chat-interface.tsx` - 메시지 리스트 + 입력창
107+
- `components/message-bubble.tsx` - 카카오톡 스타일 말풍선
108+
- `components/example-query.tsx` - 예제 질문 버튼
109+
110+
### 4단계: 법령 카드 렌더링 (1시간)
111+
**파일**: `components/law-card.tsx`
112+
- MCP tool 결과를 카드 UI로 표시
113+
- 법령명, 조문 번호, 시행일, 내용
114+
- 법제처 외부 링크
115+
116+
### 5단계: 스타일링 (2시간)
117+
**Tailwind 설정**:
118+
- 카카오톡 노란색 (#FFE812)
119+
- 그라데이션 배경
120+
- 모바일 반응형
121+
122+
### 6단계: Vercel 배포 (1시간)
123+
1. GitHub Push
124+
2. Vercel Import
125+
3. 환경변수 설정
126+
4. 테스트 및 검증
127+
128+
---
129+
130+
## 예상 소요 시간
131+
132+
**총합**: 약 10시간 (1-2일)
133+
134+
---
135+
136+
## 성공 기준
137+
138+
- [ ] Vercel 배포 성공 (HTTPS 도메인 생성)
139+
- [ ] Gemini API 연동 정상 동작
140+
- [ ] MCP 33개 도구 모두 호출 가능
141+
- [ ] 카카오톡 스타일 UI 구현
142+
- [ ] 모바일/데스크톱 반응형
143+
- [ ] 와이프 + 지인 1명 이상 테스트 완료

.claude/settings.local.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"permissions": {
3+
"allow": [
4+
"Bash(npm run build:*)",
5+
"Bash(npx:*)",
6+
"Bash(node test-tools.js:*)",
7+
"Bash(where:*)",
8+
"Bash(korean-law-mcp:*)",
9+
"Bash(node -e \"console.log\\(require\\(''c:/github_project/korean-law-mcp/.claude/mcp.json''\\)\\)\")",
10+
"Bash(set LAW_OC=ryuseungin:*)",
11+
"Bash(node build/index.js:*)",
12+
"Bash(ls:*)",
13+
"Bash(cat:*)",
14+
"Bash(node test-33-tools.js:*)",
15+
"Bash(node test-compare.js:*)",
16+
"Bash(node test-admin-rule.js:*)",
17+
"Bash(node:*)",
18+
"Bash(LAW_OC=ryuseungin node:*)",
19+
"Bash(git add:*)",
20+
"Bash(git commit -m \"$\\(cat <<''EOF''\nfeat: Add 18 new law API tools \\(v1.5.0\\)\n\n- Constitutional Court decisions \\(헌재결정례\\)\n- Administrative appeals \\(행정심판례\\)\n- English law translation \\(영문법령\\)\n- Legal terminology dictionary \\(법령용어\\)\n- Everyday law guides \\(생활법령정보\\)\n- Committee decisions: FTC, PIPC, NLRC \\(위원회 결정문\\)\n- Historical law retrieval \\(연혁법령\\)\n- Law system tree \\(법령체계도\\)\n\nTotal tools: 51\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
21+
"Bash(git commit -m \"$\\(cat <<''EOF''\ndocs: Simplify CLAUDE.md \\(230 → 47 lines\\)\n\nApply WHAT/WHY/HOW principle with progressive disclosure.\nRemove duplicated content \\(already in README.md, docs/\\).\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")"
22+
]
23+
},
24+
"outputStyle": "chris-v3"
25+
}

.dockerignore

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
node_modules
2+
build
3+
dist
4+
npm-debug.log
5+
.env
6+
.env.local
7+
.git
8+
.gitignore
9+
README.md
10+
.vscode
11+
.idea
12+
*.md

.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# 법제처 오픈API 인증키 (필수)
2+
# 발급: https://www.law.go.kr/DRF/lawService.do
3+
LAW_OC=your-api-key-here

.github/workflows/ci.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
13+
strategy:
14+
matrix:
15+
node-version: [20]
16+
17+
steps:
18+
- uses: actions/checkout@v4
19+
20+
- name: Use Node.js ${{ matrix.node-version }}
21+
uses: actions/setup-node@v4
22+
with:
23+
node-version: ${{ matrix.node-version }}
24+
cache: npm
25+
26+
- name: Install dependencies
27+
run: npm ci
28+
29+
- name: Build
30+
run: npm run build

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
node_modules/
2+
build/
3+
dist/
4+
*.log
5+
.DS_Store
6+
.env
7+
.env.local
8+
test-*.js

.mcp.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"mcpServers": {
3+
"korean-law": {
4+
"type": "stdio",
5+
"command": "node",
6+
"args": ["C:\\Users\\Mong NAS\\.openclaw\\workspace\\korean-law-mcp\\build\\index.js"],
7+
"env": {
8+
"LAW_OC": "ryuseungin"
9+
}
10+
}
11+
}
12+
}

CHANGELOG.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# Changelog
2+
3+
## [2.2.0] - 2026-04-01
4+
5+
### Added
6+
- 23개 신규 도구: 조약(2), 법령-자치법규 연계(4), 학칙/공단/공공기관(6), 특별행정심판(4), 감사원(2), 약칭(1), 행정규칙 신구대조(1), 조항호목(1), 문서분석(1), chain_document_review(1)
7+
- date-parser: 자연어 시간 표현 → YYYYMMDD 변환 (10개 패턴)
8+
- document-analysis: 8종 문서유형 분류, 17개 리스크규칙, 금액/기간 추출, 조항 충돌 탐지
9+
- 판례/해석례 날짜 필터 (fromDate/toDate)
10+
11+
### Changed
12+
- 에러 처리 통일: 40개 도구의 인라인 에러 → formatToolError 전환
13+
- 중복 XML 파서 6개 → 공용 parseSearchXML 통합
14+
- cli.ts 분리: cli-format.ts + cli-executor.ts + cli.ts (689줄 → 443+181+227)
15+
- annex.ts: AnnexItem 타입 정의, any 12회 제거
16+
17+
### Security
18+
- sse-server.ts: CORS * → CORS_ORIGIN 환경변수 기반
19+
- sse-server.ts: API 키 쿼리스트링 경로 제거 (헤더만 허용)
20+
- sse-server.ts: 보안 헤더 추가 (X-Content-Type-Options, X-Frame-Options, Referrer-Policy)
21+
- sse-server.ts: 세션 ID 로그 마스킹 (첫 8자만 출력)
22+
23+
### Fixed
24+
- 조약 XML 아이템태그 대소문자 (trty→Trty), 본문 JSON 키 (BothTrtyService)
25+
- 연계 fetchApi type 기본값 제거 (type=XML 시 500 발생)
26+
- api-client.ts: type 파라미터 미지정 시 생략
27+
28+
- 총 도구 수: 64 → 87
29+
30+
## [1.9.0] - 2026-03-15
31+
32+
### Fixed
33+
- HWP 구형 파서: `controls` 내 테이블(표) 추출 지원
34+
- `hwp.js``paragraph.controls[].content` 경로에서 테이블 구조(rows/cells) 탐색
35+
- 기존에는 `paragraph.content`만 탐색하여 표 형식 HWP 파싱 실패
36+
37+
## [1.8.1] - 2026-03-15
38+
39+
### Changed
40+
- MCP 도구 스키마 최적화: description 압축 + apiKey 은닉
41+
42+
## [1.8.0] - 2026-03-10
43+
44+
### Added
45+
- 체인 도구 7개: chain_law_system, chain_action_basis, chain_dispute_prep, chain_amendment_track, chain_ordinance_compare, chain_full_research, chain_procedure_detail
46+
- get_batch_articles: `laws` 배열 파라미터로 복수 법령 일괄 조회 지원
47+
- search_ai_law: `lawTypes` 필터로 법령종류별 결과 필터링
48+
- truncateSections(): 체인 도구 섹션별 응답 크기 최적화
49+
- truncateResponse summary 모드: 긴 응답 자동 요약
50+
- unwrapZodEffects: .refine() 스키마의 MCP 호환성 개선
51+
- 구조화된 에러 포맷: [에러코드] + 도구명 + 제안
52+
53+
### Changed
54+
- formatToolError: ZodError 자동 감지, 구조화된 출력
55+
- toMcpInputSchema: ZodEffects unwrap 후 JSON Schema 변환
56+
- 총 도구 수: 57 → 64

0 commit comments

Comments
 (0)