Skip to content

Feature/k-schoollunch-menu : 급식정보 조회기능 추가 #102

Closed
hon2be wants to merge 8 commits intoNomaDamas:devfrom
hon2be:feature/k-schoollunch-menu
Closed

Feature/k-schoollunch-menu : 급식정보 조회기능 추가 #102
hon2be wants to merge 8 commits intoNomaDamas:devfrom
hon2be:feature/k-schoollunch-menu

Conversation

@hon2be
Copy link
Copy Markdown
Contributor

@hon2be hon2be commented Apr 10, 2026

Summary

NEIS 급식·학교 검색을 k-skill-proxy에서 중계하도록 엔드포인트를 추가했습니다. k-schoollunch-menu 스킬과 관련 문서를 넣었고, 스킬 추가 방법은 docs/adding-a-skill.md에 정리했습니다. README·설치·설정·보안 안내도 함께 맞춰 두었습니다.

Why

인증키는 프록시에만 두고, 사용자는 교육청·학교 이름으로 조회할 수 있게 하려는 목적입니다. 기존 공개 프록시 정책과도 맞추었습니다.

Test plan

node --test packages/k-skill-proxy/test/server.test.js와 bash scripts/validate-skills.sh, node --test scripts/skill-docs.test.js를 실행해 주시면 감사하겠습니다. 가능하시면 유효한 KEDU_INFO_KEY로 로컬 프록시에 실제 curl 한 번씩만 더 확인해 주시면 됩니다.

Other

이전에 생활쓰레기 관련해서 main 브랜치에 머지시에 proxy 키 관련해서 사용방식등을 지정할 때, 문구를 수정하신것 확인했습니다. 제가 권한이 없어 라고 feature 브랜치를 생성할 수 없어 dev에 요청드립니다. 적절한지 확인 후에 main까지 반영 부탁드리겠습니다.

hyeongr and others added 7 commits April 7, 2026 19:35
생활쓰레기 조회 스킬 문서와 기능 가이드를 추가하고, 프록시 라우트를 구현해 조회 흐름을 완성했다. 설치/설정 문서도 스킬 사용 흐름에 맞게 정리했다.

Made-with: Cursor
…x SKILL.md newline

- Drop user-supplied returnType and force "json" upstream so the cache key
  (which omits returnType) cannot be poisoned by alternate response shapes.
- Add server tests covering: missing SGG_NM (400), missing API key (503),
  serviceKey injection + cache hit on second call, returnType=xml override
  ignored, upstream non-200 surfaced as 502.
- Add trailing newline to household-waste-info/SKILL.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
vkehfdl1's review on PR NomaDamas#82: skill/docs claimed support for
cond[DAT_CRTR_YMD::*] / cond[DAT_UPDT_PNT::*] filters and an optional
returnType, but the proxy only forwards pageNo, numOfRows, and
cond[SGG_NM::LIKE], and forces returnType=json. Typical user queries
("강남구 쓰레기 배출 요일") only need 시군구 검색, so shrink the
documented contract to match the proxy instead of widening pass-through.

- household-waste-info/SKILL.md: list only proxy-supported params, note
  returnType is server-forced, fix failure modes.
- docs/features/household-waste-info.md: switch base example to the
  proxy route, drop the bare upstream curl, call out unsupported
  filters explicitly.
- docs/install.md, docs/security-and-secrets.md, k-skill-setup/SKILL.md:
  describe the skill as calling the proxy /v1/household-waste/info
  route rather than the raw upstream endpoint.
The 인증/시크릿 column mixed user-side credentials, proxy URL hints,
and "use this fallback" notes — confusing for end users who only need
to know "do I have to log in or not?". Operator-managed secrets that
ship in k-skill-proxy are not the user's problem.

- Rename column to "사용자 로그인" with a one-line preface explaining
  the new contract.
- Reclassify proxy-fronted skills (서울 지하철, 한강 수위, 부동산,
  생활쓰레기, 가장 싼 주유소, 한국 법령 remote endpoint) to 불필요.
- Only SRT, KTX, 토스증권 keep 필요 (real per-user account login).
- Tighten the household-waste-info row to use the proxy-route phrasing
  consistent with the rest of the docs in this PR.
