Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
3354 commits
Select commit Hold shift + click to select a range
d77c50e
extract Collator to CollatorUtils
sosek108 Sep 10, 2026
094012c
extract Collator to CollatorUtils
sosek108 Sep 10, 2026
fcf5119
revert: refactor-Reports-newTransactionHighlight-and-RHPLayout-followups
TaduJR Sep 10, 2026
34397d5
Remove the client-side reimbursement amount tokens
ishpaul777 Sep 10, 2026
c9c4b1d
Remove the reimbursement amount rows from the export article
ishpaul777 Sep 10, 2026
a209bd6
drop cardList and workspaceCardList from ShareTab
sosek108 Sep 10, 2026
6e436ef
Merge pull request #99812 from Expensify/helpsite-amex-form-update
greg-schroeder Sep 10, 2026
1c0849f
Merge pull request #96524 from Expensify/claude-docs-expensify-card-v…
greg-schroeder Sep 10, 2026
0d936b6
Merge branch 'Expensify:main' into fedirjh-fix-map-distance-move-self…
fedirjh Sep 10, 2026
02d94db
refactor: remove LegendList component wrappers
chrispader Sep 10, 2026
35c2846
refactor: centralize LegendList integration utilities
chrispader Sep 10, 2026
78b07d9
chore: widen the seatbelt for the violations the revert restores
TaduJR Sep 10, 2026
b63843b
Merge pull request #98368 from fedirjh/fix/98223-edit-existing-distance
Gonals Sep 10, 2026
e02a498
Merge branch 'main' of github.com:software-mansion-labs/expensify-app…
Guccio163 Sep 10, 2026
d561460
Fix the pie chart icon
mhawryluk Sep 10, 2026
c3a78ba
Show concierge anywhere on the new page
mhawryluk Sep 10, 2026
67a069a
Merge pull request #98971 from software-mansion-labs/fix-staging-togg…
Julesssss Sep 10, 2026
3b9a8be
Merge pull request #98371 from fedirjh/fix/98231-commuter-rate-flicker
Gonals Sep 10, 2026
87c5db1
Update Mobile-Expensify submodule to 3f85615
OSBotify Sep 10, 2026
8c16c15
Auto-tighten eslint-seatbelt baseline
OSBotify Sep 10, 2026
1357b49
Merge pull request #100478 from fedirjh/fedirjh-fix-map-distance-move…
Gonals Sep 10, 2026
4e30038
Merge pull request #100810 from TaduJR/revert-refactor-Reports-newTra…
mountiny Sep 10, 2026
e4b7841
Update version to 9.4.75-1
OSBotify Sep 10, 2026
0b8c5ef
Update Mobile-Expensify submodule version to 9.4.75-1
OSBotify Sep 10, 2026
a9168f2
add perf scenarios covering the chat preview path
sosek108 Sep 10, 2026
d78c915
memoize chat preview text in prepareReportOptionsForDisplay
sosek108 Sep 10, 2026
dc77b33
keep the empty visibleReportActionsData default stable so the preview…
sosek108 Sep 10, 2026
c8c488b
Merge pull request #100633 from Expensify/claude-docsWorkEmailDomainC…
rlinoz Sep 10, 2026
0722813
add report action constants to cspell dictionary
sosek108 Sep 10, 2026
3271383
drop unused clearAlternateTextCache export
sosek108 Sep 10, 2026
947870c
Merge pull request #100796 from ishpaul777/ishpaul/655941-formula-fol…
madmax330 Sep 10, 2026
2d3d82e
test: extract LegendList Jest mock
chrispader Sep 10, 2026
be242f4
Use one-color Concierge icon in page header top right
MelvinBot Sep 10, 2026
9b4cd7f
fix: keep not-found for invalid report paths when isPendingCreation i…
JakubKorytko Sep 10, 2026
153570e
Modify the polish translation for "insights"
mhawryluk Sep 10, 2026
6a87af0
Run concierge.svg through compress-svg to satisfy the SVG compression…
MelvinBot Sep 10, 2026
2c5be81
fix: expire stale isPendingCreation route flag when no report row app…
JakubKorytko Sep 10, 2026
de54750
test: latch LegendList edge callbacks
chrispader Sep 10, 2026
c56c31c
Use 15px bold textStrong variant for card and widget headers
MelvinBot Sep 10, 2026
d15d734
Merge pull request #99235 from Expensify/claude-a11y-settlement-curre…
mountiny Sep 10, 2026
cfa2aaf
Merge pull request #100000 from software-mansion-labs/Guccio163/butto…
mountiny Sep 10, 2026
a983c47
Merge pull request #99651 from fedirjh/codex/issue-670850-search-users
mountiny Sep 10, 2026
dbcfa1b
Merge branch 'main' of github.com:software-mansion-labs/expensify-app…
Guccio163 Sep 10, 2026
5091526
Merge branch 'main' into receipt-loss-paths-we-cannot-measure
rinej Sep 10, 2026
e4c0e22
Auto-tighten eslint-seatbelt baseline
OSBotify Sep 10, 2026
83d4c7d
fix: scope isPendingCreation to the report screen and widen the stale…
JakubKorytko Sep 10, 2026
ed1f086
Merge pull request #99894 from Expensify/alberto-useRules
Gonals Sep 10, 2026
43f1e25
Merge pull request #99164 from Krishna2323/krishna2323/issue-96354
JS00001 Sep 10, 2026
0db5a28
Hide fix badge for paid invoices missing a report field
mollfpr Sep 10, 2026
0529feb
Add test for unpaid and paid invoice report
mollfpr Sep 10, 2026
813b074
docs: split pre-mount host JSDoc into two sentences
JakubKorytko Sep 10, 2026
634808e
Merge remote-tracking branch 'origin/main' into claude-eslintBanOnyxU…
MelvinBot Sep 10, 2026
9e15c3b
Merge pull request #99747 from callstack-internal/investigate-issue-6…
mountiny Sep 10, 2026
1cad63f
Merge pull request #100783 from Expensify/claude-allowDisablingReport…
NicolasBonet Sep 10, 2026
f0a77d5
Include Insights in tab navigator tests
mhawryluk Sep 10, 2026
564f26f
Drop stale seatbelt row for MoveFilesOutOfDocuments after main paid d…
MelvinBot Sep 10, 2026
0dd836f
merge main into fix/search-adopt-lhn-alternate-text
sosek108 Sep 10, 2026
e1071f8
Merge pull request #96466 from bernhardoj/feat/95976-persist-filters-…
JS00001 Sep 10, 2026
13701e6
fix: open beta overrides over the screen the test tools modal was ope…
JakubKorytko Sep 10, 2026
134c03a
add translations.
Krishna2323 Sep 10, 2026
a3a4644
Show invoice field count on the Copy settings invoices row
mollfpr Sep 10, 2026
02a49a3
Use getTaxByID instead of a new helper, inline isSelectedTax.
Krishna2323 Sep 10, 2026
f1ac928
Merge branch 'main' into fix/search-adopt-lhn-alternate-text
sosek108 Sep 10, 2026
c53a81c
Merge pull request #100717 from software-mansion-labs/collectioneur/e…
mountiny Sep 10, 2026
d7222c4
test: expect skipMatchingFullScreenRoute when opening beta overrides
JakubKorytko Sep 10, 2026
9cbf387
Merge remote-tracking branch 'upstream/main' into krishna2323/fix/cat…
Krishna2323 Sep 10, 2026
5b96991
fix regex: dont slice longer words
Guccio163 Sep 10, 2026
0b171f4
test: keep the active tab under the beta overrides RHP
JakubKorytko Sep 10, 2026
ab217c4
Merge pull request #100068 from Expensify/nicolas-agent-replace-optim…
NicolasBonet Sep 10, 2026
088bd20
Merge pull request #98212 from Expensify/docs/duplicate-workspace-inv…
johncschuster Sep 10, 2026
6815a60
Require report field names to be unique across invoice and expense ta…
mollfpr Sep 10, 2026
1d87b02
Fix middleware registration count after concurrent merges
NicolasBonet Sep 10, 2026
706f299
Merge pull request #100586 from Krishna2323/krishna2323/fix/category-…
JS00001 Sep 10, 2026
76f8469
fix: address review comments, fix offline mode related bugs, change s…
jakubstec Sep 10, 2026
a7db4f2
Merge branch 'main' of github.com:Expensify/App into mollfpr-invoice-…
mollfpr Sep 10, 2026
86cc20c
Fix middleware count in entry point test as well
NicolasBonet Sep 10, 2026
f9e02d5
Fix failing TS checks
mollfpr Sep 10, 2026
a68e6f4
Merge pull request #100858 from Expensify/nicolas-fix-middleware-count
NicolasBonet Sep 10, 2026
6eadacd
merge main
dukenv0307 Sep 10, 2026
00239ac
merge main and resolve conflicts.
Krishna2323 Sep 10, 2026
ced994b
Merge branch 'main' into fix/98617
dukenv0307 Sep 10, 2026
73013a0
Fix merge fallout: drop resurrected beta entry, restore approver hook…
Krishna2323 Sep 10, 2026
8e4fc91
fix: user approved on offline mode reappears in pending section
jakubstec Sep 10, 2026
1e5591c
Merge remote-tracking branch 'upstream/main' into jakubstec/domains/r…
jakubstec Sep 10, 2026
f154781
fix: jest tests, knipcheck
jakubstec Sep 10, 2026
94679b4
Merge branch 'main' of github.com:Expensify/App into mollfpr-invoice-…
mollfpr Sep 10, 2026
768a22f
test fix
dukenv0307 Sep 10, 2026
5f3ec3f
Merge remote-tracking branch 'origin/main' into mcp-connectors
MelvinBot Sep 10, 2026
92158e9
Rename ButtonComposed import to Button after folder rename on main
MelvinBot Sep 10, 2026
f6f3b72
Merge branch 'main' into receipt-loss-paths-we-cannot-measure
rinej Sep 10, 2026
c6d7451
Merge pull request #100196 from Expensify/claude-blockStartChatInSupp…
mountiny Sep 10, 2026
8742c87
Merge pull request #100539 from Expensify/claude-workspaceAvatarUndef…
madmax330 Sep 10, 2026
feb5e7e
Merge pull request #99999 from software-mansion-labs/Guccio163/header…
mountiny Sep 10, 2026
a18f525
Auto-tighten eslint-seatbelt baseline
OSBotify Sep 10, 2026
d993be9
Merge branch 'main' into fix/preserve-government-rate-icon-currency-c…
nabi-ebrahimi Sep 10, 2026
27ecb83
docs: move government rate JSDoc to correct function
nabi-ebrahimi Sep 10, 2026
20f1814
docs: clarify government rate unit conversion
nabi-ebrahimi Sep 10, 2026
5f2c2ec
Update Mobile-Expensify submodule to a8337d6
OSBotify Sep 10, 2026
8dd0474
Merge branch 'main' into fix/99929
nkdengineer Sep 10, 2026
3017c10
Merge pull request #100607 from nabi-ebrahimi/fix/preserve-government…
neil-marcellini Sep 10, 2026
9ccd766
add violation column for approved-violation filter
nkdengineer Sep 10, 2026
dba48b0
Merge pull request #100732 from margelo/@chrispader/feat/legend-list-…
roryabraham Sep 10, 2026
e88a30e
Merge pull request #100800 from software-mansion-labs/insights/set-up…
luacmartins Sep 10, 2026
386d199
Merge pull request #100850 from Expensify/mollfpr-invoice-blockers
mountiny Sep 10, 2026
cdc8c26
Update version to 9.4.75-2
OSBotify Sep 10, 2026
cbbb9e8
Update Mobile-Expensify submodule version to 9.4.75-2
OSBotify Sep 10, 2026
186ca6c
Merge pull request #100475 from allgandalf/saml-reauth-keep-path
mountiny Sep 10, 2026
9956186
Merge pull request #99738 from oqildev/fix/94009-duplicate-report-total
stitesExpensify Sep 10, 2026
4e3f831
fix: read trip data from report NVPs
rlinoz Sep 10, 2026
27bd036
Fix review feedback: French translation string, Collect bypassing car…
Krishna2323 Sep 10, 2026
f07c011
fix: validate trip NVP data
rlinoz Sep 10, 2026
aa001ea
fix: subscribe to the trip report NVP directly
rlinoz Sep 10, 2026
c1e9b0a
Merge pull request #99739 from rushatgabhane/mcp-connectors
lakchote Sep 10, 2026
1a9cf88
rename type and function to more useful
nkdengineer Sep 10, 2026
9b5fba0
Merge pull request #100275 from callstack-internal/eliran/100047-igno…
AndrewGable Sep 10, 2026
1b8f98f
test: make trip preview date assertion stable
rlinoz Sep 10, 2026
edeeafc
Merge pull request #100780 from mukhrr/fix/100765
roryabraham Sep 10, 2026
b7fcd6e
Merge pull request #97697 from software-mansion-labs/perf/spend-filte…
roryabraham Sep 10, 2026
8e01ac9
Merge pull request #100764 from Expensify/rory/proposal-police-edit-t…
chuckdries Sep 10, 2026
37b4af1
Remove custom agent beta gates
puneetlath Sep 10, 2026
401c419
Update custom agent availability tests
puneetlath Sep 10, 2026
30ab147
Merge remote-tracking branch 'origin/main' into puneet/remove-custom-…
puneetlath Sep 10, 2026
6745460
Update default settings menu expectation
puneetlath Sep 10, 2026
0858963
Merge pull request #100620 from nkdengineer/fix/99929
neil-marcellini Sep 10, 2026
c25de01
fix: identify current traveler from trip data
rlinoz Sep 10, 2026
56b92be
Trigger the Control upgrade page for card spend rules instead of hidi…
Krishna2323 Sep 10, 2026
f86d3d9
Merge pull request #100875 from Expensify/puneet/remove-custom-agent-…
puneetlath Sep 10, 2026
59273b0
Merge pull request #100460 from dukenv0307/fix/678347
arosiclair Sep 10, 2026
f3b878c
Fix upgrade redirect to return to the card issuance wizard.
Krishna2323 Sep 10, 2026
48a5628
Merge remote-tracking branch 'upstream/main' into krishna2323/remove-…
Krishna2323 Sep 10, 2026
64d01e1
fix: avoid selecting all trip report data
rlinoz Sep 10, 2026
743b9d4
fix: find trip rooms from report NVPs
rlinoz Sep 10, 2026
6e26216
Merge pull request #100711 from Expensify/rodrigo-upgrade-sentry-reac…
rlinoz Sep 10, 2026
e1a1958
Update Mobile-Expensify submodule to 1bb335e
OSBotify Sep 10, 2026
29d10d2
Merge pull request #99912 from software-mansion-labs/@GCyganek/fix-me…
puneetlath Sep 10, 2026
defd9fe
chore: move Search table sizing chrome constants into variables.ts
Krishna2323 Sep 10, 2026
f7de586
Auto-tighten eslint-seatbelt baseline
OSBotify Sep 10, 2026
6a392d7
use variables directly.
Krishna2323 Sep 10, 2026
3f6cf8f
Merge pull request #100164 from callstack-internal/fix/no-cycle-part6…
roryabraham Sep 10, 2026
5687e2e
Auto-tighten eslint-seatbelt baseline
OSBotify Sep 10, 2026
2547ac9
Merge pull request #100826 from software-mansion-labs/korytko/fix-pre…
mountiny Sep 10, 2026
ecab182
Merge pull request #99338 from KJ21-ENG/seatbelt/c1-260824-r1
blimpich Sep 10, 2026
468fc66
Auto-tighten eslint-seatbelt baseline
OSBotify Sep 10, 2026
11979a6
refactor: address Search column sizing review feedback
Krishna2323 Sep 10, 2026
69a7374
Update version to 9.4.75-3
OSBotify Sep 10, 2026
9b7ded2
Update Mobile-Expensify submodule version to 9.4.75-3
OSBotify Sep 10, 2026
46c468e
Merge remote-tracking branch 'origin/main' into cmartins/fix-chronos-…
luacmartins Sep 10, 2026
797d9f8
Merge pull request #100165 from callstack-internal/fix/no-cycle-part7…
roryabraham Sep 10, 2026
c044c68
Merge pull request #100069 from Expensify/claude-taskSearchOutstandin…
Sep 10, 2026
7f3126e
Merge pull request #100853 from software-mansion-labs/Guccio163/regexFix
cristipaval Sep 10, 2026
38892c8
Update version to 9.4.76-0
OSBotify Sep 10, 2026
87c7fcd
Update Mobile-Expensify submodule version to 9.4.76-0
OSBotify Sep 10, 2026
f756c36
Merge pull request #100596 from ahmdshrif/sherif/fix-99276-openreport…
neil-marcellini Sep 10, 2026
0fe4731
Merge pull request #100872 from Expensify/rodrigo-680660-tripdata-rnvp
blimpich Sep 10, 2026
dba098e
Merge pull request #99962 from Expensify/claude-docsBulkEditAttendees
twisterdotcom Sep 10, 2026
19a0a9a
Merge pull request #96409 from allgandalf/card-connection-broken-30-d…
chuckdries Sep 11, 2026
a496aca
Add missing rules param to task search test call sites
Sep 11, 2026
27eae00
Merge pull request #100919 from Expensify/youssef/fix-typecheck-searc…
MonilBhavsar Sep 11, 2026
57cc05b
Use shared mock holder
MonilBhavsar Sep 11, 2026
de99bd2
Fall back to the session email when account.primaryLogin is missing i…
MelvinBot Sep 11, 2026
b44d473
Remove the blank line left behind by the dropped account useOnyx call
MelvinBot Sep 11, 2026
888cb3a
Fix Suggestion list remains opened when dragging a file to Home
GCyganek Sep 11, 2026
dc3b216
fix: open beta overrides as a dynamic route so the screen underneath …
JakubKorytko Sep 11, 2026
b060a99
Merge pull request #100929 from Expensify/monil-fixJestTest
mollfpr Sep 11, 2026
5a7bd3b
Fix tests
GCyganek Sep 11, 2026
f19d457
Merge main into fix/search-adopt-lhn-alternate-text
sosek108 Sep 11, 2026
0398020
cspell fixes
sosek108 Sep 11, 2026
22fa38d
Treat an empty primaryLogin as missing in usePrimaryContactMethod
MelvinBot Sep 11, 2026
0139f0c
limit nightly violation check to individual expense types, update tra…
akinwale Sep 11, 2026
6b570a7
Merge branch 'main' of github.com:Expensify/App into jules-claudeSkil…
Julesssss Sep 11, 2026
4263359
Gate the "Create a rule" offer on the expense it would create a rule for
Krishna2323 Sep 11, 2026
5b721e7
Extract shared Intl.Collator into CollatorUtils
sosek108 Sep 11, 2026
66cb2ba
fix: stale GBR after offline approve
jakubstec Sep 11, 2026
2a768f1
Fix suggestion list and notch/dynamic island overlapping
GCyganek Sep 11, 2026
0068823
fix: cover folder attachment validation paths
chrispader Sep 11, 2026
23adeca
shouldAcceptDrop util
GCyganek Sep 11, 2026
746cd6f
Merge pull request #94628 from truph01/fix/66416-part-9
Gonals Sep 11, 2026
6e1a2b9
Update Mobile-Expensify submodule to ce32ccf
OSBotify Sep 11, 2026
93ee237
Merge pull request #100699 from callstack-internal/LukasMod/remove-po…
Gonals Sep 11, 2026
ce12d3c
fix: remove per diem page loading gate that never resolves
BartekObudzinski Sep 11, 2026
e9b2e22
Revert eslint seatbelt baseline change per review feedback
MelvinBot Sep 11, 2026
9af638c
Merge pull request #97596 from akinwale/task-app-632262-ee
MonilBhavsar Sep 11, 2026
7e99371
Merge pull request #99591 from Expensify/yuwen-99006-hr-sync-modal
Gonals Sep 11, 2026
45b319e
Update Mobile-Expensify submodule to 108ff9c
OSBotify Sep 11, 2026
3f3f81e
Merge pull request #100044 from Expensify/claude-fixAddWorkEmailFormL…
Gonals Sep 11, 2026
3f0161f
Merge pull request #100935 from software-mansion-labs/@GCyganek/conci…
puneetlath Sep 11, 2026
0a15d3c
Merge pull request #100161 from software-mansion-labs/jakubstec/domai…
mountiny Sep 11, 2026
8f9c163
Update version to 9.4.76-1
OSBotify Sep 11, 2026
4302279
Update Mobile-Expensify submodule version to 9.4.76-1
OSBotify Sep 11, 2026
2457b72
Merge pull request #100940 from Krishna2323/krishna2323/merchant-rule…
JS00001 Sep 11, 2026
4005793
Merge pull request #98662 from Krishna2323/krishna2323/remove-rules-r…
JS00001 Sep 11, 2026
1055af6
resolve conflict
nkdengineer Sep 11, 2026
3078215
Merge pull request #99236 from Expensify/claude-a11y-workspace-picker…
mountiny Sep 11, 2026
031d172
fix typecheck
nkdengineer Sep 11, 2026
6bad95c
Merge pull request #99239 from Expensify/claude-a11y-netsuite-invoice…
mountiny Sep 11, 2026
5528e0e
update test
nkdengineer Sep 11, 2026
ed73647
update condition for approved-violation
nkdengineer Sep 11, 2026
ef5fd25
Update Mobile-Expensify submodule to 8347262
OSBotify Sep 11, 2026
1da5462
Merge pull request #100724 from software-mansion-labs/update-react-na…
mountiny Sep 11, 2026
0321a69
Update Mobile-Expensify submodule to 16af9b8
OSBotify Sep 11, 2026
fa4d4a5
Import Button from its current path to fix the typecheck on main
mountiny Sep 11, 2026
e23d25d
Merge pull request #100582 from software-mansion-labs/remove-dsyms-fr…
AndrewGable Sep 11, 2026
35c6635
Merge pull request #100534 from Expensify/claude-eslintBanOnyxUtilsRu…
mountiny Sep 11, 2026
5c219fc
Merge pull request #100978 from Expensify/fix-typecheck-button-compos…
mountiny Sep 11, 2026
4a6f55d
Merge pull request #99238 from Expensify/claude-a11y-wallet-receipt-b…
mountiny Sep 11, 2026
c9e9318
Auto-tighten eslint-seatbelt baseline
OSBotify Sep 11, 2026
ae8d3fa
Update Mobile-Expensify submodule to 30792b5
OSBotify Sep 11, 2026
3468a05
Merge branch 'main' into fix/99965
nkdengineer Sep 11, 2026
5e4d5fe
Merge pull request #100776 from Expensify/fix/skip-submodule-validati…
luacmartins Sep 11, 2026
376d0ad
Merge remote-tracking branch 'origin/main' into tyler-680217-unique-s…
tylerkaraszewski Sep 11, 2026
a16bad6
Merge branch 'main' into receipt-loss-paths-we-cannot-measure
rinej Sep 11, 2026
c904f17
Restore generated GitHub Action bundles
tylerkaraszewski Sep 11, 2026
667f5f2
Merge remote-tracking branch 'origin/main' into tyler-680217-unique-s…
tylerkaraszewski Sep 11, 2026
6d967b0
tests: adjust SessionTest
rinej Sep 11, 2026
7ab4e9a
Merge pull request #100468 from nkdengineer/fix/99965
neil-marcellini Sep 11, 2026
400981c
Merge pull request #100706 from margelo/@chrispader/fix/single-folder…
mollfpr Sep 11, 2026
6399842
Merge pull request #99358 from Krishna2323/krishna2323/spend-table-dy…
luacmartins Sep 11, 2026
345b6c8
Merge pull request #100142 from Expensify/cmartins/fix-chronos-leave-…
luacmartins Sep 11, 2026
90b59de
Lower the Pusher activity and pong timeouts from the SDK defaults
adhorodyski Sep 11, 2026
ea9470c
Merge pull request #100387 from nabi-ebrahimi/fix/100369-workspace-se…
carlosmiceli Sep 11, 2026
01b7dc2
Auto-tighten eslint-seatbelt baseline
OSBotify Sep 11, 2026
55c2ea6
Merge pull request #97497 from Expensify/jules-claudeSkillsCodeowner
stitesExpensify Sep 11, 2026
23b443b
Merge pull request #100758 from Expensify/tyler-680217-unique-skill-n…
tylerkaraszewski Sep 11, 2026
dee7ca6
Update version to 9.4.77-0
OSBotify Sep 11, 2026
1a4b477
Update Mobile-Expensify submodule version to 9.4.77-0
OSBotify Sep 11, 2026
6d42ea0
Merge pull request #99044 from dukenv0307/fix/98617
mountiny Sep 11, 2026
17dc9fc
Look up the Workspace navigator by name in NavigateTests
MelvinBot Sep 12, 2026
ddeb1a7
Merge pull request #100931 from Expensify/claude-fixTravelPrimaryLogi…
carlosmiceli Sep 12, 2026
16df16b
Revert "Gate workspace picker selection behind a Save button (a11y On…
mountiny Sep 13, 2026
49c067e
Merge pull request #99065 from callstack-internal/receipt-loss-paths-…
mountiny Sep 13, 2026
880bbf4
Merge pull request #101037 from Expensify/revert-99236-claude-a11y-wo…
mountiny Sep 13, 2026
fbf0d6a
Update version to 9.4.77-1
OSBotify Sep 13, 2026
6fe67d1
Update Mobile-Expensify submodule version to 9.4.77-1
OSBotify Sep 13, 2026
07dca73
Merge pull request #101016 from Expensify/claude-fixNavigateTestsWork…
mountiny Sep 13, 2026
8e34299
Merge pull request #100835 from Expensify/claude-cardHeaderFontSize
shawnborton Sep 14, 2026
840a4e6
Auto-tighten eslint-seatbelt baseline
OSBotify Sep 14, 2026
f777fab
Merge pull request #100832 from Expensify/claude-oneColorConciergeIcon
shawnborton Sep 14, 2026
82b7e10
Merge branch 'main' into korytko/beta-overrides-back-navigation
jmusial Sep 14, 2026
2c7fdde
Merge pull request #100956 from callstack-internal/fix-perdiem-infini…
mountiny Sep 14, 2026
760821c
Merge branch 'Expensify:main' into fix/pusher-activity-timeouts
adhorodyski Sep 14, 2026
01b33cc
Point Claude review at the renamed coding standards rules
kacper-mikolajczak Sep 14, 2026
70d847b
Merge pull request #100984 from callstack-internal/fix/pusher-activit…
mountiny Sep 14, 2026
1c27057
Use the shared claude-review-toolkit pin
kacper-mikolajczak Sep 14, 2026
b387085
Merge pull request #101074 from kacper-mikolajczak/kacper/claude-revi…
rlinoz Sep 14, 2026
574c623
Merge pull request #100849 from software-mansion-labs/korytko/beta-ov…
mountiny Sep 14, 2026
e3caab9
Update Mobile-Expensify submodule to 067ec85
OSBotify Sep 14, 2026
7b6355f
Update version to 9.4.77-2
OSBotify Sep 14, 2026
f4b1457
Update Mobile-Expensify submodule version to 9.4.77-2
OSBotify Sep 14, 2026
beac33f
Merge branch 'main' into slice/collator-utils
sosek108 Sep 14, 2026
7be2357
Merge branch 'slice/collator-utils' into fix/search-adopt-lhn-alterna…
sosek108 Sep 15, 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
  •  
  •  
  •  
