- law_monitor.py: 2-pass 크로스 링크 적용
- Pass 1: 전체 법령 파싱 + 조문-장 매핑 테이블 생성
- Pass 2: 「법령명」 제X조 → [[법명_제N장#제X조]] wiki-link 일괄 적용
- 변경된 법령에만 크로스 링크 적용 후 DEVONthink 임포트
- pkm_api_server.py: RAG 응답에 enable_thinking=false + strip_thinking 적용
- launchd: pkm-api(Flask), law-monitor(07:00), mailplus(07:00+18:00), digest(20:00) plist
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
기존: /10_Legislation/{법령명} (Law 폴더 누락)
수정: /10_Legislation/Law/{법령명} (architecture 설계 구조와 일치)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- law_parser.py 신규: XML→MD 장 단위 분할, 조문 앵커 링크, 부칙 분리
- 장/절/편 자동 식별 (<조문여부>=전문), 장 없는 법령 fallback
- DEVONthink wiki-link 크로스 링크 (같은 법률 내 + 다른 법률 간)
- MST 자동 조회 + 7일 TTL 캐시 + 원자적 파일 쓰기
- 법령 약칭 매핑 (산안법→산업안전보건법 등)
- law_monitor.py 리팩터링:
- MONITORED_LAWS → Tier 1(15개 필수) / Tier 2(8개 참고, 비활성)
- law_id → MST 방식 (현행 법령 자동 조회)
- XML 통짜 저장 → 장별 Markdown 분할 저장
- DEVONthink 3단계 교체 (이동→생성→삭제, wiki-link 보존)
- 에러 핸들링: 재시도 3회/백오프 + 부분 실패 허용 + 법령명 검증
- 실행 결과 law_last_run.json 기록
테스트: 15개 법령 전체 성공 (148개 MD 파일 생성)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- pkm_utils.py: strip_thinking() 추가 + llm_generate() no_think 옵션
- <think> 태그 제거 + thinking 패턴("Wait,", "Let me" 등) 필터링
- enable_thinking: false 파라미터 지원
- law_monitor.py: JP 번역 호출에 no_think=True 적용
- pkm_api_server.py: /devonthink/stats 최적화 (children 순회 → count 사용)
+ /devonthink/search 한글 쿼리 이스케이프 수정
- auto_classify.scpt: baseDir property로 경로 변수화
- omnifocus_sync.scpt: 로그 경로 변수화
인프라: MailPlus IMAP HOST → LAN IP(192.168.1.227)로 변경
참고: 한국 법령 API IP(122.153.226.74) open.law.go.kr 등록 필요
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- POST /rag/query: 질문 → GPU bge-m3 임베딩 → Qdrant 검색 → MLX 35B 답변 생성
- DEVONthink 링크(x-devonthink-item://UUID) 포함 응답
- POST /devonthink/embed: 단일 문서 UUID → Qdrant 임베딩 트리거
- POST /devonthink/embed-batch: 배치 문서 임베딩
- docstring 범위 갱신: DEVONthink + OmniFocus + RAG 검색
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- ocr_preprocess.py: DEVONthink UUID → 파일 추출 → GPU Surya OCR(:8400) 호출 → 텍스트 반환
- auto_classify.scpt: Step 0 OCR 감지 추가 (텍스트 없는 PDF/이미지 → Surya OCR → 본문 병합)
- 이미지/스캔 PDF 자동 감지: docType이 PDF/JPEG/PNG/TIFF이고 텍스트가 비어있는 경우
- OCR 실패 시 로그 기록 후 분류 진행 (graceful degradation)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- scripts/pkm_utils.py: 공통 유틸 (로거, dotenv, osascript 래퍼)
- scripts/prompts/classify_document.txt: Ollama 분류 프롬프트
- applescript/auto_classify.scpt: Inbox → AI 분류 → DB 이동
- applescript/omnifocus_sync.scpt: Projects → OmniFocus 작업 생성
- scripts/law_monitor.py: 법령 변경 모니터링 + DEVONthink 임포트
- scripts/mailplus_archive.py: MailPlus IMAP → Archive DB
- scripts/pkm_daily_digest.py: 일일 다이제스트 + OmniFocus 액션
- scripts/embed_to_chroma.py: GPU 서버 벡터 임베딩 → ChromaDB
- launchd/*.plist: 3개 스케줄 (07:00, 07:00+18:00, 20:00)
- docs/deploy.md: Mac mini 배포 가이드
- docs/devonagent-setup.md: 검색 세트 9종 설정 가이드
- tests/test_classify.py: 5종 문서 분류 테스트
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>