From 30d51c952f8d8a92883fd904a0cee56d7320dd47 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Mon, 21 Sep 2026 13:41:59 +0900 Subject: [PATCH] chore(release): v1.4.0 Shortcuts gain several bindings per action, mouse buttons and a searchable picker, and the stored shortcut schema changes shape, so this is a minor bump. Existing shortcuts migrate on first launch. Play release notes state that this release carries no mobile feature changes; the work is desktop-only. --- CHANGELOG.md | 40 +++++++++++++++++++ apps/admin-swagger/openapi.json | 2 +- apps/admin/package.json | 2 +- apps/api-server/D3ROVoice.Api.csproj | 2 +- apps/desktop/package.json | 2 +- apps/mobile-rn/android/app/build.gradle | 4 +- .../ios/D3ROVoice.xcodeproj/project.pbxproj | 8 ++-- .../android/en-US/changelogs/1041000.txt | 1 + .../android/ko-KR/changelogs/1041000.txt | 1 + apps/mobile-rn/package-lock.json | 14 +++---- apps/mobile-rn/package.json | 2 +- apps/web/package.json | 2 +- apps/web/src/components/layout/sidebar.tsx | 2 +- apps/web/src/lib/desktop-release.ts | 4 +- package-lock.json | 20 +++++----- package.json | 2 +- packages/api-client/package.json | 2 +- packages/core/package.json | 2 +- packages/i18n/package.json | 2 +- packages/ui-native/package.json | 2 +- packages/ui/package.json | 2 +- release/product-version.json | 8 ++-- site/package-lock.json | 4 +- site/package.json | 2 +- site/src/release.ts | 4 +- 25 files changed, 89 insertions(+), 47 deletions(-) create mode 100644 apps/mobile-rn/metadata/android/en-US/changelogs/1041000.txt create mode 100644 apps/mobile-rn/metadata/android/ko-KR/changelogs/1041000.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index f3aaa8c..79f5eac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Cloud-optional backup (encrypted, opt-in) - Plugin system for custom pipelines +## [1.4.0] - 2026-09-21 + +### Added +- **Several shortcuts per action.** Every action now holds a list of bindings + instead of a single one, so a second (or third) shortcut can be added with the + `+` button and removed individually. +- **Mouse buttons as shortcuts.** Side buttons (back / forward) can be bound on + their own; right and middle click require a modifier. Left click cannot be + bound because it drives every on-screen interaction. Mouse events cannot be + swallowed, so a bound button still performs its original action — the settings + screen says so before the binding is saved. +- **Pick a key from a searchable list.** Besides pressing the key, a shortcut can + now be chosen from a grouped dropdown with a search box inside it, which also + makes keys reachable that are awkward to press while recording. +- **The history and command popups are rebindable.** `Ctrl+Shift+V` and + `Ctrl+Shift+C` were fixed in code and had no settings entry; they are now + ordinary actions. The voice command shortcut, which had never been exposed in + settings, is visible as well. + +### Fixed +- **Double-press hands-free never triggered.** Dictation and hands-free ship with + the same default key and are told apart by the double press, but shortcut + lookup stopped at the first match, so hands-free was unreachable in installed + builds. Both actions now receive the event and are split by press type. +- **Reserved system shortcuts could be assigned anyway.** The check compared + joined key names, so pressing the modifiers in a different order let `Ctrl+C` + and friends through. Combinations are now compared structurally. +- **Turning shortcuts off also killed the popup shortcuts permanently.** Disabling + global shortcuts released every registration in the process, including ones it + did not own, and re-enabling never restored them. +- **Enabling shortcuts after starting with them off left nothing bound.** +- **Shortcut labels were frozen in the language they were recorded in** and did not + follow the app language or platform conventions. They are now derived on display. +- **The dashboard caption indicator never reflected the real state** because the + event payload was stored instead of the state inside it. + +### Changed +- Shortcuts are stored as one list per action. Existing shortcuts are migrated + automatically on first launch; no reconfiguration is needed. + ## [1.3.7] - 2026-09-19 ### Fixed diff --git a/apps/admin-swagger/openapi.json b/apps/admin-swagger/openapi.json index 7d3d32e..48e374c 100644 --- a/apps/admin-swagger/openapi.json +++ b/apps/admin-swagger/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "D3RO-VOICE Admin API", "description": "Admin CRM Edge Functions for user management, subscription CRUD, payment history, and audit logs.", - "version": "1.3.7" + "version": "1.4.0" }, "servers": [ { diff --git a/apps/admin/package.json b/apps/admin/package.json index 7270b2a..2f364de 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/admin", - "version": "1.3.7", + "version": "1.4.0", "private": true, "description": "D3RO Voice Admin CRM — SaaS 관리 도구", "scripts": { diff --git a/apps/api-server/D3ROVoice.Api.csproj b/apps/api-server/D3ROVoice.Api.csproj index fb058c9..7d8757f 100644 --- a/apps/api-server/D3ROVoice.Api.csproj +++ b/apps/api-server/D3ROVoice.Api.csproj @@ -2,7 +2,7 @@ net10.0 - 1.3.7 + 1.4.0 enable enable diff --git a/apps/desktop/package.json b/apps/desktop/package.json index dc1f42f..04ccbec 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/desktop", - "version": "1.3.7", + "version": "1.4.0", "productName": "d3ro-voice", "description": "로컬 AI 음성 어시스턴트 (Electron)", "main": "./out/main/index.js", diff --git a/apps/mobile-rn/android/app/build.gradle b/apps/mobile-rn/android/app/build.gradle index b71db41..4f5db6f 100644 --- a/apps/mobile-rn/android/app/build.gradle +++ b/apps/mobile-rn/android/app/build.gradle @@ -151,8 +151,8 @@ def versionSettingsValid = configuredVersionName != null && configuredVersionName ==~ strictSemver && configuredVersionCodeValue != null && configuredVersionCodeValue <= 2100000000L -def resolvedVersionName = versionSettingsValid ? configuredVersionName : "1.3.7" -def resolvedVersionCode = versionSettingsValid ? configuredVersionCodeValue.toInteger() : 1031007 +def resolvedVersionName = versionSettingsValid ? configuredVersionName : "1.4.0" +def resolvedVersionCode = versionSettingsValid ? configuredVersionCodeValue.toInteger() : 1041000 def requiredReleaseSettings = [ D3RO_RELEASE_STORE_FILE: releaseStoreFilePath, diff --git a/apps/mobile-rn/ios/D3ROVoice.xcodeproj/project.pbxproj b/apps/mobile-rn/ios/D3ROVoice.xcodeproj/project.pbxproj index 24b59d2..abc4b24 100644 --- a/apps/mobile-rn/ios/D3ROVoice.xcodeproj/project.pbxproj +++ b/apps/mobile-rn/ios/D3ROVoice.xcodeproj/project.pbxproj @@ -257,7 +257,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1031007; + CURRENT_PROJECT_VERSION = 1041000; ENABLE_BITCODE = NO; INFOPLIST_FILE = D3ROVoice/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; @@ -265,7 +265,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.3.7; + MARKETING_VERSION = 1.4.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -287,14 +287,14 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1031007; + CURRENT_PROJECT_VERSION = 1041000; INFOPLIST_FILE = D3ROVoice/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.3.7; + MARKETING_VERSION = 1.4.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/apps/mobile-rn/metadata/android/en-US/changelogs/1041000.txt b/apps/mobile-rn/metadata/android/en-US/changelogs/1041000.txt new file mode 100644 index 0000000..3d0e2c1 --- /dev/null +++ b/apps/mobile-rn/metadata/android/en-US/changelogs/1041000.txt @@ -0,0 +1 @@ +Maintenance update. This release focuses on keyboard shortcuts in the desktop app; there are no mobile feature changes. diff --git a/apps/mobile-rn/metadata/android/ko-KR/changelogs/1041000.txt b/apps/mobile-rn/metadata/android/ko-KR/changelogs/1041000.txt new file mode 100644 index 0000000..156422d --- /dev/null +++ b/apps/mobile-rn/metadata/android/ko-KR/changelogs/1041000.txt @@ -0,0 +1 @@ +유지보수 업데이트입니다. 이번 변경은 데스크톱 앱의 단축키 기능에 집중되어 있으며, 모바일 앱의 기능 변경은 없습니다. diff --git a/apps/mobile-rn/package-lock.json b/apps/mobile-rn/package-lock.json index e3cbe30..e0f3dec 100644 --- a/apps/mobile-rn/package-lock.json +++ b/apps/mobile-rn/package-lock.json @@ -1,12 +1,12 @@ { "name": "@d3ro/mobile-rn", - "version": "1.3.7", + "version": "1.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@d3ro/mobile-rn", - "version": "1.3.7", + "version": "1.4.0", "dependencies": { "@d3ro/api-client": "file:../../packages/api-client", "@d3ro/core": "file:../../packages/core", @@ -62,7 +62,7 @@ }, "../..": { "name": "d3ro-voice-monorepo", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "workspaces": [ "apps/desktop", @@ -81,7 +81,7 @@ }, "../../packages/api-client": { "name": "@d3ro/api-client", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "dependencies": { "@d3ro/core": "*", @@ -98,7 +98,7 @@ }, "../../packages/core": { "name": "@d3ro/core", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "dependencies": { "docx": "^9.6.1" @@ -109,7 +109,7 @@ }, "../../packages/i18n": { "name": "@d3ro/i18n", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "devDependencies": { "@types/react": "^19.0.0" @@ -120,7 +120,7 @@ }, "../../packages/ui-native": { "name": "@d3ro/ui-native", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "devDependencies": { "@types/react": "*" diff --git a/apps/mobile-rn/package.json b/apps/mobile-rn/package.json index 81ef219..a7bf9a1 100644 --- a/apps/mobile-rn/package.json +++ b/apps/mobile-rn/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/mobile-rn", - "version": "1.3.7", + "version": "1.4.0", "private": true, "scripts": { "android": "react-native run-android", diff --git a/apps/web/package.json b/apps/web/package.json index 8fbf2a1..a8372a0 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/web", - "version": "1.3.7", + "version": "1.4.0", "private": true, "description": "D3RO Voice 웹 앱 — Next.js 기반 SaaS 인터페이스", "scripts": { diff --git a/apps/web/src/components/layout/sidebar.tsx b/apps/web/src/components/layout/sidebar.tsx index e4a0264..59d4d0b 100644 --- a/apps/web/src/components/layout/sidebar.tsx +++ b/apps/web/src/components/layout/sidebar.tsx @@ -139,7 +139,7 @@ export function Sidebar(): React.ReactElement { - v1.3.7 + v1.4.0 diff --git a/apps/web/src/lib/desktop-release.ts b/apps/web/src/lib/desktop-release.ts index 6a81fb6..89b9d34 100644 --- a/apps/web/src/lib/desktop-release.ts +++ b/apps/web/src/lib/desktop-release.ts @@ -4,10 +4,10 @@ // 설치 파일은 canonical Forgejo feed에서만 배포한다. 웹/사이트 빌드 산출물에는 // 설치 바이너리가 포함되지 않으므로 `/releases/...` 로컬 경로는 배포 환경에서 404다. -export const DESKTOP_VERSION = '1.3.7' +export const DESKTOP_VERSION = '1.4.0' /** 릴리스 게시일. `release/product-version.json`의 releaseDate와 같아야 한다. */ -export const DESKTOP_RELEASE_DATE = '2026-09-19' +export const DESKTOP_RELEASE_DATE = '2026-09-21' const FORGEJO_ORIGIN = 'https://git.chanpaca.net' const FORGEJO_OWNER = 'yunchan' diff --git a/package-lock.json b/package-lock.json index f6fa5a5..6a3d586 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "d3ro-voice-monorepo", - "version": "1.3.7", + "version": "1.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "d3ro-voice-monorepo", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "workspaces": [ "apps/desktop", @@ -25,7 +25,7 @@ }, "apps/admin": { "name": "@d3ro/admin", - "version": "1.3.7", + "version": "1.4.0", "dependencies": { "@d3ro/api-client": "*", "@d3ro/core": "*", @@ -109,7 +109,7 @@ }, "apps/desktop": { "name": "@d3ro/desktop", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "dependencies": { "@d3ro/core": "*", @@ -158,7 +158,7 @@ }, "apps/web": { "name": "@d3ro/web", - "version": "1.3.7", + "version": "1.4.0", "dependencies": { "@d3ro/api-client": "*", "@d3ro/core": "*", @@ -16861,7 +16861,7 @@ }, "packages/api-client": { "name": "@d3ro/api-client", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "dependencies": { "@d3ro/core": "*", @@ -16878,7 +16878,7 @@ }, "packages/core": { "name": "@d3ro/core", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "dependencies": { "docx": "^9.6.1" @@ -16889,7 +16889,7 @@ }, "packages/i18n": { "name": "@d3ro/i18n", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "devDependencies": { "@types/react": "^19.0.0" @@ -16900,7 +16900,7 @@ }, "packages/ui": { "name": "@d3ro/ui", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "dependencies": { "@d3ro/core": "*" @@ -16920,7 +16920,7 @@ }, "packages/ui-native": { "name": "@d3ro/ui-native", - "version": "1.3.7", + "version": "1.4.0", "license": "MIT", "devDependencies": { "@types/react": "*" diff --git a/package.json b/package.json index 5036316..0bb5c1e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "d3ro-voice-monorepo", - "version": "1.3.7", + "version": "1.4.0", "private": true, "description": "D3RO Voice — 멀티플랫폼 AI 음성 어시스턴트 (Monorepo)", "author": "D3RO", diff --git a/packages/api-client/package.json b/packages/api-client/package.json index e2f1b40..b936284 100644 --- a/packages/api-client/package.json +++ b/packages/api-client/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/api-client", - "version": "1.3.7", + "version": "1.4.0", "private": true, "description": "D3RO Voice API 클라이언트 — Supabase 래퍼 (web/desktop/mobile 공유)", "license": "MIT", diff --git a/packages/core/package.json b/packages/core/package.json index 9ce1b6d..d71be6b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/core", - "version": "1.3.7", + "version": "1.4.0", "private": true, "description": "D3RO Voice 공유 비즈니스 로직 — 타입, 에러, IPC 채널, 상수, 유틸", "license": "MIT", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 01c689e..7bf6bbe 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/i18n", - "version": "1.3.7", + "version": "1.4.0", "private": true, "description": "D3RO Voice 공유 i18n — 12개 locale, 타입 안전 키, Context, 포맷 유틸", "license": "MIT", diff --git a/packages/ui-native/package.json b/packages/ui-native/package.json index 352fd20..0f8f1f0 100644 --- a/packages/ui-native/package.json +++ b/packages/ui-native/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/ui-native", - "version": "1.3.7", + "version": "1.4.0", "private": true, "description": "D3RO Voice React Native DS — MetalCard/PhosphorText/Led/WaveBars etc.", "license": "MIT", diff --git a/packages/ui/package.json b/packages/ui/package.json index 8cc337b..72d3abc 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/ui", - "version": "1.3.7", + "version": "1.4.0", "private": true, "description": "D3RO Voice 공유 UI — 디자인 시스템 컴포넌트 + 테마 토큰 + CSS 변수 맵", "license": "MIT", diff --git a/release/product-version.json b/release/product-version.json index 253a35c..f9713a9 100644 --- a/release/product-version.json +++ b/release/product-version.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "version": "1.3.7", - "androidVersionCode": 1031007, - "iosBuildNumber": 1031007, - "releaseDate": "2026-09-19", + "version": "1.4.0", + "androidVersionCode": 1041000, + "iosBuildNumber": 1041000, + "releaseDate": "2026-09-21", "desktopLicensePublicKeyId": "5c52b765135ee2531c681b53cd4dc0e96fff8737f496c0b04ba8334fc81a887f" } diff --git a/site/package-lock.json b/site/package-lock.json index 4e3c001..888a381 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -1,12 +1,12 @@ { "name": "d3ro-voice-site", - "version": "1.3.7", + "version": "1.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "d3ro-voice-site", - "version": "1.3.7", + "version": "1.4.0", "dependencies": { "react": "^19.0.0", "react-dom": "^19.0.0" diff --git a/site/package.json b/site/package.json index 87c082a..b4b887c 100644 --- a/site/package.json +++ b/site/package.json @@ -1,7 +1,7 @@ { "name": "d3ro-voice-site", "private": true, - "version": "1.3.7", + "version": "1.4.0", "type": "module", "scripts": { "dev": "vite --port 5199 --host", diff --git a/site/src/release.ts b/site/src/release.ts index 910c795..ce03739 100644 --- a/site/src/release.ts +++ b/site/src/release.ts @@ -5,10 +5,10 @@ // NAS 배포는 바이너리를 포함하지 않으므로 `/releases/...` 같은 로컬 경로는 // 실제 배포 환경에서 404가 된다. -export const DESKTOP_VERSION = '1.3.7' +export const DESKTOP_VERSION = '1.4.0' /** 릴리스 게시일. `release/product-version.json`의 releaseDate와 같아야 한다. */ -export const DESKTOP_RELEASE_DATE = '2026-09-19' +export const DESKTOP_RELEASE_DATE = '2026-09-21' const FORGEJO_ORIGIN = 'https://git.chanpaca.net' const FORGEJO_OWNER = 'yunchan'