10 changes: 5 additions & 5 deletions .claude/agents/code-inline-reviewer.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---

name: code-inline-reviewer
description: Reviews code and creates inline comments for specific rule violations.
description: Reviews Expensify App code and creates inline comments for specific rule violations.
tools: Glob, Grep, Read, Bash, BashOutput
model: inherit
---
Expand All @@ -14,9 +14,9 @@ Your job is to scan through changed files and create **inline comments** for spe

## Rules

Coding standards are defined as individual rule files in `.claude/skills/coding-standards/rules/`.
Coding standards are defined as individual rule files in `.claude/skills/app-coding-standards/rules/`.

**Always use the `coding-standards` skill to review changed files.**
**Always use the `app-coding-standards` skill to review changed files.**

Each rule file contains:

Expand All @@ -28,7 +28,7 @@ Each rule file contains:
## Instructions

1. **Load all rules:**
- Use Glob to list all `.md` files in `.claude/skills/coding-standards/rules/`
- Use Glob to list all `.md` files in `.claude/skills/app-coding-standards/rules/`
- Read ALL rule files
- Build an explicit checklist of all rules (ruleId + title) from the YAML frontmatter
- Build a ruleId-to-filename mapping for creating docs links in comments
Expand Down Expand Up @@ -62,7 +62,7 @@ Each rule file contains:
Use this format for the `body` field of each violation:

