Compare commits

...

2 Commits

View File

@@ -38,10 +38,14 @@ npm.cmd run compile; node -e "const {generateApprovalObserverScript}=require('./
4. [ ] **변경 범위 최소화**: 불필요한 코드 포함 여부 확인 4. [ ] **변경 범위 최소화**: 불필요한 코드 포함 여부 확인
5. [ ] **재시작 사유 명시**: 사용자에게 (a) 무엇을 수정했고 (b) 왜 재시작이 필요한지 1~2줄로 설명 5. [ ] **재시작 사유 명시**: 사용자에게 (a) 무엇을 수정했고 (b) 왜 재시작이 필요한지 1~2줄로 설명
6. [ ] **재시작 횟수 명시**: Observer 변경 = 2회, Extension host만 변경 = 1회 6. [ ] **재시작 횟수 명시**: Observer 변경 = 2회, Extension host만 변경 = 1회
7. [ ] **log() relay 필터 확인**: 새 로그 키워드 추가 시 log() 함수의 키워드 필터에도 추가했는지 확인 (섹션 3.5 참조)
8. [ ] **regex E2E 테스트**: Observer에서 사용하는 새 regex는 생성된 코드에서 직접 실행하여 매칭 검증
9. [ ] **구현 전 가정 검증**: 새 접근을 코딩하기 전에, 핵심 가정이 성립하는지 로그 1줄로 먼저 확인 (예: "Step Probe가 WAITING을 볼 수 있는가?" → `STEP-PROBE.*WAITING` 로그 검색)
**정당한 사유 없이 재시작을 요구하지 않는다.** **정당한 사유 없이 재시작을 요구하지 않는다.**
**DOM 구조를 먼저 파악하고 설계한 후 코드를 작성한다.** **DOM 구조를 먼저 파악하고 설계한 후 코드를 작성한다.**
**시행착오식(trial-and-error) 접근을 하지 않는다.** **시행착오식(trial-and-error) 접근을 하지 않는다.**
**추측으로 코딩하지 않는다. 로그/데이터로 확인한 사실에 기반하여 코딩한다.**
--- ---
@@ -85,21 +89,38 @@ Select-String -Path "$env:LOCALAPPDATA\Programs\Antigravity\resources\app\out\vs
- 사용자 메시지 블록: `.select-text.rounded-lg` (v0.5.74+) - 사용자 메시지 블록: `.select-text.rounded-lg` (v0.5.74+)
- Thinking 블록: 조상에 `max-h-[200px]` 클래스 있음 → 필터링 - Thinking 블록: 조상에 `max-h-[200px]` 클래스 있음 → 필터링
### 3.2 승인 버튼 (Observer가 접근 가능) ### 3.2 승인 버튼 — "Always run" (v0.5.93 BTN-DOM-DUMP 확인)
- "Always run" 버튼: `<button>` 태그, chat panel 내
- 명령어 텍스트: `footer`**형제(sibling)** 요소의 `pre.font-mono` (조상 아님!)
- 조상 탐색 trail: `d0:button → d1:div → d2:footer` (footer.parentElement === null)
- "Retry" 버튼: `<button>` 태그, chat panel 내
### 3.3 Diff Review (Accept all / Reject all) — Observer 접근 **불가** 실제 DOM 구조 (v0.5.92 로그로 확인):
- "Accept all" / "Reject all" 버튼은 **에디터 webview**에 렌더링 - d0: button.flex.cursor-pointer (Always run 버튼)
- Observer의 `document`에서 `querySelectorAll('button')` 등으로 찾을 수 없음 - d1: div.min-w-0
- ACCEPT-SCAN 디버그 로그로 확인: `button, a, div, span, [role="button"]` 전체 스캔해도 미발견 - d2: div.flex.items-center.justify-between.rounded-b.border-t (버튼 바)
- **해결 경로**: Extension host에서 `antigravity.acceptAgentStep` 명령 실행 (CMD-DISCOVERY에서 발견됨) - d3: div (이름 없는 컨테이너)
- div.mb-1 = "Running command" (헤더)
- div.flex = " gravity_control > ..." (실제 명령어, plain div!)
- div.flex = "Always run Cancel" (버튼들)
> 명령어는 pre.font-mono나 code가 아닌 plain div.flex에 있음.
> v30: "Running command" div의 형제를 탐색하여 프롬프트 마커 뒤의 명령어 추출.
- "Retry" 버튼: button 태그, chat panel 내
### 3.3 Diff Review (Accept all / Reject all) — Observer 접근 불가
- 에디터 webview에 렌더링, Observer document에서 접근 불가
- 해결: Extension host에서 antigravity.acceptAgentStep 명령 실행
### 3.4 DOM 렌더링 타이밍 ### 3.4 DOM 렌더링 타이밍
- "Always run" 버튼이 DOM에 나타난 후, `pre.font-mono` (명령어 텍스트)는 **100~300ms 후** 렌더링 - "Always run" 버튼이 DOM에 나타날 때 명령어 div도 함께 렌더링
- 해결: DEFERRED 컨텍스트 — 500ms 딜레이 후 재추출 (v0.5.84+) - v30의 "Running command" div 탐색은 즉시 성공
### 3.5 log() relay 필터 규칙
Observer의 log() 함수는 키워드 필터로 일부 로그만 extension.log에 relay.
새 로그 키워드 추가 시 반드시 필터도 함께 수정해야 함.
현재 필터 키워드 (v0.5.92+):
CV-CLASSES, CV-CHILDREN, child[, CV found, Conversation view,
BEACON, ERROR, chat relay, user-cls,
CONTEXT, BTN-DOM, DEFERRED, DETECTED
--- ---