Skip to content

Commit d2aba26

Browse files
committed
Merge branch 'main' into VickyStash/refactor/82871-bump-onyx-3.0.46
2 parents 3d33800 + 93f91bc commit d2aba26

344 files changed

Lines changed: 7460 additions & 2689 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/agents/deploy-blocker-investigator.md

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
name: deploy-blocker-investigator
33
description: Investigates deploy blockers to find the causing PR and recommend resolution.
4-
tools: Glob, Grep, Read, Bash, BashOutput
4+
tools: Glob, Grep, Read, Write, Bash, BashOutput
55
model: inherit
66
---
77

@@ -114,11 +114,9 @@ See Decision Tree below for label actions.
114114

115115
### Step 7: Post comment and update labels
116116

117-
Post your findings (use single quotes for the body to handle special characters):
117+
Write the comment body to a temp file using the Write tool, then post it:
118118
```bash
119-
gh issue comment "$ISSUE_URL" --body '## 🔍 Investigation Summary
120-
...your comment here...
121-
'
119+
gh issue comment "$ISSUE_URL" --body-file /tmp/investigation-summary.md
122120
```
123121

124122
Remove label only if the decision tree warrants it:
@@ -131,7 +129,12 @@ Call scripts by name only (e.g., `removeDeployBlockerLabel.sh`), not with full p
131129

132130
### Step 8: Assign contributors
133131

134-
When a causing PR is identified with medium or high confidence, assign the PR author and all approving reviewers to the deploy blocker issue using `gh issue edit "$ISSUE_URL" --add-assignee`. Extract approving reviewers from `gh pr view <PR_NUMBER> --json reviews`.
132+
If the primary causing PR has at least medium confidence, assign its author and approving reviewers to the deploy blocker issue. Only assign contributors from this single PR.
133+
134+
```bash
135+
gh pr view <PR_NUMBER> --json reviews
136+
gh issue edit "$ISSUE_URL" --add-assignee <logins>
137+
```
135138

136139
---
137140

@@ -172,7 +175,7 @@ Choose ONE:
172175

173176
## Comment Format
174177

175-
Post ONE comment using this exact format:
178+
Use the Write tool to create `/tmp/investigation-summary.md` with the following markdown structure. Every field and heading must be present.
176179

177180
```markdown
178181
## 🔍 Investigation Summary
@@ -186,7 +189,7 @@ Post ONE comment using this exact format:
186189
Brief explanation of why this recommendation (1-2 sentences).
187190

188191

189-
**Assigned**: @author (PR author), @reviewer (approving reviewer) — or omit if no causing PR identified
192+
**Assigned**: @author (PR author), @reviewer (approving reviewer) from highest-confidence causing PR only — omit if no causing PR identified
190193
**Labels**: [Describe any label changes made]
191194

192195
<details>
@@ -206,6 +209,8 @@ Technical explanation of what went wrong in the code.
206209

207210
</details>
208211
```
212+
213+
Then post with: `gh issue comment "$ISSUE_URL" --body-file /tmp/investigation-summary.md`
209214
---
210215

211216
## Constraints
@@ -218,7 +223,7 @@ Technical explanation of what went wrong in the code.
218223
- Make assumptions about code you haven't read
219224
- Recommend DEMOTE for bugs affecting core functionality (auth, payments, data loss)
220225
- Close the issue—only update labels and comment
221-
- Use heredocs, temp files, or shell redirects for comments
226+
- Use heredocs or shell redirects for comments
222227

223228
**DO:**
224229
- Always verify the causing PR touches the affected code before concluding

.claude/commands/investigate-deploy-blocker.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
allowed-tools: Bash(gh issue view:*),Bash(gh issue comment:*),Bash(gh issue edit:*),Bash(gh issue list:*),Bash(gh pr view:*),Bash(gh pr list:*),Bash(gh pr diff:*),Bash(gh api:*),Bash(git log:*),Bash(git show:*),Bash(git blame:*),Bash(removeDeployBlockerLabel.sh:*),Glob,Grep,Read
2+
allowed-tools: Bash(gh issue view:*),Bash(gh issue comment:*),Bash(gh issue edit:*),Bash(gh issue list:*),Bash(gh pr view:*),Bash(gh pr list:*),Bash(gh pr diff:*),Bash(gh api:*),Bash(git log:*),Bash(git show:*),Bash(git blame:*),Bash(removeDeployBlockerLabel.sh:*),Glob,Grep,Read,Write
33
description: Investigate a deploy blocker issue to find the causing PR and recommend resolution
44
---
55

