Files
CODE_ASSISTANT/docs/troubleshootings/2026-08-05-snippet-seed-empty.md
T
2026-09-16 17:22:14 +09:00

43 lines
3.3 KiB
Markdown

# 2026-08-05 스니펫 팔레트가 비어있음 (시드 실패)
## 증상
데스크톱 앱 실행 후 `Ctrl+1` 팔레트에 스니펫이 **하나도 안 뜸**. "기존 SQLite를 복사해서 시드하기로" 했는데 빈 목록.
## 조사 (systematic-debugging)
- 앱 로그(`%TEMP%\codeassist-webview.log`): `SnippetSeed: 시드 소스 없음(빈 DB로 시작): D:\project\003.short-auto\snippets.db`
- `find`로 003 트리 전체 스캔 → `.db`/`.sqlite` **하나도 없음**. 003(파이썬)이 실제로 한 번도 안 돌아가서 `snippets.db`가 생긴 적이 없었음.
- 타겟 `%LOCALAPPDATA%\CodeAssist\snippets.db`는 이미 존재(앱이 첫 실행 때 빈 스키마 생성). `SnippetSeed`는 "타겟 있으면 스킵"이라 **재시드도 막힘**.
## 근본 원인
1. **시드 소스(SQLite)가 애초에 존재하지 않았음.** 진짜 스니펫 데이터는 C# 원본의 **XML** `0_reference/CodeTemplates.xml`(231개 `<Code>`)에 있음. 시드는 없는 SQLite를 복사하려 했으니 빈 DB.
2. 빈 타겟 db가 이미 생성돼 있어 소스를 고쳐도 재시드 안 됨.
## 해결
1. `CodeTemplates.xml` → 앱 스키마(SnippetRepository) SQLite로 **1회 변환**(아래 스크립트). 231개 중 218개 저장(빈 body 10·중복 이름 3 스킵). name은 `NormalizeName`(Trim·대문자·공백→`_`)과 동일 규칙, category 기본 `"코드"`.
2. 생성물을 시드 소스 경로 `D:\project\003.short-auto\snippets.db`에 두고(향후 재시드용), 앱 종료 후 빈 타겟(`%LOCALAPPDATA%\CodeAssist\snippets.db` + wal/shm) 제거 → 218개 db로 교체.
3. 앱 재실행 → 218개 표시.
## 재발 방지 / 메모
- 코드 변경 없음(시드 로직 자체는 정상 — 소스 파일이 없었던 게 문제). 소스 경로에 db가 생겼으니 타겟 삭제 시 시드가 정상 복구.
- 데이터 원천은 **SQLite가 아니라 XML**이었음. XML이 갱신되면 아래 스크립트로 재생성하면 됨.
- `change_word1/2`(XML의 ChangeWord1/2)는 앱 스키마에 없음 — 의도적으로 안 가져옴.
## 변환 스크립트 (보존)
```python
import xml.etree.ElementTree as ET, sqlite3, os
SRC_XML = r"D:\project\003.short-auto\0_reference\CodeTemplates.xml"
OUT_DB = r"D:\project\003.short-auto\snippets.db"
def norm(n): return n.strip().upper().replace(" ", "_") # SnippetRepository.NormalizeName 동일
root = ET.parse(SRC_XML).getroot()
rows, seen = [], set()
for code in root.findall("Code"):
name = norm(code.findtext("Name") or ""); desc = (code.findtext("Desc") or "").strip(); body = code.findtext("Snippet") or ""
if not name or not body.strip() or name in seen: continue
seen.add(name); rows.append((name, desc, body, "코드"))
if os.path.exists(OUT_DB): os.remove(OUT_DB)
con = sqlite3.connect(OUT_DB)
con.executescript("CREATE TABLE snippets(name TEXT PRIMARY KEY,desc TEXT NOT NULL DEFAULT '',body TEXT NOT NULL DEFAULT '',category TEXT NOT NULL DEFAULT '코드');CREATE TABLE usage(name TEXT PRIMARY KEY,count INTEGER NOT NULL DEFAULT 0,last_used INTEGER NOT NULL DEFAULT 0);")
con.executemany("INSERT INTO snippets(name,desc,body,category) VALUES(?,?,?,?)", rows); con.commit(); con.close()
# 그다음: 앱 종료 → %LOCALAPPDATA%\CodeAssist\snippets.db(+wal/shm) 삭제 → OUT_DB 복사 → 앱 재실행
```