3.3 KiB
3.3 KiB
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는 "타겟 있으면 스킵"이라 재시드도 막힘.
근본 원인
- 시드 소스(SQLite)가 애초에 존재하지 않았음. 진짜 스니펫 데이터는 C# 원본의 XML
0_reference/CodeTemplates.xml(231개<Code>)에 있음. 시드는 없는 SQLite를 복사하려 했으니 빈 DB. - 빈 타겟 db가 이미 생성돼 있어 소스를 고쳐도 재시드 안 됨.
해결
CodeTemplates.xml→ 앱 스키마(SnippetRepository) SQLite로 1회 변환(아래 스크립트). 231개 중 218개 저장(빈 body 10·중복 이름 3 스킵). name은NormalizeName(Trim·대문자·공백→_)과 동일 규칙, category 기본"코드".- 생성물을 시드 소스 경로
D:\project\003.short-auto\snippets.db에 두고(향후 재시드용), 앱 종료 후 빈 타겟(%LOCALAPPDATA%\CodeAssist\snippets.db+ wal/shm) 제거 → 218개 db로 교체. - 앱 재실행 → 218개 표시.
재발 방지 / 메모
- 코드 변경 없음(시드 로직 자체는 정상 — 소스 파일이 없었던 게 문제). 소스 경로에 db가 생겼으니 타겟 삭제 시 시드가 정상 복구.
- 데이터 원천은 SQLite가 아니라 XML이었음. XML이 갱신되면 아래 스크립트로 재생성하면 됨.
change_word1/2(XML의 ChangeWord1/2)는 앱 스키마에 없음 — 의도적으로 안 가져옴.
변환 스크립트 (보존)
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 복사 → 앱 재실행