Conversation
prerelease, prerelease-type만으로는 버전에 beta suffix가 붙지 않음. versioning-strategy를 prerelease로 명시해야 6.0.0-beta.0 형식이 생성됨. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-versioning ci: beta release-please versioning-strategy prerelease 설정 추가
release-please config schema의 올바른 속성명은 "versioning"이다. "versioning-strategy"는 존재하지 않는 속성으로 무시되어 prerelease 버전(6.0.0-beta.0)이 생성되지 않았다. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ci: release-please versioning 속성명 수정 (master)
"beta"로 설정하면 첫 버전이 6.0.0-beta(카운터 없음)로 생성된다. "beta.0"으로 설정하면 6.0.0-beta.0부터 시작하고, 이후 bump 시 beta.1, beta.2로 시리얼하게 증가한다. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ter-master ci: prerelease-type beta.0으로 변경 — 시리얼 넘버링 (master)
upstream/beta 동기화 시 보존 대상 파일 복원: - agents: barrel-checker, effect-reviewer, tidy-first - skills: create-model, gen-e2e-test Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v6.0.0 Effect 전환에서 남아있던 레거시 패턴을 모두 제거: - Message, KakaoOption, RcsOption dead class 제거 (호출처 없음) - MessageType, AdditionalBody, RcsOptionRequest 수동 타입을 Schema 파생 타입으로 교체 - defaultFetcher의 try-catch를 Effect.try 파이프라인으로 변환 - barrel export 개선: VariableValidationError value export, 누락 schema 추가 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- JSON.parse("null") 시 null.errorCode TypeError 방지 (null guard 추가)
- parseServerErrorBody 순수 함수 추출로 에러 결정 로직 명확화
- makeError 팩토리로 ServerError 생성 코드 중복 제거
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- res.json() 대신 res.text() + JSON.parse로 변경하여 파싱 실패 처리 - null, 비객체 JSON, 다른 스키마 JSON에 대한 null guard 추가 - genericError fallback으로 "undefined: undefined" 에러 메시지 방지 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…egacy-cleanup refactor: 레거시 클래스/수동 타입 제거 및 Effect Schema 전면 전환
- defaultFetcher.ts: Effect.flatMap 내 try-catch를 Effect.try로 전환, throw new Error 제거, isErrorResponse 타입 가드로 as Partial<ErrorResponse> 단언 대체 - defaultError.ts: 미사용 deprecated ApiError alias 제거, isErrorResponse 타입 가드 추가 - index.ts/messageService.ts: sendOne 메소드 삭제 - kakaoOption.ts: as Record<string, unknown> 단언을 keyof BaseBmsSchemaType으로 대체 - defaultService.ts: 내부 전용 타입 불필요 export 제거 - stringDateTrasnfer.ts → stringDateTransfer.ts 파일명 오타 수정 및 전체 import 경로 반영 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- isErrorResponse: 빈 문자열 거부 추가 (기존 truthy 체크 동작 보존), 단일 cast로 간소화 - handleClientErrorResponse: SyntaxError 구분 추가 (parseServerErrorBody와 일관) - defaultFetcher: toMessage/makeParseError 헬퍼 추출로 반복 제거, 불필요 nested pipe 제거 - isErrorResponse 단위 테스트 19건 추가 (null, undefined, 원시값, 빈 문자열 등) - examples/: 삭제된 sendOne/sendOneFuture → send로 전환 (6개 파일) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- singleMessageSendingRequestSchema, SingleMessageSendingRequestSchema 제거 (sendOne 전용) - singleMessageSentResponseSchema, SingleMessageSentResponse 제거 (sendOne 전용) - barrel export (requests/index.ts, responses/index.ts)에서 해당 항목 제거 - 미사용 messageTypeSchema import 정리 (messageResponses.ts) - sendMessage.test.ts에서 삭제된 스키마 테스트 3건 제거 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ns-cleanup refactor: CLAUDE.md 원칙 위반 정리 및 dead code 제거
- 미사용 default export 제거 (fileToBase64, defaultFetcher) - 빈 섹션 주석 제거 (models/index.ts, responses/index.ts) - effectErrorHandler 타입 가드 개선: 필드별 as 어설션 → Record 통합 - bmsCommerce NumberOrNumericString 타입 어설션 Why 주석 보강 - deprecated v5 alias 7개 제거 (KakaoAlimtalkTemplateInterface 등) - bindServices 동적 프로토타입 순회 → 32개 메서드 명시적 .bind() 전환 - Writable<T> 헬퍼 타입 및 DefaultService import 제거 - 타입 어설션 7개 제거 (as unknown as, as never, as Record 등) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CLAUDE.md/AGENTS.md: bindServices() 참조를 명시적 .bind()로 업데이트 - effectErrorHandler 테스트: non-string _tag, message 없는 tagged defect 케이스 추가 - solapiMessageService 테스트: 32개 메서드 전체 바인딩 검증 테스트 추가 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…de-md-violations refactor: dead code 제거, deprecated alias 정리, bindServices 명시적 바인딩 전환
- @effect/language-service 설치 및 tsconfig.json plugin 설정 - as 캐스팅 제거: isTaggedDefect 타입 가드 도입, isErrorResponse in 연산자 narrowing - DRY: DefaultService에 getWithQuery 헬퍼 추출, 6개 서비스 메서드 간소화 - Effect.gen → Effect.flatMap 전환: uploadFile, reserveGroup, addMessagesToGroup - Effect LSP diagnostic 반영: Schema.decodeUnknown + mapError, Effect.void, yieldable error 직접 yield Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rvice-optimization refactor: Effect Language Service 도입 및 타입 안전성·DRY 개선
operatorTypeSchema, dateOperatorTypeSchema, kakaoOptionRequestSchema 등 프로젝트 내부·외부 어디에서도 참조되지 않는 타입/스키마 export를 정리하고, 유일한 export가 모두 dead인 kakaoOptionRequest.ts 파일을 삭제합니다. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
refactor: 미사용 export 및 dead file 제거
Effect 공식문서 원칙에 따라 throw 가능한 함수를 사용하는 Schema.transform을 Schema.transformOrFail로 전환하고, CLAUDE.md "코드가 자체 설명적이어야 함" 원칙에 따라 불필요한 what/how 주석을 제거한다. - kakaoOption: runSafeSync + Schema.transform → Schema.transformOrFail + Effect.mapError - requestConfig: formatWithTransfer + Schema.transform → safeFormatWithTransfer + Schema.transformOrFail - 10개 파일에서 불필요한 섹션 구분·단계별·설명 주석 ~35건 제거 (JSDoc API 문서 보존) - kakaoOption.test: performance.now() 비결정적 테스트 → 결정적 정확성 테스트 - stringifyQuery.test: @effect/vitest → vitest import (순수 유닛 테스트) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- kakaoOption.ts: 남아있던 "Constants for variable validation" 주석 제거 - sendMessage.test.ts: sendRequestConfigSchema의 decode/encode 경로 테스트 5건 추가 (Date→string 변환, string→string 변환, 잘못된 날짜 실패, 선택 필드, encode round-trip) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- decode 결과를 toContain 대신 getTime() 동치 비교로 시간값 정확성 검증 - encode round-trip에서 원본 Date 값과 동치 비교 추가 - showMessageList optional 필드 커버리지 추가 - 빈 문자열 scheduledDate 실패 케이스 추가 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
getTime() 동치 비교가 타입과 값을 모두 증명하므로 중복된 toBeInstanceOf(Date) assertion 제거. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…nsform-and-comment-cleanup refactor: Schema.transformOrFail 전환 및 불필요한 주석 제거
- 미사용 defaultMessageRequestSchema 정의 및 barrel export 제거 - stringifyQuery에서 early return으로 as Record<string, unknown> 어설션 제거 - defaultFetcher에서 JSON.parse의 any 전파 차단 (unknown 경유 캐스팅) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…e-safety-cleanup refactor: dead code 제거 및 타입 어설션 개선
…e-branch-fix-master [codex] fix(ci): use release-please component branch names
There was a problem hiding this comment.
Code Review
This pull request refactors the SDK to enhance its integration with the Effect library and streamline the service architecture. Major changes include replacing dynamic service binding in SolapiMessageService with explicit method delegation, consolidating message sending logic, and introducing a getWithQuery helper in DefaultService. The PR also replaces several legacy classes with pure Schema types and adds new Claude agent/skill definitions to the repository. Review feedback points out a versioning error for @types/node in package.json and a type safety regression in stringifyQuery.ts where an implicit any was introduced during the refactoring of object entry processing.
| "@biomejs/biome": "2.4.10", | ||
| "@effect/language-service": "^0.85.1", | ||
| "@effect/vitest": "^0.29.0", | ||
| "@types/node": "^25.5.2", |
There was a problem hiding this comment.
| } | ||
| if (typeof value === 'object') { | ||
| const nested: string[] = []; | ||
| for (const [subKey, subValue] of Object.entries(value)) { |
There was a problem hiding this comment.
The type of value is unknown, and while it is narrowed to object by the previous check, Object.entries(value) will result in subValue having an implicit any type. To adhere to the project's strict type safety rules (no any), please cast value to Record<string, unknown> as it was in the previous version.
| for (const [subKey, subValue] of Object.entries(value)) { | |
| for (const [subKey, subValue] of Object.entries(value as Record<string, unknown>)) { |
기능 변경사항
master 브랜치의 최신 변경사항을 beta 브랜치로 병합합니다.
Refactoring
Schema.transformOrFail전환 및 타입 안전성 강화 (image API는 더 이상 사용되지 않습니다. 새로운 storage API로 대체됩니다. #10)bindServices명시적 바인딩 전환,isErrorResponse강화 (타입스크립트를 위한 .d.ts 파일 정의 지원 #7)Bug Fixes
handleServerErrorResponse/handleClientErrorResponse에 null/비정형 JSON 방어 적용 (npm publish #5)CI/CD
versioning속성명 수정 및beta.0시리얼 넘버링 활성화 (ci: beta release-please versioning-strategy prerelease 설정 추가 #117, ci: release-please versioning 속성명 수정 (master) #121, ci: prerelease-type beta.0으로 변경 — 시리얼 넘버링 (master) #124)Tests
expect.assertions()추가로 false-green 방지 (타입스크립트를 위한 .d.ts 파일 정의 지원 #7)sendRequestConfigSchema테스트 추가 및 강화 (image API는 더 이상 사용되지 않습니다. 새로운 storage API로 대체됩니다. #10)프로젝트 내부 변경사항
Tooling
.claude/agents추가: barrel-checker, effect-reviewer.claude/skills추가: create-model, gen-e2e-test.cursor/rules삭제 → CLAUDE.md/AGENTS.md로 통합Docs & Examples
Test plan
pnpm lint통과pnpm test통과pnpm build통과🤖 Generated with Claude Code