-
Notifications
You must be signed in to change notification settings - Fork 10
[3주차 크루 미션 - 개발 중반 & 중간 공유] ellipsis 미션 제출합니다. #14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
malibinYun
merged 161 commits into
woowacourse:committhekermit
from
CommitTheKermit:ellipsis
Jun 17, 2026
Merged
Changes from all commits
Commits
Show all changes
161 commits
Select commit
Hold shift + click to select a range
ed2e025
docs: 1주차 보고서 작성
CommitTheKermit ba1493f
docs: 1주차 보고서 수정
CommitTheKermit 4aa7038
Merge branch 'committhekermit' into ellipsis
CommitTheKermit 8b4a7d7
docs: 2주차 보고서 작성
CommitTheKermit f168ae1
Merge remote-tracking branch 'origin/ellipsis' into ellipsis
CommitTheKermit d00f330
chore: 프로토타입, 데이터 크롤러, 수집한 데이터 첨부
CommitTheKermit fd9af01
feat(keybuddy): 키보드 추천 프론트엔드를 impl/keybuddy로 이관
CommitTheKermit 71abb60
docs(keybuddy): 태그 파이프라인 추천 전환 Seed 명세 추가
CommitTheKermit 2fd6005
feat(keybuddy): HardConstraint/SoftIntent 스키마 상수 모듈 추가
CommitTheKermit 57b3bb6
feat(keybuddy): validateTagSchema 함수 구현 및 단위 테스트 추가
CommitTheKermit 241b859
feat(keybuddy): extractRawTags 함수 및 단위 테스트 구현
CommitTheKermit 07cfb7a
feat(keybuddy): sanitizeTags 함수 및 단위 테스트 추가
CommitTheKermit ee6874e
feat(keybuddy): extractAndValidateTags 파이프라인 통합 함수 구현
CommitTheKermit 9b669eb
feat(keybuddy): checkLayoutViolation 함수 구현 및 단위테스트 추가
CommitTheKermit f16cd79
feat(keybuddy): 소프트태그 정적 규칙표 및 완전성 검사 구현 (Sub-AC 3-1)
CommitTheKermit a1e08ed
test(keybuddy): checkSwitchViolation 구현 및 단위테스트 추가
CommitTheKermit 01e7654
feat(keybuddy): 단계별 선택 입력->하드 제약 순수 매핑 함수 구현 (Sub-AC 2-1-A)
CommitTheKermit e2149b6
feat(keybuddy): checkFormFactorViolation 함수 구현 및 단위테스트 추가
CommitTheKermit d338e61
feat(keybuddy): 키보드 데이터셋 스키마 추출 함수 구현
CommitTheKermit 8f28f5f
feat(keybuddy): checkBudgetViolation 함수 구현 및 단위테스트 추가
CommitTheKermit 20c48af
feat(keybuddy): 속성명 무결성 검사 함수 구현 및 테스트 추가
CommitTheKermit 7e75932
feat(keybuddy): 소프트 의도 태그 단계별 순수 매핑 함수 구현 (Sub-AC 2-1-B)
CommitTheKermit 89ec49a
feat(keybuddy): checkHardConstraintViolation 디스패처 함수 구현 (Sub-AC 4-1-5)
CommitTheKermit d31d0ae
feat(keybuddy): 속성 값 무결성 검사 함수 구현 (Sub-AC 3-2-c)
CommitTheKermit 3acff13
feat(keybuddy): filterByHardConstraints 구현 및 단위테스트 추가
CommitTheKermit 7520153
feat(keybuddy): 단계 번호 기반 TagSet 디스패처 함수 구현 (Sub-AC 2-1-C)
CommitTheKermit 8281d4b
test(keybuddy): validateTagSchema 엣지 케이스 단위 테스트 추가
CommitTheKermit 9362b89
test(keybuddy): selectionOptionConverter 추가 및 validateTagSchema 통과 단위…
CommitTheKermit 3876f15
test(keybuddy): Sub-AC 2-3-a 선택 경로와 자유형 경로의 하드 필터 결과 동일성 검증
CommitTheKermit 5fdfe99
test(keybuddy): Sub-AC 2-3-b 소프트태그 스코어 패리티 단위 테스트 추가
CommitTheKermit 4714532
test(keybuddy): 검색 엔진 진입점 및 통합 테스트 추가 (Sub-AC 2-3-c)
CommitTheKermit 7e7ad6e
feat(keybuddy): detectNoResult 함수 추가 및 단위테스트 작성
CommitTheKermit df232ec
test(keybuddy): 소프트 태그 점수 단조성 단위테스트 추가
CommitTheKermit 488db16
test(keybuddy): getRelaxationOrder 함수 구현 및 단위 테스트 추가
CommitTheKermit 006984a
feat(keybuddy): relaxAndSearch 함수 구현 및 단위 테스트 추가
CommitTheKermit 4c5705c
test(keybuddy): 하드 제약 태그 추출 정확도 골드셋 테스트 추가 (Sub-AC 1)
CommitTheKermit 0db0117
feat(keybuddy): Sub-AC 7-1 - 결과 객체 매칭 소프트태그 결정론 함수 추가
CommitTheKermit f822c03
test(keybuddy): 소프트 의도 태그 추출 정확도 골드셋 테스트 추가
CommitTheKermit 7ce74be
feat(keybuddy): evaluateConstraint 단일 하드 제약 술어 함수 구현 (Sub-AC 7-2a)
CommitTheKermit 93bfe4b
test(keybuddy): Sub-AC 2a - 정적 규칙표 맵 구조 골드셋 검증 테스트 추가
CommitTheKermit 97ce96b
feat(keybuddy): buildConstraintStatusMap 구현 (Sub-AC 7-2b)
CommitTheKermit 5169389
test(keybuddy): expandSoftTag 단위 테스트 추가 (Sub-AC 2b)
CommitTheKermit 5a76f48
test(keybuddy): 하드 제약 필터 LLM 미호출 단위 테스트 추가 (Sub-AC 7.3.1)
CommitTheKermit 7f28a22
test(keybuddy): Sub-AC 7.3.2 소프트 태그 스코어링 LLM 미호출 검증 테스트 추가
CommitTheKermit cb503f6
test(keybuddy): Sub-AC 7.3.3 결과 조합 모듈 LLM 호출 횟수 0 검증
CommitTheKermit 685bec0
fix(keybuddy): Seed metadata.version 문자열 타입으로 수정
CommitTheKermit c164ab1
feat(keybuddy): filterByConstraintPredicates 술어 기반 필터 추가 (Sub-AC 3-1)
CommitTheKermit f6c54db
fix(keybuddy): 하드 제약 6종 enforcement 누락 수정 + 의도 골드셋
CommitTheKermit 4b0eaa2
fix(keybuddy): npm run build(tsc) 통과하도록 타입 에러 정리
CommitTheKermit cc53814
feat(keybuddy): 태그 추출 견고화 + 개발용 콘솔 로그
CommitTheKermit aabe0b0
docs(keybuddy): 의도->다차원 속성 프로파일 하네싱 Seed 명세 추가
CommitTheKermit 446aada
feat(keybuddy): 의도->다차원 프로파일 정적 문서 + 결정론 확장 (AC1/3/4/5)
CommitTheKermit 925c905
feat(keybuddy): 의도 확장 검색 엔진 searchWithProfile (AC5/6)
CommitTheKermit 87e3e90
feat(keybuddy): extractIntentInput - 의도+명시 제약 분리 추출 (AC2)
CommitTheKermit 2dcf36d
feat(keybuddy): recommend를 의도 하네싱으로 배선 (AC7)
CommitTheKermit 427ade2
docs(keybuddy): 의도 하네싱 전/후 정성 비교 리포트 + 생성기 (AC8)
CommitTheKermit 2a4954b
docs(keybuddy): 자연어->태그 추출 플로우 문서 + README 현행화
CommitTheKermit 8cbac42
fix(keybuddy): 명시 정숙 요구를 방향 인식으로 하드 강화
CommitTheKermit d8ed6df
feat(keybuddy): 추천 노출 상한 12 -> 30
CommitTheKermit 059ce4e
chore: CodeRabbit 자동 코드 리뷰 설정 추가
CommitTheKermit 77de0b2
chore: CodeRabbit 제거하고 Claude Code Action 자동 PR 리뷰로 전환
CommitTheKermit 64c0a15
feat: keybuddy 프론트 추천 앱 추가
chohs4164 6be4d83
feat: Supabase Edge Function 추천 API 추가
chohs4164 79c4a3a
docs: Supabase 기반 실행 및 배포 방법 정리
chohs4164 013dff4
"Claude PR Assistant workflow"
CommitTheKermit 1b1ca63
"Claude Code Review workflow"
CommitTheKermit d18d7cc
Merge pull request #2 from CommitTheKermit/add-claude-github-actions-…
CommitTheKermit 4486d50
chore: 프로토타입, 데이터 크롤러, 추가 수집
CommitTheKermit 070d9b6
fix: Supabase 추천 함수 호출 설정 수정
chohs4164 9a858ec
Merge branch 'ellipsis' of https://github.com/CommitTheKermit/android…
chohs4164 4ef1d46
chore: keybuddy Supabase 구조를 impl 경로로 정리
chohs4164 90cdbd8
Merge remote-tracking branch 'origin/main' into ellipsis
chohs4164 5b18fe1
fix: 추천 태그를 DB 속성 기반으로 수정
chohs4164 82e00a4
chore: 추천 모델을 gpt-5.4로 변경
chohs4164 4b3dc80
fix(keybuddy): PR 리뷰 반영 - LLM 프롬프트 오타·에러 처리·데드코드 정리
CommitTheKermit bb5ca39
Merge pull request #1 from CommitTheKermit/keybuddy-intent-harness
CommitTheKermit 3422b7e
ci(review): Claude PR 리뷰를 라인별 inline 코멘트로 전환
CommitTheKermit ea1c0a5
Merge remote-tracking branch 'origin/ellipsis' into chohs4164
chohs4164 e2bf0c2
ci(review): claude-code-action OIDC 인증용 id-token 권한 추가
CommitTheKermit 5788023
ci: Claude 리뷰 워크플로 OIDC 권한 추가
chohs4164 34ac4f5
fix: 추천 API 오류 처리 보강
chohs4164 0351b39
fix: 추천 API 리뷰 지적사항 반영
chohs4164 bdd612e
Merge pull request #4 from chohs4164/chohs4164
chohs4164 8f3216d
docs: keybuddy 실행 환경 설정 가이드 보강
chohs4164 9e9659f
Merge pull request #6 from chohs4164/docs-keybuddy-env-guide
chohs4164 9be0629
feat(keybuddy): 결과 화면에 구매하기 버튼과 별점 피드백 추가
CommitTheKermit 68e7c45
docs: 프로젝트 메모리에 git 브랜치 작업 규칙 추가
CommitTheKermit 0054deb
feat(keybuddy): 별점 0.5점 단위 선택/반 개 표시 지원
CommitTheKermit c619d3e
fix: 추천 결과 최대 개수 30개로 복원
chohs4164 67a43e5
Merge pull request #9 from chohs4164/fix-keybuddy-max-recommendations
chohs4164 74673c3
fix: 추천 후보와 출력 여유 확대
chohs4164 58bb89b
fix: 추천 요청 timeout 여유 확대
chohs4164 74df9b4
fix: 추천 응답 안정성 보강
chohs4164 b942d1c
Merge pull request #10 from CommitTheKermit/fix-keybuddy-recommendati…
chohs4164 92800d8
docs: 스위치 정보 catalog 정의
first-woosun 6831ae2
docs: catalog와 유사한 스위치 이름 매핑을 위한 데이터
first-woosun 9328c96
docs: 실제 UI에 표시할 스위치 데이터
first-woosun 929ab28
feat: 키보드 스위치 옵션 매칭 및 가격비교 링크 수집 추가
first-woosun b9409ae
docs: 변경된 크롤러로 수집한 키보드 데이터
first-woosun e8d1aeb
docs: 변경된 크롤러로 수집한 키보드 데이터
first-woosun fce81ae
docs: 스위치 정보 테이블에 일치하는 스위치가 없는 키보드 로그
first-woosun a268fa9
docs: 크롤링 데이터에 대한 설명 추가
first-woosun f3007b2
chore: 최신 키보드 데이터 600개 동기화
first-woosun a5b076b
feat: 키보드 스위치 데이터 타입 확장
first-woosun c478df8
test: 데이터셋 스키마 boolean 및 null 처리 검증
first-woosun 0d55871
chore: 추천 함수 키보드 타입 동기화
first-woosun 3ea7e5d
feat: 스위치 그래프 계산 로직 추가
first-woosun d13e8bf
test: 스위치 그래프 계산 규칙 검증
first-woosun 157bae8
feat: 결과 화면 단계 그래프 UI 추가
first-woosun d7d2a5c
fix(keybuddy): 결과 화면 리마운트/타이머 누수 수정 및 별점 hover 정밀화
CommitTheKermit 65d2e71
feat: 검색 결과 카드 UI 및 제품 정보 연결
first-woosun 216d212
fix: 추천 결과 부족분 후보로 보강
chohs4164 5cf1351
feat: 범용 스위치 그래프 매핑 추가
first-woosun d8dae11
Merge remote-tracking branch 'origin/ellipsis' into crawler
first-woosun dd076c5
chore: document edge function versioning
chohs4164 1b778a1
fix: address keybuddy review comments
chohs4164 963cec3
fix: address follow-up keybuddy reviews
chohs4164 d4456a5
fix: PR 리뷰 피드백 반영
first-woosun 49663a2
fix: address remaining keybuddy reviews
chohs4164 43af4b2
fix: address latest keybuddy review comments
chohs4164 51f683f
fix: address keybuddy follow-up review comments
chohs4164 d997901
fix: refine keybuddy deploy and rate limit handling
chohs4164 329a7bb
fix: harden keybuddy function deploy workflow
chohs4164 7ebb873
fix(keybuddy): 결과 화면 메모이즈/클립보드 폴백 및 훅 참조 안정화
CommitTheKermit a6954e9
Update impl/keybuddy/frontend/src/App.tsx
CommitTheKermit af64b3b
Update impl/keybuddy/frontend/src/App.tsx
CommitTheKermit db91be4
Update impl/keybuddy/frontend/src/App.tsx
CommitTheKermit aa01419
Merge pull request #8 from CommitTheKermit/feat/keybuddy-buy-rating
CommitTheKermit 4bca566
fix: typecheck keybuddy edge function deploy
chohs4164 d74e7c2
Merge pull request #11 from CommitTheKermit/fix-keybuddy-recommendati…
chohs4164 ae0ea55
fix: 검색 결과 제품 태그 표시 개선
first-woosun 0943d36
fix: 미제공 키보드 무게 null 처리
first-woosun 7bb156a
Merge remote-tracking branch 'origin/ellipsis' into crawler
first-woosun d40a2eb
Merge pull request #12 from CommitTheKermit/crawler
first-woosun fcd6f0d
Merge remote-tracking branch 'upstream/committhekermit' into tmp-merg…
CommitTheKermit aa8aef9
docs: 3주차 주간 보고서 작성
CommitTheKermit f612ec1
docs: 3주차 주간 보고서 수정
CommitTheKermit d13be88
fix: 검색 결과 필터 카운트 표시 개선
chohs4164 e6c7663
Merge pull request #13 from CommitTheKermit/fix-keybuddy-recommendati…
chohs4164 a4a1d7a
feat: 추천 결과 초보자 설명 추가
chohs4164 d342470
fix: 초보자 설명 리뷰 반영
chohs4164 0f7f706
Merge pull request #14 from CommitTheKermit/fix-keybuddy-recommendati…
chohs4164 3dab0db
feat(keybuddy): 홈 화면을 세그먼트 토글 레이아웃으로 재디자인
CommitTheKermit 70cc5e9
docs: keybuddy 아키텍처와 개발 명령어로 CLAUDE.md 보강
CommitTheKermit df9bb8a
docs: 에이전트 지침을 AGENTS.md 단일 정본으로 통합
CommitTheKermit 4cdad13
docs(knowledge): 레포 내장 지식 루프 가이드와 이식용 스크립트 추가
CommitTheKermit 66b7b89
fix(keybuddy): 홈 재디자인 리뷰 반영
CommitTheKermit c38139b
fix(keybuddy): 홈 복귀/탭 전환 시 error·rating 상태 초기화
CommitTheKermit 9325a55
refactor(keybuddy): 홈 화면 리뷰 반영 - 상수/헬퍼 추출
CommitTheKermit 3319ca4
Merge pull request #16 from CommitTheKermit/feat/home-screen-redesign
CommitTheKermit 0dc5d4f
docs(agents): CLAUDE.md 심볼릭 링크 주의 안내 추가
CommitTheKermit 9b1f483
docs(agents): 심볼릭 링크 OS별 동작 차이 명시
CommitTheKermit a24540d
Merge pull request #17 from CommitTheKermit/docs/agents-ssot
CommitTheKermit 3ce3843
docs: keybuddy 기술 문서를 레포 루트 docs/로 일원화
CommitTheKermit 9cb84d3
docs(keybuddy): README 후보 압축 개수 40개로 정정 + 루트 docs 안내 추가
CommitTheKermit d56918d
docs: 루트 README에 keybuddy 구현 현황 반영
CommitTheKermit 44a43a0
fix(knowledge): 지식 루프 스크립트 견고성과 문서 정확성 보완
CommitTheKermit 28a04b7
Merge pull request #18 from CommitTheKermit/docs/in-repo-knowledge-loop
CommitTheKermit 25d2b41
Merge pull request #19 from CommitTheKermit/docs/keybuddy-docs-root
CommitTheKermit 8e9b000
docs: 구현 현황 단계별 선택 서술을 실제 동작에 맞게 수정
CommitTheKermit 21219bf
Merge pull request #20 from CommitTheKermit/docs/readme-impl-status
CommitTheKermit File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,98 @@ | ||
| # AGENTS.md | ||
|
|
||
| 이 파일은 이 저장소에서 작업하는 모든 AI 코딩 에이전트(Claude Code, Codex, Cursor 등)와 사람 메인테이너의 단일 진실 공급원(SSOT)이다. 특정 도구에 종속되지 않도록 작성한다. `CLAUDE.md`는 이 파일을 가리키는 심볼릭 링크이므로 둘 중 무엇을 편집해도 같은 내용이 갱신된다. | ||
|
|
||
| > **주의:** `CLAUDE.md`는 `AGENTS.md`를 가리키는 심볼릭 링크다. 별도 사본이 아니므로 한쪽만 따로 편집하지 말 것. 새 에이전트 지원을 추가할 때도 사본을 만들지 말고 링크만 건다(예: `ln -s AGENTS.md GEMINI.md`). | ||
| > | ||
| > **OS별 동작 차이:** | ||
| > - **macOS/Linux**: Git이 심볼릭 링크를 그대로 체크아웃한다. 추가 설정 없이 동작하므로 별도 조치가 필요 없다. (현재 팀 기본 환경) | ||
| > - **Windows**: Git이 심볼릭 링크를 만들려면 ① 개발자 모드 활성화 또는 관리자 권한과 ② `git config core.symlinks true`가 모두 필요하다. 둘 중 하나라도 없으면 링크가 내용 대신 대상 경로(`AGENTS.md`)만 담긴 한 줄짜리 일반 텍스트 파일로 풀려, 그 파일을 여는 에이전트가 지침 전체를 읽지 못한다. 이 경우 위 설정을 켠 뒤 재클론하거나 `git checkout -- CLAUDE.md`로 다시 받는다. | ||
|
|
||
| ## 저장소 개요 | ||
|
|
||
| `android-mini-projects`라는 이름이지만 현재 유일한 활성 프로젝트는 **keybuddy**(키보드 추천 웹 서비스)이며 Android 코드는 없다. 자연어/단계별 질문으로 사용자에게 맞는 키보드를 추천한다. | ||
|
|
||
| - `impl/keybuddy/` - 실제 제품 (프론트 + Supabase Edge Function) | ||
| - `impl/crawl.py` - 다나와 목록 크롤러 (데이터 소스 생성) | ||
| - `impl/output/` - 크롤러 산출물 (`keyboards.json` 등, 생성물) | ||
| - `report/`, `README.md` - 기획/주차별 리포트 (제품 가설·문제정의) | ||
| - `impl/keybuddy/*.yaml`, `*.md` - 의도 하네스 Seed 명세 및 before/after 분석 | ||
|
|
||
| 루트 `README.md`는 제품 기획서, `impl/keybuddy/README.md`는 실행·배포 운영 매뉴얼이다. | ||
|
|
||
| ## 주요 명령어 | ||
|
|
||
| 모든 프론트 명령은 `impl/keybuddy/frontend/`에서 실행한다. 루트에서 실행하면 `Missing script` 오류가 난다. | ||
|
|
||
| ```bash | ||
| cd impl/keybuddy/frontend | ||
| npm install | ||
| npm run dev # Vite 개발 서버 (localhost:5173) | ||
| npm test # vitest run (전체) | ||
| npm test -- src/__tests__/intentSearch.test.ts # 단일 파일 | ||
| npx vitest run -t "완화" # 이름 패턴으로 단일 테스트 | ||
| npm run typecheck # tsc --noEmit (프론트) | ||
| npm run typecheck:function # Edge Function 타입체크 | ||
| npm run build # sync:function-version + typecheck + vite build | ||
| ``` | ||
|
|
||
| Edge Function (Deno, `impl/keybuddy/`에서): | ||
|
|
||
| ```bash | ||
| supabase functions serve recommend --env-file supabase/functions/.env.local # 로컬 실행 | ||
| cd frontend && SUPABASE_PROJECT_REF=<ref> npm run deploy:function # 배포 | ||
| ``` | ||
|
|
||
| 데이터 갱신 (크롤러 재실행 후 양쪽 카탈로그 동기화): | ||
|
|
||
| ```bash | ||
| cd impl && python3 crawl.py | ||
| cd keybuddy/frontend && npm run sync:data # output/keyboards.json -> 프론트 + Edge Function 사본 | ||
| ``` | ||
|
|
||
| ## 아키텍처: 두 개의 추천 경로 | ||
|
|
||
| keybuddy의 핵심은 **추천 엔진이 두 갈래로 존재**한다는 점이다. 혼동하지 말 것. | ||
|
|
||
| 1. **현재 UI에 연결된 경로 (production)**: `App.tsx` → `lib/recommend.ts`(HTTP fetch) → Supabase Edge Function `recommend/index.ts`. Edge Function이 키워드 스코어링(`scoreKeyboard`)으로 후보를 40개 이하로 압축한 뒤 **OpenAI**(`gpt-5.4`)에 넘겨 추천 사유를 생성한다. `OPENAI_API_KEY`는 브라우저에 절대 내려가지 않고 Supabase secret에만 존재한다 (`recommend.ts`는 `apikey` 헤더만 보냄). | ||
|
|
||
| 2. **결정론적 의도 하네스 (lib/, 테스트로만 검증됨 - 아직 UI 미연결)**: `extractRawTags.ts`(유일한 LLM 호출, `claude-sonnet-4-6`로 자연어→의도+명시제약 번역) → `intentProfile.ts`(의도를 차원별 태그로 정적 확장) → `intentSearch.ts`/`searchEngine.ts`(하드필터 + 소프트 스코어링 + 무결과 시 제약 완화). 설계 의도는 `docs/tag-extraction-flow.md` 참고. **"LLM은 번역만, 태그 확장·검색은 전부 결정론"**이 핵심 불변식이며, 같은 입력→같은 출력을 보장한다. | ||
|
|
||
| `docs/tag-extraction-flow.md`는 경로 2를 "현재 흐름"으로 서술하지만 실제 `recommend.ts`는 경로 1(Edge Function)을 호출한다. 경로 2는 구축·테스트 완료됐으나 아직 `recommend.ts`에 배선되지 않았다 - 이 갭이 TODO의 "키보드 에이전트 직접 설계" 작업 대상이다. | ||
|
|
||
| ### lib/ 파이프라인 핵심 모듈 (경로 2) | ||
|
|
||
| - `extractRawTags.ts` - 자연어 → `ExtractedTags { hardConstraints, softIntentTags }` (LLM 1회) | ||
| - `tagSchema.ts` - 소프트 의도 태그 어휘(controlled vocabulary)와 검증 | ||
| - `softTagRules.ts` - 소프트 태그 → 키보드 매칭 술어(규칙 맵) | ||
| - `intentProfile.ts` - 고수준 의도(사무용/게이밍/휴대용)를 차원별 요구로 확장. 강도는 `필수`(하드 승격)/`선호`(소프트 점수)/`상관없음`. 명시 제약이 의도보다 우선. | ||
| - `hardFilter.ts` - 하드 제약 위반 키보드 제외 (위반 0건 보장) | ||
| - `softScorer.ts` - 소프트 태그 매칭 점수 → 랭킹 | ||
| - `searchEngine.ts`/`intentSearch.ts` - 무결과 시 제약을 우선순위 역순으로 1개씩 완화 후 재검색(`HARD_CONSTRAINT_RELAXATION_ORDER`). `searchKeyboards`는 LEGACY, `searchWithProfile`이 신규 진입점. | ||
|
|
||
| ## 데이터 파이프라인 | ||
|
|
||
| `crawl.py`는 다나와 **목록 페이지만** 조회한다(상세 페이지 요청 안 함, `DELAY_SEC` 레이트리밋 준수). 한 상품에 스위치 옵션이 여럿이면 제품-스위치 조합별 레코드로 펼치고 최종 **600개**로 제한(`TARGET_RECORDS`). 스위치 이름은 `src/data/switch_aliases.json` 규칙으로만 매칭하고, 매칭 실패는 추론하지 않고 `output/unmatched_switches.json`에 격리한다. | ||
|
|
||
| 카탈로그 `keyboards.json`은 **두 군데에 사본**으로 존재한다(프론트 표시용 + Edge Function 후보용). 반드시 `npm run sync:data`로 함께 갱신해야 둘이 엇갈리지 않는다. | ||
|
|
||
| ## 버전 관리 | ||
|
|
||
| 앱 버전의 단일 소스는 `frontend/package.json`의 `version`이다. `npm run build`/`deploy:function`이 `sync:function-version`으로 이 값을 Edge Function의 `version.ts`에 주입하며, Edge Function은 `GET /recommend`, 응답 `meta.version`, `X-Keybuddy-Version` 헤더로 노출한다. 배포 전 `npm version patch|minor|major --no-git-tag-version`으로 SemVer 증가. | ||
|
|
||
| ## 테스트 규약 | ||
|
|
||
| `src/__tests__/`에 36개 vitest 스위트가 있다. 특징적인 패턴: | ||
|
|
||
| - **`*LlmNoCall.test.ts`** - 결정론 경로가 실제로 LLM을 호출하지 않음을 강제하는 불변식 테스트. lib/ 검색 로직 수정 시 이 보증을 깨지 말 것. | ||
| - **`*.goldset.test.ts`** - 정답셋 기반 정확도 회귀 테스트(하드제약/소프트의도 정확도). | ||
| - **`*Parity.test.ts`** - 두 경로/구현 간 동작 일치 검증. | ||
|
|
||
| ## Git 작업 규칙 | ||
|
|
||
| - `ellipsis` 브랜치에 직접 커밋하지 말 것. `ellipsis`는 `origin/ellipsis`와 동일하게 유지한다. | ||
| - 작업은 항상 새 브랜치에서 진행한다 (`feat/...`, `fix/...`). | ||
|
|
||
| ## 리뷰 기준 (`REVIEW.md`) | ||
|
|
||
| `Important`는 동작을 막는 결함(로직 오류·보안·데이터 유출·크래시)에만 사용하고 스타일 제안은 최대 `Nit`. 생성 산출물(`impl/output/**`, `src/data/keyboards.json`)과 `node_modules`는 리뷰 대상에서 제외한다. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| AGENTS.md |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,119 @@ | ||
| # Supabase Edge Function 버전 관리 메모 | ||
|
|
||
| ## 프로젝트 메모리 작성 위치 | ||
|
|
||
| 현재 이 프로젝트의 배포/버전 관리 메모는 아래 파일에 작성했습니다. | ||
|
|
||
| - `impl/keybuddy/README.md` | ||
| - `## 배포` 섹션에 앱 버전 단일 소스, 버전 증가 방식, Supabase Edge Function 배포 및 버전 확인 방법을 반영했습니다. | ||
| - `docs/deployment-version-management.md` | ||
| - 이 파일입니다. 어떤 내용을 어디에 기록했는지와 코드 변경 이유를 별도로 정리합니다. | ||
|
|
||
| 대화에서 언급된 Firebase 프로젝트 `socratic-learn-web` 관련 배포 절차는 이 저장소의 실제 배포 대상이 아니므로 그대로 적용하지 않았습니다. 대신 해당 프로젝트의 원칙 중 “배포할 때마다 SemVer 기준으로 단일 버전을 올린다”는 부분만 Supabase Edge Function 구조에 맞게 적용했습니다. | ||
|
|
||
| ## 코드 변경이 필요했던 이유 | ||
|
|
||
| 기존 상태에서는 `frontend/package.json`에만 앱 버전(`0.1.0`)이 있었고, Supabase Edge Function 배포물에는 어떤 앱 버전이 올라가 있는지 확인할 방법이 없었습니다. | ||
|
|
||
| Supabase Edge Function은 Firebase Functions처럼 별도 릴리즈 커밋이나 배포 메타가 자동으로 앱 응답에 드러나지 않습니다. 그래서 배포 후 운영 환경에서 아래 질문에 답하기 어려웠습니다. | ||
|
|
||
| - 현재 배포된 `recommend` Edge Function이 어떤 앱 버전인지 | ||
| - 프론트와 Edge Function이 같은 버전 기준으로 배포되었는지 | ||
| - 장애나 회귀가 발생했을 때 어떤 버전의 함수 응답인지 | ||
|
|
||
| 이를 해결하기 위해 Edge Function이 앱 버전을 응답에 노출하도록 변경했습니다. | ||
|
|
||
| ## 적용한 방식 | ||
|
|
||
| 앱 버전의 단일 소스는 계속 `impl/keybuddy/frontend/package.json`입니다. | ||
|
|
||
| 프론트 빌드 시 아래 스크립트가 실행됩니다. | ||
|
|
||
| ```bash | ||
| npm run sync:function-version | ||
| ``` | ||
|
|
||
| 이 스크립트는 `frontend/package.json`의 `version` 값을 읽어서 아래 파일을 생성/갱신합니다. | ||
|
|
||
| ```text | ||
| impl/keybuddy/supabase/functions/recommend/version.ts | ||
| ``` | ||
|
|
||
| Edge Function은 이 파일의 `appVersion`을 import해서 사용합니다. | ||
|
|
||
| ## 버전 확인 방법 | ||
|
|
||
| 배포된 Edge Function은 OpenAI 호출 없이 `GET` 요청만으로 버전을 확인할 수 있습니다. | ||
|
|
||
| ```bash | ||
| curl https://your-project-ref.supabase.co/functions/v1/recommend | ||
| ``` | ||
|
|
||
| 예상 응답 형식: | ||
|
|
||
| ```json | ||
| { | ||
| "name": "recommend", | ||
| "version": "0.1.0" | ||
| } | ||
| ``` | ||
|
|
||
| 추천 `POST` 응답에도 아래 메타가 포함됩니다. | ||
|
|
||
| ```json | ||
| { | ||
| "summary": "...", | ||
| "recommendations": [], | ||
| "meta": { | ||
| "version": "0.1.0" | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| 응답 헤더에도 같은 버전이 포함됩니다. | ||
|
|
||
| ```text | ||
| X-Keybuddy-Version: 0.1.0 | ||
| ``` | ||
|
|
||
| ## 이 방식의 장점 | ||
|
|
||
| - 버전의 원본은 `frontend/package.json` 한 곳으로 유지됩니다. | ||
| - Edge Function 배포 번들 내부에 `version.ts`가 포함되므로, 배포 시 상위 디렉터리 파일 import 문제를 피할 수 있습니다. | ||
| - 배포 후 `GET /functions/v1/recommend`만으로 현재 함수 버전을 확인할 수 있습니다. | ||
| - 기존 추천 API 계약은 유지하면서 `meta.version`만 선택 필드로 추가하므로 프론트 호환성이 깨지지 않습니다. | ||
|
|
||
| ## 배포 시 주의사항 | ||
|
|
||
| 배포 전 변경 성격에 맞춰 SemVer 기준으로 버전을 올립니다. | ||
|
|
||
| ```bash | ||
| cd impl/keybuddy/frontend | ||
| npm version patch --no-git-tag-version | ||
| ``` | ||
|
|
||
| - 호환되는 버그 수정: `patch` | ||
| - 호환되는 기능 추가: `minor` | ||
| - 호환 깨짐: `major` | ||
|
|
||
| 그 다음 프론트 빌드를 실행하면 Edge Function 버전 파일이 자동 갱신됩니다. | ||
|
|
||
| ```bash | ||
| npm run build | ||
| ``` | ||
|
|
||
| Edge Function을 배포할 때는 버전 동기화와 타입 검사를 강제하는 래퍼를 사용합니다. | ||
|
|
||
| ```bash | ||
| SUPABASE_PROJECT_REF=your-project-ref npm run deploy:function | ||
| ``` | ||
|
|
||
| 이 래퍼는 `tsc --noEmit` 타입 검사를 실행하고, 배포 스크립트 안에서 | ||
| `sync:function-version`을 실행한 뒤 `supabase functions deploy recommend`를 호출합니다. | ||
| 따라서 `package.json`의 버전과 `supabase/functions/recommend/version.ts`의 버전이 | ||
| 어긋난 상태로 배포될 가능성을 줄이면서 불필요한 프론트 정적 빌드는 피합니다. | ||
|
|
||
| 프로덕션 오배포를 피하기 위해 `SUPABASE_PROJECT_REF`는 필수입니다. 실제 project ref는 | ||
| 공개 문서에 적지 말고 로컬 환경 변수나 비공개 설정에서 주입합니다. | ||
|
|
||
| Supabase Edge Function 배포는 사용자가 명시적으로 요청할 때만 수행합니다. |
3 changes: 3 additions & 0 deletions
3
impl/keybuddy/intent-harness-before-after.md → docs/intent-harness-before-after.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| # 훅 활성화 시 생성되는 런타임 파일 (커밋 대상 아님) | ||
| .extract-state | ||
| .nudge-stamp | ||
| extract.log |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ai agent를 언제든지 다른 것으로 교체했을 때 문제가 없게끔 호환이 되도록 구성해보세요.
팀원들이 claude를 쓰던 codex를 쓰던, 또 다른ai 를 사용하던 문제가 없게끔이요.
또, ai로 기획과 이 프로젝트에 대한 SSOT 로 사용할 docs도 잘 쌓아보세요.
사람에게 컨텍스트를 의존시키지 말도록 만들어보세요.
모든 컨텍스트는 이 레포에 스냅샷 떠져있다고 생각하고 만들어보세요.
그 누가 유지보수하더라도 문제 없게끔이요. 이렇게 프로젝트를 처음 시작하는 경우는 이제 점점 사라지게될거예요. 그러한 ai-native로의 경험, 하니스를 처음 구축해보는 경험은 어디에서도 할 수 없어요.
지금은 바쁘니까 나중에 해야지라는 생각이 드시죠.
일을 하시게 되면 항상 시간은 부족해요. 뭘 더 추가할 시간도 없는데 일단 해야지.
그러다 보면 일을 많이 하더라도 나에게 남는 게 없게 돼요.
결국 플러스 알파를 챙기려면 내가 시간을 더 내어서 하는 수 밖에는 없어요. ai 활용능력은 지금 IT 세계에서 너무나도 필수가 되어가고 있어요. 꼭 ai를 더 잘 활용하려는 시도를 해보셨으면 좋겠어요.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저희도 클로드(아오), 코덱스(조디악, 투핸더)로 나뉘어져 있어서 이러한 문제가 더 큰 것 같습니다.
GPT 5.5 모델이 나오고 클로드 코드보다 더 나은 성능을 보이기도 했고 최근 클로드 서버가 불안정하여 클로드 코드가 먹통이 되기도 하는 등 하나의 모델이나 에이전트에 종속되지 말아야 한다는 생각이 많이 들었습니다.
다른 프로젝트에서도 이 부분에 대해서 고민해보고 결론낸 적이 있었습니다. claude를 쓰던 codex를 쓰던 에이전트 중립적으로 개발되어야 한다고 생각합니다. 사람이 컨텍스트를 들지 않기 위해서는 에이전트에 컨텍스트를 잘 제공되어야 한다고 생각합니다. 클로드 기준으로 기술 docs나 README.md, CLAUDE.md, 스킬, agent.md 등을 통해서 공통의 컨벤션을 에이전트가 잘 따르도록 작성해야 합니다.
그러나, 모든 기술 docs나 스킬, 에이전트를 공유할 필요는 없다고 생각합니다. 결국 공통으로 사용하고자 해도 다른 개발자가 요구하는 방식과 공통으로 제공한 문서의 방식은 다르기에, 각 개발자가 특화하여 스스로 만들어야 한다고 생각합니다.
그렇기에 공통으로 사용할 만한 문서들은 README.md, AGENTS.md, feature를 개발하기 위해 적용한 방식 문서, PR Description, 컨벤션 문서, 유틸성 스킬정도 라고 생각합니다.
클로드는 CLAUDE.md를 사용하지만, 코덱스는 AGENTS.md를 사용하기에 모델별로 다른 문맥을 이해할 가능성이 있다고 생각합니다. 그렇기에, ln -s AGENTS.md CLAUDE.md를 통해 AGENTS.md에 문맥들을 작성하되 클로드에서도 똑같이 사용할 수 있도록 심볼릭 링크를 걸어 SSOT를 달성하려고 합니다.
아직, 공유할 기술 docs와 공유하지 않아도 괜찮은 docs를 잘 구분하진 못했지만, 기술 docs를 남기는 스킬을 만들었고 생성해낸 docs를 읽어보고 공유를 선택해보겠습니다.
knowledge-loop
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agent.md 로 공용화하는 게 낫다는 생각이 들어요.
또는 claude.md나 agent.md에서 그냥 단순하게 내용을 반드시 ""파일을 본다. 모든 에이전트가 같은 지침을 보기 위함이다. 이런 한두줄만 적어두고 관리하는 방법도 있겠어요.
누구든 이 레포에 기여할 때, 레포를 처음 만든 사람이 원하는 큰 그림대로 코드를 작성하고 철학이 담겨있게끔 만들도록 하니스를 구축해두는 것도 중요한 일이라 생각해요. 아주 상세한 부분들은 다를 순 있어도 가장 큰 가지의 방향정도는 자동으로 맞출 수 있게끔이요.