Commit Graph

65 Commits (a6b96a8f45ba8bc95936db8f19ba1a433feee048)
 

Author SHA1 Message Date
박성영 a6b96a8f45 검색조건이 달라졌을 경우, 감지 및 메시지 표출 함수 추가
README.md 배포 커멘드 추가
4 weeks ago
박성영 b012e51aaf TASK_PRCS_STTS_CD 01~04 까지 src/main/java/egovframework/constant 아래에 class 추가하여 공통관리
현재 검색조건 list 전체를 paging 처리 없이 전체 api 호출하는 로직 추가

apiResponse.isSuccess() == true 일 경우, [tb_car_ffnlg_trgt.CAR_BASS_MATTER_INQIRE_ID, tb_car_ffnlg_trgt.CAR_LEDGER_FRMBK_ID] 값 update
4 weeks ago
박성영 8eeee86a46 전체 구성 수정중... 4 weeks ago
박성영 2459e07a3f 로그 조정 4 weeks ago
박성영 f5c4176dc3 API 고정값 설정 4 weeks ago
박성영 ddd438dbb5 전자정부 통과를 위한 ServiceImpl 에
extends EgovAbstractServiceImpl 추가
4 weeks ago
박성영 df3329f2db **refactor: 조회구분코드(inqireSeCode)의 기본 설정 로직 개선 및 관련 불필요 코드 제거**
- **`VmisRequestEnricher`에서 조회구분코드 자동 설정**
  - `inqireSeCode`의 기본값을 `"1"(열람)`으로 자동 설정하도록 변경.
  - 중복된 수동 설정 로직 제거.

- **JSP에서 조회구분코드 필드 제거**
  - `inquiry.jsp`에서 드롭다운 및 관련 코드 삭제 (`inqireSeCode` 필드).
  - 자바스크립트에서도 조회구분코드 처리 로직 제거.

- **API 요청 관련 코드 간소화**
  - `ExternalVehicleApiServiceImpl` 및 `InternalVehicleInfoServiceImpl`에서 `inqireSeCode` 수동 설정 코드 제거.
  - 프론트엔드에서 전달할 필요 없어져 해당 변수 제거.

- **기본 요청 설정값 변경**
  - `VmisRequestEnricher`에서 `detailExpression` 기본값을 `"2"(최종내역)`에서 `"1"(전체내역)`으로 변경.
4 weeks ago
박성영 6c085ec7c0 **chore: 과태료 비교 로직 및 서비스 관련 문서 삭제**
- `README.md`, `COMPARISON_GUIDE.md`, `이첩조건_추가방법.md`, `VMIS_INTEGRATION_COMPLETE.md`, `VMIS_INTEGRATION_STRATEGY_DESIGN.md` 파일 삭제.
  - Chain of Responsibility 패턴 비교 규칙 관련 문서.
  - 서비스 및 구현 방법에 대한 가이드 문서 포함.
  - 이첩 조건 추가 방법 및 통합 완료 가이드 문서.
- 조회구분코드 : 자동차기본정보조회, 갑부에 따라 구분코드 다르게 설정하는 부분 기본셋팅값으로 추가 함
4 weeks ago
박성영 732a977b67 상품용, 이첩 TEST CASE 작성, 테스트 진행 4 weeks ago
박성영 1f442a9472 상품용, 이첩 sample 진행, 모듈화 2가지 템플릿 소스 적용
추후 테스트 후 선택
1 month ago
박성영 94cbef2857 상품용, 이첩 sample 진행
좀더 많은 케이스별로 모듈화 해야함
1 month ago
박성영 06830112b1 external api 호출시에도 log 저장 1 month ago
kjh 9b8df93144 자동차 과태료 대상 테이블 컬럼 추가
시군구 코드 테이블 및 DML 추가
1 month ago
박성영 4c69599aee 기초 구조 잡는중.... 1 month ago
박성영 24b906cb9a 한글주석 추가 및 기초 구조 잡는중.... 1 month ago
박성영 434837a949 jni lib 추가 1 month ago
박성영 a745683c09 txt 다운로드 1 month ago
박성영 50de15106f 목록 원본 다운로드 진행중... 1 month ago
박성영 c4f73bc8ff 바이트 조정 1 month ago
박성영 a0d7717f75 헤더 조정 1 month ago
박성영 af390557fe 주민등록번호 암호화 적용 1 month ago
박성영 dfc497cbfb 파일 업로드 디자인 변경 1 month ago
박성영 d0861b28f9 파일 업로드 디자인 변경 1 month ago
박성영 b10769679a 초기 셋팅 1 month ago
박성영 ed04c2ae65 초기 셋팅 1 month ago
박성영 05578efebc feat: [자동차 기본 사항 조회](TB_CAR_BASS_MATTER_INQIRE) 오탈자 수정
기본 사항 조회 ID -> CAR_BASS_MATTER_INQIRE -> CAR_BASS_MATTER_INQIRE_ID
      차량번호 VHCLNO -> VHRNO

