GGitHubchore(release): 2.8.1 (#278)
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: update changelog workflow to check PR merge status before generating changelog | 1 年前 | |
chore(release): 2.8.1 (#278) * chore(release): prepare 2.8.1 Hand-write the 2.8.1 changelog section relative to 2.7.3. The monorepo migration was squashed into a single commit, so git-cliff sees one entry for 596 commits; the section is curated from the pre-squash history and lists outcomes only, dropping fixes made within the same release cycle. Move changelog generation off CI: cliff.yml has been fully commented out for a while, and the workflow is replaced by a local git-cliff --prepend invocation documented in CLAUDE.md. Build the release APK for arm64 only, matching the abiFilters already set in the Android build. Claude-Session: https://claude.ai/code/session_01WJVLaszqF8FSo5hJexPePW * ci: automate the release flow behind tool/release.dart Run on develop: bump mobile/pubspec.yaml, prepend a git-cliff section to CHANGELOG.md for review, open the chore(release) PR and dispatch build.yml from the release branch, so the APK and the release are built before the PR is merged. Resolve the version from the pubspec instead of the latest tag, so the tag push and the dispatch paths agree, and take the release body from the matching CHANGELOG section instead of release-drafter, which counted PR labels from the previous tag and could not see commits pushed straight to develop. Merging the PR runs publish-release.yml, which undrafts the release at the squash commit. A draft carries no tag, so undrafting is what creates it, which keeps the tag off the pre-merge commit. Telegram is notified there too, since a release event raised by GITHUB_TOKEN starts no workflow. Claude-Session: https://claude.ai/code/session_01WJVLaszqF8FSo5hJexPePW | 10 天前 | |
ci(*): add flutter analyze workflow and dynamic flutter version support - Introduced a new workflow, `flutter-analyze.yml`, to perform Flutter code analysis. - Added dynamic Flutter version selection based on the `.fvmrc` file or defaulted to the latest stable version. - Modified the `build.yml` workflow to also use the dynamic Flutter version. - Added the installation of `jq` to read the Flutter version from `.fvmrc`. | 1 年前 | |
refactor: migrate to monorepo (#275) ## Breaking changes - Storage engine: Isar → SQLite (drift + FTS5). Legacy databases are migrated once through a forced startup gate (user-initiated, resumable, with a shareable failure log); the old Isar file is kept as a backup. Downgrading to 2.7.x is not supported. - Key-value storage: SharedPreferences → MMKV; the app-lock PIN and third-party API keys moved into the secure keystore (PIN stored as an Argon2id hash). Auto-sync is reset to off after the upgrade. - Mood: the 0..1 float becomes a 16-value emotion/state enum; the local sentiment model is gone, mood suggestions come from a local Qwen3 model. - Backup / archive format: new encrypted zip layout with envelope encryption (random DEK + keys.json), manifest v2 and a tombstone table. 2.7.x backups cannot be imported (a dedicated error explains why); the old JSON import/export is removed. - LAN sync protocol is 3; 2.8.0 peers are rejected at the handshake. - Diary position is now a reference to a saved place (placeId) instead of an inline snapshot; 2.8.0 → 2.8.1 migrates automatically. - Removed features: QR scan (moodiary_scan), the calendar / masonry / list home layouts (replaced by timeline and feed), the in-app font-size setting (follows the system), the start page and legal-document pages, the media tab (replaced by the Me tab), llama.cpp inference, the sync status sheet. - Platform floors: Flutter 3.47 / Dart 3.13, Android minSdk 26 → 28 (AGP 9.1, Gradle 9.3, built-in Kotlin), iOS deployment target 16.4 with SwiftPM only (CocoaPods removed). Desktop targets are removed from the app. ## Features Diary & home - Home rebuilt as a timeline layout plus a feed layout; categories become a filter dimension (chip bar + drawer) with custom ordering and diary sort. - Read-only preview by default with an edit toggle, writing pill (words / time / save), long-press multi-select with batch delete, decluttered card. - Meta header, links panel and first-line indent live inside the editor webview; wikilinks navigate through an in-page history instead of a route stack; per-diary ego graph and a full bidirectional-link knowledge graph page (Rust Barnes-Hut layout streamed to a CustomPainter). - Manual weather, saved places by reference, calendar under Me > Revisit with month paging, search ranked with BM25 . Editor & media - Editor: heading dropdown, body placeholder, optimistic image insert, image sizing slider with snap stops, video e controls, mobile undo/redo, route-aware focus restore, in-place document swap; custom fonts served from the editor b - Media library redesigned as a single sliver with chip filters; fullscreen image browser (swipe-dismiss, hero, save, ir huge originals (JPEG restart-marker random access, PNG / WebP / progressive JPEG tiles); originals are kept as-is with - Hand-rolled video player (state-machine core, brightness / volume drags, native fullscreen) replacing chewie; named synced MediaInfo table and a themed player page. - Picker: wechat_assets_picker with a custom camera, parallel asset fetch with native HEIF transcode. Sync, backup & export - One-way LAN sync with PIN pairing (Argon2id guess lockout) and local zip backup with restore-without-delete. - Sync engine: tombstone table, envelope encr optimisation, push on editor close, SyncRunner with connection health, lifecycle triggers and a sync console page e. - Import / export reworked: Markdown, DOCX and PDF (typst) writers, a fourth image writer rendered off-screen in Flutterle import, share as single-entry export. Assistant & local ML - Chat page rebuilt: two-form scroll list, inking effort levels with reasoning display, image input with per-model capability gating, token usage per round, s model-generated session titles, sessions grouped by date. - Providers split from models with per-model (completions / responses / messages) from the models.dev catalog; dsh-style agent presets with cross-provider - Layered prompt with long-term memory and auto compaction; batch tools with tiered approval; a JavaScript sandbox tool - Local RAG: sqlite-vec as a loadable extension, Qwen3 embedding on ONNX Runtime with a semantic index queue an tool; Qwen3 mood suggestion on auto-save; BYOM model download manager. UI & theme - mui design system on package:material_ui wi source of truth; lucide icon set; unified dialogs, bottom sheets, rounded menus, MInkWell press feedback, sliver sett bottom capsule; predictive-back with custom transitions. - Colour scheme reworked into grayscale / walt scale follows the system; custom fonts with variable-weight axes. - Full internationalisation on slang (app + m - New launcher icon and splash on both platforms; third-party licence page generated at build time (pub + cargo-about ## Fixes (final state) - Data safety on upgrade: search-index backfiase backup, plaintext migration backups purged, orphan-media cleanup guarded, legacy Isar handles closed and the 4 GiB ma - Sync: WebDAV 409 on nested collections, absence vs error in statObject, HeadBucket 403, partial re-encryption keeps stopped syncs no longer reported as complete, key envelopes never overwritten or destroyed on unreadable manicape the media directory rejected, restored diaries not re-deleted by the next sync, missing receiver media resent, pulledce. - Android TLS panic in the Rust HTTP client (bundled webpki roots). - Deleted diaries reappearing from tombstones on isolate capture; missed-event recovery for inline indexing. - Timestamps serialised as UTC and rendered i - Legacy content converters hardened against silent data loss; export converts by diary type instead of sniffing - EXIF orientation applied before re-encode; derivation gaps no longer delete media; alpha images no longer vanish - Editor undo/clear that never worked in release; audio recording file kept and waveform restored; orientation loc - Startup: hardened failure paths, immediate-lock observer restored, theme fallback when a custom font fails, biometri - Supply chain: the poisoned arrayref 0.3.10 removed from the lockfile. ## Internals - Repository restructured into a pub-workspace monorepo: 33 packages in four layers (foundation → core → feature_ba mobile composition root; direction enforced by tool/check_layers.dart. - Rust split into six native libraries built (cargokit removed): moodiary_rust (http / sync / llm / graph), fast_tokenizer, fast_image, fast_press (sli, fast_zip. Dio replaced by reqwest; shelf replaced by hyper. - DI on get_it + injectable; the container owpod keeps UI state only. Repositories throw exceptions instead of TaskEither. - Isar-era indexes rebuilt as PK-keyed postinn. - Test task runs only affected packages, serially; build hooks skip under flutter test. CI runs without caches. | 10 天前 | |
chore(release): 2.8.1 (#278) * chore(release): prepare 2.8.1 Hand-write the 2.8.1 changelog section relative to 2.7.3. The monorepo migration was squashed into a single commit, so git-cliff sees one entry for 596 commits; the section is curated from the pre-squash history and lists outcomes only, dropping fixes made within the same release cycle. Move changelog generation off CI: cliff.yml has been fully commented out for a while, and the workflow is replaced by a local git-cliff --prepend invocation documented in CLAUDE.md. Build the release APK for arm64 only, matching the abiFilters already set in the Android build. Claude-Session: https://claude.ai/code/session_01WJVLaszqF8FSo5hJexPePW * ci: automate the release flow behind tool/release.dart Run on develop: bump mobile/pubspec.yaml, prepend a git-cliff section to CHANGELOG.md for review, open the chore(release) PR and dispatch build.yml from the release branch, so the APK and the release are built before the PR is merged. Resolve the version from the pubspec instead of the latest tag, so the tag push and the dispatch paths agree, and take the release body from the matching CHANGELOG section instead of release-drafter, which counted PR labels from the previous tag and could not see commits pushed straight to develop. Merging the PR runs publish-release.yml, which undrafts the release at the squash commit. A draft carries no tag, so undrafting is what creates it, which keeps the tag off the pre-merge commit. Telegram is notified there too, since a release event raised by GITHUB_TOKEN starts no workflow. Claude-Session: https://claude.ai/code/session_01WJVLaszqF8FSo5hJexPePW | 10 天前 | |
refactor: migrate to monorepo (#275) ## Breaking changes - Storage engine: Isar → SQLite (drift + FTS5). Legacy databases are migrated once through a forced startup gate (user-initiated, resumable, with a shareable failure log); the old Isar file is kept as a backup. Downgrading to 2.7.x is not supported. - Key-value storage: SharedPreferences → MMKV; the app-lock PIN and third-party API keys moved into the secure keystore (PIN stored as an Argon2id hash). Auto-sync is reset to off after the upgrade. - Mood: the 0..1 float becomes a 16-value emotion/state enum; the local sentiment model is gone, mood suggestions come from a local Qwen3 model. - Backup / archive format: new encrypted zip layout with envelope encryption (random DEK + keys.json), manifest v2 and a tombstone table. 2.7.x backups cannot be imported (a dedicated error explains why); the old JSON import/export is removed. - LAN sync protocol is 3; 2.8.0 peers are rejected at the handshake. - Diary position is now a reference to a saved place (placeId) instead of an inline snapshot; 2.8.0 → 2.8.1 migrates automatically. - Removed features: QR scan (moodiary_scan), the calendar / masonry / list home layouts (replaced by timeline and feed), the in-app font-size setting (follows the system), the start page and legal-document pages, the media tab (replaced by the Me tab), llama.cpp inference, the sync status sheet. - Platform floors: Flutter 3.47 / Dart 3.13, Android minSdk 26 → 28 (AGP 9.1, Gradle 9.3, built-in Kotlin), iOS deployment target 16.4 with SwiftPM only (CocoaPods removed). Desktop targets are removed from the app. ## Features Diary & home - Home rebuilt as a timeline layout plus a feed layout; categories become a filter dimension (chip bar + drawer) with custom ordering and diary sort. - Read-only preview by default with an edit toggle, writing pill (words / time / save), long-press multi-select with batch delete, decluttered card. - Meta header, links panel and first-line indent live inside the editor webview; wikilinks navigate through an in-page history instead of a route stack; per-diary ego graph and a full bidirectional-link knowledge graph page (Rust Barnes-Hut layout streamed to a CustomPainter). - Manual weather, saved places by reference, calendar under Me > Revisit with month paging, search ranked with BM25 . Editor & media - Editor: heading dropdown, body placeholder, optimistic image insert, image sizing slider with snap stops, video e controls, mobile undo/redo, route-aware focus restore, in-place document swap; custom fonts served from the editor b - Media library redesigned as a single sliver with chip filters; fullscreen image browser (swipe-dismiss, hero, save, ir huge originals (JPEG restart-marker random access, PNG / WebP / progressive JPEG tiles); originals are kept as-is with - Hand-rolled video player (state-machine core, brightness / volume drags, native fullscreen) replacing chewie; named synced MediaInfo table and a themed player page. - Picker: wechat_assets_picker with a custom camera, parallel asset fetch with native HEIF transcode. Sync, backup & export - One-way LAN sync with PIN pairing (Argon2id guess lockout) and local zip backup with restore-without-delete. - Sync engine: tombstone table, envelope encr optimisation, push on editor close, SyncRunner with connection health, lifecycle triggers and a sync console page e. - Import / export reworked: Markdown, DOCX and PDF (typst) writers, a fourth image writer rendered off-screen in Flutterle import, share as single-entry export. Assistant & local ML - Chat page rebuilt: two-form scroll list, inking effort levels with reasoning display, image input with per-model capability gating, token usage per round, s model-generated session titles, sessions grouped by date. - Providers split from models with per-model (completions / responses / messages) from the models.dev catalog; dsh-style agent presets with cross-provider - Layered prompt with long-term memory and auto compaction; batch tools with tiered approval; a JavaScript sandbox tool - Local RAG: sqlite-vec as a loadable extension, Qwen3 embedding on ONNX Runtime with a semantic index queue an tool; Qwen3 mood suggestion on auto-save; BYOM model download manager. UI & theme - mui design system on package:material_ui wi source of truth; lucide icon set; unified dialogs, bottom sheets, rounded menus, MInkWell press feedback, sliver sett bottom capsule; predictive-back with custom transitions. - Colour scheme reworked into grayscale / walt scale follows the system; custom fonts with variable-weight axes. - Full internationalisation on slang (app + m - New launcher icon and splash on both platforms; third-party licence page generated at build time (pub + cargo-about ## Fixes (final state) - Data safety on upgrade: search-index backfiase backup, plaintext migration backups purged, orphan-media cleanup guarded, legacy Isar handles closed and the 4 GiB ma - Sync: WebDAV 409 on nested collections, absence vs error in statObject, HeadBucket 403, partial re-encryption keeps stopped syncs no longer reported as complete, key envelopes never overwritten or destroyed on unreadable manicape the media directory rejected, restored diaries not re-deleted by the next sync, missing receiver media resent, pulledce. - Android TLS panic in the Rust HTTP client (bundled webpki roots). - Deleted diaries reappearing from tombstones on isolate capture; missed-event recovery for inline indexing. - Timestamps serialised as UTC and rendered i - Legacy content converters hardened against silent data loss; export converts by diary type instead of sniffing - EXIF orientation applied before re-encode; derivation gaps no longer delete media; alpha images no longer vanish - Editor undo/clear that never worked in release; audio recording file kept and waveform restored; orientation loc - Startup: hardened failure paths, immediate-lock observer restored, theme fallback when a custom font fails, biometri - Supply chain: the poisoned arrayref 0.3.10 removed from the lockfile. ## Internals - Repository restructured into a pub-workspace monorepo: 33 packages in four layers (foundation → core → feature_ba mobile composition root; direction enforced by tool/check_layers.dart. - Rust split into six native libraries built (cargokit removed): moodiary_rust (http / sync / llm / graph), fast_tokenizer, fast_image, fast_press (sli, fast_zip. Dio replaced by reqwest; shelf replaced by hyper. - DI on get_it + injectable; the container owpod keeps UI state only. Repositories throw exceptions instead of TaskEither. - Isar-era indexes rebuilt as PK-keyed postinn. - Test task runs only affected packages, serially; build hooks skip under flutter test. CI runs without caches. | 10 天前 | |
refactor: migrate to monorepo (#275) ## Breaking changes - Storage engine: Isar → SQLite (drift + FTS5). Legacy databases are migrated once through a forced startup gate (user-initiated, resumable, with a shareable failure log); the old Isar file is kept as a backup. Downgrading to 2.7.x is not supported. - Key-value storage: SharedPreferences → MMKV; the app-lock PIN and third-party API keys moved into the secure keystore (PIN stored as an Argon2id hash). Auto-sync is reset to off after the upgrade. - Mood: the 0..1 float becomes a 16-value emotion/state enum; the local sentiment model is gone, mood suggestions come from a local Qwen3 model. - Backup / archive format: new encrypted zip layout with envelope encryption (random DEK + keys.json), manifest v2 and a tombstone table. 2.7.x backups cannot be imported (a dedicated error explains why); the old JSON import/export is removed. - LAN sync protocol is 3; 2.8.0 peers are rejected at the handshake. - Diary position is now a reference to a saved place (placeId) instead of an inline snapshot; 2.8.0 → 2.8.1 migrates automatically. - Removed features: QR scan (moodiary_scan), the calendar / masonry / list home layouts (replaced by timeline and feed), the in-app font-size setting (follows the system), the start page and legal-document pages, the media tab (replaced by the Me tab), llama.cpp inference, the sync status sheet. - Platform floors: Flutter 3.47 / Dart 3.13, Android minSdk 26 → 28 (AGP 9.1, Gradle 9.3, built-in Kotlin), iOS deployment target 16.4 with SwiftPM only (CocoaPods removed). Desktop targets are removed from the app. ## Features Diary & home - Home rebuilt as a timeline layout plus a feed layout; categories become a filter dimension (chip bar + drawer) with custom ordering and diary sort. - Read-only preview by default with an edit toggle, writing pill (words / time / save), long-press multi-select with batch delete, decluttered card. - Meta header, links panel and first-line indent live inside the editor webview; wikilinks navigate through an in-page history instead of a route stack; per-diary ego graph and a full bidirectional-link knowledge graph page (Rust Barnes-Hut layout streamed to a CustomPainter). - Manual weather, saved places by reference, calendar under Me > Revisit with month paging, search ranked with BM25 . Editor & media - Editor: heading dropdown, body placeholder, optimistic image insert, image sizing slider with snap stops, video e controls, mobile undo/redo, route-aware focus restore, in-place document swap; custom fonts served from the editor b - Media library redesigned as a single sliver with chip filters; fullscreen image browser (swipe-dismiss, hero, save, ir huge originals (JPEG restart-marker random access, PNG / WebP / progressive JPEG tiles); originals are kept as-is with - Hand-rolled video player (state-machine core, brightness / volume drags, native fullscreen) replacing chewie; named synced MediaInfo table and a themed player page. - Picker: wechat_assets_picker with a custom camera, parallel asset fetch with native HEIF transcode. Sync, backup & export - One-way LAN sync with PIN pairing (Argon2id guess lockout) and local zip backup with restore-without-delete. - Sync engine: tombstone table, envelope encr optimisation, push on editor close, SyncRunner with connection health, lifecycle triggers and a sync console page e. - Import / export reworked: Markdown, DOCX and PDF (typst) writers, a fourth image writer rendered off-screen in Flutterle import, share as single-entry export. Assistant & local ML - Chat page rebuilt: two-form scroll list, inking effort levels with reasoning display, image input with per-model capability gating, token usage per round, s model-generated session titles, sessions grouped by date. - Providers split from models with per-model (completions / responses / messages) from the models.dev catalog; dsh-style agent presets with cross-provider - Layered prompt with long-term memory and auto compaction; batch tools with tiered approval; a JavaScript sandbox tool - Local RAG: sqlite-vec as a loadable extension, Qwen3 embedding on ONNX Runtime with a semantic index queue an tool; Qwen3 mood suggestion on auto-save; BYOM model download manager. UI & theme - mui design system on package:material_ui wi source of truth; lucide icon set; unified dialogs, bottom sheets, rounded menus, MInkWell press feedback, sliver sett bottom capsule; predictive-back with custom transitions. - Colour scheme reworked into grayscale / walt scale follows the system; custom fonts with variable-weight axes. - Full internationalisation on slang (app + m - New launcher icon and splash on both platforms; third-party licence page generated at build time (pub + cargo-about ## Fixes (final state) - Data safety on upgrade: search-index backfiase backup, plaintext migration backups purged, orphan-media cleanup guarded, legacy Isar handles closed and the 4 GiB ma - Sync: WebDAV 409 on nested collections, absence vs error in statObject, HeadBucket 403, partial re-encryption keeps stopped syncs no longer reported as complete, key envelopes never overwritten or destroyed on unreadable manicape the media directory rejected, restored diaries not re-deleted by the next sync, missing receiver media resent, pulledce. - Android TLS panic in the Rust HTTP client (bundled webpki roots). - Deleted diaries reappearing from tombstones on isolate capture; missed-event recovery for inline indexing. - Timestamps serialised as UTC and rendered i - Legacy content converters hardened against silent data loss; export converts by diary type instead of sniffing - EXIF orientation applied before re-encode; derivation gaps no longer delete media; alpha images no longer vanish - Editor undo/clear that never worked in release; audio recording file kept and waveform restored; orientation loc - Startup: hardened failure paths, immediate-lock observer restored, theme fallback when a custom font fails, biometri - Supply chain: the poisoned arrayref 0.3.10 removed from the lockfile. ## Internals - Repository restructured into a pub-workspace monorepo: 33 packages in four layers (foundation → core → feature_ba mobile composition root; direction enforced by tool/check_layers.dart. - Rust split into six native libraries built (cargokit removed): moodiary_rust (http / sync / llm / graph), fast_tokenizer, fast_image, fast_press (sli, fast_zip. Dio replaced by reqwest; shelf replaced by hyper. - DI on get_it + injectable; the container owpod keeps UI state only. Repositories throw exceptions instead of TaskEither. - Isar-era indexes rebuilt as PK-keyed postinn. - Test task runs only affected packages, serially; build hooks skip under flutter test. CI runs without caches. | 10 天前 |