.github/actions/javascript/getPullRequestIncrementalChanges/index.js

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12658,7 +12658,7 @@ class Git {
1265812658
return; // Reference is already available locally
1265912659
}
1266012660
try {
12661-
(0, Logger_1.log)(`🔄 Fetching missing ref: ${ref}`);
12661+
console.log(`🔄 Fetching missing ref: ${ref}`);
1266212662
await exec(`git fetch ${remote} ${ref} --no-tags --depth=1 --quiet`);
1266312663
// Verify the ref is now available
1266412664
if (!this.isValidRef(ref)) {
@@ -12869,7 +12869,7 @@ exports["default"] = Git;
1286912869
"use strict";
1287012870

1287112871
Object.defineProperty(exports, "__esModule", ({ value: true }));
12872-
exports.bold = exports.formatLink = exports.success = exports.error = exports.note = exports.warn = exports.info = exports.log = void 0;
12872+
exports.bold = exports.formatLink = exports.success = exports.errorDetail = exports.error = exports.note = exports.warn = exports.info = void 0;
1287312873
const COLOR_DIM = '\x1b[2m';
1287412874
const COLOR_RESET = '\x1b[0m';
1287512875
const COLOR_YELLOW = '\x1b[33m';
@@ -12884,40 +12884,34 @@ const EMOJIS = {
1288412884
SUCCESS: '✅',
1288512885
ERROR: '🔴',
1288612886
};
12887-
const log = (...args) => {
12888-
console.debug(...args);
12889-
};
12890-
exports.log = log;
1289112887
const info = (...args) => {
12892-
const lines = [EMOJIS.INFO, ...args];
12893-
log(...lines);
12888+
console.log(EMOJIS.INFO, ...args);
1289412889
};
1289512890
exports.info = info;
1289612891
const bold = (...args) => {
12897-
const lines = [COLOR_BOLD, ...args, COLOR_RESET];
12898-
log(...lines);
12892+
console.log(COLOR_BOLD, ...args, COLOR_RESET);
1289912893
};
1290012894
exports.bold = bold;
1290112895
const success = (...args) => {
12902-
const lines = [`${EMOJIS.SUCCESS}${COLOR_GREEN}`, ...args, COLOR_RESET];
12903-
log(...lines);
12896+
console.log(`${EMOJIS.SUCCESS}${COLOR_GREEN}`, ...args, COLOR_RESET);
1290412897
};
1290512898
exports.success = success;
1290612899
const warn = (...args) => {
12907-
const lines = [`${EMOJIS.WARN}${COLOR_YELLOW}`, ...args, COLOR_RESET];
12908-
log(...lines);
12900+
console.warn(`${EMOJIS.WARN}${COLOR_YELLOW}`, ...args, COLOR_RESET);
1290912901
};
1291012902
exports.warn = warn;
1291112903
const note = (...args) => {
12912-
const lines = [COLOR_DIM, ...args, COLOR_RESET];
12913-
log(...lines);
12904+
console.log(COLOR_DIM, ...args, COLOR_RESET);
1291412905
};
1291512906
exports.note = note;
1291612907
const error = (...args) => {
12917-
const lines = [`${EMOJIS.ERROR}${COLOR_RED}`, ...args, COLOR_RESET];
12918-
log(...lines);
12908+
console.error(`${EMOJIS.ERROR}${COLOR_RED}`, ...args, COLOR_RESET);
1291912909
};
1292012910
exports.error = error;
12911+
const errorDetail = (...args) => {
12912+
console.error(` ${COLOR_RED}↳`, ...args, COLOR_RESET);
12913+
};
12914+
exports.errorDetail = errorDetail;
1292112915
const formatLink = (name, url) => `\x1b]8;;${url}\x1b\\${name}\x1b]8;;\x1b\\`;
1292212916
exports.formatLink = formatLink;
1292312917

.github/workflows/deployBlockerInvestigation.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,4 @@ jobs:
7777
github_token: ${{ secrets.OS_BOTIFY_TOKEN }}
7878
prompt: "/investigate-deploy-blocker ISSUE_URL: ${{ env.ISSUE_URL }}"
7979
claude_args: |
80-
--allowedTools "Task,Glob,Grep,Read,Bash(gh issue view:*),Bash(gh issue comment:*),Bash(gh issue edit:*),Bash(gh issue list:*),Bash(gh pr view:*),Bash(gh pr list:*),Bash(gh pr diff:*),Bash(gh api:*),Bash(git log:*),Bash(git show:*),Bash(git blame:*),Bash(removeDeployBlockerLabel.sh:*)"
80+
--allowedTools "Task,Glob,Grep,Read,Write,Bash(gh issue view:*),Bash(gh issue comment:*),Bash(gh issue edit:*),Bash(gh issue list:*),Bash(gh pr view:*),Bash(gh pr list:*),Bash(gh pr diff:*),Bash(gh api:*),Bash(git log:*),Bash(git show:*),Bash(git blame:*),Bash(removeDeployBlockerLabel.sh:*)"

.github/workflows/syncVersions.yml

Lines changed: 88 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,56 @@ jobs:
3636
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
3737
SETUP_AS_APP: false
3838

39-
- name: Update submodule to latest Mobile-Expensify main
40-
run: git submodule update --remote
39+
- name: Record submodule gitlink and update Mobile-Expensify to latest main
40+
id: submoduleRemote
41+
run: |
42+
RECORDED_SHA=$(git rev-parse HEAD:Mobile-Expensify)
43+
echo "Submodule commit recorded on App: $RECORDED_SHA"
44+
echo "RECORDED_SHA=$RECORDED_SHA" >> "$GITHUB_OUTPUT"
45+
46+
git submodule update --remote
47+
48+
ACTUAL_SHA=$(git -C Mobile-Expensify rev-parse HEAD)
49+
echo "Mobile-Expensify after remote update: $ACTUAL_SHA"
50+
echo "ACTUAL_SHA=$ACTUAL_SHA" >> "$GITHUB_OUTPUT"
4151
42-
- name: Check current versions
52+
- name: Check sync state (versions + submodule pointer)
4353
id: checkVersions
4454
run: |
4555
APP_VERSION=$(jq -r .version package.json)
4656
ME_VERSION=$(jq -r .meta.version Mobile-Expensify/app/config/config.json)
57+
RECORDED_SHA="${{ steps.submoduleRemote.outputs.RECORDED_SHA }}"
58+
ACTUAL_SHA="${{ steps.submoduleRemote.outputs.ACTUAL_SHA }}"
59+
4760
echo "E/App version: $APP_VERSION"
4861
echo "Mobile-Expensify version: $ME_VERSION"
4962
echo "APP_VERSION=$APP_VERSION" >> "$GITHUB_OUTPUT"
5063
echo "ME_VERSION=$ME_VERSION" >> "$GITHUB_OUTPUT"
51-
52-
if [ "$APP_VERSION" == "$ME_VERSION" ]; then
53-
echo "::notice::✅ Versions are already in sync: $APP_VERSION"
64+
65+
if [[ "$RECORDED_SHA" != "$ACTUAL_SHA" ]]; then
66+
echo "::warning::⚠️ Submodule pointer is behind Mobile-Expensify main (recorded $RECORDED_SHA, latest $ACTUAL_SHA)"
67+
fi
68+
69+
if [[ "$APP_VERSION" == "$ME_VERSION" && "$RECORDED_SHA" == "$ACTUAL_SHA" ]]; then
70+
echo "::notice::✅ Versions and submodule are in sync ($APP_VERSION @ $ACTUAL_SHA)"
5471
echo "IN_SYNC=true" >> "$GITHUB_OUTPUT"
72+
echo "NEED_FULL_VERSION_SYNC=false" >> "$GITHUB_OUTPUT"
5573
else
56-
echo "::warning::⚠️ Versions are out of sync - E/App: $APP_VERSION, Mobile-Expensify: $ME_VERSION"
5774
echo "IN_SYNC=false" >> "$GITHUB_OUTPUT"
75+
if [[ "$APP_VERSION" != "$ME_VERSION" ]]; then
76+
echo "::warning::⚠️ Versions are out of sync - E/App: $APP_VERSION, Mobile-Expensify: $ME_VERSION"
77+
echo "NEED_FULL_VERSION_SYNC=true" >> "$GITHUB_OUTPUT"
78+
else
79+
echo "::notice::Versions match ($APP_VERSION) but App must record the latest submodule commit"
80+
echo "NEED_FULL_VERSION_SYNC=false" >> "$GITHUB_OUTPUT"
81+
fi
5882
fi
5983
6084
- name: Determine target version
61-
if: steps.checkVersions.outputs.IN_SYNC != 'true'
85+
if: steps.checkVersions.outputs.IN_SYNC != 'true' && steps.checkVersions.outputs.NEED_FULL_VERSION_SYNC == 'true'
6286
id: targetVersion
6387
run: |
64-
if [ -n "${{ inputs.TARGET_VERSION }}" ]; then
88+
if [[ -n "${{ inputs.TARGET_VERSION }}" ]]; then
6589
echo "Using provided target version: ${{ inputs.TARGET_VERSION }}"
6690
echo "VERSION=${{ inputs.TARGET_VERSION }}" >> "$GITHUB_OUTPUT"
6791
else
@@ -71,69 +95,109 @@ jobs:
7195
fi
7296
7397
- name: Setup Node
74-
if: steps.checkVersions.outputs.IN_SYNC != 'true'
98+
if: steps.checkVersions.outputs.IN_SYNC != 'true' && steps.checkVersions.outputs.NEED_FULL_VERSION_SYNC == 'true'
7599
uses: ./.github/actions/composite/setupNode
76100

77101
- name: Sync E/App to target version
78-
if: steps.checkVersions.outputs.IN_SYNC != 'true'
102+
if: steps.checkVersions.outputs.IN_SYNC != 'true' && steps.checkVersions.outputs.NEED_FULL_VERSION_SYNC == 'true'
79103
run: |
80104
TARGET="${{ steps.targetVersion.outputs.VERSION }}"
81105
echo "::notice::Syncing E/App to version $TARGET"
82-
106+
83107
# Update version using npm (this updates package.json and package-lock.json)
84108
npm --no-git-tag-version version "$TARGET"
85-
109+
86110
# Extract version components for native file updates
87111
SHORT_VERSION="${TARGET%-*}" # e.g., "9.3.11" from "9.3.11-48"
88112
BUILD_NUMBER="${TARGET#*-}" # e.g., "48" from "9.3.11-48"
89113
CF_VERSION="${SHORT_VERSION}.${BUILD_NUMBER}" # e.g., "9.3.11.48"
90-
114+
91115
# Pad build number components for Android version code (prefix 10 for E/App)
92116
IFS='.' read -r MAJOR MINOR PATCH <<< "$SHORT_VERSION"
93117
ANDROID_VERSION_CODE="10$(printf '%02d' "$MAJOR")$(printf '%02d' "$MINOR")$(printf '%02d' "$PATCH")$(printf '%02d' "$BUILD_NUMBER")"
94-
118+
95119
echo "Updating Android build.gradle with versionName=$TARGET, versionCode=$ANDROID_VERSION_CODE"
96120
sed -i '' "s/versionName \"[0-9.-]*\"/versionName \"$TARGET\"/" android/app/build.gradle
97121
sed -i '' "s/versionCode [0-9]*/versionCode $ANDROID_VERSION_CODE/" android/app/build.gradle
98-
122+
99123
echo "Updating iOS plists with CFBundleShortVersionString=$SHORT_VERSION, CFBundleVersion=$CF_VERSION"
100124
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $SHORT_VERSION" ios/NewExpensify/Info.plist
101125
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $CF_VERSION" ios/NewExpensify/Info.plist
102126
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $SHORT_VERSION" ios/NotificationServiceExtension/Info.plist
103127
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $CF_VERSION" ios/NotificationServiceExtension/Info.plist
104128
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $SHORT_VERSION" ios/ShareViewController/Info.plist
105129
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $CF_VERSION" ios/ShareViewController/Info.plist
106-
130+
107131
# Commit version changes
108132
git add package.json package-lock.json android/app/build.gradle ios/*/Info.plist
109133
git commit -m "Update version to $TARGET (sync recovery)"
110-
134+
111135
# Update submodule reference
112136
git add Mobile-Expensify
113137
git commit -m "Update Mobile-Expensify submodule version to $TARGET (sync recovery)"
114-
138+
115139
# Push changes
116140
if ! git push origin main; then
117141
echo "::warning::Push failed, attempting rebase..."
118142
git fetch origin main
119143
git rebase origin/main
120144
git push origin main
121145
fi
122-
146+
123147
echo "::notice::✅ Successfully synced E/App to version $TARGET"
124148
149+
- name: Bump Mobile-Expensify submodule only
150+
if: steps.checkVersions.outputs.IN_SYNC != 'true' && steps.checkVersions.outputs.NEED_FULL_VERSION_SYNC != 'true'
151+
run: |
152+
EXPECTED_SHA="${{ steps.submoduleRemote.outputs.ACTUAL_SHA }}"
153+
CURRENT_SHA=$(git -C Mobile-Expensify rev-parse HEAD)
154+
if [[ "$CURRENT_SHA" != "$EXPECTED_SHA" ]]; then
155+
echo "::error::Mobile-Expensify checkout ($CURRENT_SHA) does not match expected main ($EXPECTED_SHA)"
156+
exit 1
157+
fi
158+
159+
echo "::notice::Recording Mobile-Expensify submodule at $CURRENT_SHA (versions already matched ${{ steps.checkVersions.outputs.APP_VERSION }})"
160+
git add Mobile-Expensify
161+
git commit -m "Bump Mobile-Expensify submodule to latest main ($CURRENT_SHA)"
162+
163+
if ! git push origin main; then
164+
echo "::warning::Push failed, attempting rebase..."
165+
git fetch origin main
166+
git rebase origin/main
167+
git submodule update --remote
168+
git add Mobile-Expensify
169+
if ! git diff --staged --quiet; then
170+
git commit -m "Bump Mobile-Expensify submodule to latest main after rebase ($(git -C Mobile-Expensify rev-parse HEAD))"
171+
fi
172+
git push origin main
173+
fi
174+
175+
echo "::notice::✅ Submodule pointer updated on App main"
176+
125177
- name: Verify sync completed
178+
id: verifySync
126179
if: steps.checkVersions.outputs.IN_SYNC != 'true'
127180
run: |
128181
APP_VERSION=$(jq -r .version package.json)
129182
ME_VERSION=$(jq -r .meta.version Mobile-Expensify/app/config/config.json)
130-
131-
if [ "$APP_VERSION" != "$ME_VERSION" ]; then
183+
184+
if [[ "$APP_VERSION" != "$ME_VERSION" ]]; then
132185
echo "::error::Sync failed! Versions still don't match"
133186
echo "::error::E/App: $APP_VERSION, Mobile-Expensify: $ME_VERSION"
134187
exit 1
135188
fi
136-
echo "::notice::✅ Versions verified: $APP_VERSION"
189+
190+
git -C Mobile-Expensify fetch origin
191+
192+
RECORDED=$(git rev-parse HEAD:Mobile-Expensify)
193+
REMOTE_SHA=$(git -C Mobile-Expensify rev-parse origin/main)
194+
if [[ "$RECORDED" != "$REMOTE_SHA" ]]; then
195+
echo "::error::Submodule on App main ($RECORDED) still differs from Mobile-Expensify origin/main ($REMOTE_SHA)"
196+
exit 1
197+
fi
198+
199+
echo "POST_SYNC_APP_VERSION=$APP_VERSION" >> "$GITHUB_OUTPUT"
200+
echo "::notice::✅ Verified versions ($APP_VERSION) and submodule match Mobile-Expensify main ($RECORDED)"
137201
138202
- name: Announce sync in Slack
139203
if: steps.checkVersions.outputs.IN_SYNC != 'true'
@@ -146,7 +210,7 @@ jobs:
146210
channel: '#deployer',
147211
attachments: [{
148212
color: "good",
149-
text: `✅ Version sync completed. E/App and Mobile-Expensify are now both at version ${{ steps.targetVersion.outputs.VERSION }}`
213+
text: `✅ Version sync completed. E/App and Mobile-Expensify are at ${{ steps.verifySync.outputs.POST_SYNC_APP_VERSION }}; submodule matches Mobile-Expensify main.`
150214
}]
151215
}
152216
env:

Mobile-Expensify

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ android {
111111
minSdkVersion rootProject.ext.minSdkVersion
112112
targetSdkVersion rootProject.ext.targetSdkVersion
113113
multiDexEnabled rootProject.ext.multiDexEnabled
114-
versionCode 1009036002
115-
versionName "9.3.60-2"
114+
versionCode 1009036017
115+
versionName "9.3.60-17"
116116
// Supported language variants must be declared here to avoid from being removed during the compilation.
117117
// This also helps us to not include unnecessary language variants in the APK.
118118
resConfigs "en", "es"

android/gradle.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ newArchEnabled=true
4444
# If set to false, you will be using JSC instead.
4545
hermesEnabled=true
4646

47+
# Use this property to enable or disable Hermes V1.
48+
hermesV1Enabled=true
49+
4750
# Key Store Information
4851
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
4952

-118 KB
Loading

0 commit comments

Comments
 (0)