컬럼명 변경됨
1 month ago
박성영 6bdfc0001f feat: 차량 정보 조회 기능 추가
- VehicleInquiryController 신설: 차량 통합 조회, 기본정보 조회, 등록원부(갑) 조회 기능 제공
  - `/getIntegratedInfo.do`: 차량 통합 조회 엔드포인트 추가
  - `/getBasicInfo.do`: 차량 기본정보 조회 엔드포인트 추가
  - `/getLedgerInfo.do`: 차량 등록원부(갑) 조회 엔드포인트 추가
  - Swagger API 문서화 추가

- 차량 정보 조회 화면 JSP 파일 추가: `/WEB-INF/views/carInspectionPenalty/callApi/inquiry.jsp`
  - 조회 필드 및 조회 결과 표시 UI 구현
  - 차량 통합 조회, 기본 조회, 등록원부 조회 옵션 제공
  - 입력값 유효성 검증 및 초기화 버튼 기능 구현
  - AJAX 기반 API 요청/응답 처리 로직 추가

- 서비스 계층 VehicleInfoService 의존성 주입하여 통합 로직 처리

 새로운 차량 조회 기능 제공 및 사용자 편의성 개선
1 month ago
박성영 aa73fff2de model 객체 프로퍼티에서 자동셋팅 되는 필드에 설명 추가 1 month ago
박성영 2bf0a550aa model 객체 스키마 name 추가 1 month ago
박성영 347ebac95c refactor: Lombok @Data 어노테이션 적용
- Getter: 모든 필드에 대해
            - Setter: 모든 final이 아닌 필드에 대해
            - toString(): 모든 필드 포함
            - equals(): 모든 필드 기반
            - hashCode(): 모든 필드 기반
            - RequiredArgsConstructor: final 필드에 대해
1 month ago
박성영 018e0d78e7 refactor: 변경된 상세 내역 반영 및 기본값 조정
- LedgerRequest의 detailExpression 기본 값을 "1"로 수정 (전체내역 조회)
- application-local.yml 기본 VMIS 모드 external로 전환
- Internal/External 구현체에서 detailExpression 값 통합 수정

 BUILD SUCCESSFUL
1 month ago
박성영 e71fca28a0 refactor: 차량 조회 요청 로직 개선 및 차량번호 기반 요청 객체 확장
- getVehicleInfo 오버로딩 추가: 차량번호 -> 요청 객체로 확장
- 기본/등록원부 요청 시 필수 파라미터 적용 로직 추가
  - 고정값 설정: 개인정보공개, 경로구분코드, 내역표시, 조회구분코드
- External/Internal 모드 구현체에서 통합 로직 적용 및 레코드 기반 LedgerRequest 구성
- Request, Response 객체의 필드 설명 보강 (Swagger)
- Controller, Service 전반적으로 요청 구조 통일
- application-local.yml 기본 모드 internal로 변경

 BUILD SUCCESSFUL
