Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
199 commits
Select commit Hold shift + click to select a range
404c2e3
fix: add missed mock MicrophoneStatusBloc for screenshot builds (#806)
SERDUN Dec 15, 2025
d50fd88
fix: change ice in media settings to abbreviation (#807)
OMaudza Dec 19, 2025
2724c6f
fix: restore contact name display from phone number lookup (#805)
OMaudza Dec 19, 2025
32339a5
fix: fixed not showing Google contacts in Android (#813)
OMaudza Dec 22, 2025
7c58ea1
fix: prevent forcing speakerphone when headphones are connected on iO…
SERDUN Dec 22, 2025
77cbb91
feat: introduce configurable theme images with alignment and fit (#810)
SERDUN Dec 22, 2025
f73b2cb
feat: add background support to screen styles using ThemedScaffold (#…
SERDUN Dec 23, 2025
5cebf09
refactor: remove extension for external contact (#816)
OMaudza Dec 24, 2025
ec19c40
feat: extend AppBar and TabBar theming via config-driven factories (#…
SERDUN Dec 24, 2025
573f1f8
refactor: unify AppBar config mapping and update TabBarConfig JSON mo…
SERDUN Dec 26, 2025
d00751f
fix: not available media (#817)
OMaudza Dec 26, 2025
d9713a2
feat: add themed SettingsScreen styles and support item iconColor (#819)
SERDUN Dec 26, 2025
c701eef
fix: harden Firebase background message handling and error reporting …
SERDUN Dec 26, 2025
41a862a
fix: await Crashlytics error reporting in background handler (#821)
SERDUN Dec 26, 2025
5a0671f
feat: unknown sdp profiles filter (#822)
digiboridev Dec 30, 2025
5c0495b
fix: sdp profiles filter hotfix (#824)
digiboridev Dec 30, 2025
85e0c54
refactor: clarify camera soft-mute strategy and RecvOnly limitation (…
SERDUN Dec 30, 2025
c32d5fd
fix: hide initial online snackbar (#826)
digiboridev Dec 30, 2025
7cf1cde
feat: conversation screen title align (#825)
digiboridev Dec 30, 2025
e0217fc
refactor: improve local camera preview overlay UI (#827)
SERDUN Dec 30, 2025
74adc67
refactor: styled chat messages improvements (#828)
digiboridev Dec 30, 2025
9551d3e
fix: stabilize draggable thumbnail by tracking offset state (#831)
SERDUN Dec 31, 2025
a880cf1
feat: auto-hide call controls with compact mode controller (#829)
SERDUN Dec 31, 2025
6412d1d
feat: add remote video fit toggle and blurred background (#830)
SERDUN Dec 31, 2025
7a083f4
refactor(mesaging): better space reuse (#832)
digiboridev Dec 31, 2025
3ececb4
chore: sync generated localizations mapper (#834)
SERDUN Dec 31, 2025
e8f6647
fix: emit state update when toggling existing video track (#833)
SERDUN Dec 31, 2025
78572ce
fix: fix not selectable slider value (#838)
OMaudza Jan 2, 2026
2666b91
fix: fix core version label (#835)
OMaudza Jan 2, 2026
683bf44
fix: messaging push notifications (#841)
digiboridev Jan 5, 2026
8e08a34
refactor: single DB creation point for isolates + lifecycle holder + …
SERDUN Jan 5, 2026
60f5b95
fix: fixed non-alphabetic contacts ordering (#808)
OMaudza Jan 5, 2026
74506bc
fix fix changing info icon color (#836)
OMaudza Jan 5, 2026
70f2a7c
fix: enable WAL + busy_timeout and add isolate DB concurrency stress …
SERDUN Jan 5, 2026
2847168
fix: fixed wrong ordering of recent calls (#845)
OMaudza Jan 6, 2026
71c3a95
fix: fixed label recent calls (#839)
OMaudza Jan 7, 2026
3cef9b9
refactor: centralize contact synchronization logic in repository laye…
SERDUN Jan 7, 2026
71dfe61
fix: close menu section on opening other (#837)
OMaudza Jan 7, 2026
6915903
refactor: centralize local contact phone number sanitization in Conta…
SERDUN Jan 7, 2026
39c0527
chore: sync translations and regenerate localizations (#847)
SERDUN Jan 7, 2026
b2c303a
fix: presence params in group add dialog (#848)
digiboridev Jan 7, 2026
12be9da
fix: ensure auto-compact mode only triggers for the current active ca…
SERDUN Jan 8, 2026
ccebe4b
refactor: connectivity check (#853)
digiboridev Jan 9, 2026
7a0c424
fix: presence indicator empty color (#854)
digiboridev Jan 9, 2026
dfd6080
fix: external contacts sync kind overwrite (#850)
digiboridev Jan 9, 2026
4e76719
fix: chat appbar name doubling (#851)
digiboridev Jan 9, 2026
26aca00
refactor: hide personal data and actualize code in dialog info (#852)
digiboridev Jan 9, 2026
9d3180b
fix: presence settings presets style (#855)
digiboridev Jan 9, 2026
f811dd8
fix: missed contact kind commit (#856)
digiboridev Jan 9, 2026
665cde9
fix: presence settings hint clip (#857)
digiboridev Jan 9, 2026
289f672
refactor: contact presence view (#859)
digiboridev Jan 9, 2026
9808b13
feat: add draggable thumbnail overlay manager and local camera previe…
SERDUN Jan 9, 2026
8301677
refactor: use semantic naming (portrait/auto) and optimize utils (#860)
SERDUN Jan 13, 2026
710a8ad
feat: respect system auto-rotate setting in auto mode (#861)
SERDUN Jan 15, 2026
33518ba
chore: fix pubspec build number length (#863)
SERDUN Jan 15, 2026
21537af
fix: stabilize error group id and extract DiagnosticType labels (#868)
SERDUN Jan 21, 2026
da5a36b
fix: change ice in media settings to abbreviation (#869)
OMaudza Jan 21, 2026
7a81e02
fix: add additional check for setting source object (#866)
OMaudza Jan 21, 2026
290ee49
fix: fixed delaying when updating seen status (#867)
OMaudza Jan 22, 2026
bd4f626
refactor: move common isolate logic into SignalingManager (#873)
SERDUN Jan 23, 2026
817ce37
feat: add call log event lookup and incoming video SDP helper extensi…
SERDUN Jan 23, 2026
f3ff9b4
feat: show missed call notification and log call from isolate hangup …
SERDUN Jan 23, 2026
38aac8a
refactor: rename isolate manager callbacks/services for clarity and u…
SERDUN Jan 23, 2026
75449a8
refactor: remove deprecated performSetSpeaker stub from CallBloc (#878)
SERDUN Jan 26, 2026
00377c6
fix: improve list separation and multi-select deletion UX (#880)
SERDUN Jan 26, 2026
25d51de
chore: remove AppBlocObserver wiring (#881)
SERDUN Jan 27, 2026
69c35d1
feat: add LoggerPretty extension with chunking and safe formatting (#…
SERDUN Jan 27, 2026
dcdd2f9
feat: enhance PeerConnectionManager with RTP traffic monitoring, disp…
SERDUN Jan 27, 2026
f2f6a15
fix: reset iOS audio route on call session start/end to prevent stick…
SERDUN Jan 27, 2026
e61323a
refactor: migrate FeatureAccess from *Feature to *Config with mappers…
SERDUN Jan 27, 2026
7ffbd56
feat: implement configurable call actions in chat contact info (#883)
SERDUN Jan 27, 2026
5b887a2
refactor(messaging): conversations screen improvements (#884)
digiboridev Jan 27, 2026
fd445f9
chore: remove unused PendingCall subscription cleanup (#888)
SERDUN Jan 28, 2026
f7956e0
fix: evaluate feature flag dynamically in FeatureGuard (#886)
SERDUN Jan 28, 2026
2d9b950
refactor: make configs equatable for reliable state comparison (#887)
SERDUN Jan 28, 2026
08fdebb
refactor: make FeatureAccess reactive to SystemInfo changes via Strea…
SERDUN Jan 28, 2026
5a92246
fix: audio device button interaction and visual selection state (#889)
SERDUN Jan 28, 2026
e7efec6
refactor: improve voicemail audio playback stability and error handli…
SERDUN Jan 28, 2026
f11c8e5
fix: handle session_missing error explicitly (#891)
SERDUN Jan 29, 2026
f8575b6
chore: disable overwrite and reviewed flags on upload (#892)
SERDUN Jan 29, 2026
abe502f
fix: solve "sticky speaker" issue by localizing audio state (#895)
SERDUN Jan 29, 2026
9f629a3
fix: prevent duplicate outgoing calls using hybrid event transformer …
SERDUN Jan 29, 2026
99ba9e4
fix: expand small touch target size for menu button (#894)
OMaudza Jan 29, 2026
d33dfcb
refactor: cache CallBloc to avoid unsafe context access (#899)
SERDUN Jan 30, 2026
d472357
chore: sync lockfiles and regenerate localization mappers (#900)
SERDUN Jan 30, 2026
586d321
fix: prioritize config color for avatar initials (#901)
SERDUN Jan 30, 2026
f904ab2
style: apply initials text color to loading and placeholder icons (#902)
SERDUN Jan 30, 2026
4b07917
feat: support initial expansion state in MediaSettingsScreen (#903)
SERDUN Feb 2, 2026
e5c34c7
fix: media settings panel color (#906)
SERDUN Feb 2, 2026
04fdf3a
feat: implement ProgressIndicatorThemeData with Material 3 surface ma…
SERDUN Feb 2, 2026
3985467
fix: correct foreground color for app bar actions (#908)
SERDUN Feb 2, 2026
35b5c82
refactor(messaging): enhance GroupAvatar styling and logic (#910)
SERDUN Feb 3, 2026
405731d
chore(lefthook): move heavy checks to pre-push and add format check (…
SERDUN Feb 3, 2026
ab7776e
feat: implement declarative screen styling and theme override system …
SERDUN Feb 3, 2026
e8b5c97
fix: revert changes in bottom_menu_feature.dart (#913)
SERDUN Feb 3, 2026
ee8ad6f
fix: fixed formatting on about screen (#905)
OMaudza Feb 4, 2026
42543b8
fix: fixed contacts ordering (#904)
OMaudza Feb 4, 2026
7c7a4e7
feat: implement feature configuration system and unified dark theme s…
SERDUN Feb 4, 2026
0d2c08f
refactor: standardize theme mode types and naming (#915)
SERDUN Feb 4, 2026
e33325d
refactor: utilize ThemeProvider in ThemedScaffold for consistent over…
SERDUN Feb 4, 2026
06a3b08
fix: support dark mode in screenshot generation (#918)
SERDUN Feb 4, 2026
9216d6f
fix: remove hardcoded colors to allow context-based inheritance (#917)
SERDUN Feb 4, 2026
5294ae4
refactor: migrate login screens to ThemedScaffold and enhance styling…
SERDUN Feb 4, 2026
161dcf0
fix: polish theming and fix active call overlay (#920)
SERDUN Feb 6, 2026
6c2502a
refactor: sync localizely keys and update plural logic (#921)
SERDUN Feb 6, 2026
830e5bb
refactor(app): implement safe teardown sequence for user logout (#922)
SERDUN Feb 6, 2026
2b93ae6
feat: Implement dynamic styling for LoginSwitch segmented button (#925)
SERDUN Feb 9, 2026
746086b
refactor: convert CallPopupMenuButton to StatelessWidget and disable …
SERDUN Feb 9, 2026
ef536a0
refactor: replace custom tab buttons with standard TabBar and add unr…
SERDUN Feb 10, 2026
18f5d19
fix(theme): propagate defaultFontFamily to theme factories (#926)
SERDUN Feb 10, 2026
5e8b7ea
fix(contacts): prevent race condition in LocalContactsSyncBloc during…
SERDUN Feb 11, 2026
9006737
refactor: re-engineer actionpad styling to semantic roles (#928)
SERDUN Feb 11, 2026
57f37e3
fix(call): increase monitor interval to optimize log quota (#929)
SERDUN Feb 12, 2026
1d32f7c
feat: enhance RemoteConfigService with snapshots and stream support (…
SERDUN Feb 13, 2026
ab19383
feat: dynamic RTP traffic monitoring interval and configuration synch…
SERDUN Feb 13, 2026
ec99d04
feat: generalize emergency reboot logic and refine diagnostic reporti…
SERDUN Feb 13, 2026
eafc236
refactor: add controller to HistoryAutocompleteField for manual histo…
SERDUN Feb 16, 2026
524521a
feat: migrate system notifications and SIP presence to supported feat…
SERDUN Feb 16, 2026
fcba2e9
fix: collect outbound rtp stats (#937)
digiboridev Feb 17, 2026
a508548
fix: description for Media encoding configs (#938)
OMaudza Feb 18, 2026
376a636
fix(call): preserve widget context during auto-compact transition (#939)
SERDUN Feb 18, 2026
8562a61
fix: fixed localization issues in network settings (#936)
OMaudza Feb 18, 2026
4865d1c
chore: actualize l10n code generation (#940)
SERDUN Feb 18, 2026
f9150fb
chore: actualize configurations (#942)
SERDUN Feb 19, 2026
b9e9c33
chore: implement modular rules system (#943)
SERDUN Feb 19, 2026
604b102
chore: implement modular rules system and copilot instructions (#946)
SERDUN Feb 19, 2026
4eb3243
feat: add theme switching settings (#951)
SERDUN Feb 19, 2026
b49eb54
feat: remote cli settings (#944)
digiboridev Feb 19, 2026
46ab63e
feat: support metadata for missed call display name in isolate (#953)
SERDUN Feb 20, 2026
3853446
feat(call): override _onNoActiveLines in PushNotificationIsolateManag…
SERDUN Feb 20, 2026
f3c53a1
chore: ai agent pipeline refinement (#954)
SERDUN Feb 20, 2026
ba2170c
fix: user id migration (#960)
digiboridev Feb 23, 2026
938698b
refactor: replace SupportedMonitorConfig with SupportedLoggingConfig …
SERDUN Feb 23, 2026
fafec9a
chore: update Flutter to 3.41.2 and suppress experimental_member_use …
SERDUN Feb 23, 2026
b593eea
chore: add claude code team settings (#965)
SERDUN Feb 23, 2026
50b4983
fix: remove unused import in messaging_shell.dart (#966)
SERDUN Feb 23, 2026
bc51beb
fix(settings): add optimistic toggle with spinner for register status…
SERDUN Feb 23, 2026
b0e2c7c
fix: skip static payloads sanitizing if no rtpmap (#968)
digiboridev Feb 23, 2026
5e85c88
fix: media preset translation (#969)
digiboridev Feb 23, 2026
0b2ff35
fix: fix splash config generation and add android_12 image support (#…
OMaudza Feb 23, 2026
fb8a33d
chore: add diagnostic logging for recents number mismatch (#970)
SERDUN Feb 24, 2026
39e308f
feat: add support a blurred appbar surface (#971)
SERDUN Feb 25, 2026
e043449
feat(screenshots): make IgnorePointer configurable in ScreenshotApp (…
SERDUN Feb 25, 2026
263d7be
feat: add screenshot mocks and docs for all features (#973)
SERDUN Feb 25, 2026
33e77dc
feat: update keystores path to new applications subdirectory (#974)
SERDUN Feb 26, 2026
741fb57
feat: add text style background decoration support (#975)
SERDUN Feb 26, 2026
3761b60
feat: update theme template configs with missing components and fixes…
SERDUN Feb 26, 2026
0017eab
refactor: replace deprecated GradientColorsConfig with PageBackground…
SERDUN Mar 2, 2026
32e39db
feat: appBar blurred surface config and theme updates (#979)
SERDUN Mar 2, 2026
671210a
fix: system back button blocked in EmbeddedRequestErrorDialog (#935)
OMaudza Mar 2, 2026
dda8a73
fix: prevent keepalive write-after-close and harden transaction lifec…
OMaudza Mar 2, 2026
3df37a3
fix: fixed app is locked in Bluetooth call profile after first call (…
OMaudza Mar 3, 2026
85c53fb
feat: add melos v7 integration (#980)
SERDUN Mar 3, 2026
77ac0d9
fix: reverse date divider in chat (#983)
OMaudza Mar 3, 2026
7c661ba
feat: claude code setup (#981)
SERDUN Mar 3, 2026
25992e7
feat: configure gitignore, formatter, and analysis for generated file…
SERDUN Mar 4, 2026
d3fe378
feat: allow feat/ as valid branch prefix alongside feature/ (#987)
SERDUN Mar 4, 2026
9a8ed3a
feat: favorites remote syncable (#984)
digiboridev Mar 5, 2026
d3d2e32
refactor: cdr ui improvements, disconnect reason translations (#989)
digiboridev Mar 5, 2026
57e7516
fix: use firstWhere instead of first in getAllContacts test to avoid …
SERDUN Mar 5, 2026
76f6c60
fix: change contact_phones UNIQUE constraint to (number, label, conta…
SERDUN Mar 6, 2026
e79ca1d
feat: melos exported env support (#993)
digiboridev Mar 6, 2026
32bb0b3
fix: log records file stability improvements (#998)
SERDUN Mar 12, 2026
08d6ada
feat: add Claude Code PostToolUse hooks (dart formatter + newline enf…
SERDUN Mar 12, 2026
35a5fb3
fix: call dropped when user taps before app fully initializes (#997)
SERDUN Mar 13, 2026
9a12065
fix: await reportNewIncomingCall in background FCM handler (#1001)
SERDUN Mar 13, 2026
e031293
feat: provide CallController as singleton via RepositoryProvider in M…
SERDUN Mar 19, 2026
d00a317
fix: feature access mapper logic (#1007)
digiboridev Mar 23, 2026
18aaf0b
fix: correct icon and text case assertions in integration tests (#1010)
SERDUN Mar 23, 2026
cbe5f26
feat: add integration tests for webtrit_signaling keepalive and disco…
SERDUN Mar 23, 2026
c3a2bf8
fix(signaling): reconnect silently on server force-close (code 4441) …
SERDUN Mar 24, 2026
dd48b4a
refactor: decouple AppLogger from LogzioLoggingService via RemoteLogg…
SERDUN Mar 24, 2026
c034f66
feat: enable and disable log anonymization with env (#1004)
OMaudza Mar 24, 2026
de8c294
fix: api healthcheck path (#1014)
digiboridev Mar 24, 2026
a55d649
fix: use shared static logger in WebtritSignalingClient (#1013)
SERDUN Mar 24, 2026
f13ddba
fix: signaling errors (#1016)
digiboridev Mar 25, 2026
e2d5675
feat: user info cache (#1015)
digiboridev Mar 25, 2026
fc249cc
fix: integration tests rescue (#1025)
digiboridev Mar 30, 2026
703bbd3
fix: no audio if lone codec (#1028)
digiboridev Mar 30, 2026
c07a366
fix: WebRTC signaling state guards — ICE restart, renegotiation, and …
SERDUN Mar 30, 2026
604e3cd
fix: guard RTCVideoRenderer srcObject assignment until initialize() c…
SERDUN Mar 30, 2026
5605753
fix: update ExternalContactsSyncBloc tests to mock getAndListen inste…
SERDUN Mar 30, 2026
f04fb9e
feat: handle 'voicemail_not_configured' error (#1005)
OMaudza Mar 30, 2026
8640737
feat: add toJson() to all Event subclasses and fix NotifyEvent constr…
SERDUN Mar 30, 2026
8b573dd
fix: suppress transient network error SnackBar in RegisterStatusCubit…
SERDUN Mar 30, 2026
5a006d1
fix: add 10s timeout to reportNewIncomingCall in background message h…
SERDUN Mar 30, 2026
b4ad4f6
fix: add 5s timeout to getInitialMessage() to prevent splash freeze (…
SERDUN Mar 30, 2026
d4bad8c
refactor: remove tryUse from AppDatabaseScope, migrate callers to use…
SERDUN Mar 30, 2026
c4dc9f9
fix: eliminate write-write SQLite contention via shared DriftIsolate …
SERDUN Mar 31, 2026
bec6c37
refactor: introduce SignalingModule stream abstraction (phase 1) (#1024)
SERDUN Mar 31, 2026
dfd79ef
fix: incorrect styling of status bar on app start (#1006)
OMaudza Mar 31, 2026
879a23c
feat: show progress indicator while sharing logs (#1036)
SERDUN Mar 31, 2026
eaadae9
fix: upgrade to video resets hold (#1038)
digiboridev Mar 31, 2026
72a94f0
fix: media settings parsing (#1039)
digiboridev Mar 31, 2026
1908a64
fix: call drops after theme or lang change (#1041)
digiboridev Mar 31, 2026
f373b29
fix: cannot make calls after blind transfer — skip hangup + reconnect…
SERDUN Mar 31, 2026
8e51b20
build: create a new release version 1.14.0
SERDUN Mar 31, 2026
408a5d1
build: increment build number to 1.14.0+1
SERDUN Mar 31, 2026
236596a
chore: resolve merge conflict — take release version 1.14.0+1
SERDUN Apr 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 12 additions & 0 deletions .claude/hooks/dart_formatter.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
# PostToolUse hook: auto-format .dart files after Write/Edit/MultiEdit.
# Generated files (*.g.dart, *.freezed.dart, *.gr.dart) are skipped.
INPUT=$(cat)
FILE=$(jq -r '(.tool_input.file_path // .tool_input.path // "")' <<< "$INPUT")

[[ -z "$FILE" || ! -f "$FILE" ]] && exit 0
[[ "$FILE" != *.dart ]] && exit 0
[[ "$FILE" == *.g.dart || "$FILE" == *.freezed.dart || "$FILE" == *.gr.dart ]] && exit 0

ROOT=$(git rev-parse --show-toplevel 2>/dev/null) && cd "$ROOT"
dart format "$FILE"
33 changes: 33 additions & 0 deletions .claude/hooks/env_file_guard.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/usr/bin/env bash
# PreToolUse hook: block any access to .env files.
INPUT=$(cat)
TOOL=$(jq -r '.tool // ""' <<< "$INPUT")
COMMAND=$(jq -r '.tool_input.command // ""' <<< "$INPUT")
FILE=$(jq -r '(.tool_input.file_path // .tool_input.path // "")' <<< "$INPUT")

if [[ "$TOOL" == "Bash" || "$TOOL" == "Run" ]]; then
if echo "$COMMAND" | grep -qE '\b(cat|less|more|head|tail|bat|view|nano|vi|vim|code|open|type|strings|xxd|hexdump|od|base64)\b' \
&& echo "$COMMAND" | grep -qE '\.env($|\.)'; then
echo "🚫 BLOCKED: reads a .env file — secrets must not be read by the agent." >&2
exit 2
fi
if echo "$COMMAND" | grep -qE '\b(cp|mv|scp|rsync|tar|zip)\b' \
&& echo "$COMMAND" | grep -qE '\.env($|\.)'; then
echo "🚫 BLOCKED: copies/moves a .env file — secrets must not be transferred." >&2
exit 2
fi
if echo "$COMMAND" | grep -qE '\b(find|grep|rg|ag|fd)\b' \
&& echo "$COMMAND" | grep -qE '\.env($|\.)'; then
echo "🚫 BLOCKED: searches for .env files — secret files must not be scanned." >&2
exit 2
fi
fi

if [[ "$TOOL" =~ ^(Read|View|Edit|Write|MultiEdit)$ ]]; then
if echo "$FILE" | grep -qE '\.env($|\.)'; then
echo "🚫 BLOCKED: Cannot access '$FILE' — .env files contain secrets." >&2
exit 2
fi
fi

exit 0
10 changes: 10 additions & 0 deletions .claude/hooks/md_formatter.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
# PostToolUse hook: runs markdownlint-cli2 --fix on .md files after Write/Edit/MultiEdit.
INPUT=$(cat)
FILE=$(jq -r '(.tool_input.file_path // .tool_input.path // "")' <<< "$INPUT")

[[ -z "$FILE" || "$FILE" != *.md ]] && exit 0

ROOT=$(git rev-parse --show-toplevel 2>/dev/null) && cd "$ROOT"
npx --yes markdownlint-cli2 --fix "$FILE" >/dev/null 2>&1
exit 0
15 changes: 15 additions & 0 deletions .claude/hooks/newline_enforcer.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
# PostToolUse hook: ensure text files end with a newline after Write/Edit/MultiEdit.
INPUT=$(cat)
FILE=$(jq -r '(.tool_input.file_path // .tool_input.path // "")' <<< "$INPUT")

[[ -z "$FILE" || ! -f "$FILE" ]] && exit 0
[[ "$FILE" == *.g.dart || "$FILE" == *.freezed.dart || "$FILE" == *.gr.dart ]] && exit 0

case "$FILE" in
*.dart|*.yaml|*.yml|*.json|*.md|*.py|*.sh|*.kt|*.kts|*.swift|*.gradle|*.xml|*.html|*.txt) ;;
*) exit 0 ;;
esac

[[ -n "$(tail -c 1 "$FILE")" ]] && printf '\n' >> "$FILE"
exit 0
95 changes: 95 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
{
"permissions": {
"allow": [
"Bash(flutter test:*)",
"Bash(flutter analyze:*)",
"Bash(dart format:*)",
"Bash(dart fix:*)",
"Bash(flutter pub get:*)",
"Bash(flutter gen-l10n:*)",
"Bash(melos *)",
"Bash(git status:*)",
"Bash(git diff:*)",
"Bash(git log:*)",
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(git checkout:*)",
"Bash(git branch:*)",
"Bash(git fetch:*)",
"Bash(git pull:*)",
"Bash(git push:*)",
"Bash(git stash:*)",
"Bash(git merge:*)",
"Bash(git rebase:*)"
],
"deny": [
"Bash(**/.env*)",
"Read(**/.env*)",
"Write(**/.env*)",
"Read(**/*.jks)",
"Read(**/*.keystore)",
"Read(**/*.p12)",
"Read(**/*.pem)",
"Read(**/*.key)",
"Read(**/*.p8)",
"Write(**/*.jks)",
"Write(**/*.keystore)",
"Write(**/*.p12)",
"Write(**/*.pem)",
"Write(**/*.key)",
"Write(**/*.p8)"
]
},
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "ROOT=$(git rev-parse --show-toplevel 2>/dev/null) || exit 0; bash \"$ROOT/.claude/hooks/md_formatter.sh\""
}
]
},
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "ROOT=$(git rev-parse --show-toplevel 2>/dev/null) || exit 0; bash \"$ROOT/.claude/hooks/dart_formatter.sh\"",
"timeout": 30
}
]
},
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "ROOT=$(git rev-parse --show-toplevel 2>/dev/null) || exit 0; bash \"$ROOT/.claude/hooks/newline_enforcer.sh\""
}
]
}
],
"PreToolUse": [
{
"matcher": "Bash|Run",
"hooks": [
{
"type": "command",
"command": "ROOT=$(git rev-parse --show-toplevel 2>/dev/null) || exit 0; bash \"$ROOT/.claude/hooks/env_file_guard.sh\""
}
]
},
{
"matcher": "Read|View|Edit|Write|MultiEdit",
"hooks": [
{
"type": "command",
"command": "ROOT=$(git rev-parse --show-toplevel 2>/dev/null) || exit 0; bash \"$ROOT/.claude/hooks/env_file_guard.sh\""
}
]
}
]
}
}
39 changes: 39 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# GitHub Copilot Workspace Instructions

You are a Senior Full-Stack Engineer specializing in **Flutter**. Your goal is to
deliver clean, production-ready code while strictly adhering to the project's modular standards.

## Rule Discovery & Context

Before planning or writing any code, you **MUST**:

1. Read [CONTRIBUTING.md](../CONTRIBUTING.md) for branch naming, commit message, and hook conventions.
2. Read [AGENTS.md](../AGENTS.md) for code standards, architecture, and testing conventions.
3. Prioritize project-specific rules over your default coding style.

## Hard Constraints

* **NO CYRILLIC:** Strictly prohibited in code, strings, logs, comments, and git metadata. English
only.
* **CALLBACKS:** Must be single-expression. If logic exceeds one line, you MUST extract it into a
private method.
* **CLEAN CODE:** No conversational filler. Output only commit-ready code.

## Git Standards & Workflow

You must validate all Git metadata against these requirements. Non-compliant PRs will be rejected.

See [CONTRIBUTING.md](../CONTRIBUTING.md) for branch naming and commit message conventions.

**Branch pattern:** `^(feature|feat|refactor|fix|chore|build|style|docs|release)/.+$`

**Commit pattern:** `^(feat|fix|chore|refactor|test|docs|style|ci|perf|build|revert)(\(.+\))?:\ .+`

## Pre-Submission Checklist

Before finalizing a task and creating a Pull Request:

1. **Validate:** Ensure branch and all commits match the regex patterns above.
2. **Verify Logic:** Ensure all multi-line logic in widgets/services is extracted to private
methods.
3. **Check Imports:** Ensure imports are grouped and sorted as defined in `.rules/global.rules.md`.
2 changes: 1 addition & 1 deletion .github/flutter_version.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
flutter:
version: "3.35.7"
version: "3.41.2"
channel: "stable"
45 changes: 45 additions & 0 deletions .github/workflows/git-lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Git Lint

on:
pull_request:
branches: [ main, dev, develop ]

jobs:
validate:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Validate Branch Name
run: |
BRANCH="${{ github.head_ref }}"
REGEX="^(feat|feature|refactor|fix|chore|build|style|docs|release)/.+$"

if [[ ! "$BRANCH" =~ $REGEX ]]; then
echo "Invalid branch name: '$BRANCH'"
exit 1
fi

- name: Validate Commit Messages
run: |
COMMITS_FULL=$(git log --no-merges --format=%B origin/${{ github.base_ref }}..HEAD)
COMMITS_SUBJECTS=$(git log --no-merges --format=%s origin/${{ github.base_ref }}..HEAD)

if echo "$COMMITS_FULL" | grep -qP '\p{Cyrillic}'; then
echo "Cyrillic characters detected in commits."
exit 1
fi

REGEX="^(feat|fix|chore|refactor|test|docs|style|ci|perf|build|revert)(\([^)]+\))?: [^A-Z].+$"

while IFS= read -r SUBJECT; do
if [ -z "$SUBJECT" ]; then continue; fi

if [[ ! "$SUBJECT" =~ $REGEX ]]; then
echo "Invalid format or capitalized description: '$SUBJECT'"
exit 1
fi
done <<< "$COMMITS_SUBJECTS"
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
.pub-cache/
.pub/
/build/
**/build/

# Web related

Expand All @@ -48,3 +49,13 @@ app.*.map.json
/tool/configs/localizely_token.txt
makefile.shared
.env

# Melos
.melos_tool/
**/pubspec_overrides.yaml

# Agents
.aider*
.claude/settings.local.json
CLAUDE.local.md
**/.claude/
51 changes: 51 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# AGENTS.md

WebTrit Phone — Flutter VoIP app, Melos monorepo.
Flutter 3.32.4 (stable), Android SDK 35.0.1.

## Build & Test

```bash
melos bootstrap # install all deps
melos run analyze # lint all packages
melos run test # test all packages
flutter test # unit/widget (app root)
dart run build_runner build --delete-conflicting-outputs # codegen
dart run bin/create_new_schema_dump_and_test_migration.dart # after Drift table changes
```

## Code Standards

- No Cyrillic anywhere (source, comments, strings, logs, keys).
- No inline comments — DartDoc only for public APIs.
- No DI frameworks (`get_it`, `injectable`, Service Locator — forbidden).
- Single quotes; 120-char line width.
- Never edit `*.g.dart` / `*.freezed.dart` / `*.gr.dart` — regenerate via `build_runner`.
- Required named params before optional named params.
- Callbacks: single-expression only; extract multi-statement logic to a private method.
- Imports: 6 groups, one blank line between, alphabetical within:
1. Dart SDK
2. Flutter SDK
3. External
4. Internal packages
5. `package:webtrit_phone/...`
6. Relative

## Architecture

```
lib/ → app (features/, theme/, repositories/, models/, blocs/, l10n/)
packages/ → shared libs (must NOT import from lib/)
webtrit_appearance_theme/ pure Dart theme DTOs
data/app_database/ Drift DB + DAOs
webtrit_api/ REST client
webtrit_signaling/ WebSocket signaling
webtrit_callkeep/ native call UI (external repo)
```

- State: `@freezed` for state; `sealed class + Equatable` for events (never `freezed` on events).
- BLoC deps via `Provider`/`RepositoryProvider`; never pass `BuildContext` into BLoC/Service.
- DB: DAOs only — never `AppDatabase` directly; Drift-generated classes stay in repo layer.
- Theme: never raw `Colors.xxx` or `TextStyle` in widgets; `Theme.of(context).extension<T>()`.
- Widgets: `StatelessWidget` always (not helper methods); dumb widgets in `features/*/view/widgets/`.
- Tests: `MockClient`/`mocktail` — no real network calls; DB migrations via `SchemaVerifier`.
27 changes: 27 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# WebTrit Phone — Claude Code

@AGENTS.md
@docs/call_architecture.md

## Package Docs

@packages/webtrit_api/AGENTS.md
@packages/webtrit_signaling/AGENTS.md
@packages/data/CLAUDE.md
@packages/webtrit_appearance_theme/AGENTS.md
@packages/_http_client/AGENTS.md
@packages/_web_socket_channel/AGENTS.md
@packages/ssl_certificates/CLAUDE.md
@packages/store_info_extractor/AGENTS.md
@packages/device_auto_rotate/AGENTS.md
@packages/webtrit_phone_number/AGENTS.md

## Gotchas

- **l10n keys**: `<Bloc>_<Widget><Fields>[_<variant>]` — e.g. `lobby_AppBarTitle`, `login_Button_getPasswordBySMS`.
- **initState / dispose**: `super.initState()` first; `super.dispose()` last; dispose in reverse creation order.
- **withValues**: `withValues(alpha: 0.x)` — not deprecated `withOpacity()`.
- **Card not Container**: elevation/shadow → `Card`, not `Container + BoxShadow`.
- **Schema migration**: `dart run bin/create_new_schema_dump_and_test_migration.dart` after any Drift table change.
- **Theming steps**: DTO → codegen → JSON assets → bridge → extension (all 5 steps when adding a theme property).
- **Flavor combinator**: `--flavor deeplinkssmsReceiver` = deeplinks + sms receiver (see AGENTS.md for full matrix).
Loading
Loading