```
### ❌ <Rule ID> [(docs)](https://github.com/Expensify/App/blob/main/.claude/skills/coding-standards/rules/<rule-filename>.md)
### ❌ <Rule ID> [(docs)](https://github.com/Expensify/App/blob/main/.claude/skills/app-coding-standards/rules/<rule-filename>.md)

<Reasoning>

Expand Down
2 changes: 1 addition & 1 deletion .claude/commands/review-code-pr.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
allowed-tools: Bash(gh pr diff:*),Bash(gh pr view:*),Bash(check-compiler.sh:*)
description: Run the coding-standards rule linter on a PR diff. Use when user wants to review their changes against our custom rules.
description: Run the app-coding-standards rule linter on an Expensify App PR diff. Use when user wants to review their App changes against our custom rules.
---

Perform a comprehensive PR review using a specialized subagent:
Expand Down
6 changes: 4 additions & 2 deletions .claude/skills/agent-device/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ allowed-tools: Bash(agent-device *) Bash(npm root *) Bash(scripts/is-hybrid-app.

These checks evaluate at skill load. If any line shows `FAIL`, stop and surface the fix before running any device command.

`agent-device` version: !`R=0.18.0; V=$(agent-device --version 2>/dev/null); [ -n "$V" ] && [ "$(printf '%s\n%s\n' "$R" "$V" | sort -V | head -1)" = "$R" ] && echo "OK ($V)" || echo "FAIL (need v$R+, got: ${V:-not installed}). Fix: npm install -g agent-device@latest"`
`agent-device` version: !`R=0.20.0; V=$(agent-device --version 2>/dev/null); [ -n "$V" ] && [ "$(printf '%s\n%s\n' "$R" "$V" | sort -V | head -1)" = "$R" ] && echo "OK ($V)" || echo "FAIL (need v$R+, got: ${V:-not installed}). Fix: npm install -g agent-device@latest"`

Bundled CLI skills dir: !`D="$(npm root -g)/agent-device/skills/agent-device"; test -s "$D/SKILL.md" && echo "OK ($D)" || echo "FAIL (missing $D/SKILL.md). Fix: npm install -g agent-device@latest"`

Expand Down Expand Up @@ -121,4 +121,6 @@ Read these files directly for device automation guidance (bootstrap, exploration

## Flows

Repeatable steps (sign-in, onboarding, etc.) are captured as composable `.ad` snippets under [`flows/`](flows/README.md). For interactive usage, propose and run only `flows/macros/` helpers. `flows/tests/` belongs to a separate QA workflow and must not be proposed by this skill; QA/perf runs execute them via `agent-device test <path>`.
This skill owns interactive automation only: reusable setup and navigation macros under [`flows/macros/`](flows/README.md), with platform overrides under `flows/macros/<platform>/`. Propose and run macros through the [Agent decision loop](flows/README.md). `flows/README.md` is also the reference for the `.ad` metadata spec, selector rules, and recording workflow, so read it before authoring any `.ad` file in this repository.

Measurement flows live in the [`measure-telemetry-span`](../measure-telemetry-span/SKILL.md) skill, which owns its own `flows/` and runner. Do not add measurement flows here.
58 changes: 31 additions & 27 deletions .claude/skills/agent-device/flows/README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
# Flows

This file is the reference for every `.ad` file in the repository: the metadata spec, selector rules, recording, and maintenance.

## Directory layout

- `macros/` - reusable helpers for common setup/navigation actions that stop in a navigable state for further interactive work.
- `macros/<platform>/` - platform-specific overrides of a `macros/` flow, for flows whose selectors differ per platform. See [Platform scoping](#platform-scoping).
- `tests/` - critical-scenario scripts for QA/perf verification that assert explicit outcomes (for example Sentry spans) and then stop.
1. `macros/` contains reusable setup and navigation helpers for interactive work. These are the only flows an interactive agent may propose.
2. `macros/<platform>/` contains platform-specific overrides of a `macros/` flow, for flows whose selectors differ per platform. See [Platform scoping](#platform-scoping).

Composable `.ad` snippets - bounded units of work. A flow may span one or multiple screens as long as it represents a coherent, reusable action with clear start (`@pre`) and completion (`@post`) checkpoints. Each flow advertises machine-matchable metadata (`@pre`, `@post`, `@tag`, `@param`) via `# @`-prefixed comment headers, while flow type is derived from location (`flows/macros/` or `flows/tests/`).
`macros/` contains composable `.ad` snippets. The caller owns application startup, authentication, platform selection, session state, and cleanup. A flow may span one or multiple screens as long as it represents a coherent action with clear start (`@pre`) and completion (`@post`) checkpoints.

