diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 27cb137..b941703 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -35,6 +35,7 @@ | 2026-11-06 | v3.100 | **⌘K 넓히기: 이 노트의 동작과 폴더·태그로 가기(브랜치 `feat/palette-note-actions`, 앱만).** 노트를 열었을 때 맨 앞 `이 노트` 묶음: 즐겨찾기(`org.setFavorite`)·태그 편집(`org.requestTagFocus`, 사이드바 줄 메뉴와 같은 통로)·형식별 내보내기·Obsidian. 내보내기는 `useNoteExport`가 MeetingView 안에 있어 App이 `exportReq {id, format, nonce}`를 내려 주고 MeetingView가 노트를 다 읽은 뒤 한 번 `exp.exportAs`/`toObsidian`을 부른다(노트 머리 메뉴와 같은 함수: Markdown·Word는 넣을 내용 고르기 창). 목록이 길어지지 않게 `PaletteAction.typed`(빈 입력에서는 숨기고 찾을 때만)를 두어 빈 입력에서는 Markdown·Word만 보인다. 입력이 있으면 `폴더·태그` 묶음: 고르면 사이드바 거르기를 그 폴더(태그) 하나로 바꾸고(`clearFilters` → `selectFolder`/`toggleTag`) 노트 목록을 펼친다. 폴더로 옮기기·인쇄는 고르는 창·쓰던 메모 저장이 끼어 넣지 않았다. WORDS §4.30. | | 2026-11-06 | v3.101 | **일정과 노트 잇기(브랜치 `feat/event-note-link`).** v3.96의 이번 주 띠는 일정과 그 일정으로 녹음한 노트를 따로 보였다(노트에 일정 ID가 없었다). `event.json`에 선택 키 `id`(EventKit 일정 ID, 한 줄 256자 이하)를 더했다: 앱 `calendar::clean_event`와 코어 `calendar_event.clean_event`가 둘 다 남긴다(코어가 녹음 폴더 → 노트 폴더로 옮길 때 다시 검사하므로). 노트 목록 `MeetingInfo.event`에 `{id?, title, start}`만 싣는다(`calendar::note_event`, 목록 캐시 안: `event.json`은 두 저장 경로 모두 transcript.json보다 먼저 쓰인다). 화면 `week.linked`: 같은 순간에 시작하고 ID가 같으면(반복 일정은 회차마다 ID가 같아 시각으로 가른다), ID가 없는 옛 노트는 제목이 같으면 잇는다. `groupWeek`가 이어진 노트를 일정(`DayEvent.notes`) 아래로 옮기고 그날 노트에서는 뺀다(`dayNotes`는 둘 다 센다). 미리보기는 세 번째 노트를 화요일 스탠드업에 이었다. 실제 EventKit ID로 녹음해 잇는 것은 이 터미널에 캘린더 권한이 없어 확인하지 않았다(릴리스 번들 확인 때 함께). | | 2026-11-06 | v3.102 | **⌘K에 폴더로 옮기기·PDF(브랜치 `feat/palette-move-print`, 앱만).** v3.100에서 뺀 둘을 더했다. 폴더 고르는 창을 띄우는 대신 폴더마다 `폴더로 이동: {경로}` 한 줄과 `폴더에서 빼기`(`org.moveNote`, 사이드바 줄 메뉴와 같다, 둘 다 `typed`라 찾을 때만). PDF는 `exportReq`의 `format: "print"`: MeetingView가 노트 머리 PDF와 똑같이 `flushMemos` 뒤 `setPrintNonce`. | +| 2026-11-06 | v3.103 | **0.5.5 릴리스 준비(브랜치 `chore/release-0.5.5`).** 버전 0.5.5를 `package.json`·`Cargo.toml`(+`Cargo.lock`의 `tractus-app`)·`tauri.conf.json`·`pyproject.toml`(+`uv.lock`)·플러그인 `plugin.json`에 맞췄다. 0.5.4 이후: 리팩토링(v3.86~v3.89·v3.93·v3.94), 사전(v3.90~v3.92·v3.98), ⌘K(v3.95·v3.100·v3.102), 이번 주 띠와 일정·노트 잇기(v3.96·v3.101), 안내 말풍선·빈 요약(v3.97), onnxruntime 제거(v3.99). 소개 사이트(`site/ko`)의 `자주 쓰는 단어`를 `사전`으로. 릴리스 노트 `docs/releases/v0.5.5.md`, 로드맵 항목. **번들 확인(저장소 복사본에서 빌드, 다른 폴더로 옮겨 `env -i`):** DMG 188.8MB(0.5.4) → 166.4MB(−22.4MB, onnxruntime 제거·v3.99), 앱 469MB. `doctor --json`·`note new`·`note sample`·`tractus-rec record --fake`·`calendar range`(권한 없는 터미널이라 `access: undetermined`, 빈 목록)·`codesign --verify --deep --strict`·번들 파이썬에서 `tractus.voices`·`onnx_mlx` 불러오기 통과. 실제 일정 ID로 녹음해 잇기는 확인하지 않았다. | | 2026-10-30 | v3.78 | **한국어 파인튜닝 엔진을 8bit 변환본으로 교체(브랜치 `feat/univa-8bit`).** 0.5.2에 올린 `asr-ko-univa`가 원본 bf16(4.7GB)이었다(변환·업로드 위치를 정하지 않고 허브 원본을 그대로 등록했다). `mlx_audio.convert -q --q-bits 8 --q-group-size 64 --q-mode affine`로 변환해(표준 엔진과 같은 설정, `model.safetensors` 2,463,307,541바이트로 공식 Qwen3-ASR 1.7B 8bit와 같다) 소유자 계정에 `voyagar/Qwen3-ASR-1.7B-ko-mlx-8bit`(공개, Apache-2.0, 커밋 `8fcc32c4`, 모델 카드에 원 제작자·원본 revision·변환 명령)로 올리고 등록 목록을 바꿨다. ID `asr-ko-univa`·`level_note`는 그대로라 사용자가 고른 엔진 설정은 유지되고, 새 폴더(`qwen3-asr-1.7b-ko-8bit`)를 받을 때까지는 받아 둔 다른 엔진으로 변환한다. 0.5.2로 bf16을 받은 폴더(`qwen3-asr-1.7b-ko-bf16`)는 등록 밖이 되어 `models prune`으로 지운다. 간이 점검: 원본과 출력 차이 CER 2.5, 처리 시간 약 30% 단축(docs/design/asr-engines.md). | | 2026-10-30 | v3.77 | **0.5.2 릴리스 준비(브랜치 `fix/mic-config-change-crash`).** 버전 0.5.2를 다섯 매니페스트와 잠금 파일에 맞췄다. 0.5.1 이후: 한국어 파인튜닝 엔진 `asr-ko-univa` 등록과 모델 화면 변환 엔진 라디오 목록(v3.75), 장치 전환 중 녹음 프로그램 크래시 수정(v3.76, 이슈 #57). 릴리스 노트 `docs/releases/v0.5.2.md`, 로드맵 항목. | | 2026-10-30 | v3.76 | **녹음 중 입력 장치가 바뀌면 `tractus-rec`가 죽던 것(이슈 #57, 브랜치 `fix/mic-config-change-crash`).** `AVAudioEngineConfigurationChange` → `Recorder.restart` → `MicSource.open`의 `installTap`이 Objective-C 예외(NSException)를 던져 Swift `do/catch`를 지나 프로세스가 abort됐다(66분 녹음 중 크래시, `recording.json`의 `duration`이 null로 남음). ① `RecorderKit.micFormatProblem`: tap 전에 채널·표본 속도 0과 하드웨어 포맷 불일치를 오류로 던진다(`restart`의 경고와 watchdog 2초 재시도로 넘어감). 음성 처리(에코 제거) 중에는 두 포맷이 다를 수 있어 표본 속도 일치는 보지 않는다. ② `MicSource.stop()`마다 새 `AVAudioEngine`으로 바꾸고 관찰자를 다시 단다(장치가 바뀐 뒤 같은 엔진의 입력 노드가 낡은 포맷을 쥐는 것을 피함). ③ 새 SwiftPM 타깃 `ObjCCatch`(Objective-C, `TractusObjC.catching { }`)로 `installTap`을 감싸 NSException을 Swift 오류로 바꾼다(`recorder/`의 tools-version 5.10·플랫폼은 그대로). 이 Mac의 실제 마이크로 일반·에코 제거 녹음이 정상임은 확인했고, **실제 장치 전환(블루투스 연결·해제)은 재현하지 못했다.** 비정상 종료로 `duration`이 null인 녹음은 앱의 `변환 대기 중인 녹음`에 보이고 코어가 그대로 변환 전 노트로 저장한다는 것을 테스트로 고정했다. | diff --git a/app/package.json b/app/package.json index 5fdc429..b90ab57 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tractus-app", "private": true, - "version": "0.5.4", + "version": "0.5.5", "license": "Apache-2.0", "type": "module", "scripts": { diff --git a/app/src-tauri/Cargo.lock b/app/src-tauri/Cargo.lock index df14c4e..c4d9dea 100644 --- a/app/src-tauri/Cargo.lock +++ b/app/src-tauri/Cargo.lock @@ -4426,7 +4426,7 @@ dependencies = [ [[package]] name = "tractus-app" -version = "0.5.4" +version = "0.5.5" dependencies = [ "base64 0.22.1", "minisign-verify", diff --git a/app/src-tauri/Cargo.toml b/app/src-tauri/Cargo.toml index e331472..1472e4e 100644 --- a/app/src-tauri/Cargo.toml +++ b/app/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tractus-app" -version = "0.5.4" +version = "0.5.5" description = "Tractus 데스크톱 앱" license = "Apache-2.0" edition = "2021" diff --git a/app/src-tauri/tauri.conf.json b/app/src-tauri/tauri.conf.json index 47a9cfb..6ef3d68 100644 --- a/app/src-tauri/tauri.conf.json +++ b/app/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Tractus", - "version": "0.5.4", + "version": "0.5.5", "identifier": "dev.tractus.app", "build": { "beforeDevCommand": "pnpm dev", diff --git a/docs/releases/v0.5.5.md b/docs/releases/v0.5.5.md new file mode 100644 index 0000000..4413f10 --- /dev/null +++ b/docs/releases/v0.5.5.md @@ -0,0 +1,73 @@ +--- +version: 0.5.5 +date: 2026-11-06 +summary: 잘못 알아듣는 단어를 모아 두는 사전 화면이 생기고, ⌘K로 노트 열기·앱 동작·내용 검색을 한곳에서 하며, 홈에 이번 주 일정과 노트가 보입니다. +summary_en: A new Vocabulary screen collects the words transcription keeps getting wrong, ⌘K opens notes, runs actions and searches contents in one place, and the home screen shows this week's events and notes. +--- +# Tractus v0.5.5 + +녹음과 메모를 내 Mac 안에서 텍스트로 바꾸고, 요약·검색·AI 질문까지 가능한 앱입니다. 이번 버전은 받아 적기 정확도를 사용자가 직접 높이는 `사전`과, 노트를 빨리 찾아 다루는 ⌘K·이번 주 띠를 더했습니다. (English below) + +## 이번 버전에서 바뀐 것 + +- **`자주 쓰는 단어`가 `사전`이 되고 화면이 따로 생겼습니다.** 사이드바 위 `사전`에서 엽니다. + - Enter로 단어를 더합니다. 쉼표나 줄바꿈으로 나눈 목록을 붙여 넣으면 미리 보고 한 번에 더합니다. + - 줄마다 고치거나 지울 수 있습니다. 지운 뒤에는 알림의 `되돌리기`로 되살립니다. + - **고쳐 쓴 낱말:** 대화 내용에서 직접 고친 낱말 중 사전에 넣을 만한 것을 칩으로 보여 줍니다. 누르면 더하고, ×를 누르면 다시 보이지 않습니다. 글자를 저절로 바꾸지는 않습니다. + - 텍스트로 변환할 때 **최근에 더한 단어부터** 씁니다. 단어가 50개를 넘어도 방금 넣은 단어가 빠지지 않습니다. + - Qwen 계열이 아닌 변환 엔진을 고르면 `사전 단어를 쓰지 않습니다`라고 알려 줍니다. +- **⌘K 빠른 실행 창이 생겼습니다.** ⌘K를 누르면 화면 가운데 창이 열립니다. + - 비어 있을 때는 최근에 고친 노트 5개와 앱 동작(녹음 시작·글쓰기·파일 가져오기·AI 어시스턴트·사전·설정 등)이 보입니다. + - 입력하면 제목이 맞는 노트, 이름이 맞는 동작, 맞는 폴더·태그가 나옵니다. 맨 아래 `내용에서 찾기`로 노트 내용을 검색합니다. + - 노트를 연 채 열면 `이 노트` 묶음에서 즐겨찾기, 태그 편집, 내보내기(Markdown·Word·PDF 등), Obsidian으로 보내기, 폴더로 옮기기를 할 수 있습니다. 자주 쓰지 않는 것은 입력해야 나옵니다(예: `pdf`, `폴더`). +- **홈에 `이번 주` 띠가 생겼습니다.** 월요일부터 일요일까지 날마다 캘린더 일정과 그날 만든 노트를 보여 줍니다. + - 캘린더를 연결하지 않아도 노트는 보입니다. + - 오늘 아직 끝나지 않은 일정에는 녹음 단추가 있습니다. + - 일정으로 녹음한 노트는 그 일정 바로 아래에 들여 써서 보입니다. 반복 일정은 회차마다 따로 잇습니다. +- **안내 말풍선과 빈 요약 화면을 고쳤습니다.** + - 안내 말풍선이 열린 AI 어시스턴트 서랍 위에 뜨거나 대화 줄을 가리지 않습니다. + - 요약이 없을 때 `요약 만들기` 단추를 가리키는 안내 상자가 보입니다. +- **앱이 조금 가벼워졌습니다.** 목소리 프로필 모델을 다른 실행 방식으로 바꿔 큰 라이브러리 하나를 뺐습니다. 등록해 둔 목소리는 다시 등록하지 않아도 되고 결과도 같습니다. +- 내부 구조를 많이 정리했습니다(노트 화면·작업 순서·명령 모듈). 동작은 바뀌지 않았습니다. + +## 알아 둘 것 + +- 예전 버전에서 일정으로 녹음한 노트는 일정 제목이 같을 때만 일정 아래로 이어집니다. 캘린더에서 제목을 바꾸면 따로 보입니다. +- 사전 화면은 영어 화면에서 `Vocabulary`로 보입니다. + +## 업데이트·설치 + +- **v0.1.1 이상을 쓰고 있다면:** 설정 › 업데이트에서 `업데이트 확인` → `업데이트 설치` → `다시 열기`. +- **새로 설치한다면:** DMG를 열고 `Tractus.app`을 `Applications`로 끌어다 놓습니다. + - 처음 열 때 "확인되지 않은 개발자" 경고가 나오면: 시스템 설정 → 개인정보 보호 및 보안 → "그래도 열기" (또는 `xattr -dr com.apple.quarantine /Applications/Tractus.app`) + - **ffmpeg가 필요합니다:** `brew install ffmpeg` +- 노트·모델·설정·사전 파일은 그대로입니다. + +## 받을 파일 + +| 파일 | 설명 | +| --- | --- | +| `Tractus-0.5.5-arm64.dmg` | 설치 파일 (Apple Silicon 전용) | +| `Tractus-0.5.5-arm64.dmg.sha256` | 체크섬. `shasum -a 256 -c Tractus-0.5.5-arm64.dmg.sha256` | +| `Tractus.app.tar.gz`, `.sig`, `latest.json` | 앱 안 업데이트가 쓰는 파일입니다. 직접 받을 필요는 없습니다. | + +## 요구 사항 + +- Apple Silicon(M1 이상), 메모리 16GB 이상 권장(8GB는 저사양 구성) +- macOS 14.4 이상(설계상 최소) + +--- + +## English + +Tractus turns recordings and memos into text on your Mac, then summarizes, searches and answers questions about them. **New in 0.5.5: a Vocabulary screen, a ⌘K command window and a This week strip on the home screen.** + +- **Vocabulary.** The old frequent-words list is now its own screen (`Vocabulary` at the top of the sidebar). Press Enter to add a word, or paste a comma- or line-separated list and add it in one go. Edit or delete any word; `Undo` in the notice brings a deleted word back. **Words you corrected** shows words you fixed in transcripts as chips: click to add, × to hide. Nothing is replaced automatically. Transcription now uses the **most recently added words first**, so new words are not dropped once you pass 50. If you pick a non-Qwen engine, the screen tells you the vocabulary is not used. +- **⌘K.** Opens a window in the middle of the screen. Empty, it shows your 5 most recently edited notes and app actions. Type to find notes by title, actions by name, and folders & tags; `Search contents` at the bottom searches inside notes. With a note open, **This note** lets you favorite it, edit tags, export (Markdown, Word, PDF and more), send it to Obsidian or move it to a folder. Less common actions appear only when you type (e.g. `pdf`, `folder`). +- **This week.** The home screen shows Monday to Sunday with each day's calendar events and the notes made that day. Notes show even without a calendar. Events today that haven't ended get a record button. Notes recorded from an event sit right under that event; recurring events link per occurrence. +- **Fixes:** tips no longer pop up over the open AI assistant drawer or cover transcript lines, and an empty summary shows a box pointing to `Create summary`. +- **Lighter app:** the voice profile model runs a different way, so one large library is gone. Enrolled voices keep working without re-enrolling, with the same results. +- Notes recorded from an event in older versions link only while the event title is unchanged. +- Install: open the DMG and drag `Tractus.app` to `Applications`; you need `brew install ffmpeg`. The build isn't notarized yet — use System Settings › Privacy & Security › Open Anyway on first launch. Apple Silicon, macOS 14.4+. + +Guides: [Setup](https://github.com/sjoon21/Tractus/blob/main/docs/en/setup.md) · [Usage](https://github.com/sjoon21/Tractus/blob/main/docs/en/usage.md) · [Agents (MCP)](https://github.com/sjoon21/Tractus/blob/main/docs/en/mcp.md) diff --git a/docs/roadmap.md b/docs/roadmap.md index f8492ca..7031e3a 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -35,6 +35,7 @@ - [x] 0.5.2: 모델 화면 변환 엔진을 라디오 목록 하나로(받지 않은 엔진도 고르면 받기 시작), 한국어 파인튜닝 엔진(TeamUNIVA) 목록에 추가, 녹음 중 입력 장치가 바뀌면 녹음이 죽던 것 수정 (v3.75~v3.77, 이슈 #57) - [x] 0.5.3: 한국어 파인튜닝 엔진을 8bit 변환본으로 교체(4.7GB → 2.5GB, 약 30% 빠름) (v3.78~v3.79) - [x] 0.5.4: 스마트 교정 다음 제안 자동 이동·AI 서비스 선택, 노트·녹음 화면 하단 도크, 대화상자 확대, AI 어시스턴트 예시 질문, 설정 구역 바로가기, 사이드바 정리 (v3.80~v3.85) +- [x] 0.5.5: 사전 화면(고쳐 쓴 낱말 제안, 최근에 더한 단어부터 변환에 사용), ⌘K 빠른 실행(노트 열기·앱 동작·내용 검색·이 노트의 동작·폴더·태그), 홈의 이번 주 띠(일정과 그 일정으로 녹음한 노트 잇기), onnxruntime 제거, 노트 화면·작업 줄·cli.py·lib.rs 리팩토링 (v3.86~v3.103) - [ ] Windows 지원 (MLX를 대신할 런타임, Windows 녹음 프로그램, 설치·서명). 2026-10-22 소유자 결정: macOS에서 충분히 다듬은 뒤로 최대한 미룬다(1.0일 수 있다) - [ ] 영어 화면에서 실제 AI 요약·노트 완성 품질 확인 - [ ] 깨끗한 Mac(새 계정)과 macOS 14.4~15에서 미리 만든 앱 실행, 내려받은 `.dmg`의 Gatekeeper 동작과 권한 이름 확인 diff --git a/plugins/tractus/.claude-plugin/plugin.json b/plugins/tractus/.claude-plugin/plugin.json index 86ccd1c..ea92d70 100644 --- a/plugins/tractus/.claude-plugin/plugin.json +++ b/plugins/tractus/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "tractus", "displayName": "Tractus", - "version": "0.5.4", + "version": "0.5.5", "description": "Your meetings as local memory for Claude Code: search notes, transcripts, decisions and action items recorded on this Mac with Tractus. Nothing leaves your Mac except what Claude reads.", "author": { "name": "sjoon21", "url": "https://github.com/sjoon21" }, "homepage": "https://github.com/sjoon21/Tractus", diff --git a/pyproject.toml b/pyproject.toml index fcb389f..015ccb9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tractus" -version = "0.5.4" +version = "0.5.5" description = "Local-first 노트·녹음 도구" readme = "README.md" license = "Apache-2.0" diff --git a/site/ko/benchmark/index.html b/site/ko/benchmark/index.html index 6dcc5fe..b883337 100644 --- a/site/ko/benchmark/index.html +++ b/site/ko/benchmark/index.html @@ -80,7 +80,7 @@
Qwen3-ASR이 한국어·영어를 자동으로 감지해 받아 적고, 영어 용어가 섞인 한국어 회의에 강합니다. 참석자를 구분하고, 한 번 이름을 붙이면 다음 녹음부터 이름을 제안합니다.
아니요. 음성 인식, 참석자 구분, 스마트 검색은 Apple MLX로 내 Mac 안에서 돕니다. 요약이나 AI 질문을 할 때 필요한 텍스트만, 고른 AI 서비스로 보냅니다.
Apple Silicon(M1 이상) Mac, macOS 14.4 이상입니다. 메모리 16GB 이상을 권장하고, 8GB는 저사양 구성으로 씁니다. ffmpeg가 필요합니다(brew install ffmpeg).
녹음 → 텍스트 변환 → 요약 → 검색이라는 흐름은 같지만, 음성 인식을 클라우드가 아니라 내 Mac에서 하고 노트를 내가 가진 파일로 남긴다는 점이 다릅니다. 영어 용어가 섞인 한국어 회의에 맞춰 조정했습니다.
실제 한국어 회의(5.2시간)로 잰 결과, 기본 모델 Qwen3-ASR-1.7B의 글자 오류율은 9.49%로 Whisper-large-v3-turbo(14.92%)보다 오류가 36% 적었습니다. 노트 제목과 메모의 낱말, 자주 쓰는 단어를 함께 넣어 분야 용어를 더 정확하게 받아 적습니다.
실제 한국어 회의(5.2시간)로 잰 결과, 기본 모델 Qwen3-ASR-1.7B의 글자 오류율은 9.49%로 Whisper-large-v3-turbo(14.92%)보다 오류가 36% 적었습니다. 노트 제목과 메모의 낱말, 사전 단어를 함께 넣어 분야 용어를 더 정확하게 받아 적습니다.
아직 받지 않았습니다. 처음 열 때 "확인되지 않은 개발자" 경고가 나오면 시스템 설정 › 개인정보 보호 및 보안에서 '그래도 열기'를 누르세요. 자세한 내용은 설치 안내에 있습니다.