Skip to content

feat: T1을 MCP 서버 hooks로 옮길 준비 — 화면 패키지·show_standard_check·T1 hooks (BDT-108 PR A) - #68

Merged
k0nghaa merged 6 commits into
mainfrom
feat/bdt-108-t1-hooks-prepare
Oct 23, 2026
Merged

k0nghaa merged 6 commits into
mainfrom
feat/bdt-108-t1-hooks-prepare

Conversation

@k0nghaa

@k0nghaa k0nghaa commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

관련 이슈

BDT-108 [개발] T1을 T2~T5처럼 다른 저장소에서도 뜨게 옮기기 (CLAUDE.md에서 T1 빼기) — PR A. 준비
https://linear.app/pj-3/issue/BDT-108

무엇을 바꿨나요

커밋 순서대로예요.

  1. test(notify) 알리기 도구 테스트(notify-tools.test.ts)의 지금 시각을 10/16으로 고정했어요. 예시 데이터가 10/13에 답한 변경이라 10/20이 지나면서 includeClosed 7일 기간(notify.list.closed-7-days)에서 빠져 main에서도 테스트 2개가 실패하고 있었어요. 테스트 파일만 고쳤고 코드 동작은 그대로예요. (민수님 파일이라 알려 드려요)
  2. docs(wiki) wiki.mcp.five-tools를 T1 절차로 v2로 저장하고 CHANGELOG 한 줄을 붙였어요. CLAUDE.md "새 위키 도구를 더하지 않는다" 줄을 맞췄어요.
    • v2: 제목 "위키 MCP 도구는 여섯 개다", 값 "… show_standard_check 여섯 개이고, show_standard_check는 결정 사항 확인 화면만 띄우며 저장하지 않는다".
    • ID를 six-tools로 바꾸지 않은 이유
      • data.standard.id-format(항상 적용): ID는 한 번 정하면 바꾸지 않아요.
      • 이름 바꾸기 기능이 없어요. 새 ID로 저장하면 새 결정 사항(v1)이 하나 더 생겨요.
      • 결정 사항은 지울 수 없어서(wiki.standard.no-delete) five-tools는 사람이 sil deprecate로 폐기해야 해요.
      • 버전 기록·CHANGELOG·확인할 변경·이슈 연결이 ID로 이어져 있어서, 새 ID로 가면 기록이 둘로 나뉘어요.
      • 제목과 값이 이미 "여섯 개"라 읽는 사람과 Claude는 헷갈리지 않아요.
  3. refactor(t1) 새 패키지 packages/t1(@sil/t1): apps/detect/src/t1/의 screens.ts, copy.ts, text.ts, issues.ts, save-input.ts를 옮기고(git mv), apps/detect는 @sil/t1에서 가져다 써요. 화면·문구·저장 값 테스트는 패키지로, Bash 명령·hooks 테스트는 detect에 남겼어요. CLAUDE.md T1의 copy.ts·save-input.ts 경로도 새 위치로 맞췄어요(T1 1~9번 내용은 그대로).
  4. feat(mcp) show_standard_check 도구 (apps/mcp-server/src/tools/detect/, 묶음 detect). 입력을 zod로 검사(screen: conflicts/preview/notice, 고른 칸 하나만)하고 { ok: true }만 돌려줘요. readOnlyHint: true, openWorldHint: false. 도구 설명은 PR B에서 채우고, 지금은 "준비 중이라 부르지 않아요"로 둬서 Claude가 부르지 않게 했어요.
  5. feat(mcp) 서버 hooks hooks/t1-hooks.ts (after-t1, before-save, after-save)와 http.ts·install.ts·hook.mjs에 T1 부분 추가
    • after-t1: ②·③·예외 화면을 @sil/t1로 만들고, Claude에게 다음에 물을 질문을 T1_COPY 글자 그대로 넘겨요. ③의 받는 이슈는 서버가 DB에서 읽어요(바꾸는 사람 = X-Sil-User).
    • ③ 값은 hook.mjs가 ~/.claude/haribo/t1-<세션>-<결정 사항 ID>.json에 남기고, 저장 직전·직후에 t1_preview로 붙여 보내요. 저장이 끝나면 지워요. 서버는 기억하지 않아요.
    • before-save: ③과 다르면 deny, 같으면 ask. after-save: ④, VERSION_CONFLICT면 예외 7. 둘 다 ③ 파일이 있을 때만 움직여요.
  6. fix(mcp) 서버가 ③ 화면을 못 만들었으면(systemMessage 없음) hook.mjs가 ③ 값을 남기지 않게 했어요 (리뷰에서 찾음).