## Platform scoping

Expand Down Expand Up @@ -34,29 +35,24 @@ Before manually navigating, use this human-in-the-loop loop:
7. `agent-device replay <path> -e KEY=VALUE ...`.
8. If the flow declares `@post`, verify each `@post` with `is exists`. On success, re-enter the loop only if the user's stated goal is not complete; otherwise stop and report completion. On failure, propose peer flow/manual fallback options and ask before continuing. If no `@post` is declared (utility flow), rely on explicit user confirmation or the next snapshot before continuing.

## QA workflow (separate)
## Replay lifecycle

`flows/tests/` is reserved for dedicated QA automation and should not be offered to users as part of the interactive helper loop above. Run these flows with the dedicated test runner:

```bash
agent-device test .claude/skills/agent-device/flows/tests/<name>.ad -e KEY=VALUE ...
```
No flow in this repository owns application lifecycle, so none of them is a self-contained `agent-device test` input. `agent-device test` creates an isolated session per attempt; use it only for scripts that own `context`, `open`, and cleanup. Repository flows expect the caller to open the app and prepare a named session first.

## Metadata header spec

Each flow starts with `# @key value` comment lines. The `.ad` parser treats `#` lines as no-ops, so headers cost nothing at replay time.

| Field | Cardinality | Value |
| -------- | ----------- | ------------------------------------------------------------------------------------------------ |
| `@desc` | 1 | One-line human summary. |
| `@pre` | 1..N | Selector that must resolve in the current snapshot. Multiple lines are ANDed. |
| `@post` | 0..N | Selector expected after replay. Multiple lines are ANDed. Used for chaining + success. |
| `@tag` | 0..N | Free-form category (`auth`, `onboarding`, ...) or scoped (`sentry-<spanName>`). |
| `@param` | 0..N | Runtime input contract: `@param KEY description.` Use with `${KEY}` in flow body. |
| Field | Cardinality | Value |
| -------- | ----------- | -------------------------------------------------------------------------------------- |
| `@desc` | 1 | One-line human summary. |
| `@pre` | 1..N | Selector that must resolve in the current snapshot. Multiple lines are ANDed. |
| `@post` | 0..N | Selector expected after replay. Multiple lines are ANDed. The flow body enforces them. |
| `@param` | 0..N | Runtime input contract: `@param KEY description.` Use with `${KEY}` in flow body. |

