배경
Croco는 98개 패키지를 가진 TypeScript 모노레포인데, public package의 배포 엔트리포인트 계약이 패키지마다 다릅니다. 현재 조사 기준으로 53개 패키지가 root main/types를 ./src/index.ts로 가리키면서 files는 dist만 포함합니다.
예시:
왜 중요한가
world-class 프레임워크는 npm 소비자가 ESM/CJS/TypeScript 환경에서 동일하게 패키지를 해석할 수 있어야 합니다. entrypoint drift는 release 직후 런타임 import 실패, 타입 해상도 실패, bundler별 동작 차이로 이어집니다.
외부 기준:
제안 범위
- public package manifest 표준 결정
- root
main, module, types, exports, type, files
publishConfig 사용 여부와 root field 중복 정책
- CJS/ESM/type declaration 확장자 정책
scripts/normalize-packages.mjs를 write 모드와 check 모드로 분리
- CI에서 manifest drift를 hard fail
- 기존 package별 예외가 필요하면 allowlist와 사유 문서화
완료 기준
배경
Croco는 98개 패키지를 가진 TypeScript 모노레포인데, public package의 배포 엔트리포인트 계약이 패키지마다 다릅니다. 현재 조사 기준으로 53개 패키지가 root
main/types를./src/index.ts로 가리키면서files는dist만 포함합니다.예시:
packages/framework-context/package.json:4-20—files: ["dist"]인데 rootmain/types는./src/index.ts,publishConfig는dist를 가리킴packages/impersonation-core/package.json:8-23— rootmain/module/types/exports가 dist 기반이지만types가 배열 형태package.json:18— release는pnpm build && changeset publish흐름왜 중요한가
world-class 프레임워크는 npm 소비자가 ESM/CJS/TypeScript 환경에서 동일하게 패키지를 해석할 수 있어야 합니다. entrypoint drift는 release 직후 런타임 import 실패, 타입 해상도 실패, bundler별 동작 차이로 이어집니다.
외부 기준:
제안 범위
main,module,types,exports,type,filespublishConfig사용 여부와 root field 중복 정책scripts/normalize-packages.mjs를 write 모드와 check 모드로 분리완료 기준
pnpm check또는 별도 CI step이 manifest drift를 실패로 처리한다scripts/normalize-packages.mjs가 check-only 모드를 지원한다