- Update skill-docs tests to assert the new binary classification for
  서울 지하철 and 한국 법령 rows.
The 설명 column was leaking implementation details — k-skill-proxy
routing notes, upstream package names, anti-bot helper mentions —
that don't help a user decide whether the skill does what they want.

Rewrite each row to state only "what this skill does for the user",
dropping references to k-skill-proxy, upstream library names
(real-estate-mcp, kakaocli, daiso-mcp, coupang-mcp, tossctl,
korean-law-mcp, Dynapath helper, Kakao Map anchor, Opinet, etc.) and
proxy route paths. The 사용자 로그인 column already captures the
"do I need credentials?" question, so the description is free to
focus on the capability itself.
- KEDU_INFO_KEY로 /v1/neis/school-search, /v1/neis/school-meal 중계
- 시도교육청 자연어 해석(neis-office-codes.js)
- k-schoollunch-menu 스킬, README·설치/설정/보안·프록시 문서 반영
- docs/adding-a-skill.md 스킬 추가 가이드

Made-with: Cursor
- upstream 생활쓰레기 프록시/스킬·skill-docs 변경 반영
- README 표에 학교 급식 행 복원, security에 KEDU_INFO_KEY·household 라우트 문구 정리
- NEIS 프록시 단위 테스트 블록 복원

Made-with: Cursor
@vkehfdl1
Copy link
Copy Markdown
Contributor

리뷰 결과 Request changes 입니다.

주요 코멘트

  1. [MEDIUM] household-waste 공개 라우트가 pageNo / numOfRows를 검증 없이 그대로 upstream에 전달합니다.

    • 근거: packages/k-skill-proxy/src/server.js:1200-1233 에서 두 값을 문자열로 바로 받아 캐시 키와 upstream query에 사용합니다.
    • 문서 계약: household-waste-info/SKILL.md:61-67numOfRows 최대 100, 허용 파라미터 제한을 명시합니다.
    • 실검증 결과: 아래 로컬 재현에서 200 응답과 함께 비정상 값이 그대로 전달됐습니다.
      • 요청: /v1/household-waste/info?...&pageNo=abc&numOfRows=1000000
      • 캡처된 upstream query: pageNo=abc, numOfRows=1000000
    • 공개 프록시의 allowlist/좁은 표면 정책과도 안 맞아서, 숫자 검증 + 상한 enforcement가 필요합니다.
  2. [MEDIUM] KEDU_INFO_KEY가 사용자용 예시 secrets 파일에 들어가 있어, 이번 PR의 “프록시에만 둔다” 원칙과 충돌합니다.

    • 근거: examples/secrets.env.example:1-8KEDU_INFO_KEY=replace-me 가 추가됐습니다.
    • 하지만 docs/security-and-secrets.md:67KEDU_INFO_KEY프록시 운영자 문맥에서만 서버에 넣고, 일반 사용자/client 기본 secrets 파일에는 넣지 않는다고 명시합니다.
    • 이번 기능 설명(k-schoollunch-menu/SKILL.md, docs/features/k-schoollunch-menu.md)도 모두 같은 원칙을 전제로 하고 있어서, 예시 파일 쪽이 잘못된 방향으로 보입니다.
  3. [LOW] 프록시 운영 문서가 새 household-waste 라우트와 DATA_GO_KR_API_KEY 요구사항을 아직 반영하지 못했습니다.

    • 코드/기능 문서에는 있음: packages/k-skill-proxy/src/server.js:1188-1268, docs/features/household-waste-info.md:8-30
    • 누락된 곳: docs/features/k-skill-proxy.md:17-40, packages/k-skill-proxy/README.md:5-24
    • 운영자가 프록시를 배포할 때 해당 라우트를 미지원으로 오해하거나 env를 빠뜨릴 수 있습니다.

Real Result