Selector syntax matches the body: `id="..."`, `role="..." label="..."`, `text="..."`, `||` for fallbacks.

## Parametrization (`agent-device` v0.13.0+)
## Parametrization

Declare runtime inputs via metadata (`@param`) and reference them in the body with `${VAR}` interpolation. Values are supplied by caller arguments (`-e`) or shell imports (`AD_VAR_*`) - never by in-file `env` directives.

Expand All @@ -78,11 +74,16 @@ agent-device replay <flow>.ad -e EMAIL=other@example.com
## Authoring rules

- **No `open`, no `close`, no `context` header.** Caller owns lifecycle.
- **No fixed `wait` calls.** `fill`/`press` resolve selectors with retry. Only add `wait <selector>` for real post-action blocks.
- **No fixed-duration `wait` calls.** Guard every asynchronous transition with `wait "<selector>" <timeoutMs>`, which polls until the selector resolves. A bare `wait <ms>` only burns wall clock.
- **No command flags in a flow body.** The `.ad` parser only reads flags for `press`, `fill`, `click`, and a few capture commands; for `is`, `wait`, and `find` it treats `--first` and friends as positionals. Disambiguate with a tighter selector instead.
- **Durable selectors.** Prefer `id=...` first, then `role=... label=...`, with `||` fallbacks. Avoid `@eN` refs.
- **A `@pre` must distinguish the start screen from the destination.** A bottom-tab label such as `text="Home"` is rendered on every tab, so asserting it proves nothing. Anchor on a screen-scoped `id=` instead - `id="HomePage"` for Home, `id="BaseSidebarScreen"` for Inbox - otherwise a flow that starts on the wrong screen reports success while the action it measures never happens.
- **Confirm every selector on the platform it is written for.** `snapshot -i` prints display tags, which are not selector values - a node printed as `[text-field]` may only match `role="textbox"`. Check the exit code of `agent-device is visible "<selector>"` before committing a selector, and never carry one across platforms unchecked.
- **Every flow declares `@desc` and `@pre`.** Add `@post` for outcome-bearing flows; utility flows (for example `go-back`) may omit it. Add `@tag` when applicable.
- **Choose directory intentionally.** Put reusable setup/navigation steps in `flows/macros/`; put outcome verification scenarios in `flows/tests/`.
- **Every flow declares `@desc` and `@pre`.** Outcome-bearing flows also declare at least one `@post`. Utility macros (for example `go-back`) may omit `@post`.
- **Every declared `@pre` and `@post` runs as a body assertion.** Use `is exists` or `wait`. Metadata documents the contract but does not execute it.
- **Assertion order decides whether a pass means anything.** Enforce every `@pre` before the first mutation and every `@post` after the last one. An assertion on the wrong side of a mutation lets a flow report success from the screen it started on.
- **No `find <selector> "click"`.** It resolves at runtime and hides which element was hit. Press an exact selector instead.
- **A bare `label=` alternative must carry `hittable=true`.** Without it the match can land on an off-screen or non-interactive node and the press silently does nothing.
- **Keep scope coherent, not artificially tiny.** Flows can span multiple screens when that sequence is the reusable intent (for example "create and submit manual expense").
- **Peers share `@pre` and differ on `@post`.** One flow per narrow outcome is better than a mega-flow with conditional branches.
- **Use `@param` for substituted values.** If a literal is interpolated into the body, declare `# @param KEY description.` and reference it as `${KEY}`.
Expand All @@ -94,21 +95,24 @@ agent-device replay <flow>.ad -e EMAIL=other@example.com
1. Drive the target screen manually.
2. Start a session with `--save-script`:
```bash
agent-device open <app> --save-script .claude/skills/agent-device/flows/<kind>/<name>.ad
agent-device open <app> --save-script .claude/skills/agent-device/flows/macros/<name>.ad
```
3. Perform the steps.
4. `agent-device close` - flushes the `.ad`.
5. Edit the generated file:
- Delete the `context` line, leading `open ... --relaunch`, trailing `close`, and eyeballing `wait`s.
- Move file to `flows/macros/` or `flows/tests/`, then add `@desc`, `@pre`, optional `@post`, optional `@tag`, and any needed `@param` headers.
6. Verify: pre-check from a matching state, replay, post-check.
- Move the file to `flows/macros/`, then add `@desc`, `@pre`, optional `@post`, and any needed `@param` headers.
6. Add executable checks for every declared `@pre` and `@post`.
7. Verify: pre-check from a matching state, replay, post-check.