민수님 파일·공용 파일에서 바뀐 원래 줄 (나머지는 더하기만):

  • notify-hooks.ts: 고치지 않았어요.
  • http.ts: 지운 줄 없음 (handleHook 맨 앞 T1 분기, 옵션 t1Hooks, createT1Hooks 더함).
  • install.ts: HOOK_TABLE의 event 타입 한 줄, hookCommand의 event 타입 한 줄(표의 값을 그대로 넘겨서 같이 넓혀야 했어요. 이슈에는 한 줄로 적혀 있었어요).
  • haribo-hook.mjs: import 한 줄(rmSync, writeFileSync 더함), 본문 body: input || '{}' → body: withPreview(input) 한 줄.

왜 바꿨나요

T1(결정 사항과 다르면 먼저 묻기)이 이 저장소 CLAUDE.md + Bash에만 있어서 다른 저장소에서는 뜨지 않아요. T2~T5처럼 MCP 서버 hooks로 옮기기 위한 준비예요. 설계는 BDT-108 "정한 것 (10/23)"과 "흐름"을 따랐어요.

이슈와 다르게 한 것 (만들기 전에 확인받음):

  • ③ 파일이 없는 저장을 PR A에서는 막지 않아요. 이슈에는 "파일이 없으면 저장을 막는다"고 되어 있는데, PR A 뒤 팀원이 pnpm mcp:register를 다시 하면 지금 T1(Bash)과 안내문 2·3번 저장이 모두 막혀요. 막기는 안내문을 바꾸는 PR B에서 켜요.
  • ④의 "이슈 N개에 보냈어요" 수는 ③에서 읽은 것을 기억하지 않고 저장 직후 다시 읽어요(서버가 상태를 들고 있지 않게).

PR A 뒤 상태: 지금 T1(CLAUDE.md T1 1~9번, .claude/settings.json Bash hooks, apps/detect/src/t1/ Bash 파일)은 그대로 돌아요. Claude가 새 도구를 아직 부르지 않아 화면이 두 번 뜨지 않아요.

어떻게 확인했나요

  • 커밋마다 pnpm check (타입, 린트, 포맷, 테스트) 통과. 마지막: 테스트 파일 20개, 291 통과 · 1 건너뜀
  • pnpm mcp:check: 도구 10개(show_standard_check 포함), 401, ping, DB 연결 확인
  • http.test.ts: 도구 목록 9→10개, show_standard_check 표시(readOnlyHint, openWorldHint)·{ ok: true }·저장 안 함·잘못된 입력 거절
  • install.test.ts: T1 hooks 네 줄, 이 저장소의 Bash T1 hooks는 지우지 않음, 실제 hook.mjs를 Node로 돌려 ③ 파일 남기기·붙이기·지우기, 경로 문자 막기, 서버 실패 때 동작
  • 새 t1-hooks.test.ts: ②(에이전트·직접 요청·되돌림), ③(받는 이슈 있음·새 결정 사항·실패), 예외, 저장 직전(③ 없음·같음·다름), 저장 직후(③ 없음·④·예외 7·다른 실패)
  • wiki.mcp.five-tools는 이 세션에서 T1 절차(Bash 화면 → 묻기 → ③ → 등록하기)로 저장했어요. CHANGELOG에는 그 한 줄만 들어 있어요.
  • 별도 리뷰 에이전트로 diff를 한 번 봤어요 (막을 결함 없음, 찾은 것 하나는 6번 커밋으로 고침)