1 month ago
박성영 a1687070fd refactor: VMIS 모드 분기 로직 간소화 및 서비스 계층 위임
- 내부/외부 모드 분기 로직 제거, VehicleInfoService로 위임
- 컨트롤러 메서드 간결화 및 모드 의존성 제거
- Swagger API 설명 및 예제 수정
- application-local.yml 기본 모드 external로 변경
1 month ago
박성영 4ca218151e refactor: 차량 기본정보 및 등록원부 API 로직 개선
- 내부/외부 VMIS 모드 통합 및 외부 REST URL 동적 구성
- VehicleInfoService로 서비스 계층 역할 재구성
- BasicResponse 및 LedgerResponse 단독 조회 기능 추가
- VMIS 통합 속성 구조 변경 및 application-{profile}.yml 수정
- 컨트롤러 메서드 간결화 및 모드 기반 분기 로직 추가
- 중복 모델 제거 및 Envelope 구조 통일
- Swagger 테스트 컨트롤러 보강
1 month ago
박성영 91f7d04f4a refactor: 차량 정보 및 등록원부 서비스 구현 추가
- ExternalVehicleApiServiceImpl: 외부 VMIS API 호출 구현
  - 차량 기본정보 및 등록원부 조회 로직 추가
  - 오류 처리 및 실패 응답 객체 생성 로직 포함
- VmisCarBassMatterInqireServiceImpl/VmisCarLedgerFrmbkServiceImpl:
  - 내부 서비스 관계와 API 호출 보강, 응답 로그 저장 로직 추가
  - 오류 시 트랜잭션 독립적 로그 작성 보장
- 관련 로그 서비스 구현체 (VmisCarBassMatterInqireLogServiceImpl, VmisCarLedgerFrmbkLogServiceImpl): 요청/응답 로그 저장 및 오류 로그 추가
- 기존 인터페이스 및 클래스 위치 이동 (VehicleInfoService 등)
1 month ago
박성영 6b47e3f84c refactor: VMIS 통합 설정 개선 및 RestTemplate 동적 구성 추가
- VMIS RestTemplate 설정을 내부/외부 모드로 분리
  - Internal Mode: 정부 API 호출 설정(빠른 타임아웃)
  - External Mode: 외부 API 호출 설정(완화된 타임아웃)
- application-{profile}.yml에 환경별 VMIS 설정 추가
- RestTemplateProperties -> VmisProperties로 대체하여 설정 통합
  - 타임아웃, 연결 풀, Rate Limit 설정을 모드별로 분기
- 기존 regionCode -> sigunguCode로 수정하여 의미 명확화
- 로그 포맷 개선 및 나열 정보 추가

## 효과
- 환경 구성 단순화 및 명확화
- RestTemplate 설정 관리 용이성 향상
- 코드 유지보수성 및 가독성 개선

 BUILD SUCCESSFUL
1 month ago
박성영 d0cb4eefbd refactor: RestTemplateConfig 통일 1 month ago
박성영 ad07645bb6 refactor: VehicleBasicInfoVO, VehicleLedgerVO 제거하고 BasicResponse, LedgerResponse 직접 사용
중복 VO 제거 및 응답 모델 단순화

## 제거된 파일
-  VehicleBasicInfoVO.java
-  VehicleLedgerVO.java
-  VehicleResponseMapper.java (변환 로직 제거)

## 변경된 사용처
- VehicleApiResponseVO: BasicResponse, LedgerResponse 직접 사용
- InternalVehicleInfoServiceImpl: Mapper 제거하고 BasicResponse/LedgerResponse 직접 반환
- ExternalVehicleApiService: 동일하게 BasicResponse/LedgerResponse 사용

## 최종 모델 구조 (9개)
```
api/model/
├── Envelope.java                    # 공통 Envelope
├── VehicleApiResponseVO.java        # 최상위 응답
├── request/                         # 요청 (2개)
│   ├── BasicRequest.java
│   └── LedgerRequest.java
└── response/                        # 응답 (5개)
    ├── BasicResponse.java           클라이언트 응답용
    ├── LedgerResponse.java          클라이언트 응답용
    ├── VmisCarBassMatterInqireVO.java  # DB 저장용
    ├── VmisCarLedgerFrmbkVO.java       # DB 저장용
    └── VmisCarLedgerFrmbkDtlVO.java    # DB 저장용
```