## Maintenance

Heal selector drift in place:
Heal selector drift by hand. Replay the flow and read the divergence report:

```bash
agent-device replay -u .claude/skills/agent-device/flows/<kind>/<name>.ad
agent-device replay <path-to-flow>.ad --session <name>
```

Re-verify `@pre`/`@post` still hold, then commit. Note: `replay -u` can rewrite interpolated lines to concrete selectors/values; review diffs and restore `${KEY}` placeholders where needed. Keep runtime inputs in `@param` + `-e`/`AD_VAR_*`; do not reintroduce in-file `env` directives.
Every divergence carries ranked selector suggestions. Apply them yourself: `replay --update`/`-u` no longer rewrites the `.ad` file. Editing by hand also keeps `${KEY}` placeholders intact. Re-verify `@pre`/`@post` still hold, then commit. Keep runtime inputs in `@param` + `-e`/`AD_VAR_*`; do not reintroduce in-file `env` directives.

After editing a flow, re-read the authoring rules above and replay it from a matching start state. A green replay plus enforced `@pre`/`@post` is the check.
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
context platform=android
# @desc Complete onboarding with minimal choices (skip work email, pick "Something else" purpose, enter generic name). Lands on Home.
# @pre text="What’s your work email?"
# @post text="Home"
# @post role="button" label="Search"
# @tag onboarding
# @param FIRST_NAME First name to enter on onboarding profile step.
# @param LAST_NAME Last name to enter on onboarding profile step.