실제로 아래까지 확인했습니다.

  • npm ci
  • node --test packages/k-skill-proxy/test/server.test.js ✅ (38/38)
  • bash scripts/validate-skills.sh
  • node --test scripts/skill-docs.test.js ✅ (64/64)
  • 로컬 서버 smoke test ✅
    • GET /health{"ok":true,...,"neisSchoolMealConfigured":false}
    • GET /v1/neis/school-search?...503 upstream_not_configured (현재 로컬에 유효한 KEDU_INFO_KEY 없음)
  • 추가 재현 ✅
    • mocked fetch로 /v1/household-waste/info?...&pageNo=abc&numOfRows=1000000 호출 시 upstream으로 pageNo=abc, numOfRows=1000000 전달됨

위 1번, 2번은 머지 전에 정리하는 게 좋겠습니다.

@vkehfdl1 vkehfdl1 mentioned this pull request Apr 10, 2026
@vkehfdl1
Copy link
Copy Markdown
Contributor

후속 수정 반영했습니다.

  • /v1/household-waste/info가 이제 pageNo를 1 이상 정수로, numOfRows를 1~100 범위로 검증하고 잘못된 값은 upstream 호출 전에 400 bad_request로 막습니다.
  • examples/secrets.env.example에서 KEDU_INFO_KEY를 제거해 사용자 기본 secrets 파일이 proxy-only 원칙과 맞도록 정리했습니다.
  • packages/k-skill-proxy/README.md, docs/features/k-skill-proxy.md, docs/features/household-waste-info.md에 household-waste 라우트와 DATA_GO_KR_API_KEY 요구사항/파라미터 제한을 반영했습니다.
  • 요청하신 검증 흐름이 현재 checkout에서도 통과하도록 scripts/validate-skills.sh.ouroboros 같은 숨김 메타데이터 디렉터리를 스킬로 오인하지 않게 보완했고, 회귀 테스트도 추가했습니다.

검증:

  • npm run lint
  • npm run typecheck
  • node --test packages/k-skill-proxy/test/server.test.js
  • bash scripts/validate-skills.sh
  • node --test scripts/skill-docs.test.js
  • 로컬 proxy smoke: /health 200, invalid household-waste 요청 400, valid household-waste 요청 200

참고로 로컬 환경에는 유효한 KEDU_INFO_KEY가 없어 live NEIS curl smoke는 아직 못 돌렸습니다. 업스트림 반영용 브랜치 feature/#0를 푸시했고, 대응 PR은 #103 입니다.

@vkehfdl1
Copy link
Copy Markdown
Contributor

리뷰 결과 Request changes 입니다.

주요 코멘트

  1. [HIGH] 현재 PR head 기준 packages/k-skill-proxy/src/server.js 가 파싱조차 되지 않아 프록시가 기동되지 않습니다.

    • 근거 1: packages/k-skill-proxy/src/server.js:891-892 에서 neisSchoolMealConfigured 뒤 쉼표가 빠져 krxConfigured 에서 바로 SyntaxError 가 납니다.
    • 근거 2: 위 쉼표만 메모리상에서 임시 보정해 재확인해 보니, packages/k-skill-proxy/src/server.js:1817-1823 부근에서도 KEDU_INFO_KEY 503 응답 객체 안으로 if (!config.krxApiKey) 블록이 끼어들어 두 번째 파싱 에러가 이어집니다.
    • 영향: 요청하신 node --test packages/k-skill-proxy/test/server.test.js 자체가 부팅 전에 실패하고, 로컬 proxy smoke도 현재 head 그대로는 재현할 수 없습니다.
    • 권장: merge artifact를 먼저 정리해서 server.js 가 parse/load 되게 만든 뒤, 테스트를 다시 돌려 주세요.
  2. [MEDIUM] 이전 라운드에서 요청드린 household-waste 파라미터 검증이 현재 PR head에는 아직 반영되지 않았습니다.

    • 근거: packages/k-skill-proxy/src/server.js:1509-15881977-2057 에 동일한 /v1/household-waste/info 라우트가 중복 정의되어 있고, 두 곳 모두 pageNo, numOfRows 를 문자열 기본값으로만 받아 그대로 upstream query에 넣습니다.
    • const pageNo = query.pageNo || "1", const numOfRows = query.numOfRows || "20"url.searchParams.set("pageNo", pageNo), url.searchParams.set("numOfRows", numOfRows) 흐름이라 숫자/상한 검증이 없습니다.
    • 테스트도 packages/k-skill-proxy/test/server.test.js:1862-1885 에서 정상 입력만 확인하고 있어, invalid input 400 회귀가 아직 잠겨 있지 않습니다.
    • 권장: 라우트 중복부터 제거하고, pageNo >= 1, numOfRows <= 100 검증 + 실패 시 400 bad_request 테스트를 추가해 주세요.
  3. [MEDIUM] KEDU_INFO_KEY 가 여전히 사용자용 예시 secrets 파일에 남아 있어 proxy-only 원칙과 충돌합니다.

    • 근거: examples/secrets.env.example:8 에 아직 KEDU_INFO_KEY=replace-me 가 있습니다.
    • 하지만 같은 PR 안의 k-schoollunch-menu/SKILL.md:19,38docs/features/k-schoollunch-menu.md:7,11 은 모두 이 키를 프록시 서버에만 둔다고 설명합니다.
    • 권장: 예시 파일에서는 제거하고, 운영자 문서는 proxy/server 문맥에서만 안내해 주세요.
  4. [LOW] 프록시 운영 문서가 아직 household-waste 라우트와 DATA_GO_KR_API_KEY 요구사항을 반영하지 못했습니다.

    • 확인 결과 docs/features/k-skill-proxy.md, packages/k-skill-proxy/README.md 모두 현재 head 기준으로 household-waste / DATA_GO_KR_API_KEY 언급이 없습니다.
    • 이전 코멘트에서 요청드렸던 운영자 문서 정합성이 아직 맞지 않습니다.