## 효과
- 중복 모델 제거 (3개 파일 삭제)
- 변환 레이어 제거 (VehicleResponseMapper 삭제)
- Internal/External 모두 동일한 응답 모델 사용
- 코드 간소화 및 유지보수성 향상

## 빌드 결과
 BUILD SUCCESSFUL

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 8c16d6cdf6 refactor: API 모델 완전 통합 (vo + internal/model -> model)
중복 제거 및 단일 모델 구조로 통합

## 변경사항

### 통합된 구조
```
api/model/
├── Envelope.java                    # 공통 Envelope
├── VehicleApiResponseVO.java        # 최상위 응답
├── request/                         # 요청 모델
│   ├── BasicRequest.java           # 기본정보 요청
│   └── LedgerRequest.java          # 등록원부 요청
└── response/                        # 응답 모델
    ├── BasicResponse.java          # 기본정보 응답
    ├── LedgerResponse.java         # 등록원부 응답
    ├── VehicleBasicInfoVO.java     # 기본정보 VO
    ├── VehicleLedgerVO.java        # 등록원부 VO
    ├── VmisCarBassMatterInqireVO.java
    ├── VmisCarLedgerFrmbkVO.java
    └── VmisCarLedgerFrmbkDtlVO.java
```

### 제거된 중복 패키지
-  api/vo/ (삭제)
-  api/internal/model/ (삭제)

### 효과
- Internal/External 모두 **동일한 모델** 사용
- 중복 없는 **단일 진실 공급원**
- 패키지 구조 단순화 및 명확화

## 빌드 결과
 BUILD SUCCESSFUL

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 cecb99e87f refactor: 중복 클래스 통합 (Envelope, Request VO)
이름만 다르고 필드가 동일한 클래스 통합

## 통합된 클래스

### 1. Envelope (완전히 동일)
-  api/internal/model/common/Envelope.java (삭제)
-  api/vo/Envelope.java (유지)
- 변경: internal 패키지 전체에서 import 경로 수정

### 2. BasicRequest (더 완전한 버전 사용)
-  api/vo/VehicleBasicRequestVO.java (삭제)
-  api/internal/model/basic/BasicRequest.java (유지)
- 변경: ExternalVehicleApiService에서 BasicRequest 사용

### 3. LedgerRequest (더 완전한 버전 사용)
-  api/vo/VehicleLedgerRequestVO.java (삭제)
-  api/internal/model/ledger/LedgerRequest.java (유지)
- 변경: ExternalVehicleApiService에서 LedgerRequest 사용

## 효과
- 중복 클래스 3개 제거
- Internal/External 모두 동일한 모델 사용
- 코드 일관성 및 유지보수성 향상

## 빌드 결과
 BUILD SUCCESSFUL

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 2f03f11782 docs: VMIS API 통합 아키텍처 상세 문서 추가
API 패키지 구조, Internal/External 패턴, 데이터 흐름 상세 설명

## 문서 내용
- API 패키지 전체 구조 및 각 구성요소 설명
- Strategy Pattern을 통한 Internal/External 모드 전환
- 각 모드별 상세 동작 원리 및 데이터 흐름
- 설정 가이드 및 사용 예제
- 트러블슈팅 및 성능 최적화 가이드

## 주요 섹션
1. 개요 및 설계 원칙
2. 패키지 구조 (디렉토리 트리)
3. 아키텍처 패턴 (Strategy, DI, 계층화)
4. Internal Mode 상세 (GPKI, 정부 API 연동)
5. External Mode 상세 (REST API 호출)
6. 공통 구성요소 (VO, Properties, Config)
7. 데이터 흐름 다이어그램
8. 설정 가이드 (개발/운영 환경)
9. 사용 예제 (Controller, Service)
10. 모드 전환 시나리오
11. 트러블슈팅
12. 성능 최적화
13. 보안 고려사항
14. 확장 가능성