press "id=\"onboardingPrivateEmailSkipButton\" || role=\"button\" label=\"Skip\" || label=\"Skip\""
wait "label=\"Something else\""
press "role=\"button\" label=\"Something else\" || label=\"Something else\""
wait "label=\"First name\" editable=true"
fill "role=\"textfield\" label=\"First name\" editable=true || label=\"First name\" editable=true" "${FIRST_NAME}"
fill "role=\"textfield\" label=\"Last name\" editable=true || label=\"Last name\" editable=true" "${LAST_NAME}"
press "role=\"button\" label=\"Continue\" || label=\"Continue\""
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
context platform=android
# @desc Send a chat message from inside an already-open chat. Reusable helper for setting up state in other flows. Does not navigate or open a chat - assumes the composer is visible. For the QA scenario that exercises the ManualSendMessageVisible Sentry span, see flows/tests/send-message.ad.
# @desc Send a chat message from inside an already-open chat. Reusable helper for setting up state in other flows. Does not navigate or open a chat - assumes the composer is visible.
# @pre label="Write something..." editable=true
# @post label="Write something..." editable=true
# @tag chat
# @param MESSAGE Message text to send in the currently open chat.

is exists "label=\"Write something...\" editable=true"
Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/agent-device/flows/macros/android/sign-in.ad
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ context platform=android
# @pre id="username"
# @pre role="button" label="Continue"
# @post role="button" label="Join" || role="button" label="Search"
# @tag auth
# @param EMAIL Login email. Use randomized alias format `agent-device-testing+<9digits>@gmail.com` to avoid account flagging.