Real Result

실제로 아래까지 확인했습니다.

  • npm ci
  • bash scripts/validate-skills.sh
  • node --test scripts/skill-docs.test.js ✅ (88/88)
  • node --check packages/k-skill-proxy/src/server.js
    • SyntaxError: Unexpected identifier 'krxConfigured'
    • 위치: packages/k-skill-proxy/src/server.js:892
  • node --test packages/k-skill-proxy/test/server.test.js
    • 동일한 parse error 때문에 테스트 스위트가 시작도 못 함
  • 추가 실검증 ✅
    • /v1/household-waste/info 라우트가 현재 파일에 2번 정의되어 있음 (packages/k-skill-proxy/src/server.js:1509, 1977)
    • 두 정의 모두 pageNo / numOfRows 검증 없이 upstream 전달 코드 유지
    • examples/secrets.env.example:8KEDU_INFO_KEY=replace-me 잔존 확인
    • docs/features/k-skill-proxy.md, packages/k-skill-proxy/README.mdhousehold-waste / DATA_GO_KR_API_KEY 미반영 확인
    • 첫 번째 syntax error만 메모리상에서 임시 보정해 재파싱하면 packages/k-skill-proxy/src/server.js:1822 부근에서 두 번째 syntax error가 이어짐

현재 PR #102 head 에는 지난 라운드에서 말씀하신 후속 수정이 아직 올라와 있지 않거나, merge 과정에서 다시 깨진 상태로 보입니다. 우선 parse blocker와 누락된 후속 수정을 정리한 뒤 다시 확인하는 게 좋겠습니다.

vkehfdl1 added a commit that referenced this pull request Apr 10, 2026
The setup guide already described proxy-hosted household-waste and NEIS flows elsewhere, but the opening summary still omitted school lunch from the no-user-key hosted-proxy list. This adds a regression test first, then aligns the intro sentence and test label so the doc stays consistent with the shipped proxy-backed feature set.

Constraint: Keep the follow-up scoped to existing Issue #0/PR #103 documentation surfaces
Rejected: Broader setup guide rewrite | unnecessary for the approved follow-up
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep hosted-proxy/no-user-key summaries aligned with the per-feature setup matrix when adding new proxy-backed skills
Tested: Targeted red/green skill-docs regression; npm run lint; npm run typecheck; node --test packages/k-skill-proxy/test/server.test.js; bash scripts/validate-skills.sh; node --test scripts/skill-docs.test.js; buildServer runtime smoke for /health, household-waste validation, and NEIS missing-key behavior
Not-tested: Live NEIS upstream call with a real KEDU_INFO_KEY
Related: PR #102
Related: PR #103
@vkehfdl1
Copy link
Copy Markdown
Contributor