## 파일 위치
docs/API_ARCHITECTURE.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 9b5edc7993 fix: url 패턴에 맞춰 .ajax 사용 1 month ago
박성영 5b229d7f80 refactor: Mapper 스캔 설정 분리 (API vs 일반 프로젝트)
Mapper 중복 스캔 경고 해결 및 용도별 명확한 분리

## 문제
- DatabaseConfig에서 중복 패턴으로 Mapper 스캔
- "Bean already defined with the same name!" 경고 발생
- go.kr.project.**.mapper가 api.internal.mapper 포함하여 중복

## 해결
- DatabaseConfig → ApiMapperConfig로 변경 (API 전용)
- ProjectMapperConfig 신규 생성 (일반 프로젝트용)

## 변경사항
- ApiMapperConfig: go.kr.project.api.internal.mapper만 스캔
- ProjectMapperConfig: 일반 프로젝트 및 egovframework mapper 스캔
  - carInspectionPenalty.**.mapper
  - common.mapper
  - login.mapper
  - system.**.mapper
  - egovframework.**.mapper

## 최종 구조
- API 전용: ApiMapperConfig
- 일반 프로젝트: ProjectMapperConfig
- 중복 없이 명확하게 분리

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 8757eb9e95 fix: TransactionManager Bean 충돌 해결 (egovframework 기본 설정 사용)
DatabaseConfig에서 중복 TransactionManager Bean 제거

## 문제
- DatabaseConfig.transactionManager와 EgovConfigTransaction.txManager 충돌
- "expected single matching bean but found 2" 에러 발생

## 해결
- DatabaseConfig에서 transactionManager Bean 제거
- egovframework의 txManager Bean 사용
- DatabaseConfig는 MapperScan만 담당

## 최종 설정
- DataSource: egovframework.config.DataSourceProxyConfig
- TransactionManager: egovframework.config.EgovConfigTransaction.txManager
- MapperScan: DatabaseConfig

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 c8bf89b2e7 fix: MyBatis MapperScan 경로 업데이트 (패키지 이동 반영)
패키지 리팩토링 후 Mapper 스캔 경로 수정

## 변경사항
- @MapperScan 경로 업데이트
  - 기존: go.kr.project.vmis.mapper
  - 변경: go.kr.project.api.internal.mapper 포함 전체 mapper 패키지

## 수정 파일
- DatabaseConfig.java

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 cf951cdc71 fix: 중복 디렉토리 구조 수정 (basic/basic, ledger/ledger, common/common 제거)
디렉토리 이동 후 발생한 중복 경로 정리

