Sync main → gbpark-node: AI 모듈 JSONB 파싱 + audit-log fix #1

Merged
johngreen merged 33 commits from main into gbpark-node 2026-05-02 10:20:35 +00:00

33 Commits

Author SHA1 Message Date
johngreen 19f7615367 docs(notes): 그렘린 카오스 테스트 + JSONB autopilot 작업 노트
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m34s
- 2026-05-02-agents-gremlins-report.md — AI 에이전트 페이지 그렘린 1차 결과
- 2026-05-02-gremlins-jsonb-autopilot-report.md — 종합 리포트 (audit-log fix +
  AI 모듈 JSONB 일괄 적용 + Phase 4 검증 결과 + follow-up 항목)

향후 follow-up (별도 PR 권장):
- H1: AiAgentApiKey listAll cross-tenant 노출 (security)
- M1: AiLlmProvider.config 평문 노출 가능성
- M3: AiAgentProviderController create/update model 직접 노출
- M4: workspace/page.tsx 잔여 connectors 직접 접근 5곳

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 16:12:06 +09:00
johngreen 04cea72f33 fix(ai-modules): JSONB ::text 응답 자동 파싱 + workspace 카드 깨짐 수정
백엔드:
- 6개 AI Service (group/apiKey/provider/conversation/agent/scheduler) 가 응답 메서드에서
  `parseJsonField` 헬퍼로 JSONB(::text) 컬럼 (connectors / config / permissions /
  metadata / tool_calls / notification / tools) 을 String → Object 자동 변환.
- 모범 패턴 (`AuditLogService.processChanges`, `BusinessRuleService.parseJsonField`,
  `DataflowDiagramService.parseJsonbFields`) 동일하게 적용.
- model 의 String getter 는 그대로 유지 — `MultiAgentExecutionEngine` 등
  내부 LLM 호출 chain 영향 없음 (`getEntityById` 분리).
- 컨트롤러 시그니처 generic 만 변경 (return type Map).

프론트엔드:
- `safeArray<T>` / `safeObject<T>` 헬퍼 (`lib/utils.ts`) — 백엔드가 미파싱 String 으로
  올 때 graceful fallback. 빈 배열/객체 반환.
- `workspace/page.tsx` 멤버 카드:
  - `safeArray(member.connectors)` 적용 → `.map()` 폭발 차단.
  - 좁은 viewport 에서 한글 텍스트 한 글자씩 세로로 깨지던 문제 해결
    (`flex-wrap` + `truncate` + `whitespace-nowrap` + `max-w` + `title`).

그렘린 1000마리 폭격 + architect 자문으로 발견. workspace `Application error`,
`memberConnectors.map is not a function` 모두 해결.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 16:11:50 +09:00
johngreen 53f2638b82 fix(audit-log): URL 단/복수 + DB 컬럼명 + 응답 키 case 일괄 정정
- frontend `/audit-log` → 백엔드 `/audit-logs` (단/복수 mismatch)
- mapper auditLog.xml: `CREATED_DATE` → `CREATED_AT` (PostgreSQL 실제 컬럼명)
- AuditLogStats interface camelCase → snake_case (백엔드 응답 키 일치)

그렘린 카오스 테스트 + fetch hook 으로 발견. Application error / 500 / 404 모두 해결.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 16:11:26 +09:00
johngreen db06c95724 docs: REST API 아키텍처 문서 추가
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m8s
backend-architecture-summary.md 는 옛 Node 백엔드(VEX 1세대) 기준이라 현재 Spring 백엔드의 컨벤션이 문서화돼있지 않음. 신규 작업자가 합의된 패턴(3-layer, Map<String,Object>, 네이밍 규칙, 표준 응답, common SQL 단편) 을 한 곳에서 빠르게 파악할 수 있게 정리.

다른 아키텍처 문서(MULTI_TENANCY_ARCHITECTURE / DOMAIN_MAPPING) 와 상호 링크.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 21:46:24 +09:00
johngreen a76b85f1e5 fix(ai-agents): 카드 내 설정 버튼/모델 배지 위치 정렬
Build & Deploy to K8s / build-and-deploy (push) Has been cancelled
description 유무에 따라 카드 내부 컨텐츠 높이가 달라져 모델 배지와 설정 버튼이 카드마다 다른 높이에 노출되는 문제.

