# 무콘솔 루비 실행 로더 (dzw_task_loader)

**목적: SketchUp 루비 콘솔을 다시는 열지 않는다.**
콘솔을 열 때마다 한글 IME가 켜져 대표님 단축키가 죽는 사고가 3번 발생했다. 이 로더는 그 원인을 원천 차단한다.

---

## 1. 이게 뭔가 (한 줄)

SketchUp이 1초마다 정해진 폴더(inbox)를 들여다보다가, 루비 파일(.rb)이 새로 놓이면
**창 하나도 띄우지 않고** 조용히 실행하고 결과를 텍스트 파일에 적어주는 자동 실행기.

## 2. 설치된 파일

| 무엇 | 경로 |
|---|---|
| 로더 본체 | `C:\Users\user\AppData\Roaming\SketchUp\SketchUp 2021\SketchUp\Plugins\dzw_task_loader.rb` |
| 주 작업함 (inbox) | `E:\도진팩토리\3D스캔및티칭시스템\_자동화\inbox\` |
| 예비 작업함 (ASCII 경로) | `C:\dzw\inbox\` |
| 결과 파일 | 각 inbox 안의 `_result.txt` |
| 처리 완료 보관 | 각 inbox 안의 `done\` |
| 로더 원본 보관(git 추적) | `E:\도진팩토리\3D스캔및티칭시스템\_자동화\dzw_task_loader.rb` |

실제로 도는 것은 Plugins 폴더의 것이고, `_자동화\dzw_task_loader.rb` 는 **git으로 보존하는 원본 사본**이다.
Plugins 쪽이 사라지면 이 사본을 다시 복사해 넣으면 된다.

예비 작업함(`C:\dzw\inbox`)은 한글 경로가 문제를 일으킬 경우를 위한 **비상 통로**다.
두 폴더 모두 동시에 감시되므로 어느 쪽에 넣어도 실행된다.

## 3. 사용법 (앞으로의 작업 절차)

1. 실행할 루비 코드를 `inbox\작업이름.rb.tmp` 로 **먼저** 쓴다.
2. 그 파일을 `inbox\작업이름.rb` 로 **이름만 바꾼다(rename)**.
3. 2~3초 기다린 뒤 `inbox\_result.txt` 를 읽어 결과를 확인한다.

### 왜 .tmp → rename 인가 (중요)
로더는 1초마다 폴더를 본다. `.rb` 를 직접 쓰면 **절반만 쓰인 파일**을 로더가 집어서
엉뚱한 오류를 낼 수 있다. 같은 드라이브 내 rename은 순간적으로 일어나므로 이 문제가 없다.
**이 규칙은 반드시 지킬 것.**

PowerShell 예:
```powershell
$inbox = "E:\도진팩토리\3D스캔및티칭시스템\_자동화\inbox"
# (Write 도구로 $inbox\task.rb.tmp 를 UTF-8로 작성한 뒤)
Move-Item "$inbox\task.rb.tmp" "$inbox\task.rb" -Force
Start-Sleep -Seconds 3
Get-Content "$inbox\_result.txt" -Encoding UTF8 -Tail 40
```

## 4. 결과 파일 읽는 법

`_result.txt` 는 **누적 기록**이다. 매 실행마다 아래 형식이 뒤에 붙는다.

```
=== 2026-09-19 14:03:11 | task.rb ===
-- STDOUT --   (puts 로 출력한 내용)
-- RETURN --   (스크립트 마지막 식의 반환값)
-- RESULT: OK --   또는  -- RESULT: FAIL -- (+ -- ERROR -- 에 예외 내용)
```

`LOADER ALIVE ... START` 줄이 보이면 로더가 살아있다는 뜻이다(하트비트, 약 5분마다 기록).

## 5. 절대 하지 말 것

- **루비 콘솔 열기 금지.** (이 시스템의 존재 이유)
- 로더가 실행하는 스크립트 안에서 `UI.messagebox`, `SKETCHUP_CONSOLE.show`, `UI.inputbox` 등
  **창을 띄우는 명령 금지.** 창이 뜨면 IME가 다시 오염되고, 모달 창이 뜨면 타이머가 멈춘다.
- 스케치업 재시작·종료, 저장(Ctrl+S), Ctrl+Z 금지 (미저장 작업물 보호).

## 6. 로더를 고쳐야 할 때 (콘솔 없이)

로더 자체를 수정해도 콘솔은 필요 없다. Plugins 폴더의 `dzw_task_loader.rb` 를 고친 뒤,
inbox에 아래 내용의 스크립트를 넣으면 실행 중인 로더가 **자기 자신을 갈아끼운다**.

```ruby
load 'C:/Users/user/AppData/Roaming/SketchUp/SketchUp 2021/SketchUp/Plugins/dzw_task_loader.rb'
```

(로더는 재시작 시 기존 타이머를 `UI.stop_timer` 로 정리하므로 타이머가 중복되지 않는다.)

**이 경로는 2026-09-19에 실제로 검증했다.** reload 후 새 `LOADER ALIVE ... START` 줄이 찍히고,
이어서 넣은 스크립트가 **정확히 1번만** 실행됐다(타이머 중복 없음).

## 8. 검증 상태 (2026-09-19)

| 항목 | 상태 |
|---|---|
| 콘솔 없이 루비 실행 | **검증 완료** (t_smoke.rb → `_result.txt` 에 모델정보·반환값 기록, `done\` 이동 확인) |
| 한글 경로 inbox 동작 | **검증 완료** |
| ASCII 예비 inbox 동작 | **검증 완료** |
| 콘솔 없이 로더 자기교체 | **검증 완료** |
| IME 오염 없음 | **검증 완료** (실행 후 모델창 conv=0 / open=0 유지) |
| **스케치업 재시작 후 자동 로드** | **미검증** — 재시작 금지 제약 때문에 확인 불가 |

### 다음 세션 첫 확인 (한 줄)
`inbox\_result.txt` 끝부분에 새로운 `LOADER ALIVE v1.0.0 START` 줄이 있으면 로더가 자동 로드된 것이다.
없으면 자동 로드가 안 된 것이므로, 그때만(그때만!) 콘솔 1회로 §6의 `load` 를 다시 실행한다.

참고: Plugins 폴더의 확장 로드 제한(서명 정책) 설정은 레지스트리·환경설정에서 발견되지 않았고,
같은 폴더에 예전 일반 `.rb` 파일(`dae2skp_parts.rb.disabled_...`)이 있었던 점으로 보아 자동 로드는 될 것으로 본다.
다만 **직접 본 것은 아니다.**

### 로그 관리
`_result.txt` 는 계속 쌓인다(하트비트 약 5분마다 1줄). 커지면 그냥 지우거나 비워도 된다 —
로더는 없으면 새로 만든다.

## 7. 결과가 안 나올 때 점검 순서

1. `_result.txt` 에 `LOADER ALIVE` 줄이 있는가 → 없으면 로더가 활성화 안 된 것.
   (SketchUp을 다음에 정상적으로 재시작하면 Plugins 폴더에서 자동 로드된다)
2. SketchUp에 **모달 창(다이얼로그)**이 떠 있는가 → 떠 있으면 타이머가 안 돈다. 창을 닫아라.
3. `.rb` 파일이 `done\` 으로 옮겨졌는가 → 옮겨졌으면 실행은 된 것이니 `_result.txt` 의 ERROR를 보라.
4. 주 작업함이 안 되면 예비 작업함 `C:\dzw\inbox\` 로 넣어 보라.

---
*작성: 2026-09-19 / 설치 근거: 루비 콘솔 IME 오염 사고 3회 재발 방지*