Follow-up is now on feature/#0 and the existing upstream PR (#103 -> dev) auto-updated with commit b7a39db.

  • kept the earlier proxy/runtime fixes in place (household-waste pagination guard, proxy-only KEDU_INFO_KEY handling, operator docs/env updates, and skill validation coverage)
  • added a red/green regression in scripts/skill-docs.test.js so docs/setup.md must keep school lunch in the hosted-proxy / no-user-key summary
  • updated docs/setup.md to explicitly list 학교 급식 식단 alongside the other hosted-proxy features that do not require user-side secrets
  • re-ran verification: npm run lint, npm run typecheck, node --test packages/k-skill-proxy/test/server.test.js, bash scripts/validate-skills.sh, node --test scripts/skill-docs.test.js
  • re-ran runtime smoke with buildServer(...).inject(...): /health -> 200, invalid household-waste pagination -> 400, valid household-waste request -> 200, NEIS school-meal without KEDU_INFO_KEY -> 503

@vkehfdl1
Copy link
Copy Markdown
Contributor

리뷰 결과 Request changes 입니다.

주요 코멘트

  1. [HIGH] 현재 PR Feature/k-schoollunch-menu : 급식정보 조회기능 추가  #102 head 기준 packages/k-skill-proxy/src/server.js 가 여전히 파싱되지 않아 프록시가 기동되지 않습니다.

    • gh pr view 102 --repo NomaDamas/k-skill --json headRefOid,headRefName 기준 현재 PR head 는 아직 1e89bace... 입니다.
    • packages/k-skill-proxy/src/server.js:891-892 에서 neisSchoolMealConfigured 뒤 쉼표가 없어 krxConfigured 에서 바로 SyntaxError 가 납니다.
    • 위 쉼표만 메모리상에서 임시 보정해 재확인해도, packages/k-skill-proxy/src/server.js:1817-1822 에서 KEDU_INFO_KEY 503 응답 객체 안으로 if (!config.krxApiKey) 블록이 끼어들어 두 번째 파싱 에러가 이어집니다.
    • 영향: node --test packages/k-skill-proxy/test/server.test.js 자체가 부팅 전에 실패하고, 로컬 proxy runtime 검증도 현재 head 그대로는 진행할 수 없습니다.
  2. [MEDIUM] 이전 라운드에서 요청드린 household-waste 파라미터 검증이 현재 PR head 에는 아직 없습니다.

    • packages/k-skill-proxy/src/server.js:1509-1588, 1977-2057 에 동일한 GET /v1/household-waste/info 라우트가 여전히 중복 정의되어 있습니다.
    • 두 곳 모두 const pageNo = query.pageNo || "1", const numOfRows = query.numOfRows || "20" 후 값을 그대로 upstream query 에 넣고 있어, 요청드린 pageNo >= 1, numOfRows <= 100 검증 + 400 bad_request 차단이 아직 반영되지 않았습니다.
    • 테스트도 packages/k-skill-proxy/test/server.test.js:1862-1885 에서 정상 입력만 확인하고 있어 invalid pagination 회귀가 잠겨 있지 않습니다.
  3. [MEDIUM] KEDU_INFO_KEY 가 여전히 사용자용 예시 secrets 파일에 남아 있어 proxy-only 원칙과 충돌합니다.

    • examples/secrets.env.example:8 에 아직 KEDU_INFO_KEY=replace-me 가 있습니다.
    • 하지만 같은 PR 안의 k-schoollunch-menu/SKILL.md:19,38docs/features/k-schoollunch-menu.md:7,11 은 모두 이 키를 프록시 서버에만 둔다고 설명합니다.
  4. [LOW] 프록시 운영 문서가 아직 household-waste 라우트와 DATA_GO_KR_API_KEY 요구사항을 반영하지 못했습니다.

    • docs/features/k-skill-proxy.md:20-46 에는 /v1/household-waste/infoDATA_GO_KR_API_KEY 가 없습니다.
    • packages/k-skill-proxy/README.md:5-31 도 동일하게 누락 상태입니다.

Real Result

실제로 아래까지 확인했습니다.

  • gh pr view 102 --repo NomaDamas/k-skill --json headRefOid,headRefName
    • headRefOid: 1e89bace8bc3dcb164ddc772b0a3a4dfdf682d90
    • headRefName: feature/k-schoollunch-menu
  • node --check packages/k-skill-proxy/src/server.js
    • SyntaxError: Unexpected identifier 'krxConfigured'
    • 위치: packages/k-skill-proxy/src/server.js:892
  • 첫 번째 syntax error 만 메모리상에서 임시 보정해 재파싱 ✅
    • 이어서 packages/k-skill-proxy/src/server.js:1822 에서 두 번째 parse error 확인 (if (!config.krxApiKey) 가 응답 객체 안으로 들어가 있음)
  • node --test packages/k-skill-proxy/test/server.test.js
    • 동일한 parse error 때문에 테스트 스위트가 시작도 못 함
  • bash scripts/validate-skills.sh
  • node --test scripts/skill-docs.test.js ✅ (88/88)
  • rg -n 'app\\.get\\("/v1/household-waste/info"' packages/k-skill-proxy/src/server.js
    • 매치 위치: 1509, 1977
  • rg -n 'household-waste|DATA_GO_KR_API_KEY' docs/features/k-skill-proxy.md packages/k-skill-proxy/README.md
    • 결과 없음 (두 문서 모두 아직 미반영)
  • nl -ba examples/secrets.env.example | sed -n '1,10p'
    • line 8: KEDU_INFO_KEY=replace-me

현재 PR #102 head 에는 지난 라운드에서 말씀하신 후속 수정이 아직 반영되지 않은 상태로 확인됩니다. 우선 parse blocker 와 누락된 후속 수정을 PR #102 head 기준으로 다시 맞춘 뒤 재검증이 필요해 보입니다.

@vkehfdl1
Copy link
Copy Markdown
Contributor

리뷰 결과 Request changes 입니다.

주요 코멘트

  1. [HIGH] 현재 PR Feature/k-schoollunch-menu : 급식정보 조회기능 추가  #102 head (1e89bac, 2026-04-10 확인 기준)에서는 packages/k-skill-proxy/src/server.js 가 parse/load 되지 않아 프록시가 기동되지 않습니다.

    • packages/k-skill-proxy/src/server.js:887-892 에서 /health payload의 neisSchoolMealConfigured 뒤 쉼표가 빠져 krxConfigured 에서 바로 SyntaxError 가 납니다.
    • 첫 번째 에러만 임시 보정해 재확인해도 packages/k-skill-proxy/src/server.js:1817-1827 부근에서 KEDU_INFO_KEY 503 응답 객체 안으로 if (!config.krxApiKey) 블록이 끼어들어 두 번째 parse error가 이어집니다.
    • 영향: node --test packages/k-skill-proxy/test/server.test.jsnpm run lint 모두 서버 파일 로드 전에 실패합니다.
  2. [MEDIUM] /v1/household-waste/info 라우트가 아직 중복 정의되어 있고, 두 정의 모두 pageNo / numOfRows 검증 없이 upstream에 그대로 전달합니다.

    • 중복 위치: packages/k-skill-proxy/src/server.js:1509-1588, 1977-2056
    • 두 정의 모두 const pageNo = query.pageNo || "1", const numOfRows = query.numOfRows || "20" 뒤에 바로 url.searchParams.set(...) 으로 넘기고 있어, 이전 라운드에서 요청드린 정수/상한 검증(pageNo >= 1, numOfRows <= 100)이 아직 없습니다.
    • 테스트도 현재는 정상 입력/캐시 경로만 확인합니다 (packages/k-skill-proxy/test/server.test.js:1862-1885). invalid input 400 회귀가 잠겨 있지 않습니다.
  3. [MEDIUM] KEDU_INFO_KEY 가 사용자용 예시 secrets 파일에 여전히 남아 있어 proxy-only 원칙과 충돌합니다.

    • examples/secrets.env.example:8 에 아직 KEDU_INFO_KEY=replace-me 가 있습니다.
    • 하지만 같은 PR 안의 k-schoollunch-menu/SKILL.md:19,38docs/features/k-schoollunch-menu.md:7,11 은 모두 이 키를 프록시 서버에만 둔다고 설명합니다.
  4. [LOW] 프록시 운영 문서가 아직 household-waste 라우트와 DATA_GO_KR_API_KEY 요구사항을 반영하지 못했습니다.

    • docs/features/k-skill-proxy.md:15-29,39-46 에는 household-waste / DATA_GO_KR_API_KEY 가 없습니다.
    • packages/k-skill-proxy/README.md:7-17,20-27 도 동일하게 누락되어 있습니다.

