From 4d21c3bb08ed8aa5af3621a3e590994d3c6bf929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=98=A4=EB=AC=B8=EC=84=B1?= Date: Fri, 30 Oct 2026 13:39:08 +0900 Subject: [PATCH] =?UTF-8?q?KIT:=20=EC=9D=B4=EC=8A=88=EB=B3=84=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=ED=8C=8C=EC=9D=BC=20checks/=20=E2=80=94=20?= =?UTF-8?q?=EC=97=AC=EB=9F=AC=20=ED=95=98=EC=9D=B4=EC=BF=A0=20=EB=8F=99?= =?UTF-8?q?=EC=8B=9C=20=EC=9E=91=EC=97=85=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 이슈마다 검사를 checks/ 의 파일 하나로 두어, 여러 이슈를 다른 폴더(git worktree)에서 동시에 해도 check.sh 가 충돌하지 않게 함. 코치가 저장소 밖 사본에서 통과·실패· 오류 파일·부분 검사·두 브랜치 합치기를 시험함. check.sh 마지막 줄: 결과: PASS 153 / FAIL 0 / SKIP 3 (검사 범위 F01~F47) Co-Authored-By: Claude Haiku 5.5 --- CLAUDE.md | 5 ++++- SPEC.md | 1 + check.sh | 23 ++++++++++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 0037d41..d8025a0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,12 +12,15 @@ 3. 이슈 댓글(완료 기준 확인 표·검사 결과·커밋 해시·경위 한 줄)과 push·이슈 닫기는 **지시가 있을 때만** 한다. ## 금지 -- `check.sh`·`SPEC.md`·`CLAUDE.md` 수정. 틀렸다고 생각되면 고치지 말고 보고한다. +- `check.sh`·`checks/`·`SPEC.md`·`CLAUDE.md` 수정. 틀렸다고 생각되면 고치지 말고 보고한다. - 검사를 통과시키려고 파일을 숨기거나 검사를 우회하기. - 화면 코드의 라이브러리·CDN·import·외부 URL. 도구는 표준 라이브러리만. - 정리본 3개(`private/drawing.dxf`·`drawing.svg`·`drawing_gen.svg`) 밖의 도면, 원본 DWG, 지명·과업명·실제 좌표, 비밀값 커밋. `git add -A` 전에 `git status`. - `model.js` 는 `const MODEL = ` 뒤 순수 JSON 과 `;`. - `Co-Authored-By` 줄 지우기, `--no-verify`·`--amend`·`rebase`·날짜 지정, 실패한 커밋 지우기. +## 여러 하이쿠가 동시에 할 때 +다른 하이쿠가 다른 폴더(git worktree)에서 다른 이슈를 할 수 있다. 내 폴더·내 브랜치만 건드린다. main 에 합치기(merge)·push 는 지시가 있을 때만. + ## 막히면 같은 문제를 두 번 고쳐도 안 되면 멈추고 무엇이 안 되는지 보고한다. 모르는 치수는 지어내지 않는다. diff --git a/SPEC.md b/SPEC.md index 4d0d7cd..5ad6a62 100644 --- a/SPEC.md +++ b/SPEC.md @@ -30,6 +30,7 @@ mm, z 위 +, 지표 z 0. 각도는 X축에서 반시계, 도. 모델 XY 는 슬 ## 5. 검사 원칙 - `check.sh` 가 합격 판정이다. 검사를 먼저 커밋하고 그 뒤 구현한다. +- 이슈 #N 의 검사는 `checks/i_<짧은이름>.py` 한 파일에 `check(ok, 메시지)` 로 쓴다. check.sh 가 번호 순으로 모아 돌린다(F01~F47 은 1차 검사로 check.sh 안). 이슈끼리 파일이 겹치지 않아 여러 이슈를 동시에 할 수 있다. - 기준값은 도면에서 가져온다. 코드에서 역산하지 않는다. - 변조 시험: 도면을 바꾸면 결과도 그만큼 바뀌어야 한다(하드코딩 방지). diff --git a/check.sh b/check.sh index 467ab48..380bf8c 100644 --- a/check.sh +++ b/check.sh @@ -1,7 +1,8 @@ #!/usr/bin/env bash # check.sh — drawing3d-web 합격 판정 (설계 단계에서 작성, 하이쿠는 수정 금지) # 사용: bash check.sh → 전체 기능 검사 -# bash check.sh F06 → F01~F06 만 검사, 뒤 기능은 SKIP +# bash check.sh F06 → F01~F06 만 검사, 뒤 기능·이슈 검사는 SKIP +# 이슈 검사: checks/i<번호>_<이름>.py 를 번호 순으로 모아 돌린다 (F01~F47 은 1차 검사) # 판정: FAIL 이 0 이면 종료 코드 0 cd "$(dirname "$0")" || exit 2 python3 - "$@" <<'PY' @@ -1093,6 +1094,26 @@ report("F47", bool(trk47) and not gone47, "FEATURES.json·PROGRESS.md 없음 — cl47 = read("CLAUDE.md") or "" report("F47", "Gitea 이슈" in cl47 and "그 이슈만" in cl47 and "(#이슈번호)" in cl47, "CLAUDE.md 에 이슈 규칙(작업 목록은 이슈·그 이슈만 읽기·커밋에 #번호)") +# ---- 이슈별 검사: checks/i<번호>_<이름>.py (이슈 #N 의 완료 기준) ---- +# 이슈마다 파일 하나라 여러 이슈를 동시에 해도 check.sh 는 바뀌지 않는다. +# 검사 파일은 위의 값(MODEL·html·viewer·read·near 등)을 쓰고 check(ok, 메시지) 로 판정한다. +def issue_no(p): + m = re.match(r"i(\d+)_", os.path.basename(p)) + return int(m.group(1)) if m else 10 ** 6 +ichecks = sorted(glob.glob("checks/i*.py"), key=lambda p: (issue_no(p), p)) +for cp in ichecks: + def check(ok, msg, cid=(f"#{issue_no(cp)}" if issue_no(cp) < 10 ** 6 else os.path.basename(cp))): + tag = "SKIP" if LIMIT < len(ORDER) - 1 else ("PASS" if ok else "FAIL") + count[tag] += 1 + print(f"[{tag}] {cid} {msg}") + g = dict(globals()) + g["check"] = check + try: + exec(compile(read(cp) or "", cp, "exec"), g) + except (Exception, SystemExit) as e: + check(False, f"{cp} 실행 오류: {type(e).__name__}: {e}") +print(f"이슈 검사 파일 {len(ichecks)}개" + (f": {', '.join(os.path.basename(p) for p in ichecks)}" if ichecks else "")) + print(f"결과: PASS {count['PASS']} / FAIL {count['FAIL']} / SKIP {count['SKIP']} (검사 범위 F01~{upto})") sys.exit(0 if count["FAIL"] == 0 else 1) PY