Skip to content

Commit 53fdc0a

Browse files
committed
Merge remote-tracking branch 'upstream/main' into fix/search-params-overwrite
# Conflicts: # src/components/Search/index.tsx
2 parents 7b5ab5d + 71a4eb6 commit 53fdc0a

1,455 files changed

Lines changed: 52960 additions & 34392 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

.claude/settings.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@
5252
"mcp__sentry__search_events",
5353
"mcp__sentry__search_issue_events",
5454
"mcp__sentry__search_issues",
55-
"mcp__sentry__whoami"
55+
"mcp__sentry__whoami",
56+
"Bash(agent-device *)",
57+
"Bash(echo \"$(npm root -g)/agent-device/skills/agent-device\")"
5658
]
5759
},
5860
"enabledPlugins": {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
name: agent-device
3+
description: Drive iOS and Android devices for the Expensify App - testing, debugging, performance profiling, bug reproduction, and feature verification. Use when the developer needs to interact with the mobile app on a device.
4+
allowed-tools: Bash(agent-device *) Bash(npm root *)
5+
---
6+
7+
# agent-device
8+
9+
## Pre-flight
10+
11+
`agent-device` CLI version: !`agent-device --version 2>&1 || echo "NOT_INSTALLED"`
12+
13+
Canonical skill reference path (read these files directly for device automation guidance - bootstrap, exploration, verification, debugging): !`echo "$(npm root -g)/agent-device/skills/agent-device"`
14+
15+
> If the version line above shows `NOT_INSTALLED` or a command-not-found error, **STOP** and instruct the developer to install it: `npm install -g agent-device`. All device interaction depends on it.

.claude/skills/coding-standards/rules/clean-react-0-compiler.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Manual memoization is therefore:
1818
The codebase enforces this via:
1919
- **Babel plugin**: `babel-plugin-react-compiler` in `babel.config.js`
2020
- **ESLint processor**: `eslint-plugin-react-compiler-compat` suppresses redundant lint rules when files compile successfully
21-
- **CI compliance check**: `scripts/react-compiler-compliance-check.ts` blocks PRs with manual memoization in new files
21+
- **CI compliance check**: `scripts/react-compiler-compliance-check.ts` enforces that new components/hooks compile and that existing compiled files don't regress
2222

2323
Reference: [React Compiler documentation](https://react.dev/learn/react-compiler)
2424

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Is Contributor+
2+
description: Check whether a GitHub user is a member of the Expensify/contributor-plus team. Sets IS_CPLUS=true when the user is a member, IS_CPLUS=false otherwise.
3+
4+
inputs:
5+
USERNAME:
6+
description: The GitHub login of the user to check.
7+
required: true
8+
OS_BOTIFY_TOKEN:
9+
description: OSBotify token. Needed to read team memberships (the default GITHUB_TOKEN lacks the read:org scope).
10+
required: true
11+
12+
outputs:
13+
IS_CPLUS:
14+
description: "'true' if the user is a member of Expensify/contributor-plus, 'false' otherwise."
15+
value: ${{ steps.check.outputs.IS_CPLUS }}
16+
17+
runs:
18+
using: composite
19+
steps:
20+
- name: Check Contributor+ membership
21+
id: check
22+
shell: bash
23+
env:
24+
GH_TOKEN: ${{ inputs.OS_BOTIFY_TOKEN }}
25+
USERNAME: ${{ inputs.USERNAME }}
26+
run: |
27+
if gh api "/orgs/Expensify/teams/contributor-plus/memberships/$USERNAME" --silent; then
28+
echo "::notice::✅ $USERNAME is a Contributor+ member"
29+
echo "IS_CPLUS=true" >> "$GITHUB_OUTPUT"
30+
else
31+
echo "::notice::$USERNAME is not a Contributor+ member"
32+
echo "IS_CPLUS=false" >> "$GITHUB_OUTPUT"
33+
fi

.github/actions/javascript/authorChecklist/categories/newComponentCategory.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,7 @@ function detectReactComponent(code: string, filename: string): boolean | undefin
6565
// eslint-disable-next-line @typescript-eslint/naming-convention
6666
ClassDeclaration(path) {
6767
const {superClass} = path.node as unknown as SuperClassType;
68-
if (
69-
superClass &&
70-
((superClass.object && superClass.object.name === 'React' && isComponentOrPureComponent(superClass.property.name)) || isComponentOrPureComponent(superClass.name))
71-
) {
68+
if (superClass && ((superClass.object?.name === 'React' && isComponentOrPureComponent(superClass.property.name)) || isComponentOrPureComponent(superClass.name))) {
7269
isReactComponent = true;
7370
path.stop();
7471
}

.github/actions/javascript/authorChecklist/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15767,11 +15767,11 @@ class GithubUtils {
1576715767
/**
1576815768
* Fetch all pull requests given a list of PR numbers.
1576915769
*/
15770-
static fetchAllPullRequests(pullRequestNumbers) {
15770+
static fetchAllPullRequests(pullRequestNumbers, repo = CONST_1.default.APP_REPO) {
1577115771
const oldestPR = pullRequestNumbers.sort((a, b) => a - b).at(0);
1577215772
return this.paginate(this.octokit.pulls.list, {
1577315773
owner: CONST_1.default.GITHUB_OWNER,
15774-
repo: CONST_1.default.APP_REPO,
15774+
repo,
1577515775
state: 'all',
1577615776
sort: 'created',
1577715777
direction: 'desc',

.github/actions/javascript/awaitStagingDeploys/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12545,11 +12545,11 @@ class GithubUtils {
1254512545
/**
1254612546
* Fetch all pull requests given a list of PR numbers.
1254712547
*/
12548-
static fetchAllPullRequests(pullRequestNumbers) {
12548+
static fetchAllPullRequests(pullRequestNumbers, repo = CONST_1.default.APP_REPO) {
1254912549
const oldestPR = pullRequestNumbers.sort((a, b) => a - b).at(0);
1255012550
return this.paginate(this.octokit.pulls.list, {
1255112551
owner: CONST_1.default.GITHUB_OWNER,
12552-
repo: CONST_1.default.APP_REPO,
12552+
repo,
1255312553
state: 'all',
1255412554
sort: 'created',
1255512555
direction: 'desc',

.github/actions/javascript/checkAndroidStatus/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -737288,11 +737288,11 @@ class GithubUtils {
737288737288
/**
737289737289
* Fetch all pull requests given a list of PR numbers.
737290737290
*/
737291-
static fetchAllPullRequests(pullRequestNumbers) {
737291+
static fetchAllPullRequests(pullRequestNumbers, repo = CONST_1.default.APP_REPO) {
737292737292
const oldestPR = pullRequestNumbers.sort((a, b) => a - b).at(0);
737293737293
return this.paginate(this.octokit.pulls.list, {
737294737294
owner: CONST_1.default.GITHUB_OWNER,
737295-
repo: CONST_1.default.APP_REPO,
737295+
repo,
737296737296
state: 'all',
737297737297
sort: 'created',
737298737298
direction: 'desc',

0 commit comments

Comments
 (0)