Skip to content

Deploy to BETA#141

Merged
Palbahngmiyine merged 37 commits intosolapi:betafrom
Palbahngmiyine:master
Apr 15, 2026
Merged

Deploy to BETA#141
Palbahngmiyine merged 37 commits intosolapi:betafrom
Palbahngmiyine:master

Conversation

@Palbahngmiyine
Copy link
Copy Markdown
Member

@Palbahngmiyine Palbahngmiyine commented Apr 15, 2026

기능 변경사항

master 브랜치의 최신 변경사항을 beta 브랜치로 병합합니다.

Refactoring

Bug Fixes

CI/CD

Tests

프로젝트 내부 변경사항

Tooling

  • .claude/agents 추가: barrel-checker, effect-reviewer
  • .claude/skills 추가: create-model, gen-e2e-test
  • tidy-first 에이전트 검증 단계에 full validation 추가
  • .cursor/rules 삭제 → CLAUDE.md/AGENTS.md로 통합

Docs & Examples

  • AGENTS.md, CLAUDE.md 업데이트
  • JavaScript 예제 코드 최신 API에 맞게 수정

Test plan

  • pnpm lint 통과
  • pnpm test 통과
  • pnpm build 통과

🤖 Generated with Claude Code

Palbahngmiyine and others added 30 commits April 8, 2026 12:45
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>
@Palbahngmiyine Palbahngmiyine self-assigned this Apr 15, 2026
Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread package.json
"@biomejs/biome": "2.4.10",
"@effect/language-service": "^0.85.1",
"@effect/vitest": "^0.29.0",
"@types/node": "^25.5.2",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The version for @types/node seems to be a typo. Version 25.5.2 does not exist as of now (Node.js is currently at version 23). It should likely be 22.5.2 or another valid version matching your target Node.js environment.

Suggested change
"@types/node": "^25.5.2",
"@types/node": "^22.5.2",

Comment thread src/lib/stringifyQuery.ts
}
if (typeof value === 'object') {
const nested: string[] = [];
for (const [subKey, subValue] of Object.entries(value)) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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.

Suggested change
for (const [subKey, subValue] of Object.entries(value)) {
for (const [subKey, subValue] of Object.entries(value as Record<string, unknown>)) {

@Palbahngmiyine Palbahngmiyine merged commit 6e4ff25 into solapi:beta Apr 15, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant