Commit Graph
56 Commits
Author SHA1 Message Date
Sanders ec0a134b5a Run workflow steps under bash (pipefail is sh-incompatible)
build-apk / build (push) Failing after 9m5s
Gitea Actions default shell is sh (dash), which rejects 'set -o pipefail'.
Add defaults.run.shell: bash so the version/release steps work.
2026-08-12 01:03:15 +03:00
Sanders 1c19f5a8e4 Only upload artifacts on master runs
build-apk / build (push) Failing after 3m6s
2026-08-12 01:01:59 +03:00
Sanders 468349e90c Auto-increment version and auto-create release on each master build
build-apk / build (push) Failing after 3m8s
- Compute next vX.Y.Z from the latest tag (patch bump) via Gitea API
- Pass it to flutter build via --build-name/--build-number so the APK
  versionName/versionCode always increase (installs update in place)
- Auto-create tag + Gitea release + upload both APKs on master runs only
- Verbose logging: version computed, built APK sizes, tag/release/asset results
- Drop the tag trigger: the auto-created tag would otherwise re-trigger the
  workflow (double builds / release conflicts)
2026-08-12 00:57:05 +03:00
Sanders 6f7ae57dd7 Only create releases for tags pointing at master
build-apk / build (push) Canceled after 4m12s
Guard the Create Gitea release step: fetch origin/master and compare with
the tagged commit; if the tag is not on master's tip, skip release creation
instead of publishing a release for a feature/dev branch.
2026-08-12 00:53:22 +03:00
Sanders 4e18000773 Use $GITHUB_TOKEN consistently in release curl calls
build-apk / build (push) Canceled after 2m1s
v1.0.0
2026-08-12 00:51:40 +03:00
Sanders 269f17ce66 Use upload-artifact@v3 — v4 not supported by Gitea Actions
build-apk / build (push) Successful in 11m37s
upload-artifact@v4 relies on the new @actions/artifact 2.x protocol and
fails on Gitea with GHESNotSupportedError. v3 uses the older artifact
API that Gitea implements.
2026-08-12 00:37:51 +03:00
Sanders 3943135397 Fix Gradle config crash when key.properties is absent
build-apk / build (push) Failing after 11m26s
signingConfigs.release was configured unconditionally, so even assembleDebug
failed at configuration time with 'getProperty(...) must not be null' on CI
(build-apk.yml restores the keystore only after the debug build). Guard the
release signing config on key.properties existence: debug builds proceed
unsigned, release builds still sign when the keystore is present.
2026-08-12 00:24:04 +03:00
Sanders b2c17ffaae ci: integration tests with DeepSeek key, release APK signing, auto-release on tags
build-apk / build (push) Failing after 11m34s
2026-08-11 23:48:02 +03:00
Sanders 5ed9cbfdde ci: use floating stable tag for flutter image
build-apk / build (push) Canceled after 6m1s
2026-08-11 23:42:31 +03:00
Sanders a3631bb2cc ci: bump flutter image to 3.44.0 (Dart 3.12+ for sdk ^3.12.0)
build-apk / build (push) Canceled after 1m6s
2026-08-11 23:41:39 +03:00
Sanders 5005b4d991 ci: install node in job container for JS actions (checkout/upload-artifact)
build-apk / build (push) Failing after 56s
2026-08-11 23:39:31 +03:00
Sanders eddbe19e2e ci: add Gitea Actions workflow to build debug APK on push
build-apk / build (push) Failing after 18m36s
2026-08-11 23:17:47 +03:00
Sanders 9d052e04ca Fix ios 2026-07-20 23:04:03 +03:00
SandersandClaude Opus 4.8 eed9164150 Add CompanionDevice watch pairing and store raw AI responses
Two fixes for the notification-parsing pipeline:

- CompanionDeviceManager pairing (DEVICE_PROFILE_WATCH -> COMPANION_DEVICE_WATCH
  role -> RECEIVE_SENSITIVE_NOTIFICATIONS) via a new platform channel in
  MainActivity.kt, companion_device_channel.dart and companion_access_controller,
  surfaced as a card in parsing settings. Lifts the system "Confidential"
  redaction that hid VTB/T-Bank notification text from the listener.

- raw_messages.ai_response: the model's raw completion content is now persisted
  (schema v4 + migration) and shown in the parsing log detail panel. Unlike
  draftJson it survives inbox sweeps and is filled even for partial/ignored
  outcomes.

flutter analyze: no issues.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 22:04:39 +03:00
SandersandClaude Fable 5 f2ed501ed4 Unify parse rules: one rule = condition + actions, autoApply toggle, v3 migration
- Drop ParseRuleKind from parse_rules (enum survives only in rule_candidates):
  a rule is now a condition (pattern + matchMode + optional txTypeGuard) plus
  any set of actions (merchantCanonical/categoryId/accountId) or isIgnore
- Field-wise resolution: findClassificationRule fills merchant/category,
  findAccountRule feeds the account resolver - one message may use both
- Per-rule autoApply toggle + ruleAutoApplyEnabled gate check; off -> Inbox
  with full prefill
- Dedup guard in ParseRulesRepositoryImpl.create: same condition updates or
  reactivates the existing row instead of inserting a duplicate
- ParsingPipeline.reapplyRulesToInbox: sweep app inbox cards on cached AI
  drafts after createRule/ignoreWithRule (zero tokens)
- Schema v2 -> v3 migration (drop kind, add auto_apply) + migration_v3_test
- Rework rule_editor_screen into a single unified form; update rules list,
  rule cards, source app detail, l10n strings, and tests

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 23:24:06 +03:00
SandersandClaude Opus 4.8 fdc5c14852 Move Inbox to a dedicated bottom-nav tab gated by parsing toggle
Replace the Inbox badge button in MonthHeader with a bottom-nav tab
(hidden when notification parsing is disabled). Redirect /inbox → /home
when parsing is off, register the Inbox shell branch unconditionally,
and add a settings action to the Inbox screen. Move the parsing tile to
the top of the profile screen so settings stay reachable when the tab
is hidden. Add tests for the nav tab visibility and inbox routing, plus
a release-install PowerShell helper that preserves app data.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 16:45:21 +03:00
SandersandClaude Opus 4.8 4f99b80169 Replace account_bindings with per-app default account; build analytics charts
Notification parsing:
- Drop the account_bindings table/DAO/repo/entity/controller/screen; account
  resolution now goes senderToAccount rule -> source_apps.defaultAccountId
  (trusted) -> global default (untrusted -> Inbox), via v1->v2 migration.
- Add defaultAccountId to source_apps; per-app settings consolidated into
  source_app_detail_screen (/settings/parsing/apps/:pkg).
- Inbox auto-learns an app default on first Confirm/CreateRule; account picker
  on the card instead of a disabled button; parse_error_labels extracted.

Analytics:
- Replace placeholder screen with fl_chart cards (chart_card, chart_theme,
  month_stepper, month_math domain helper); slim down habit_analysis_screen.

Android: add launcher icon (adaptive foreground + colors.xml) and app_name.

Tests: migration_v2, analytics (screen/month_math), AI retry, inbox
visibility; update resolver/gate/inbox suites for the new resolution path.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 00:09:12 +03:00
Sanders d8dc6efe0a Fix lang 2026-07-10 23:01:10 +03:00
SandersandClaude Opus 4.8 94c08a5a37 Add app launcher icon and app_name string resource
Set up flutter_launcher_icons to generate Android launcher icons from assets/icon/app_icon.png. Move the app label into a string resource (@string/app_name) with a debug-only "Kitty finances debug" override.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-10 22:55:51 +03:00
SandersandClaude Opus 4.8 da65bf6f8e Add per-app rules, transfer pairing, self-merchant flag, two-step onboarding
Notification parsing:
- Per-app parse rules (parse_rules.packageName; getEnabledForApp, NULL = legacy global)
- Transfer pairing: transfer_pair_matcher + transfer_pairing_blocklist table/dao/repo
- source_apps.selfMerchant flag (Ozon inbox rework: default account picker, suppress
  AI category prefill + rule suggestion)
- raw_messages.diagnostics dump captured under diagnostic-mode toggle
- Inbox card / settings / log UI reworks

Onboarding:
- Two-step flow (name -> first account); UserSeeder seeds categories only, no accounts

Schema bumped to v11; drop obsolete migration + mixed-merchant tests, add new coverage.
Add ios/ platform folder.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-10 22:49:04 +03:00
SandersandClaude Opus 4.8 1ac68c0eb1 Add "mixed merchant" marker for notification parsing
Introduce ParseRuleKind.mixedMerchant to flag merchants whose category
varies (Ozon, marketplaces). When set, the pipeline suppresses the
merchant→category rule suggestion in the Inbox so the card shows
"confirm once" instead of "Create rule". Inbox action "Categories vary"
creates the marker rule, removes any existing merchant→category rule and
observed candidate, and rewrites the draft cache without the suggestion.

Adds findMixedMerchantRule lookup, InboxController.markMerchantMixed,
localizations (en/ru), UI in inbox_card/rule_editor, and tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 18:56:50 +03:00
SandersandClaude Opus 4.8 1e15250c27 Add diagnostic mode for notification capture
When enabled, the native listener captures every post from monitored
apps (including empty/duplicate placeholders like "Конфиденциально")
and stores a full dump of key/postTime/visibility/flags/extras in the
new raw_messages.diagnostics column (schemaVersion 9), shown in the
parsing-log detail panel. Dedup is salted with postTime in this mode so
two distinct posts (placeholder then real-text update) both appear while
reboot redelivery still collapses. Toggle lives in parsing settings
(Android), synced to native via the ingest worker.

Also gate the parsing worker drain on the feature being enabled, with an
explicit re-drain when it is turned back on.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 00:17:50 +03:00
Sanders 6efc8cef0a Fix parse app 2026-06-28 00:39:09 +03:00
SandersandClaude Opus 4.8 ab66aebc5e Switch AI notification parsing from OpenRouter to DeepSeek API
Replace the OpenRouter HTTP client with a DeepSeek client:
- data/openrouter/ -> data/deepseek/; OpenRouterClient -> DeepSeekClient
  (+ DeepSeekCompletion / DeepSeek*Exception)
- base URL api.deepseek.com, drop OpenRouter-only headers
- DeepSeek has no strict json_schema: use response_format json_object
  and rely on the prompt for shape (ai_schema.dart removed)
- secure-storage key openrouter_api_key -> deepseek_api_key
- default model deepseek/deepseek-v4-flash -> deepseek-chat
- l10n strings, test dart-defines (DEEPSEEK_API_KEY/_TEST_MODEL), docs

Also bundles in-progress findBodyIgnoreRule (body-level ignore rules
applied before the AI call) already present in the working tree.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 00:23:38 +03:00
SandersandClaude Opus 4.8 76f301b758 Add native notification ingest and source-app allowlist
- Android NotificationListenerService plugin + queue store, MethodChannel
  bridge, and Flutter ingest worker / access controller
- source_apps allowlist (DAO, repo, settings + source_apps screen)
- schema v8 migration + decision_gate / dedup / draft_codec updates
- l10n strings and tests

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 00:08:18 +03:00
Sanders 209e5dd9c5 Fix parse app 2026-06-01 18:22:10 +03:00
Sanders bc3acb68e6 Fix parse pipeline 2026-06-01 18:04:04 +03:00
Sanders 6358c3e71b Add account bind 2026-06-01 17:51:25 +03:00
Sanders f1e9496865 Fix pie 2026-06-01 11:43:58 +03:00
SandersandClaude Opus 4.8 fe4165a97b Update CLAUDE.md to match current codebase
- Add notification_parsing feature to directory map; analytics no longer placeholder
- Fix schemaVersion 2 -> 6
- Update data model: transactions note->merchant + parsing/habit fields, settings.habitTrackingEnabled, accounts.isDefault, parsing tables
- Drop completed 'wire FAB' item from What's-left and renumber

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 11:21:25 +03:00
Sanders 512ea44192 Add habits 2026-06-01 10:58:38 +03:00
Sanders 7d7036c67e fix tests 2026-06-01 00:55:38 +03:00
Sanders 5dab1bd418 Stage 2 ai for sms 2026-05-31 16:40:13 +03:00
Sanders a2d94a1451 Stage ai for sms 1 2026-05-31 01:12:52 +03:00
Sanders 50d56b91d2 Stage ai for sms 2026-05-30 20:38:00 +03:00
Sanders 1286012dda Stage 1 sms 2026-05-30 15:02:32 +03:00
Sanders 054bef832b Stage 1 sms 2026-05-30 00:18:06 +03:00
Sanders e90554fd7a Add db for sms 2026-05-29 13:39:09 +03:00
Sanders f010bc08d8 Exclude design folder from git tracking 2026-05-29 13:07:08 +03:00
Sanders 5e97506d55 first plan 2026-05-29 12:26:56 +03:00
SandersandClaude Opus 4.7 0b4ae9cd2d Refresh CLAUDE.md to match current codebase state
Update feature directory map (mock data removed, presentation layers landed),
rewrite active-user section with redirect + UserSeeder flow, replace stale
priority list, and add Testing section capturing Fake-class pattern, drift
isNull conflict, and controller error handling convention.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 18:01:40 +03:00
Sanders 7bad68b311 Add accs 2026-05-28 17:27:11 +03:00
Sanders ad6d0f44bf Add accs 2026-05-28 17:27:06 +03:00
Sanders f8f14270bd Add categories 2026-05-28 16:08:16 +03:00
Sanders 3e0e591a57 Add data 2026-05-28 15:17:53 +03:00
Sanders 739ee363d3 Add add info 2026-05-28 11:53:26 +03:00
Sanders 46fbfd9da8 Add add trans 2026-05-28 00:27:51 +03:00
Sanders 8fe4245bd3 Add filter 2026-05-27 17:46:56 +03:00
Sanders 0284d491f5 fixes 2026-05-27 17:01:17 +03:00
Sanders 9e4f7ae751 fixes 2026-05-27 17:01:13 +03:00