직접 확인하지 못한 부분

  • 실제 Claude Code에서 새 hooks를 돌려 보지 않았어요. 서버에 올리고 pnpm mcp:register로 깐 뒤 show_standard_check를 실제로 불러 화면이 뜨는지, PostToolUse:mcp__haribo__show_standard_check says: 머리글 아래 줄바꿈·색이 맞는지는 확인하지 못했어요. 테스트는 가짜 서버·가짜 입력으로만 했어요.
  • Claude Code가 MCP 도구의 PreToolUse hook에 permissionDecision: "ask"를 줄 때, 이 저장소의 permissions.ask와 겹쳐 허락 창이 한 번만 뜨는지 확인하지 못했어요 (PR B에서 도구를 쓰기 시작할 때 봐야 해요).
  • PostToolUseFailure에서 additionalContext가 Claude에게 전달되는지는 지금 Bash hook(hook-saved.ts)과 같은 모양으로 맞췄을 뿐 새 경로로는 확인하지 못했어요.
  • 남는 위험 (리뷰에서 나옴, PR B에서 다룰 것):
    • ③에서 취소하기·Esc를 고르면 ③ 파일이 남아요. 같은 세션에서 같은 결정 사항을 다른 값으로 저장하면 막혀요(지금 Bash hook-guard.ts와 같은 동작). 세션이 끝난 파일도 지우지 않아요.
    • ③ 파일을 저장하려는 ID로 찾아서, ③과 다른 ID로 저장하면 비교하지 못하고 지나가요.
  • define-tool.ts에 _meta(anthropic/alwaysLoad)는 더하지 않았어요. 도구 설명과 함께 PR B에서 정해요.
  • 민수님께 hook.mjs·install.ts·notify-tools.test.ts를 고친 것을 따로 알리지는 않았어요. 리뷰 부탁드려요.

🤖 Generated with Claude Code

k0nghaa and others added 6 commits October 23, 2026 15:16
예시 데이터는 10/13에 답한 변경이라 10/20이 지나면 includeClosed 목록에서 빠져 테스트 2개가 실패했어요 (notify.list.closed-7-days).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…져다 씀 (BDT-108)

MCP 서버도 T1 화면을 만들어야 해서 D49("packages/는 가져다 쓰는 코드")에 맞춰 옮겼어요.
화면 테스트는 패키지로, Bash 명령·hooks 테스트는 apps/detect에 남겼어요. 동작은 그대로예요.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
입력(zod)만 검사하고 { ok: true }를 돌려줘요. 저장하지 않아요(wiki.mcp.five-tools v2).
도구 설명은 PR B에서 채우고, 그 전에는 부르지 않게 "준비 중"으로 둬요.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ook.mjs 추가 (BDT-108)

show_standard_check 직후 ②·③·예외 화면을 서버가 @sil/t1로 만들고, 저장 직전에 ③과 비교해요.
③ 값은 서버가 아니라 팀원 PC(~/.claude/haribo/t1-<세션>-<ID>.json)에 hook.mjs가 남겨요.
③ 파일이 없는 저장은 PR A에서는 그대로 둬서 지금 T1(CLAUDE.md + Bash)과 ④가 두 번 뜨지 않아요.
민수님 파일과 공용 http.ts는 더하기만 했어요(install.ts 타입 두 줄, hook.mjs import·본문 한 줄씩 바뀜).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@k0nghaa
k0nghaa merged commit 7e55398 into main Oct 23, 2026
@github-actions

Copy link
Copy Markdown

바뀐 결정 사항 찾기 · PR #68

지금은 결정 사항을 저장하지 않고 결과만 알려 주는 기간이에요. 저장했다면 아래처럼 했을 거예요.

이 PR의 변경은 결정 사항에 이미 반영돼 있어요 (v2). 다시 저장하지 않았어요.

  • 결정 사항: wiki.mcp.five-tools
  • 지금 값: 위키 MCP 도구는 get_index, search_standards, get_standard, save_standard, revert, show_standard_check 여섯 개이고, show_standard_check는 결정 사항 확인 화면만 띄우며 저장하지 않는다

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.

1 participant