mattermost-mobile-upstream/.cursor/cursor.md
Nick Misasi 46c2da9d4e
Add Cursor Cloud Agent environment for PR babysitting (#10128)
* Add a Linux Cursor Cloud Agent environment for PR babysitting.

This gives cloud agents Node, GitHub CLI, and the same lint/tsc/Jest install path as PR CI, without Android or iOS native tooling.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Document Cloud Agent babysitter smoke checks from live validation.

Add the Ubuntu CI commands this VM can actually run, note gh/i18n footguns, and ship an optional smoke script for the next environment round.

Co-authored-by: nick.misasi <nick.misasi@mattermost.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 12:03:39 -04:00

72 lines
3.3 KiB
Markdown

# Cloud Agent — PR babysitter
This VM is Linux-only and exists to watch and unstick pull requests. It can lint, typecheck, run Jest, and drive GitHub checks. It cannot build or run the native iOS/Android apps.
Read [CLAUDE.md](../CLAUDE.md) for repository conventions. Do not try to run simulators, emulators, CocoaPods, Fastlane, Detox, or Maestro here.
## What this environment can run
These match the default PR workflow in `.github/workflows/ci.yml` (Ubuntu):
```bash
npm run lint
npm run tsc
npm run check # lint + tsc
./scripts/precommit/i18n.sh
npm run test:ci # local analog of the PR `test` job (that job uses test:ci:coverage)
cd detox && npm run tsc
bash detox/maestro/scripts/validate-flow-headers.sh
cd detox && npm run test:unit # detox JS unit tests, not device E2E
```
`./scripts/precommit/i18n.sh` may rewrite non-`en.json` locale files as a side effect. Discard those diffs — Weblate owns every language file except `assets/base/i18n/en.json`.
Or: `bash .cursor/scripts/cloud-agent-smoke.sh` (add `--with-jest` to include `npm run test:ci`).
Before pushing a CI fix, run the narrowest command that failed, then `npm run check` if you touched JS/TS.
If Jest or `tsc` is killed with OOM, retry with a smaller heap and fewer workers:
```bash
NODE_OPTIONS=--max_old_space_size=4096 npx tsc --noEmit
NODE_OPTIONS=--max_old_space_size=4096 npx jest --verbose=false --forceExit --workerIdleMemoryLimit=1GB --maxWorkers=2
```
## What this environment cannot run
- `npm install` / `npm ci` without `--ignore-scripts` — Solidarity requires `ANDROID_HOME` and `emulator`
- `npm run pod-install`, `npm run ios`, `npm run android`
- `npm run build:ios`, `npm run build:android`
- Detox / Maestro device tests (`npm run e2e:*`)
- Xcode, CocoaPods, Android SDK, simulators, emulators
- `actionlint` / `shellcheck` (diagnose workflow YAML from GitHub Actions logs)
- Coverage comparison against `main` artifacts (`npm run test:ci:coverage` needs GHA cache)
Deps were installed during boot with `npm ci --ignore-scripts` plus the same follow-up steps as `.github/actions/prepare-node-deps`. Do not reinstall with a full `npm install`.
## Babysitter loop
1. Resolve the PR: `gh pr view --json number,url,headRefName`
2. Inspect checks: `gh pr checks --json name,bucket,state,workflow,link`
3. If checks are pending: `gh pr checks --watch --fail-fast`
4. On failure, read the job log (`gh run view <id> --log-failed` for GitHub Actions) before changing code
5. Fix only in-scope failures; verify locally with the commands above; `git push` without `--force`
`gh pr checks` without `--json` exits `8` while any check is pending — that is not an environment failure. Prefer `--json` and read `state`. Cursor's `gh` token is read-only (no merge/comment writes); push fixes with `git`.
For iOS compile or E2E failures, diagnose from CI logs and push a targeted source fix. Do not attempt to reproduce native builds on this VM. Let GitHub's `macos-*` / E2E runners be the proof.
## Skip flags
Set these as Cloud Agent secrets or env vars to shorten boot:
| Flag | Effect |
|------|--------|
| `CLOUD_AGENT_SKIP_NPM_DEPS=1` | Skip root `npm ci` and asset generation |
| `CLOUD_AGENT_SKIP_DETOX_DEPS=1` | Skip `detox/` `npm ci` |
| `CLOUD_AGENT_SKIP_HUSKY=1` | Skip wiring git hooks |
## Secrets
None required. Cursor provides GitHub auth for `gh` against this repository.