- 카드를 flex column 으로 변환하고 버튼 행에 mt-auto 적용 → 항상 카드 바닥 고정.
- description 영역을 항상 렌더링하고 min-h-[28px] (~2줄) 로 고정 → 빈 description 카드도 동일한 공간 차지 → 모델 배지 위치도 일치.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 21:42:47 +09:00
johngreen 81637b64a0 chore(scripts): obsolete .bat 정리 + invyone 전용 start/reload 추가
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m4s
옛 PLM 시절 Windows 스크립트가 현재 invyone 셋업 (compose: docker/dev/docker-compose.invyone.yml, 포트 9772/8083)과 안 맞아 정리.

삭제:
- 루트: start-windows-simple.bat / start-all-separated.bat / stop-all-separated.bat / test-backend-build.bat / run-windows.bat
- 루트: docker-compose.backend.win.yml / docker-compose.frontend.win.yml (옛 PLM 컨테이너명/포트, hardcoded credentials, 위 .bat 외엔 참조 없음)
- scripts/dev/: start-all-parallel.{bat,ps1} / stop-all.{bat,ps1} (모두 위 .yml 참조)
- ※ Mac 스택 (docker-compose.{backend,frontend}.mac.yml + scripts/dev/*.sh) 은 별도 시스템이라 건드리지 않음

신규:
- start.bat: scripts/start/invyone-start-docker-all.bat 으로 위임 (단일 진실의 원천)
- reload.bat: 프론트 컨테이너 재시작 + 백엔드 'sh ./gradlew classes' 로 재컴파일 (Spring DevTools 가 자동 리로드). Docker Desktop bind mount 가 호스트 변경을 컨테이너 inotify 로 안 넘겨서 자동 핫리로드가 안 되는 환경용.

업데이트:
- docs/DOMAIN_MAPPING.md: 개발 환경 표를 현재 포트/compose 로 갱신 + 테넌트 서브도메인 행 추가.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 20:58:31 +09:00
johngreen 5cc255d8df build(docker-dev): Windows 바인드마운트에서 gradlew 실행 보장
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m6s
- backend-spring.Dockerfile: CMD에 sh ./gradlew 명시 호출 — 호스트가 Windows일 때 바인드마운트가 빌드 시점 chmod +x를 덮어쓰면서 ./gradlew가 실행 비트 없이 매핑되는 문제 해결. Linux/Mac 환경에도 동일하게 동작.
- .gitattributes 신규: gradlew와 *.sh 를 eol=lf 로 고정해 Windows core.autocrlf=true 환경에서 CRLF 변환으로 컨테이너 내 sh 파싱이 깨지는 문제 재발 방지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 19:09:21 +09:00
johngreen 8804b9fbfa fix(ai-workspace): 실행 모드 토글 한글 라벨 세로 깨짐 수정
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m3s
- 토글 컨테이너/버튼에 shrink-0 + whitespace-nowrap 추가
- 헤더 행을 flex-wrap 으로 보강해 좁은 폭에서 우아하게 줄바꿈
- raw <button> 이라 shadcn Button 의 nowrap 보호 막이 없어
  CJK 음절 단위로 "병/렬", "순/차", "혼/합" 으로 끊기던 문제 해결

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 17:38:54 +09:00
johngreen 9755869754 feat(template-thumb): 라이브 미니 프리뷰 (실제 TemplateRenderer scale-down)
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m5s
기존 와이어프레임 박스(테두리 + 투명 fill) 대신 실제 TemplateRenderer
를 mock empty context 로 띄워 transform: scale 로 축소 → 사용자가
빌더에서 그린 그대로의 레이아웃이 카드에서 그대로 읽힘.

- TemplateMiniPreview 컴포넌트 신설:
  - DEFAULT empty context (data:[], callbacks no-op) 로 데이터 fetch 0회
  - BASE_WIDTH=1200, 16:10 stage → ResizeObserver 로 카드 폭 변화 자동 추종
  - pointer-events: none / user-select: none / overflow: hidden
  - views 가 비어있으면 기존 TemplateThumbnail (와이어프레임) 폴백
- TemplateLibraryModal 카드 아이콘 자리 교체
- dashboard.css 에 .dash-lib-card-thumb--live / -stage 추가

향후 템플릿 50+ 로 늘어 모달 첫 오픈이 무거워지면 lazy mount(
intersection observer) 또는 background 스크린샷 캐싱으로 전환.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 08:31:34 +09:00
johngreen b7ebc69755 style(template-thumb): solid 컬러 → 와이어프레임 (테두리+투명 fill)
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m6s
기존: 컴포넌트마다 .55 alpha 솔리드 박스 → 화면 스크린샷처럼 보임
변경: 5px inset 패딩 + 각 블록은 .55 테두리 + .14 fill 의 와이어프레임 톤

- KIND_COLOR (rgba 문자열) → KIND_RGB (RGB 트리플 문자열) 로 변경
  → 같은 색을 테두리/배경 다른 알파로 동시 사용 가능
- thumb 안에 dash-lib-card-thumb-canvas wrapper 추가해 padding 적용
- block 은 border-box + border 1px transparent base, 색상은 inline 으로

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 08:16:37 +09:00
johngreen bad1010621 fix(template-thumb): 실제 스튜디오 저장 포맷(list:Array + screenResolution) 지원
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m7s
기존 fromV2 / fromV1 은 BlockV2.xPct 또는 TemplateComponent.order/row
가정이었는데, 실 운영 빌더(templateAdapter.saveTemplate) 는
list 가 컴포넌트 배열이고 각 요소가 position{x,y} + size{w,h} 절대 px,
공통 screenResolution 으로 정규화되는 구조였음.

fromStudio 추가:
- list 를 배열 / v2.1 layers / { components } 어느 모양이든 평탄화
- screenResolution 우선, 없으면 컴포넌트 bounding box 폴백
- url(v2-table-list 등)/componentType/widgetType 어느 키든 inferKind 로 분류

호출 순서: fromStudio → fromV2 → fromV1 (안전망).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 08:09:14 +09:00
johngreen df9a539017 feat(template): 라이브러리 카드에 wireframe 썸네일 표시
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m26s
템플릿 목록 카드의 정적 📋 아이콘을 실제 view 구조 기반의
미니 와이어프레임으로 교체. 사용자가 카드만 보고도 템플릿이
어떤 화면인지(테이블 위주 / 폼 위주 / 단순 버튼 등) 파악 가능.

- backend: getTemplateList SQL 에 VIEWS 컬럼 추가, list 응답 각
  row 의 views jsonb 를 객체로 파싱
- frontend: TemplateThumbnail 컴포넌트 신설 — v2(BlockV2.xPct/yPct
  /wPct/hPct) 정규화 좌표 우선, v1(order/row) 폴백, 컴포넌트
  종류별 색상(table=primary, form=cyan, button=pink)
- TemplateLibraryModal 카드 아이콘 자리 교체
- dashboard.css 에 .dash-lib-card-thumb / -block 스타일 추가
  (v5 토큰 준수 — solid + glow, blur 없음)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 08:00:10 +09:00
johngreen 59f230187d feat(layout): Tweaks 버튼 토글 동작 — 다시 누르면 닫힘
setSettingsOpen(true) → setSettingsOpen(v => !v) 로 변경.
열려 있을 때 한 번 더 누르면 SettingsModal 이 닫히고,
v5-hdr-icon.on 활성 상태도 자동 토글됨.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 07:59:51 +09:00
johngreen 9d11616761 fix(sidebar): 두 메뉴가 동시에 active 표시되던 버그 해결
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m5s
증상: AI 어시스턴트 → '에이전트 관리' 클릭 후 '멀티에이전트 워크스페이스'
이동하면 사이드바에 두 메뉴가 동시에 보라색 active 로 표시됨.

원인: isMenuActive 가 pathname 매칭과 activeTab 매칭을 OR 결합해서
이전 URL 메뉴 + 현재 활성 탭 메뉴 둘 다 true 반환.

수정: activeTab 이 있을 때는 그 탭 기준으로만 매칭. activeTab 이 없는
경우(/main 첫 진입 등)에만 pathname 으로 fallback.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 07:30:00 +09:00
johngreen 1d37b8d2ea fix(ai-agent): list 쿼리가 archived(soft-delete) 행을 기본 제외하도록
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m24s
증상: 에이전트 삭제 후에도 목록에 그대로 표시.
원인: softDelete 가 status='archived' 로만 변경하는데 list 쿼리가
status 필터 미지정 시 archived 도 모두 반환.

수정: status 명시 X 시 status != 'archived' 기본 적용. status 명시 시
그 값으로 정확 매칭.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 06:53:22 +09:00
johngreen 016442973e fix: ObjectMapper 에 JavaTimeModule 등록 (OffsetDateTime 직렬화)
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m26s
증상: POST /api/ai-agents 가 500 으로 응답.
원인: 커스텀 @Bean ObjectMapper 가 Spring Boot 자동 모듈 등록을 가로
막아 java.time.OffsetDateTime (AiAgent.created_at/updated_at 등) 직렬화
실패. INSERT 자체는 성공했으나 응답 변환에서 깨짐.

- JacksonConfig: registerModule(new JavaTimeModule()) +
  WRITE_DATES_AS_TIMESTAMPS=false (ISO-8601 문자열 출력)
- GlobalExceptionHandler: 직전 디버그 메시지 노출 원복

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 06:41:15 +09:00
johngreen faa77160af debug: GlobalExceptionHandler 에 root cause 임시 노출
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m31s
POST /api/ai-agents 가 500 만 반환하고 backend pod logs 직접 접근이
불가하여 진단 불가. 임시로 응답 message 에 [DEBUG] prefix + 예외
클래스명/메시지/cause 를 포함시켜 ULTRAQA 사이클로 root cause 파악.

⚠️ TEMPORARY — 안정화 후 다음 commit 에서 즉시 원복.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 06:34:48 +09:00
johngreen 552cb50bbd chore(db): 중복 'AI 어시스턴트' 자식 메뉴 비활성 (V016)
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m28s
V014 가 AI_ASSISTANT_ROOT(부모) + AI_MENU_ASSISTANT(자식) 둘 다 동일
URL(/admin/aiAssistant)로 등록해 사이드바에 같은 이름 메뉴가 두 번
표시되던 증상 fix. V014 자체는 Flyway 체크섬 보호 때문에 수정하지
않고 후행 마이그레이션으로 soft-delete.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 21:19:28 +09:00
johngreen dc4508d5ea fix: AI 어시스턴트 entry — WorkspacePage 직접 렌더
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m5s
invyone SPA 탭 시스템은 AdminPageRenderer 가 cleanUrl 로 컴포넌트를
매칭하는 구조라, redirect/router.replace 로는 _URL 만 바뀌고 본문은
빈 컴포넌트를 그대로_ 렌더하는 문제가 있었다.

WorkspacePage 를 직접 import 해서 첫 자식 메뉴 클릭 시에도 워크스페이스
화면이 즉시 표시되도록 변경.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 21:04:31 +09:00
johngreen ecca02fbbf fix: AI 어시스턴트 entry page client-side redirect 로 변경
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m21s
기존 server-side redirect("/workspace") 가 invyone SPA 탭 시스템과
충돌해서 사이드바 'AI 어시스턴트' 자식 클릭 시 화이트 스크린 발생.

useRouter().replace() 의 client-side 라우팅으로 변경 — AdminPageRenderer
가 dynamic import 한 컴포넌트가 정상으로 mount.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 20:38:43 +09:00
johngreen 7c57c69f84 fix: AiKnowledgeController 추가 (Epic C 누락분)
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m33s
frontend 가 /api/ai-knowledge 호출하는데 backend 에 컨트롤러가 없어
"지식 파일 목록 로드 실패" 토스트가 나던 증상 fix.

서비스/매퍼/모델/DTO 는 이미 있고 컨트롤러만 누락이었음. 다른
ai 컨트롤러 (AiAgentController) 와 동일 패턴으로 GET/POST/PUT/DELETE
+ 멀티테넌시(company_code 필터, SUPER_ADMIN 예외) 적용.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 13:52:20 +09:00
johngreen 2d938ea45b ci: frontend cache-bust + 진단에 deploy 이미지 표시
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m52s
빌드 컨텍스트 변경에도 운영 frontend chunk 에 신규 라우트가 들어가지
않는 증상 발견. Kaniko/Docker layer cache 가 npm run build 단계를
잘못된 시점에 hit 하는 것으로 의심. GIT_SHA build-arg 를 npm run build
직전에 주입해 매 commit 마다 그 layer 부터 강제 invalidate.

또 진단 step 에 deploy 이미지 tag 표시 추가 — 새 image 로 갱신
됐는지 즉시 확인 가능.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 12:47:17 +09:00
johngreen 22d073f563 SecurityConfig: Spring Security 6 호환 필터 등록 순서 수정
Build & Deploy to K8s / build-and-deploy (push) Successful in 1m0s
기존 코드는 addFilterBefore(AiApi, JwtAuthenticationFilter.class) 가
jwt 등록 전에 호출되어 'JwtAuthenticationFilter does not have a
registered order' 예외 발생. Spring Security 6 부터 anchor 는 _이미
등록된_ 필터여야 함.

수정: jwt 를 UsernamePasswordAuthenticationFilter 기준으로 가장 먼저
등록 → JwtAuthenticationFilter.class 가 known map 에 추가됨 →
이후 SubdomainResolver/AiApiKey/TenantConsistency/ForcePw 가 jwt 를
anchor 로 정상 참조.

실행 순서는 동일: SubdomainResolver → AiApiKey → Jwt → TenantConsistency
→ ForcePw → UsernamePasswordAuthenticationFilter

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 08:35:08 +09:00
johngreen 7e3e4078d0 flyway: out-of-order=true 안전망 추가
Build & Deploy to K8s / build-and-deploy (push) Failing after 3m34s
운영 DB flyway_schema_history 가 baseline + V015 만 가진 상태에서
V001~V014 가 누락되어 있던 사고를 정리한 후, 향후 비슷한 누락이
있어도 자동 복구 가능하도록 out-of-order 허용.

전제: 운영 DB 의 V015 row 는 별도로 DELETE 처리하여 baseline 만
남겨둔 상태. 다음 부팅에서 V001~V015 가 차례로 적용된다.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 08:28:05 +09:00
johngreen b2ac4a08bf ci: 진단 step 에서 모든 backend-spring pod 로그 순회
Build & Deploy to K8s / build-and-deploy (push) Failing after 3m8s
deployment/<name> selector 는 활성 ReplicaSet 만 봐서 새 ReplicaSet 의
CrashLoopBackOff pod 로그를 놓친다. label selector 로 모든 pod 를
순회하며 current + previous 로그 출력.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 08:05:05 +09:00
johngreen 6965dfdd57 ci: 배포 실패 시 pod 로그 / k8s events 자동 캡처
Build & Deploy to K8s / build-and-deploy (push) Failing after 3m22s
backend-spring rollout 이 180초 timeout 으로 실패할 때, Gitea Actions
로그에는 timeout 메시지만 나오고 정작 Spring Boot 부팅 단계의 진짜
에러는 pod 안 stdout 에 갇혀 있어서 디버깅 불가.

- if: failure() 조건으로 마지막에 Diagnose step 추가
- kubectl get pods, describe, logs (current + previous), events 출력
- frontend 도 참고용 200줄 출력
- 모든 명령 || true 로 감싸서 진단 자체가 실패해도 다음 단계 진행

이 step 은 진짜 원인 파악되고 안정화되면 제거 예정.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 07:55:17 +09:00
johngreen 12454a79d4 test: commit author 매핑 검증 (johngreen)
Build & Deploy to K8s / build-and-deploy (push) Failing after 3m6s
2026-04-28 08:14:38 +09:00
Johngreen 2b954db854 프로필 모달에서 차량/운전자 정보 섹션 제거
Build & Deploy to K8s / build-and-deploy (push) Failing after 6m29s
ProfileModal 의 isDriver 토글 섹션 + 새 차량 등록 모달 + DriverInfo
/DriverFormData 타입 + 관련 props 모두 제거. 호출부(AppLayout) 와
useProfile 훅의 driver/vehicle 상태 관리 로직도 함께 정리.

차량/운전자 메뉴 화면(components/vehicle/*) 과 대시보드 위젯
(VehicleListWidget, DriverManagementWidget 등) 은 그대로 유지.

3 files changed, 525 deletions(-).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 07:52:38 +09:00
Johngreen 57c6c1b472 .omc/ 디렉토리 git 추적 해제 (실수 노출 회수)
Build & Deploy to K8s / build-and-deploy (push) Failing after 6m30s
직전 commit 52386efb 에서 .omc/ 가 .gitignore 에 명시 안 된 상태로
git add -A 에 의해 함께 추적되어 push 되었습니다. .omc/ 는 OMC 의
세션 상태/agent transcript/planning 결과 등 작업용 임시 파일이므로
저장소에서 제거하고 .gitignore 에 명시합니다.

- .gitignore 에 .omc/ 패턴 추가
- git rm -r --cached .omc/ 로 추적 해제 (워킹트리 보존)
- 직전 commit 의 .omc/ 콘텐츠는 git history 에는 남으나,
  최신 트리에서는 사라집니다.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 07:40:18 +09:00
Johngreen 52386efb83 도메인 정리: invion.com → invyone.com 전체 일괄 치환 + 매핑 문서화
Build & Deploy to K8s / build-and-deploy (push) Has been cancelled
운영 도메인이 실제로는 v1.invyone.com / solution.invyone.com / api.invyone.com 인데
코드/문서 곳곳에 v1.invion.com / api.invion.com 등 미존재 도메인이 박혀 있어 정리.

변경 파일 (21):
- frontend lib/api/client.ts, lib/utils/apiUrl.ts: hostname 체크 endsWith(\".invyone.com\") 일반화
- frontend lib/api/dashboard.ts, file.ts, flow.ts, FileViewerModal*2.tsx: 도메인 치환
- frontend invion-layout-v5.html: 시안 내 placeholder 도메인 정리
- backend-spring SecurityConfig.java: CORS 주석 예시 정리
- docker/deploy/docker-compose.yml, k8s/traefik-dynamic.yaml: traefik Host 라벨 정리
- scripts/prod/deploy.sh: 안내 메시지 정리
- .cursor/rules/api-client-usage.mdc, project-conventions.mdc: AI 가이드 정리
- docs/* 4개: 아키텍처/플로우 문서 도메인 정리
- notes/gbpark/* 3개: 과거 메모 정리

신규:
- docs/DOMAIN_MAPPING.md: 운영/개발/폐기 도메인 영구 기록.
  AI 에이전트와 신규 개발자가 헷갈리지 않도록 단일 진실 출처.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 07:39:04 +09:00
Johngreen eed70014c2 dev 환경 OpenClaw 의존성 옵셔널화
depends_on: openclaw service_healthy 제거 + OPENCLAW_ENABLED 기본값을
false로 변경. OpenClaw 이미지가 placeholder 상태에서 backend 컨테이너가
못 뜨던 문제 해결. OpenClaw 사용 시 별도 docker-compose.openclaw.yml
또는 환경변수 override 로 활성화.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 07:29:56 +09:00
Johngreen 4306fa6f4b AI 메뉴 슈퍼관리자 권한 자동 매핑 (V015)
Build & Deploy to K8s / build-and-deploy (push) Failing after 3m30s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 05:44:38 +09:00
Johngreen 229b09b895 AI관리 시스템 교체: ai-assistant 제거 + 멀티 에이전트 오케스트레이션 이식
Build & Deploy to K8s / build-and-deploy (push) Failing after 7m14s
Epic A: ai-assistant 디렉토리/Spring 프록시/프론트엔드 메뉴 완전 제거
Epic B: Flyway 도입 + 13 신규 테이블 마이그레이션
Epic C: 9 서비스 + 7 컨트롤러 + LlmClient 추상화 (Java 21/Spring/MyBatis)
Epic D: ApiKey 인증 필터 (sk-pipe-* 키 SHA-256 검증)
Epic E: OpenClaw 외부 엔진 docker-compose 통합
Epic F: Next.js 7 페이지 + lib/api/aiAgent.ts 이식
Epic G: 화면 그룹/메뉴 등록 마이그레이션 (V014)
Epic H: 통합 빌드 검증

- DB: invyone PostgreSQL에 ai_agents/ai_agent_groups/... 13 테이블 + Quartz
- 멀티테넌시: 모든 테이블에 company_code 강제 필터
- LLM: Anthropic/OpenAI/Google/Ollama 직접 클라이언트 (Spring AI 미도입)
- 스케줄러: Quartz JDBC JobStore (cron 기반)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 22:49:43 +09:00