diff --git a/CHANGELOG.md b/CHANGELOG.md index 842a6d8..353c849 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,38 +13,6 @@ 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.2.0] - 2026-09-16 - -> Published from an annotated tag through CI. Installer and update metadata are -> served by the canonical Forgejo feed; no binaries are committed to this repository. - -### Added -- **Canonical desktop release channel**: desktop auto-update now reads one Forgejo Generic Package Registry feed, published by a version-agnostic publisher (`scripts/ci/publish-forgejo-release.mjs`) from tag-triggered Forgejo Actions, GitLab, and GitHub pipelines. The GitLab registry stays a legacy mirror for pre-Forgejo installs. -- **Update policy SSOT** (`release/update-policy.json`): channels (`latest`/`beta`/`alpha`), minimum supported version, forced install, full-installer thresholds, staged rollout percentage, and a remote kill switch, enforced at runtime by `apps/desktop/src/main/update-policy.ts`. -- **Dictionary import/export on desktop and web**: round-trip import with per-entry conflict reporting, a web dictionary client, and an expanded knowledge add form. -- **Multi-transport push delivery**: Web Push (VAPID) and token-based Apple Push (APNs) transports join Firebase Cloud Messaging, with a Cloudflare Worker cron drain over an outbox table. -- **Team activity feed**: team activity events, migration, and the web feed component. -- **Shared entitlement gating** in `@d3ro/core` for free/paid feature boundaries. -- **Infrastructure map** (`docs/map/`) documenting the infrastructure and feature status per platform, with an update protocol so feature work and the map stay in step. -- 21 unit tests for update policy decisions and feed helpers, plus tests for dictionary I/O, entitlements, push drain, Web Push, and APNs payloads. - -### Changed -- Desktop runtime updater feed moved from GitLab project 1172 to the canonical Forgejo registry; `electron-builder.yml`, the metadata verifier, and both CI publishers now enforce the canonical/mirror split. -- Release metadata verifier self-test expanded to negative cases covering the feed contract, policy schema, and Forgejo publisher invariants. -- The canonical publisher refuses to re-publish a version whose registry assets already hold different bytes, so a same-version re-release fails closed instead of overwriting a shipped installer. -- Landing site and web console download centers now link the canonical Forgejo feed instead of repository-local installer paths, which are not part of any deploy artifact. -- Admin console data views (models, pipelines, users, subscriptions, audit log) read live back-office data, with a unified sidebar and console theme. -- Desktop settings, ad surfaces, license, and meeting-export UI aligned on the shared theme tokens; meeting export filenames now go through one sanitizer. -- Developer-only automation, scratch captures, .NET build output, and Playwright run output left the release checkout. -- Product version moved to `1.2.0` with Android version code and iOS build number `1020001`. - -### Fixed -- Desktop configuration writes fail explicitly when the config store is unavailable instead of falling back to a throwaway in-memory store. -- Speech provider and model failures reach the UI as errors instead of surfacing as empty transcriptions. -- Removed the Forgejo release-publishing prohibition; the legacy hardcoded-version script is replaced by a version-gated publisher. -- Dropped a stale admin bundle from the API server web root. -- Mobile team, meeting, memo, template, command, and dictionary screens follow the server contract, and report submission no longer hangs without confirming to the user. - ## [1.1.0] - 2026-08-29 ### Added @@ -54,6 +22,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Generated-content safety controls**: added generation receipts, shared generative-AI safety instructions, and an authenticated report flow for owned AI-generated meeting documents. - **Release verification tooling**: added Android artifact, App Links, production Firebase/AdMob configuration, Play asset, secret scanning, signed provenance, and publication-boundary checks. - **Complete mobile icon set**: added canonical Android legacy/adaptive/monochrome launchers, the 512px Play icon, and all required iPhone, iPad, and App Store marketing icon slots. +- **Canonical desktop release channel**: desktop auto-update now reads one Forgejo Generic Package Registry feed, published by a version-agnostic publisher (`scripts/ci/publish-forgejo-release.mjs`) from a tag-triggered Forgejo Actions workflow. GitLab CI and GitHub Actions converge on the same publisher, and the GitLab registry stays a legacy mirror for pre-Forgejo installs. +- **Update policy SSOT** (`release/update-policy.json`): channels (`latest`/`beta`/`alpha`), minimum supported version, forced install, full-installer thresholds, staged rollout percentage, and a remote kill switch, enforced at runtime by `apps/desktop/src/main/update-policy.ts`. +- **Dictionary import/export on desktop and web**: round-trip import with per-entry conflict reporting, a web dictionary client, and an expanded knowledge add form. +- **Multi-transport push delivery**: Web Push (VAPID) and token-based Apple Push (APNs) transports join Firebase Cloud Messaging, with a Cloudflare Worker cron drain over an outbox table. +- **Team activity feed**: team activity events, migration, and the web feed component. +- **Shared entitlement gating** in `@d3ro/core` for free/paid feature boundaries. +- 21 unit tests for update policy decisions and feed helpers, plus tests for dictionary I/O, entitlements, push drain, Web Push, and APNs payloads. ### Changed - Unified mobile authentication and invitation links on the canonical `d3ro-voice` app scheme and added fail-closed verification for the HTTPS App Links contract. @@ -64,6 +39,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Finalized benchmarked `ko-KR`/`en-US` Play listing copy and a Console-previewed 1024×500 canonical feature graphic with preserved generation prompt, source, output, and hashes. +- Desktop runtime updater feed moved from GitLab project 1172 to the canonical + Forgejo registry; `electron-builder.yml`, the metadata verifier, and both CI + publishers now enforce the canonical/mirror split. +- Release metadata verifier self-test expanded to 13 negative cases covering the + feed contract, policy schema, and Forgejo publisher invariants. +- Landing site and web console download centers now link the canonical Forgejo feed + instead of repository-local installer paths, which are not part of any deploy + artifact. +- Admin console data views (models, pipelines, users, subscriptions, audit log) read + live back-office data, with a unified sidebar and console theme. +- Desktop settings, ad surfaces, license, and meeting-export UI aligned on the shared + theme tokens; meeting export filenames now go through one sanitizer. ### Security - Added atomic authorization and replay protection for teams, invitations, push delivery, transcription quotas, billing, ad rewards, administrative actions, data portability, and content reports. @@ -75,6 +62,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Corrected realtime Edge Function model routing and type checks for team and enterprise tiers. - Removed the legacy `d3ro://` deep-link surface to prevent divergent authentication callback identities. +- Removed the Forgejo release-publishing prohibition; the legacy hardcoded-version + script is replaced by a version-gated publisher. +- Dropped a stale admin bundle from the API server web root, and stopped tracking + .NET build output, Playwright run output, and developer-only automation scripts in + the release checkout. ## [0.2.1-alpha] - 2026-07-22 diff --git a/apps/admin-swagger/openapi.json b/apps/admin-swagger/openapi.json index 140aded..385711a 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.2.0" + "version": "1.1.0" }, "servers": [ { diff --git a/apps/admin/package.json b/apps/admin/package.json index 74e1de4..c1e58ae 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/admin", - "version": "1.2.0", + "version": "1.1.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 c62425c..d7685cf 100644 --- a/apps/api-server/D3ROVoice.Api.csproj +++ b/apps/api-server/D3ROVoice.Api.csproj @@ -2,7 +2,7 @@ net10.0 - 1.2.0 + 1.1.0 enable enable diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 376115a..ebf4195 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/desktop", - "version": "1.2.0", + "version": "1.1.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 8f1c98a..76c9498 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.2.0" -def resolvedVersionCode = versionSettingsValid ? configuredVersionCodeValue.toInteger() : 1020001 +def resolvedVersionName = versionSettingsValid ? configuredVersionName : "1.1.0" +def resolvedVersionCode = versionSettingsValid ? configuredVersionCodeValue.toInteger() : 1010001 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 2eaba84..cd5c985 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 = 1020001; + CURRENT_PROJECT_VERSION = 1010001; ENABLE_BITCODE = NO; INFOPLIST_FILE = D3ROVoice/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; @@ -265,7 +265,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.1.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -287,14 +287,14 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1020001; + CURRENT_PROJECT_VERSION = 1010001; INFOPLIST_FILE = D3ROVoice/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.0; + MARKETING_VERSION = 1.1.0; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/apps/mobile-rn/metadata/android/en-US/changelogs/1020001.txt b/apps/mobile-rn/metadata/android/en-US/changelogs/1020001.txt deleted file mode 100644 index 7750638..0000000 --- a/apps/mobile-rn/metadata/android/en-US/changelogs/1020001.txt +++ /dev/null @@ -1 +0,0 @@ -Team, meeting, memo, template, command, and dictionary screens now use server responses directly, so lists and edits stay in sync. Reporting a generated document confirms completion instead of hanging. \ No newline at end of file diff --git a/apps/mobile-rn/metadata/android/ko-KR/changelogs/1020001.txt b/apps/mobile-rn/metadata/android/ko-KR/changelogs/1020001.txt deleted file mode 100644 index 0961c21..0000000 --- a/apps/mobile-rn/metadata/android/ko-KR/changelogs/1020001.txt +++ /dev/null @@ -1 +0,0 @@ -팀·회의·메모·템플릿·명령·사전 화면이 서버 응답을 그대로 사용해 목록과 수정 내용이 어긋나지 않습니다. 생성 문서 신고가 멈추지 않고 완료 확인을 표시합니다. \ No newline at end of file diff --git a/apps/mobile-rn/package-lock.json b/apps/mobile-rn/package-lock.json index 6d68878..c274b58 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.2.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@d3ro/mobile-rn", - "version": "1.2.0", + "version": "1.1.0", "dependencies": { "@d3ro/api-client": "file:../../packages/api-client", "@d3ro/core": "file:../../packages/core", @@ -62,7 +62,7 @@ }, "../..": { "name": "d3ro-voice-monorepo", - "version": "1.2.0", + "version": "1.1.0", "license": "MIT", "workspaces": [ "apps/desktop", @@ -81,7 +81,7 @@ }, "../../packages/api-client": { "name": "@d3ro/api-client", - "version": "1.2.0", + "version": "1.1.0", "license": "MIT", "dependencies": { "@d3ro/core": "*", @@ -98,7 +98,7 @@ }, "../../packages/core": { "name": "@d3ro/core", - "version": "1.2.0", + "version": "1.1.0", "license": "MIT", "dependencies": { "docx": "^9.6.1" @@ -109,7 +109,7 @@ }, "../../packages/i18n": { "name": "@d3ro/i18n", - "version": "1.2.0", + "version": "1.1.0", "license": "MIT", "devDependencies": { "@types/react": "^19.0.0" @@ -120,7 +120,7 @@ }, "../../packages/ui-native": { "name": "@d3ro/ui-native", - "version": "1.2.0", + "version": "1.1.0", "license": "MIT", "devDependencies": { "@types/react": "*" diff --git a/apps/mobile-rn/package.json b/apps/mobile-rn/package.json index 7ea08ee..25f1180 100644 --- a/apps/mobile-rn/package.json +++ b/apps/mobile-rn/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/mobile-rn", - "version": "1.2.0", + "version": "1.1.0", "private": true, "scripts": { "android": "react-native run-android", diff --git a/apps/web/package.json b/apps/web/package.json index c6cbf8b..48b54a6 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/web", - "version": "1.2.0", + "version": "1.1.0", "private": true, "description": "D3RO Voice 웹 앱 — Next.js 기반 SaaS 인터페이스", "scripts": { diff --git a/apps/web/src/app/download/page.tsx b/apps/web/src/app/download/page.tsx index 1135786..1b5cbb1 100644 --- a/apps/web/src/app/download/page.tsx +++ b/apps/web/src/app/download/page.tsx @@ -24,7 +24,6 @@ import { DESKTOP_FEED_URL, DESKTOP_RELEASE_HUB_URL, DESKTOP_RELEASES_URL, - DESKTOP_RELEASE_DATE, DESKTOP_VERSION, DESKTOP_WINDOWS_INSTALLER_FILENAME, DESKTOP_WINDOWS_INSTALLER_URL, @@ -540,7 +539,7 @@ export default function DownloadPage(): React.ReactElement { fontWeight: 500, }} /> - {DESKTOP_RELEASE_DATE} + 2026-08-29