Problem
repo는 strict: true를 사용하지만 build-time/type 기반 검증을 더 강하게 만드는 TS strict 옵션과 Croco-specific lint rule은 아직 단계적으로 적용되지 않았다. 결과적으로 일부 contract/core 오류는 타입 시스템보다 generator diagnostic 또는 runtime path에서 늦게 드러난다.
Evidence
tsconfig/tsconfig.base.json:24-25는 strict: true지만 strictPropertyInitialization: false다.
noUncheckedIndexedAccess, exactOptionalPropertyTypes, noPropertyAccessFromIndexSignature는 trunk의 tsconfig에서 활성화되어 있지 않다.
packages/oxlint-rules/src/index.ts:6-11는 현재 no-cross-domain-import, no-datasource-import, type-graphql-explicit-type 세 rule만 노출한다.
packages/protocols-rest/src/libs/decorators/HttpMethod.ts:67-70는 generated contract에 표현하기 어려운 @All decorator를 제공한다.
packages/protocols-rest/src/libs/decorators/Params.ts:38-57는 REST param/body schema를 optional로 받는다.
Desired Outcome
contract/core 경로부터 stricter TS options와 Croco REST misuse lint를 단계 적용해, 약한 계약 작성이 CI 전에 타입/정적 분석 단계에서 드러나게 한다.
Proposed Implementation Path
- contract/core 패키지부터 적용할 staged strict config를 만든다. 후보:
exactOptionalPropertyTypes, noUncheckedIndexedAccess, noPropertyAccessFromIndexSignature, package별 strictPropertyInitialization 재검토.
- 바로 전체 repo에 강제하지 말고 allowlist와 package rollout plan을 둔다.
oxlint-rules에 REST contract misuse rule을 추가한다. 후보: generated-contract path의 @All 금지, public route @ResponseSchema 요구, @Body() schema 요구, named param schema 요구.
- generated app templates와 CI
pnpm check가 새 gate를 사용하도록 연결한다.
- false positive를 피하기 위해 route contract-first API와 compatibility loose mode의 경계를 rule 옵션으로 둔다.
Acceptance Criteria
- 최소
protocols-core, protocols-rest, rpc-codegen, openapi-spec, framework-context 중 합의된 1차 대상 패키지가 staged strict config로 typecheck된다.
- strict option 위반은 allowlist 없이 새 코드에서 추가될 수 없다.
@All을 generated contract route에 쓰는 fixture가 lint에서 실패한다.
@Body() 또는 named param에 schema를 빠뜨린 fixture가 strict REST contract lint에서 실패한다.
- generated app smoke와
pnpm check가 새 gate를 실행한다.
Validation
pnpm check
pnpm typecheck
pnpm test --filter=@croco/oxlint-rules
pnpm test --filter=@croco/protocols-rest
pnpm create-croco-app:smoke
Scope Boundaries
Problem
repo는
strict: true를 사용하지만 build-time/type 기반 검증을 더 강하게 만드는 TS strict 옵션과 Croco-specific lint rule은 아직 단계적으로 적용되지 않았다. 결과적으로 일부 contract/core 오류는 타입 시스템보다 generator diagnostic 또는 runtime path에서 늦게 드러난다.Evidence
tsconfig/tsconfig.base.json:24-25는strict: true지만strictPropertyInitialization: false다.noUncheckedIndexedAccess,exactOptionalPropertyTypes,noPropertyAccessFromIndexSignature는 trunk의 tsconfig에서 활성화되어 있지 않다.packages/oxlint-rules/src/index.ts:6-11는 현재no-cross-domain-import,no-datasource-import,type-graphql-explicit-type세 rule만 노출한다.packages/protocols-rest/src/libs/decorators/HttpMethod.ts:67-70는 generated contract에 표현하기 어려운@Alldecorator를 제공한다.packages/protocols-rest/src/libs/decorators/Params.ts:38-57는 REST param/body schema를 optional로 받는다.Desired Outcome
contract/core 경로부터 stricter TS options와 Croco REST misuse lint를 단계 적용해, 약한 계약 작성이 CI 전에 타입/정적 분석 단계에서 드러나게 한다.
Proposed Implementation Path
exactOptionalPropertyTypes,noUncheckedIndexedAccess,noPropertyAccessFromIndexSignature, package별strictPropertyInitialization재검토.oxlint-rules에 REST contract misuse rule을 추가한다. 후보: generated-contract path의@All금지, public route@ResponseSchema요구,@Body()schema 요구, named param schema 요구.pnpm check가 새 gate를 사용하도록 연결한다.Acceptance Criteria
protocols-core,protocols-rest,rpc-codegen,openapi-spec,framework-context중 합의된 1차 대상 패키지가 staged strict config로 typecheck된다.@All을 generated contract route에 쓰는 fixture가 lint에서 실패한다.@Body()또는 named param에 schema를 빠뜨린 fixture가 strict REST contract lint에서 실패한다.pnpm check가 새 gate를 실행한다.Validation
pnpm checkpnpm typecheckpnpm test --filter=@croco/oxlint-rulespnpm test --filter=@croco/protocols-restpnpm create-croco-app:smokeScope Boundaries