Releases: jeiel85/pulpit-ink-desktop
Releases · jeiel85/pulpit-ink-desktop
Release list
v0.5.0
Added — Tauri 하이브리드 UI 기능 parity 2차 포팅
- 네이티브 파일/폴더 다이얼로그:
tauri-plugin-dialog도입. 오디오/원문/사용자 사전/모델 캐시 경로 입력을 절대경로 직접 입력 대신 OS 네이티브 다이얼로그로 선택할 수 있는PathPicker컴포넌트 신설. - Wavesurfer.js 기반 2단 대조 편집기:
wavesurfer.js를 React 편집기 상단에 도킹하여 오디오 파형을 실시간 렌더링. 타임스탬프 클릭/더블클릭으로 해당 구간 이동/구간 재생, TauriconvertFileSrc+ asset 프로토콜로 로컬 미디어 스트리밍. 세그먼트별 Fuzzy 교정 후보를 팝오버 형태로 노출하고 클릭 한 번에edited_text에 반영 및 SQLite에 영속화. - 배치 큐 UI: 새 STT 변환 시 큐에 누적되고 순차적으로 사이드카에 위임. 개별 항목 진행률·상태 표시, 실패 시에도 다음 항목 계속 진행, 완료/실패 일괄 정리 버튼 제공.
- YouTube opt-in 동의 모달: 저작권 고지 + 동의 체크박스 + URL 검증 + yt-dlp 진단/원클릭 자동 설치를 묶은 모달. 동의 후 큐에 추가하고 사이드카
transcribe가 URL을 처리. - Glossary(사용자 용어 사전) 탭: 사전 항목 추가/수정/삭제/검색 + CSV import/export. 사이드카
user-dict서브명령으로 위임하며 기본 위치는%LOCALAPPDATA%/PulpitInk/user_dict.json. - 업데이트 알림 배너: 앱 부팅 시 사이드카
update-check --json을 호출해 GitHub Releases 최신 버전을 확인하고, 신규 버전 존재 시 상단 배너로 표시. 사용자 dismiss는 버전 단위로localStorage에 기록.
Added — 사이드카 IPC 보강
pulpit-ink user-dict list/add/remove/import/export/path [--json]— 사용자 사전 CRUD 및 CSV 입출력.pulpit-ink update-check [--force] [--json]— 24시간 캐시 적용된 GitHub Releases 비교.pulpit-ink youtube check/install [--json]— yt-dlp 설치 여부 진단 및 pip 자동 설치.pulpit-ink segments update <id> [--edited-text/--clean-text/--speaker] [--json]— React 편집기가 호출하는 세그먼트 영속화 엔드포인트.
Changed
frontend/package.json/Cargo.toml/tauri.conf.json/pyproject.toml/src/pulpit_ink/__init__.py버전을0.5.0으로 일제히 범프.- Tauri 윈도우 기본 크기를 1180×760 → 1280×820으로 확장 (편집기 + 파형 도킹용 여유 확보).
tauri.conf.json의security.assetProtocol.enable = true로 로컬 미디어 스트리밍 활성화.
Tests
tests/test_cli_tauri_helpers.py신규 8건: user-dict CRUD/CSV 라운드트립, update-check JSON, youtube check/install JSON 게이트 검증.- 전체 회귀: pytest 144/144 PASS, ruff 0건.
v0.4.7
Added
- 프로 검수 단축키 시스템 구현 (QShortcut 기반):
Ctrl+Space: 오디오 재생/일시정지 토글 기능 바인딩. 한글/영어 타이핑 텍스트 입력과 충돌을 방지하기 위한 안전 조합 키 적용.Ctrl+←/Ctrl+→: 테이블의 이전/다음 세그먼트(행)로 즉각 행 포커스를 이동하고, 오디오 싱크 플레이어도 해당 세그먼트의 시작 시각으로 즉시 seek 및 자동 재생 처리.Ctrl+P: 현재 활성화된 세그먼트(행)의 오디오 구간만을 정밀 반복 재생.Ctrl+↑/Ctrl+↓: 재생 속도를 0.5배속에서 2.0배속 범위(0.1배속 단위)로 동적으로 제어.- 속도 배지 UI 피드백: 재생 속도 조절 시 플레이어 조작부 옆에 배지(Badge) 스타일로 현재 속도 값을 직관적으로 시각화.
- Markdown 실시간 HTML 리치 뷰어 도킹:
- 편집 테이블 하단에 텍스트 편집 영역과 함께 병렬로 작동하는
QTextBrowser기반 실시간 리치 뷰어 구성. - 별도 무거운 외부 파서 라이브러리 없이 Windows SmartScreen 백신 오탐을 차단하고 바이너리 용량을 가볍게 유지하기 위해, 순수 Python 정규식 헬퍼(
_markdown_to_html)로 HTML 변환 파이프라인(Bold, Italic, Strikethrough, Inline Code, 개행 및 이스케이프) 구축. - 세그먼트 테이블 행 포커스 변경(
itemSelectionChanged) 및 사용자의 텍스트 수정(itemChanged) 즉시 실시간 Markdown 파서가 뷰어 내용을 동조/갱신하도록 신호-슬롯(Signal-Slot) 연결. - 하단부에 검수 단축키 목록과 속도 단축키 정보를 안내하는 미니 가이드 범례 표시줄 탑재.
- 편집 테이블 하단에 텍스트 편집 영역과 함께 병렬로 작동하는
Documentation
- 차기 에이전트 세션용 기술 이관 로드맵 수립:
docs/roadmap-tasks.md및docs/decision-log.md문서 내에 v0.4.7 마일스톤 작업을 전원 완료로 업데이트.- GitHub Issue #1
"실시간 마이크 녹음 및 실시간 오프라인 Whisper 스트리밍 STT 연동"에 대비하여, 차기 에이전트 세션이 그대로 이관받아 즉각 개발을 시작할 수 있도록 아주 정밀하고 완벽한 오프라인 아키텍처 가이드라인(sounddevice/PyAudio 하드웨어 드라이버 격리, PCM 링 버퍼 스레드 큐, Whisper 비동기 스트리밍 디코딩 및 10초 주기 원자적 플러시 세이브 세이프 가드) 설계 이관 가이드를 수립.
Tests
tests/test_editor_hotkeys.py신규 추가:Ctrl+Space재생/일시정지 토글,Ctrl+Up/Down재생 배속 상/하한선 예외 가드 제어,Ctrl+Left/Right행 경계 예외 가드 및 순환 제어를 철저히 검증하는 단위 테스트 3건 작성 완료.pytest전체 회귀 테스트 스위트 100% 통과 완료 (136/136 PASS).ruff check .정적 린트 경고 0건 (Perfect Clean) 달성.
v0.4.5
Added
- yt-dlp 자동 진단/원클릭 설치 UI: YouTube 저작권 Disclaimer 다이얼로그에
yt-dlp라이브러리 설치 상태를 자동 진단하는 상태 라벨과 백그라운드 워커 스레드(YtdlpInstallWorker) 기반의 원클릭 자동 설치 버튼을 추가하여, 사용자가 터미널 명령 없이 GUI에서 직접pip install yt-dlp를 안전하게 실행할 수 있도록 통합하였습니다. 설치 진행 중에도 UI가 프리즈되지 않습니다. - 1시간 오디오 스트레스 테스트 및 실측 성능 프로파일 보고서:
scripts/stress_test.py로 3600초 무음 WAV를 합성하여 전체 STT 파이프라인을 구동하고psutil로 CPU/RSS를 샘플링한 뒤docs/performance-profile.md로 결과를 자동 출력합니다. tiny 모델 기준 실측 결과는 14.07x 실시간, 평균 CPU 11.84%, 피크 RSS 1014.32 MB입니다. - Inno Setup 기반 Windows 인스톨러 빌드 스크립트:
scripts/pulpitink.iss(다국어 한국어/영어, 데스크탑 아이콘 옵션, 64bit Program Files 설치)와scripts/create_installer.ps1(pyproject.toml 버전 자동 감지 후 ISCC.exe 호출, 미설치 시 다운로드 안내)을 추가하여 Portable ZIP 외에 정식 설치 관리자(.exe) 산출물을 생성할 수 있게 되었습니다. 단, 코드 서명은 미적용입니다.
Tests
tests/test_youtube.py에install_yt_dlp성공/실패 및is_yt_dlp_available진단 경로 단위 테스트 4건 추가.tests/test_i18n.py에 yt-dlp 자동 설치 흐름용 신규 ko↔en 번역 키 회귀 테스트 1건 추가.python -m pytest: 115/115 PASSpython -m ruff check .: PASS
v0.4.4
Added
- Heuristic 화자 분리(Diarization) 파이프라인 구현: 무음구간 갭(gap > 1.5s) 기반
HeuristicDiarizer를 구현하고, CLI--diarize옵션 및 GUI 변환 설정 체크박스를 연동하여 STT 변환 시 자동으로 화자 태그("화자 1", "화자 2")가 분리되어 할당되도록 구축하였습니다. - GUI 편집기 화자 열 연동 및 영속성 저장:
TranscriptEditorWidget에 "화자" 편집 열(Column)을 추가하여 사용자가 테이블에서 직접 화자를 수정할 수 있게 하고, 수정 시 즉시 SQLite DB의segments테이블 내speaker컬럼에 실시간으로 영속화되도록 연동하였습니다. - 경량 i18n 번역 프레임워크 구축:
src/pulpitink/core/utils/i18n.py에 경량 영한 번역 Dictionary 및 실시간 UI retranslate 기능을 구현하여, GUI "인터페이스 언어" 변경 시 실시간으로 영한 UI 언어가 매끄럽게 토글되도록 구축하였습니다. - YouTube URL 비동기 다운로드 및 저작권 Disclaimer UI:
yt-dlp기반의 비동기 오디오 다운로드 파이프라인을 구축하고, GUI 메인 화면에 "YouTube 주소 추가" 버튼 및 저작권 Disclaimer 동의 팝업 창을 추가하여, 동의 후 URL 입력 시 백그라운드 워커 스레드에서 무정지 비동기 다운로드 및 STT 변환이 순차 진행되도록 연동하였습니다.
Tests
tests/test_diarizer.py를 신규 추가하여 무음구간 기반 화자 전환 및 예외/빈 입력 처리를 검증하는 단위 테스트 3건 작성 완료.tests/test_youtube.py를 신규 추가하여yt-dlp라이브러리 존재 여부별 안전 폴백 및 Mock 기반 비동기 오디오 다운로드 정확도를 검증하는 단위 테스트 2건 작성 완료.tests/test_i18n.py를 신규 추가하여 전역 언어 설정 전환 및 번역/폴백 매핑 정확도를 검증하는 단위 테스트 4건 작성 완료.python -m pytest: 110/110 PASS (총 110개 테스트 완료)python -m ruff check .: PASS
v0.4.3
Added
- PulpitInk 프리미엄 공식 아이콘 탑재: 강대상, 깃펜, 잉크 및 소리 파형을 미니멀하게 형상화한 고유의 앱 로고 png 리소스를 생성하고, 다중 규격의
pulpitink.ico파일로 변환하여src/pulpitink/resources디렉토리에 통합 탑재하였습니다. - PyInstaller 아이콘 연동:
pulpitink.spec및pulpitink-sidecar.spec스펙 파일의EXE정의부에 고유 아이콘 리소스를 바인딩하여, 윈도우용 실행 파일 패키징 시 아이콘이 엠베딩되도록 지정하였습니다.
Fixed
- 자모 Fuzzy 매칭 2글자 오탐 스톱워드(Stop-words) 가드 도입: 한글 자모 Fuzzy 매칭 스캔 과정 중 "에서", "하고", "그리고", "우리", "그의" 등 단순 조사 및 접속사가 임계값을 넘겨 거짓 양성(False Positive)을 유발하는 문제를 방지하기 위해
DEFAULT_STOP_WORDS제외 가드를 설계하여 postprocess 로직의 정확도를 대폭 상향시켰습니다.
v0.4.2
Added
- CI 빌드 및 테스트 자동화 고도화: GitHub Actions
Test워크플로우 실행 시 GUI 테스트에 필수적인PySide6및rapidfuzz를 포함한 옵셔널 의존성을 일괄 설치하도록 구성 (test.yml수정).
Fixed
- PySide6 환경 가드 설계: 로컬 및 CLI 가상환경 중 PySide6가 누락된 환경에서도 배치 큐 관련 유닛 테스트 수집(collection) 시 크래시가 발생하지 않고, 정상적으로 스킵 처리되도록 임포트 안전장치 탑재 (
tests/test_batch_queue.py수정).
v0.4.1
Added
- 실험용/임시 디렉터리 무시 설정: Git 추적 관리를 위해 루트 내
.antigravitycli/및frontend/디렉터리를.gitignore에 등록 완료.
Changed
- 알려진 제한사항 문서 최신화:
docs/known-limitations.md문서에서 0.4.0에 기구현된 최근 작업 기록 비활성화, 오디오 싱크 플레이어, 다중 작업 큐 항목을 "구현 완료 (v0.4.0 완비)" 상태로 정비. - 릴리즈 체크리스트 최신화:
docs/release/release-checklist.md문서에서 0.4.0 및 0.4.1 기능들에 대해 완료 체크리스트 항목을 업데이트 처리.
v0.4.0
Added
- 편집기 탭 내 오디오 싱크 플레이어 연동 (Audio Sync Player):
TranscriptEditorWidget내에PySide6.QtMultimedia기반QMediaPlayer및QAudioOutput객체 탑재.- 플레이어 제어 바 UI 추가: 재생/일시정지 버튼, 수평 방향
QSlider진행 바, 재생 시간 표시 레이블, 선택 구간 재생 버튼, 재생 싱크 스크롤 활성화 체크박스. - 작업 오디오 소스 자동 매핑:
load_job(job_id)호출 시cache/jobs/<job_id>/processed.wav(전처리 캐시) 존재를 최우선 점검하고, 미발견 시 SQLite DB에서 job의source_path를 쿼리하여 원본 미디어 재생 소스로 대체 재생. - 세그먼트 테이블 행 더블클릭(
cellDoubleClicked) 및 "선택 구간 재생" 시 해당 세그먼트의start_sec로 플레이어 seek 및 자동 재생. - 플레이어 재생 시간 변화(
positionChanged) 시 현재 위치에 해당하는 테이블 행을 하이라이트(Select) 처리하며, 스크롤 싱크 옵션이 활성화된 경우 해당 행이 중앙에 오도록 자동 스크롤(scrollToItem) 연동.
- 메인 화면 다중 작업 배치 큐 UX 개선 (Batch Queue UX):
- 파일 큐 처리 상태 머신 구현: 대기 목록 내 아이템들에 대기 상태 문자열(
[대기],[진행 중],[완료],[실패])을 추가하여 실시간 시각화. - 순차 처리 기동 루프(
_start_next_queue_item): 스레드가 완전히 해제된 시점(_on_thread_finished)에 다음 파일의 변환을 기동시켜 리소스 경합 방지. - 연속성 정책 반영: 다중 파일 변환 도중 특정 개별 파일 변환이 실패하더라도 전체 배치 처리를 멈추지 않고, 해당 행만
[실패]표기 후 다음 작업을 연쇄 변환. - 변환 중단(Cancel) 기능: 진행 중 "변환 중단" 버튼 클릭 시 확인 다이얼로그를 통해 대기 중인 모든 큐를 일괄 파기하고 워커 스레드를 정지(
terminate()). - 변환 진행 중 파일 추가/제거/비우기 동작 시도에 대한 안전 가드 팝업 경고 추가.
- 파일 큐 처리 상태 머신 구현: 대기 목록 내 아이템들에 대기 상태 문자열(
Tests
tests/test_batch_queue.py를 신규 추가하여, 다중 파일 배치 큐 가동, 순차 변환, 실패 시의 연속성 기동, 변환 중환 및 큐 일괄 파기 등 상태 머신 시뮬레이션 테스트 3건 작성 완료.python -m pytest: 100/100 PASS (총 100개 테스트)python -m ruff check .: PASS
Feature: Delete UX & Privacy Control & Doc Alignment
Added
- 작업/캐시 삭제 기능 보강 (Delete UX):
- CLI
jobs delete <job_id>명령어 추가: 지정된 작업 ID의 DB 데이터와 캐시 오디오 디렉터리(cache/jobs/<job_id>)를 재확인 절차를 거쳐 영구 연쇄 삭제합니다. - CLI
jobs clean-cache명령어 추가: DB 내 활성 작업 목록과 대조하여 등록되지 않은 방치 캐시 디렉터리(고스트 캐시)만 안전하게 일괄 정리합니다. - GUI 최근 작업 목록(
recent_list)에 우클릭 컨텍스트 메뉴 및 "작업 및 캐시 삭제" 액션 추가:QMessageBox대화상자로 안전하게 재확인 후 DB 레코드와 물리 캐시를 연쇄 삭제 처리하고 목록을 자동 갱신합니다.
- CLI
- 최근 작업 기록 저장 비활성화 옵션 (Privacy Control):
Settings데이터클래스에keep_history(기본값: True) 필드를 탑재하고 JSON 설정 파일 연동 및 형변환 가드 처리를 추가했습니다.- STT 변환 시(
run_transcribe),keep_history가 False이면persist매개변수를 강제 비활성화하여 DB 영속화 저장을 전면 우회하도록 처리했습니다. - GUI 설정 그룹에 "최근 작업 기록 저장 및 표시" 체크박스 위젯을 추가하여 즉시 저장 및 리프레시되도록 했습니다. 기능 비활성화 시 목록에 고지 문구 노출 및 컨텍스트 메뉴 진입을 차단합니다.
Changed
- Jamo Fuzzy 매칭 문서 상태 갱신 (Doc Alignment):
docs/design/jamo-fuzzy-matching.md설계 노트의 상태를구현 완료 (v1.0 완비)로 변경하고 6절에 2글자 단어 한계와 임계값 0.75~0.80 상향 조정 가이드를 보완했습니다.
Tests
tests/test_settings_service.py에keep_history형변환 및 역직렬화 단위 테스트 추가.tests/test_transcribe_persistence.py에keep_history가 False일 때 DB 트랜잭션 및 영속화를 생략하는지에 대한 Mocking 기반 통합 테스트 추가.python -m pytest: 97/97 PASSpython -m ruff check .: PASS
Branding: 설교필기 PulpitInk 전체 리네이밍
Changed
- 프로젝트 전체 브랜딩을 SermonScript에서 설교필기 (PulpitInk) 로 변경했습니다.
- Python 패키지명:
sermonscript→pulpitink, CLI 명령:pulpitink - GUI 타이틀바:
설교필기 (PulpitInk), QMessageBox 다이얼로그:설교필기 - 클래스:
SermonScriptError→PulpitInkError - PyInstaller spec:
pulpitink.spec,pulpitink-sidecar.spec - 빌드 산출물:
PulpitInk_Portable_*.zip, EXE:PulpitInk.exe - GitHub 저장소:
jeiel85/sermon-script→jeiel85/pulpitink - 데이터 경로:
%LOCALAPPDATA%\PulpitInk\PulpitInk\ - DB/로그:
pulpitink.db,pulpitink.log - 환경변수:
PULPITINK_ROOT
Tests
ruff check .: All checks passedpytest: 95/95 passed
Documentation: README repository guide
Changed
- GitHub Pages 랜딩 페이지가 별도로 생긴 뒤 README를 저장소 안내 문서 역할에 맞게 재정비했습니다.
- 상단 대형 랜딩 이미지를 제거하고 설치, 사용, 데이터 저장 위치, 개발 검증, 프로젝트 구조 중심으로 구성했습니다.
Documentation: GitHub Pages landing
Added
- GitHub Pages용 정적 랜딩 페이지
docs/index.html을 추가했습니다. - GitHub Pages에서 정적 파일을 그대로 제공하도록
docs/.nojekyll을 추가했습니다.
Changed
- README와 프로젝트 홈페이지 URL을
https://jeiel85.github.io/pulpitink/기준으로 갱신했습니다.
Documentation: GitHub landing page
Changed
README.md를 GitHub 랜딩 페이지 역할에 맞게 갱신했습니다.
사용자가 제공한 랜딩 이미지를 상단에 배치하고, 현재 구현된 GUI/CLI/STT/편집/Export/배포 상태를 기준으로 빠른 시작과 기능표를 정리했습니다.- 프로젝트 메타데이터의 GitHub URL을 실제 저장소인
https://github.com/jeiel85/pulpitink로 정정했습니다.
Added
docs/assets/pulpitink-landing.png랜딩 이미지를 추가했습니다.
v0.3.0
Added
- GitHub 태그(
v*) push 시 Windows Portable ZIP을 빌드한 뒤 GitHub Release를 자동 생성하도록
build-windows.yml을 정비했습니다. - 릴리즈 산출물과 함께
SHA256SUMS.txt를 생성해 GitHub Release에 첨부합니다.
Changed
- 참고 프로젝트(
claude-usage-tray-windows)와 동일하게 태그를 릴리즈 트리거로 삼고,
릴리즈 본문은CHANGELOG.md의 해당 버전 섹션에서 추출합니다. - 태그 버전과
pyproject.toml버전이 다르면 릴리즈 빌드를 중단하도록 검증 단계를 추가했습니다.
Tests
- 워크플로우 변경은 GitHub Actions 태그 push에서 검증됩니다.