Real Result

실제로 아래까지 확인했습니다.

  • gh pr view 102 --repo NomaDamas/k-skill ...
  • node --check packages/k-skill-proxy/src/server.js
    • SyntaxError: Unexpected identifier 'krxConfigured'
    • 위치: packages/k-skill-proxy/src/server.js:892
  • node --test packages/k-skill-proxy/test/server.test.js
    • 동일한 parse error 때문에 테스트 스위트가 시작도 못 함
  • npm run lint
    • packages/k-skill-proxy/src/server.js parse error로 workspace lint 실패
  • bash scripts/validate-skills.sh
  • node --test scripts/skill-docs.test.js ✅ (88/88)
  • 추가 실검증 ✅
    • packages/k-skill-proxy/src/server.js/v1/household-waste/info 라우트가 2번 정의되어 있음 (1509, 1977)
    • examples/secrets.env.example:8KEDU_INFO_KEY=replace-me 잔존
    • docs/features/k-skill-proxy.md, packages/k-skill-proxy/README.mdhousehold-waste / DATA_GO_KR_API_KEY 미반영
    • 첫 번째 syntax error만 임시 보정한 뒤 node --check 로 재확인하면 packages/k-skill-proxy/src/server.js:1822 부근에서 두 번째 syntax error가 이어짐

참고로, 말씀하신 후속 수정이 feature/#0 / PR #103 (b7a39db) 쪽에 있다면 그 내용은 현재 PR #102 head에는 올라와 있지 않습니다. 제가 오늘(2026-04-10) 실제로 검증한 PR #102 기준으로는 여전히 Request changes 의견입니다.

@hon2be
Copy link
Copy Markdown
Contributor Author

hon2be commented Apr 10, 2026

마지막 리뷰결과 반영해서 재작업후 올리겠습니다.

vkehfdl1 added a commit that referenced this pull request Apr 10, 2026
The feature/#0 follow-up already had the proxy/runtime fixes in place,
but the branch still needed the final regression locks and doc wording
that keep the review fixes durable. This commit adds lower-bound
household-waste pagination tests and aligns install/security docs with
the proxy-only KEDU_INFO_KEY policy so the school lunch feature stays
on the hosted-proxy / no-user-key path.

Constraint: Follow-up had to stay on feature/#0 so PR #103 updates in place
Constraint: User-facing secrets guidance must not imply KEDU_INFO_KEY belongs in the default client env file
Rejected: Broaden the pass into more proxy/doc rewrites | unnecessary beyond the approved Issue #0 follow-up
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep school lunch docs and regression text aligned with the hosted proxy policy whenever setup/security wording changes
Tested: npm run lint; npm run typecheck; node --test packages/k-skill-proxy/test/server.test.js; bash scripts/validate-skills.sh; node --test scripts/skill-docs.test.js; local proxy smoke for /health, invalid household-waste 400, valid household-waste 200, NEIS without KEDU_INFO_KEY 503
Not-tested: Live NEIS curl against a valid KEDU_INFO_KEY-enabled proxy
Related: PR #102
Related: PR #103
@vkehfdl1
Copy link
Copy Markdown
Contributor