fill "id=\"username\" || label=\"Phone or email\" editable=true" "${EMAIL}"
press "id=\"username\" || role=\"edittext\" label=\"Phone or email\" editable=true || label=\"Phone or email\" editable=true"
fill "id=\"username\" || role=\"edittext\" label=\"Phone or email\" editable=true || label=\"Phone or email\" editable=true" "${EMAIL}"
press "role=\"button\" label=\"Continue\" || label=\"Continue\""
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
# @pre text="What’s your work email?"
# @post text="Home"
# @post role="button" label="Search"
# @tag onboarding
# @param FIRST_NAME First name to enter on onboarding profile step.
# @param LAST_NAME Last name to enter on onboarding profile step.

Expand Down
1 change: 0 additions & 1 deletion .claude/skills/agent-device/flows/macros/go-back.ad
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
# @desc Generic back navigation via the HeaderWithBackButton chevron. Works on any screen that mounts HeaderWithBackButton (Create Expense, Search, Report details, settings pages, etc.).
# @pre role="button" label="Back"
# @tag navigation
press "role=\"button\" label=\"Back\""
6 changes: 6 additions & 0 deletions .claude/skills/agent-device/flows/macros/join.ad
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# @desc Press Join on the post-sign-in welcome screen to create the account and enter onboarding.
# @pre role="button" label="Join"
# @post text="What’s your work email?"
# @tag auth

press "role=\"button\" label=\"Join\" || label=\"Join\""
8 changes: 8 additions & 0 deletions .claude/skills/agent-device/flows/macros/return-to-inbox.ad
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# @desc Return from a child screen to the Inbox and wait for its sidebar anchor.
# @pre role="button" label="Back"
# @post id="BaseSidebarScreen"
is exists "role=\"button\" label=\"Back\""
press "role=\"button\" label=\"Back\""
wait "role=\"tab\" label=\"Inbox\" || role=\"tab\" label=\"Inbox. Your review is required\" || label=\"Inbox\" hittable=true || label=\"Inbox. Your review is required\" hittable=true" 10000
press "role=\"tab\" label=\"Inbox\" || role=\"tab\" label=\"Inbox. Your review is required\" || label=\"Inbox\" hittable=true || label=\"Inbox. Your review is required\" hittable=true"
wait "id=\"BaseSidebarScreen\"" 10000
3 changes: 1 addition & 2 deletions .claude/skills/agent-device/flows/macros/send-message.ad
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# @desc Send a chat message from inside an already-open chat. Reusable helper for setting up state in other flows. Does not navigate or open a chat - assumes the composer is visible. For the QA scenario that exercises the ManualSendMessageVisible Sentry span, see flows/tests/send-message.ad.
# @desc Send a chat message from inside an already-open chat. Reusable helper for setting up state in other flows. Does not navigate or open a chat - assumes the composer is visible.
# @pre label="Write something..." editable=true
# @post label="Write something..." editable=true
# @tag chat
# @param MESSAGE Message text to send in the currently open chat.

is exists "label=\"Write something...\" editable=true"
Expand Down
6 changes: 6 additions & 0 deletions .claude/skills/agent-device/flows/macros/switch-to-home.ad
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# @desc Switch to the Home tab and wait for the Home screen anchor.
# @pre role="tab" label="Home" || label="Home" hittable=true
# @post id="HomePage"
is exists "role=\"tab\" label=\"Home\" || label=\"Home\" hittable=true"
press "role=\"tab\" label=\"Home\" || label=\"Home\" hittable=true"
wait "id=\"HomePage\"" 10000
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
context platform=web
# @desc Complete onboarding with minimal choices (skip work email, pick "Something else" purpose, enter generic name). Lands on Home.
# @pre text="What’s your work email?"
# @post text="Home"
# @post role="heading" label="Home"
# @post role="button" label="Search"
# @tag onboarding
# @param FIRST_NAME First name to enter on onboarding profile step.
# @param LAST_NAME Last name to enter on onboarding profile step.

Expand Down
Loading
Loading