diff --git a/.tool-versions/README.md b/.tool-versions/README.md new file mode 100644 index 0000000..0d67355 --- /dev/null +++ b/.tool-versions/README.md @@ -0,0 +1,9 @@ +--- +applyTo: ".tool-versions/**" +--- +# .tool-versions 파일과 package.json의 pnpm 버전 일치 규칙 +- `.tool-versions` 파일 내 pnpm 버전과 루트 `package.json`의 `packageManager` 또는 `engines.pnpm` 버전이 일치하는지 검증한다. +- 버전이 불일치할 경우, `.tool-versions`의 pnpm 버전을 `package.json`에 명시된 버전으로 자동 수정하는 스크립트 또는 규칙을 적용한다. +- 이 규칙은 CI 또는 pre-commit 훅에서 실행되어 도구 체인 불일치를 방지한다. +- `asdf` 또는 `rtx`와 같은 도구들이 일관된 버전으로 동작하도록 보장한다. +- 버전 일치 규칙을 문서화하여 팀 내에서 공유하고, PR 검토 시 반드시 체크하도록 한다. diff --git a/docs/promote/digests/2026-05-22.md b/docs/promote/digests/2026-05-22.md new file mode 100644 index 0000000..3bc862a --- /dev/null +++ b/docs/promote/digests/2026-05-22.md @@ -0,0 +1,142 @@ +# 메모리 승격 다이제스트 — trpc/trpc +> 생성일: 2026-05-22 · promote v0.6.0 + +## 설정 + +- Provider: `openai` (embeddings + HAC + llmRefine) +- Models: `gpt-4.1-mini` (classify), `gpt-4.1-nano` (draft), `text-embedding-3-small` (embed) +- Output language: `ko` +- Thresholds: similarity `0.8`, min confidence `0.75`, min occurrences `2` +- Window: `90` days (overridden via --since; config default is 60) +- Privacy: redactSecrets=`true`, sendDiffHunksToLLM=`false` + +## 요약 + +- Scanned: **423** review comments across **62** PRs +- AI reviewer comments: **361** +- Clusters found: **274** +- Repeated clusters: **45** +- Promotion candidates: **1** +- Estimated cost: $0.0348 +- Timings: fetch 5.2s · normalize 25ms · cluster 54.2s · conv-fetch 5.8s · reply-ctx 12.5s · memory 1.1s · classify+draft 18.3s · **total 1m 38s** + +--- + +## 1. `.tool-versions` 파일의 pnpm 버전과 루트 package.json의 pnpm 버전 선언이 일치하지 않아 도구 체인 불일치 문제가 발생할 수 있으므로, 두 버전을 일치시키는 규칙이 필요합니다. + +- **ID**: `candidate_379` +- **Target**: `path_scoped_rule` → `.tool-versions/README.md` +- **Confidence**: 0.95 +- **Scope**: 🌐 cross-PR (2 PRs) +- **Occurrences**: 2 comments +- **Path scope**: `.tool-versions` + +### 근거 + +- PR #7200 `.tool-versions` — "`.tool-versions` still pins `pnpm 8.15.5`, but the repo’s root `package.json` de..." [link](https://github.com/trpc/trpc/pull/7200#discussion_r2872405266) +- PR #7194 `.tool-versions` — "The repo declares pnpm 9.x via package.json (engines/packageManager), but .tool-..." [link](https://github.com/trpc/trpc/pull/7194#discussion_r2869277485) + +### 제안된 패치 + +```markdown +--- +applyTo: ".tool-versions/**" +--- +# .tool-versions 파일과 package.json의 pnpm 버전 일치 규칙 +- `.tool-versions` 파일 내 pnpm 버전과 루트 `package.json`의 `packageManager` 또는 `engines.pnpm` 버전이 일치하는지 검증한다. +- 버전이 불일치할 경우, `.tool-versions`의 pnpm 버전을 `package.json`에 명시된 버전으로 자동 수정하는 스크립트 또는 규칙을 적용한다. +- 이 규칙은 CI 또는 pre-commit 훅에서 실행되어 도구 체인 불일치를 방지한다. +- `asdf` 또는 `rtx`와 같은 도구들이 일관된 버전으로 동작하도록 보장한다. +- 버전 일치 규칙을 문서화하여 팀 내에서 공유하고, PR 검토 시 반드시 체크하도록 한다. +``` + +### 이 대상을 선택한 이유 + +이 패턴은 .tool-versions 파일과 package.json 파일 간의 pnpm 버전 일치 문제로, 특정 경로(.tool-versions)와 관련된 규칙으로 관리하는 것이 적합합니다. 이는 여러 PR에서 반복적으로 지적된 문제이며, 도구 체인 일관성을 위해 경로 범위 규칙으로 저장하는 것이 유용합니다. AGENTS.md 같은 전역 AI 지침보다는 특정 파일과 관련된 규칙이므로 path_scoped_rule이 적절합니다. + +### 고려된 대안 + +- `agents`: 버전 일치 문제는 여러 경로에 걸쳐 발생할 수 있으나, 현재는 .tool-versions 파일에 국한되어 있어 범위가 좁음. +- `pr_only`: 반복된 패턴이지만, 도구 체인 일관성 문제는 여러 PR에서 공통적으로 발생하여 일회성 문제보다 일반적임. + +### 실행 명령어 + +```bash +promote candidate_379 --target path_scoped_rule +promote ignore candidate_379 --reason "..." +promote snooze candidate_379 --days 30 +``` + +--- + +## 필터링된 항목 + +승격 후보에서 제외된 항목들. 임계치 튜닝이나 팀 리뷰의 엣지 케이스 확인에 유용합니다. + +### 이미 승격됨 (28) + +- www/scripts/check-twoslash.ts 파일 내에서 인덱스 또는 캡처 접근 시 non-null assertion 연산자(!) 사용을 제거하고 명시적 null 검사 또는 optional chaining으로 대체해야 한다. +- 통합 테스트에서 서버와 클라이언트 리소스 관리를 위해 `testServerAndClientResource` 패턴을 일관되게 사용하도록 권장하는 리팩토링 제안입니다. +- `@ts-expect-error` 지시문에 ESLint 요구사항에 따라 3자 이상의 설명을 추가해야 한다는 규칙이 packages/openapi/test/routers/** 경로 내에서 반복적으로 나타남 +- @types/node 버전은 Node.js 주요 버전과 일치시켜야 하며, package.json의 engines.node 설정과 맞춰야 한다. +- 테스트 파일에서 beforeAll을 vitest에서 임포트하지 않으면 런타임 에러가 발생하므로, describe/expect/it와 함께 반드시 임포트해야 한다. +- 인터셉터 루프 내에서 변환된 에러를 체인으로 전달해야 한다는 반복된 지적 +- 패키지의 bin 실행 파일을 올바르게 배포하기 위해 package.json의 files 배열에 bin 디렉토리를 포함해야 한다. +- `maxBatchSize` 설정이 있어도 `opts.path.split(',')`가 먼저 배열을 할당하여 DoS 공격에 취약하므로, 경로 내 쉼표 개수를 직접 세어 제한하는 방식으로 개선해야 한다. +- 여러 @trpc/* 패키지에서 동일한 'intent' 바이너리를 노출하면 node_modules/.bin/intent 충돌이 발생할 수 있으므로, 고유한 네임스페이스가 있는 바이너리 이름을 사용해야 한다. +- ServerSentEventsOptions 타입 파라미터 누락 문제를 수정하고, SSE 페이로드 타입 전파를 올바르게 적용하는 규칙 +- 여러 패키지에서 동일한 이름의 bin 실행 파일을 선언했으나 실제 파일이 존재하지 않아 설치 시 충돌 및 오류가 발생할 수 있으므로, bin 선언 시 실제 파일 존재 여부와 이름 중복을 반드시 확인해야 한다. +- `hasExpectedArtifacts()` 함수가 출력 디렉토리 존재 여부만 확인하여 내부 파일이 삭제되거나 손상된 경우 캐시 히트가 잘못 발생할 수 있음으로, 출력 디렉토리 내 특정 파일 존재 여부도 검사할 필요가 있음. +- `subscribe()` 호출 시 `const`로 선언된 `subscription` 변수를 `onError` 핸들러 내에서 참조하는 것은 동기적 에러 발생 시 temporal dead zone 문제를 일으킬 수 있으므로, `let`으로 선언하거나 별도 초기화가 필요하다. +- 테스트에서 오타가 있는 오류 메시지 'occured'를 사용하고 있으며, 런타임 메시지가 'occurred'로 수정되면 테스트 기대값도 일치하도록 업데이트해야 한다. +- 환경 변수로부터 절대 경로를 직접 사용하는 셸 명령어는 제어되지 않은 경로 의존성을 초래할 수 있다. +- packages/tanstack-react-query 테스트 파일에서는 React를 네임스페이스 import 방식으로 사용해야 한다는 규칙이 반복적으로 지적됨 +- maxBatchSize가 NaN, Infinity, 음수, 0 또는 비정수일 경우 제한 조건이 제대로 작동하지 않으므로, 유한하고 양의 정수인지 검증해야 한다. +- `SKILL.md` 파일명은 md/mdx camelCase 명명 규칙을 위반하지만, 이는 의도된 예외로서 명확히 문서화되어야 한다. +- `querySerializer`가 `undefined` 값을 `JSON.stringify`로 직렬화할 때, `URLSearchParams.append()`가 이를 문자열 "undefined"로 변환하는 문제와 `responseTransformer`의 특정 필드 검사 문제를 다룸 +- 이 에러 핸들러에서 `resolveProcedureError` 호출 시 프로시저의 `declaredErrors` 등록 리스트가 누락되어, 등록된 선언된 에러가 잘못 처리되는 문제가 반복적으로 지적됨. +- `onSseEvent` 함수는 메타데이터 전용 프레임(heartbeat 또는 `retry:` 전용 청크)에 대해 호출을 건너뛰어야 하며, 이는 `StreamEvent.data`가 필수임에도 불구하고 `data: undefined`가 전달되는 문제를 방지하기 위함입니다. +- 서버 전송 이벤트 재시도 로직에서 초기 연결 시도에 재시도 예산을 소모하지 않고, AbortError 발생 시 재시도하지 않아야 한다는 규칙이 반복적으로 지적됨. +- GitHub Actions 워크플로우에서 lerna publish 명령어가 기본적으로 git 태깅 및 푸시를 수행하므로, permissions.contents 권한을 read로 제한할 경우 푸시가 필요한 작업에는 적절한 권한 설정이 필요하다. +- 의존성 변경 시 package.json과 pnpm-lock.yaml 파일을 항상 동기화하여 CI 실패를 방지해야 합니다. +- 릴리스 워크플로우에서 'pnpm add -g npm@latest' 사용은 비재현적이며, npm 버전을 고정하는 것이 안정적임. +- 이 패턴은 여러 패키지에서 `bin` 엔트리가 `@tanstack/intent`에 의존하지만, 해당 의존성을 명시하지 않아 런타임 오류가 발생할 수 있음을 지적합니다. +- CI 워크플로우에서 사용하는 CLI 버전을 package.json에 명시된 버전과 일치하도록 고정해야 합니다. +- 마크다운 코드 블록에 언어 식별자를 추가하여 markdownlint MD040 경고를 방지하고 편집기 지원을 향상시킵니다. + +### 승격 불가 (target=none / invalid) (16) + +- AI가 인간 대화 상황을 인지하고 개입하지 않겠다는 안내 메시지 반복 — target=`none`, confidence=0.95 + - 이 패턴은 특정 PR에서 AI가 대화 상황을 인지하고 개입하지 않겠다는 단순 안내 메시지로, 저장할 가치가 있는 지식이나 규칙이 아니며, 코드 리뷰나 아키텍처와 관련된 내용도 아님 +- 디렉터리 읽기 오류 처리 시 모든 오류를 무시하지 말고 ENOENT(디렉터리 없음) 오류만 무시해야 한다. — target=`pr_only`, confidence=0.90 + - 이 패턴은 특정 파일(www/scripts/check-twoslash.ts) 내 특정 코드 라인에서 발생하는 오류 처리 방식에 관한 것으로, 범용적인 규칙이라기보다는 해당 PR에서만 적용되는 구체적인 문제 해결법이다. 따라서 전체 에이전트 지침이나 경로 범위 규칙으로 확장하기보다는 PR 단위로 보존하는 것이 적절하다. +- 워크플로우의 경로 필터가 실제 문서 디렉토리 위치와 일치하지 않아 문서 변경 시 워크플로우가 트리거되지 않는 문제를 수정해야 한다. — target=`pr_only`, confidence=0.90 + - 이 패턴은 특정 PR에서 발견된 워크플로우 경로 설정 오류에 관한 것으로, 특정 코드 위치와 상황에 국한되어 있어 범용적인 규칙이나 아키텍처 결정으로 확장하기 어렵다. 따라서 향후 참고를 위해 PR 단위로 보존하는 것이 적절하다. +- 오타 'occured'를 'occurred'로 수정하여 사용자에게 노출되는 메시지의 철자 오류를 방지하는 반복된 리뷰 요청입니다. — target=`pr_only`, confidence=0.95 + - 이 패턴은 특정 PR 내에서 발생한 오타 수정에 관한 것으로, 일반적인 코딩 규칙이나 아키텍처 결정과는 무관하며, 다른 PR이나 경로에 걸쳐 적용되는 규칙이 아니므로 저장소 전체 지식으로 보존할 필요가 없습니다. +- 사용자에게 표시되는 오류 메시지에서 'occured' 오타를 'occurred'로 수정하는 반복된 리뷰 코멘트 — target=`pr_only`, confidence=0.95 + - 이 패턴은 특정 PR과 파일 내의 한정된 오타 수정에 관한 것으로, 범용적인 규칙이나 아키텍처 결정이 아니며, 테스트 스냅샷과 연관되어 있어 PR 단위로 관리하는 것이 적절하다. +- `@hey-api/openapi-ts` 패키지의 peerDependencies 최소 버전을 실제 코드에서 사용하는 Plugins 타입을 지원하는 가장 이른 버전으로 엄격히 지정해야 한다는 반복된 리뷰 지적 — target=`pr_only`, confidence=0.90 + - 이 패턴은 특정 PR 내에서 패키지 버전 호환성 문제를 다루는 구체적이고 일회성인 코드 변경에 관한 것으로, 전체 저장소에 적용되는 일반 규칙이나 아키텍처 결정과는 거리가 있다. 따라서 범용적인 에이전트 지침이나 경로별 규칙으로 승격하기보다는 해당 PR에 한정하여 기억하는 것이 적절하다. +- pnpm-lock.yaml 파일에서 일부 워크스페이스가 여전히 vitest 3.x 버전을 참조하고 있어, 모노레포 전체를 vitest 4로 업그레이드하려면 해당 워크스페이스의 package.json도 함께 업데이트해야 한다. — target=`pr_only`, confidence=0.90 + - 이 패턴은 특정 PR에서 모노레포 내 vitest 버전 일관성을 맞추기 위한 구체적이고 일회성 작업에 관한 것으로, 범용적인 규칙이나 아키텍처 결정이 아니며, 다른 경로나 전반적인 에이전트 지침에 적용되지 않으므로 pr_only가 적합하다. +- PR 설명과 실제 exports 키의 경로 명명 규칙 불일치 문제로 인해 소비자가 문서화된 경로로 임포트할 수 없는 문제 반복 지적 — target=`pr_only`, confidence=0.90 + - 이 패턴은 특정 PR에서만 발생하는 구체적인 문제로, 경로 명명 규칙 불일치에 관한 것으로 전체 저장소에 적용되는 일반 규칙이나 아키텍처 결정과는 거리가 있음. 따라서 향후 참고를 위해 PR 단위로 보존하는 것이 적절함. +- 파일 헤더 주석에 명시된 경로와 실제 파일 경로가 일치하지 않아 혼란을 초래할 수 있으므로, 주석 또는 파일 위치를 일치시켜야 한다. — target=`pr_only`, confidence=0.90 + - 이 패턴은 특정 PR 내에서 파일 경로와 주석 불일치 문제에 국한된 구체적인 사례로, 범용적인 규칙이나 아키텍처 결정이 아니며, 다른 경로에 적용되는 일반적인 규칙도 아니므로 저장소 전체 지침으로 승격할 필요가 없다. +- 여러 패키지의 package.json에서 bin.intent가 존재하지 않는 ./bin/intent.js 파일을 참조하여 실행 파일 경로가 깨지는 문제. — target=`pr_only`, confidence=0.95 + - 이 문제는 특정 PR에서 여러 패키지에 걸쳐 발생한 구체적인 코드베이스 문제로, 일반적인 규칙이나 아키텍처 결정이 아니라 일회성 코드 오류에 해당한다. 따라서 저장소 전체에 적용할 만한 규칙이나 에이전트 지침으로 승격하기보다는 해당 PR에 한정하여 보존하는 것이 적절하다. +- 이 헬퍼 함수는 subscribe 호출 중 onError가 동기적으로 실행되면 ReferenceError가 발생할 수 있으므로, let으로 변수를 미리 선언하고 할당 후 구독 해제해야 한다. — target=`pr_only`, confidence=0.90 + - 이 패턴은 특정 테스트 파일 내 subscribe 함수 사용 시 발생하는 일회성 코드 문제로, 범용적인 규칙이나 아키텍처 결정이 아니며, 다른 경로에도 일반화하기 어렵다. 따라서 PR 단위로 관리하는 것이 적절하다. +- `getRouterInputsHash()` 함수가 각 라우터마다 전체 파일을 재탐색하고 재읽기 때문에 다중 라우터 환경에서 성능 저하가 발생한다는 지적이 반복됨. — target=`pr_only`, confidence=0.95 + - 이 패턴은 특정 PR 내에서 `getRouterInputsHash()` 함수의 비효율적 구현에 관한 구체적이고 기술적인 문제로, 범용적인 규칙이나 아키텍처 결정과는 거리가 있음. 따라서 전체 에이전트 지침이나 경로별 규칙으로 승격하기보다는 해당 PR에 한정된 개선 사항으로 보존하는 것이 적절함. +- 도움말 및 주석에서 OpenAPI 버전이 3.0으로 표기되어 있으나 실제 생성기는 3.1.1 버전을 출력하므로 문서 일관성 문제를 수정해야 한다. — target=`pr_only`, confidence=0.90 + - 이 패턴은 특정 PR 내에서 문서 주석의 버전 표기 오류를 수정하는 구체적이고 한정된 사례로, 범용적인 규칙이나 아키텍처 결정이 아니며, 다른 경로에도 적용되는 일반적인 규칙도 아니다. 따라서 저장소 전체에 적용할 필요 없이 해당 PR에만 국한된 지식으로 보존하는 것이 적절하다. +- 이 클러스터는 스트리밍 응답의 content-type이 application/json에서 application/jsonl로 변경되어야 한다는 반복된 리뷰 코멘트를 포함합니다. — target=`pr_only`, confidence=0.90 + - 이 패턴은 특정 PR(#7345)과 관련된 구체적인 변경 사항에 국한되어 있으며, 다른 PR이나 전역 규칙에 적용되지 않습니다. 따라서 일반적인 에이전트 지침이나 경로별 규칙으로 승격하기보다는 해당 PR에만 유용한 정보로 보존하는 것이 적절합니다. +- @ts-expect-error 주석이 호출되는 훅 이름과 일치하지 않아 정확한 API 명칭으로 수정이 필요함 — target=`pr_only`, confidence=0.95 + - 이 패턴은 특정 PR 내 테스트 파일에서 발생한 주석 불일치 문제로, 일반적인 규칙이나 아키텍처 결정과는 무관하며, 다른 경로에도 적용되는 범용 규칙이 아니므로 저장할 필요가 없음 +- 문서 내 오타 및 맞춤법 오류 수정에 관한 반복된 리뷰 코멘트 — target=`pr_only`, confidence=0.95 + - 이 패턴은 특정 PR 내 문서 파일에서 발견된 개별적인 오타 수정에 관한 것으로, 범용적인 규칙이나 아키텍처적 결정과는 거리가 멀다. 따라서 저장소 전체에 적용할 만한 지침이나 테스트 불변 조건으로 보기 어렵고, 특정 PR에 한정된 내용이다. + +---