## 변경사항
- api/internal/model/basic/basic/* -> api/internal/model/basic/
- api/internal/model/ledger/ledger/* -> api/internal/model/ledger/
- api/internal/model/common/common/* -> api/internal/model/common/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 6819329a95 refactor: model 패키지 통합 (api/model -> api/internal/model)
패키지 구조 단순화

## 변경사항
- api/model -> api/internal/model로 이동
- BasicRequest/Response, LedgerRequest/Response는 internal 전용

## 최종 구조
```
api/
  ├── vo/              # 공통 응답 VO (external/internal 공유)
  ├── config/          # 공통 설정
  ├── VehicleInfoService
  ├── internal/
  │   ├── model/      # 모든 internal 모델
  │   │   ├── basic/  (BasicRequest, BasicResponse, VmisCarBassMatterInqireVO)
  │   │   ├── ledger/ (LedgerRequest, LedgerResponse, VmisCarLedgerFrmbkVO 등)
  │   │   └── common/ (Envelope)
  │   ├── client/
  │   ├── service/
  │   └── ...
  └── external/
      └── service/
```

## 장점
 패키지 구조 단순화
 internal 전용 모델은 internal 안에
 공통 VO만 api/vo에

빌드 성공 

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 c3c8bbb024 refactor: 패키지 구조 개선 (api/internal, api/external)
VO 중복 해결 및 패키지 구조 명확화

## 주요 변경사항

### 패키지 구조 재구성
- `go.kr.project.vmis` → `go.kr.project.api.internal`
- `go.kr.project.externalApi` → `go.kr.project.api.external`
- 공통 모델: `go.kr.project.api.model`
- 공통 VO: `go.kr.project.api.vo`
- 공통 설정: `go.kr.project.api.config`

### 새로운 구조
```
go.kr.project.api/
  ├── model/              # 공통 모델
  │   ├── basic/          (BasicRequest, BasicResponse)
  │   ├── ledger/         (LedgerRequest, LedgerResponse)
  │   └── common/         (Envelope)
  ├── vo/                 # 공통 API 응답 VO
  │   ├── VehicleApiResponseVO
  │   ├── VehicleBasicInfoVO
  │   └── VehicleLedgerVO 등
  ├── config/             # 공통 설정
  │   ├── properties/     (VmisProperties)
  │   ├── ApiConstant
  │   ├── VmisIntegrationConfig
  │   └── DatabaseConfig
  ├── VehicleInfoService  # 공통 인터페이스
  ├── internal/           # 내부 모드 (기존 vmis)
  │   ├── client/
  │   ├── config/
  │   ├── controller/
  │   ├── gpki/
  │   ├── mapper/
  │   ├── model/          # 내부 전용 DB VO
  │   ├── service/
  │   └── util/
  └── external/           # 외부 모드 (기존 externalApi)
      └── service/
```

### VO 중복 제거
-  history 패키지와 api.internal 패키지의 VO 명확히 구분
-  공통 모델은 api.model에서 공유
-  Bean 충돌 완전 해결

### MyBatis 업데이트
- mapper 디렉토리: `mybatis/mapper/vmis` → `mybatis/mapper/api-internal`
- namespace: `go.kr.project.vmis` → `go.kr.project.api.internal`

### application.yml 업데이트
- mapper-locations: `api-internal/**/*_maria.xml`

## 장점
 패키지 구조 명확화 (internal/external 구분)
 공통 모델 공유로 중복 제거
 더 나은 아키텍처
 모드별 책임 명확

## 빌드 성공 확인 

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 eb61cd9817 refactor: VMIS 패키지 클래스에 Vmis prefix 추가 (Bean 충돌 해결)
VO, Service, Mapper 클래스 이름 충돌 문제 해결

## 문제
- history 패키지와 vmis 패키지에 동일한 이름의 VO 클래스 존재
- CarBassMatterInqireVO, CarLedgerFrmbkVO, CarLedgerFrmbkDtlVO 충돌
- Bean 생성 오류 발생

## 해결
모든 VMIS 패키지 클래스에 Vmis prefix 추가:

### VO 클래스 (충돌 해결)
- CarBassMatterInqireVO → VmisCarBassMatterInqireVO
- CarLedgerFrmbkVO → VmisCarLedgerFrmbkVO
- CarLedgerFrmbkDtlVO → VmisCarLedgerFrmbkDtlVO

### Service 클래스
- CarBassMatterInqireService → VmisCarBassMatterInqireService
- CarBassMatterInqireLogService → VmisCarBassMatterInqireLogService
- CarLedgerFrmbkService → VmisCarLedgerFrmbkService
- CarLedgerFrmbkLogService → VmisCarLedgerFrmbkLogService
- RequestEnricher → VmisRequestEnricher

### Mapper 클래스
- CarBassMatterInqireMapper → VmisCarBassMatterInqireMapper
- CarLedgerFrmbkMapper → VmisCarLedgerFrmbkMapper

### MyBatis XML 업데이트
- mapper namespace 및 resultType 변경
- CarBassMatterInqireMapper_maria.xml
- CarLedgerFrmbkMapper_maria.xml

## 빌드 성공 확인 
- Bean 충돌 완전 해결
- 전체 컴파일 성공

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago
박성영 a2dc40a0d7 docs: VMIS 통합 완료 가이드 문서 추가
완료된 작업 요약 및 사용 가이드 문서

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
1 month ago