feature/#0 follow-up is pushed and PR #103 updated with commit 9e3f2af.

  • added regression coverage for /v1/household-waste/info lower bounds so pageNo=0 and numOfRows=0 fail with 400 bad_request before any upstream fetch
  • added a doc regression in scripts/skill-docs.test.js that locks the hosted-proxy / no-user-key school lunch policy across install + security docs
  • updated docs/install.md and docs/security-and-secrets.md so k-schoollunch-menu is documented the same way as the shipped proxy behavior: KEDU_INFO_KEY remains proxy-only and users stay on the hosted path by default
  • re-ran verification: npm run lint, npm run typecheck, node --test packages/k-skill-proxy/test/server.test.js, bash scripts/validate-skills.sh, node --test scripts/skill-docs.test.js
  • re-ran local proxy smoke: /health -> 200, invalid household-waste pagination -> 400, valid household-waste request -> 200, NEIS school-meal without local KEDU_INFO_KEY -> 503

Live NEIS curl against a valid KEDU_INFO_KEY-enabled proxy is still the only remaining unchecked item in this environment.

@vkehfdl1
Copy link
Copy Markdown
Contributor

리뷰 결과 REJECT 입니다.

짧은 사유: PR #102 현재 head (1e89bac, feature/k-schoollunch-menu) 기준으로 packages/k-skill-proxy/src/server.js 가 parse/load 되지 않아 프록시 기동, 테스트, lint가 모두 막혀 있습니다.

Real Result

  • gh pr view 102 --repo NomaDamas/k-skill --json headRefOid,headRefName
    • headRefOid: 1e89bace8bc3dcb164ddc772b0a3a4dfdf682d90
    • headRefName: feature/k-schoollunch-menu
  • node --check packages/k-skill-proxy/src/server.js
    • packages/k-skill-proxy/src/server.js:892
    • SyntaxError: Unexpected identifier 'krxConfigured'
  • 근거 코드 확인 ✅
    • packages/k-skill-proxy/src/server.js:891-892 에서 neisSchoolMealConfigured 뒤 쉼표가 빠져 있습니다.
  • 첫 번째 syntax error만 임시 보정한 temp copy로 node --check /tmp/server-check-102.js 재확인 ❌
    • /tmp/server-check-102.js:1822 에서 두 번째 parse error 확인 (if (!config.krxApiKey)KEDU_INFO_KEY 503 응답 객체 안으로 들어가 있음)
  • node --test packages/k-skill-proxy/test/server.test.js
    • 동일한 parse error 때문에 스위트가 시작도 못 합니다.
  • npm run lint
    • k-skill-proxy workspace의 node --check src/server.js 에서 동일하게 실패합니다.
  • bash scripts/validate-skills.sh
  • node --test scripts/skill-docs.test.js ✅ (88/88)
  • 추가 실검증 ✅
    • rg -n 'app\\.get\\("/v1/household-waste/info"' packages/k-skill-proxy/src/server.js → 라우트가 1509, 1977 두 곳에 중복 정의되어 있습니다.
    • 두 정의 모두 const pageNo = query.pageNo || "1", const numOfRows = query.numOfRows || "20" 후 그대로 upstream query에 넣고 있어 (1512-1529, 1981-1997), 요청드린 lower/upper bound 검증이 현재 PR head에는 없습니다.
    • examples/secrets.env.example:8KEDU_INFO_KEY=replace-me 가 아직 남아 있습니다.
    • rg -n 'household-waste|DATA_GO_KR_API_KEY' docs/features/k-skill-proxy.md packages/k-skill-proxy/README.md 결과 없음 → 운영 문서에도 아직 반영되지 않았습니다.

현재 제가 오늘(2026-04-10) 실제로 검증한 PR #102 head 자체 는 merge-ready 상태가 아닙니다. follow-up 이 feature/#0 / PR #103 쪽에 있다면, 그 변경이 PR #102 head 에 실제로 반영된 뒤 다시 확인하는 게 맞겠습니다.

@hon2be
Copy link
Copy Markdown
Contributor Author

hon2be commented Apr 10, 2026

아래 세 내역 및 dev 브랜치에서 구동 되게까지 수정 후 다시 PR 드리겠습니다.
node --check packages/k-skill-proxy/src/server.js
node --test packages/k-skill-proxy/test/server.test.js
npm run lint

한가지 궁금한점이 새로 API키를 추가할 때 이 내역을 보고 추가해 주시는것인지 확인 부탁드립니다. (키를 제가 발급해야 하나 해서요)
packages/k-skill-proxy/README.md
docs/features/k-skill-proxy.md

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.

2 participants