KIT: 이슈별 검사 파일 checks/ — 여러 하이쿠 동시 작업 준비
이슈마다 검사를 checks/ 의 파일 하나로 두어, 여러 이슈를 다른 폴더(git worktree)에서 동시에 해도 check.sh 가 충돌하지 않게 함. 코치가 저장소 밖 사본에서 통과·실패· 오류 파일·부분 검사·두 브랜치 합치기를 시험함. check.sh 마지막 줄: 결과: PASS 153 / FAIL 0 / SKIP 3 (검사 범위 F01~F47) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3308c2759b
commit
4d21c3bb08
3 files changed
+27
-2
No files matched your search
@@ -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 는 지시가 있을 때만.
|
||||
|
||||
## 막히면
|
||||
같은 문제를 두 번 고쳐도 안 되면 멈추고 무엇이 안 되는지 보고한다. 모르는 치수는 지어내지 않는다.
|
||||
@@ -30,6 +30,7 @@ mm, z 위 +, 지표 z 0. 각도는 X축에서 반시계, 도. 모델 XY 는 슬
|
||||
|
||||
## 5. 검사 원칙
|
||||
- `check.sh` 가 합격 판정이다. 검사를 먼저 커밋하고 그 뒤 구현한다.
|
||||
- 이슈 #N 의 검사는 `checks/i<N>_<짧은이름>.py` 한 파일에 `check(ok, 메시지)` 로 쓴다. check.sh 가 번호 순으로 모아 돌린다(F01~F47 은 1차 검사로 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
|
||||
Reference in new issue
Block a user