plugins/src/expo/skills/ops-deploy/SKILL.md
Deploy Expo frontend (EAS Update/Build) or serverless backend (Serverless Framework) to dev, staging, or production environments.
npx skillsauth add codyswanngt/lisa ops-deployInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Deploy the application to remote environments.
Argument: $ARGUMENTS — environment (dev, staging, production) and optional target (frontend, backend, both; default: both)
.)${BACKEND_DIR:-../backend-v2} — set BACKEND_DIR in .claude/settings.local.json if your backend is elsewhereCRITICAL: Production deployments require explicit human confirmation before proceeding. Always ask for confirmation when $ARGUMENTS contains production.
package.json to discover deploy:*, aws:signin:* scriptspackage.json to discover available scripts.env.{environment} files to find GraphQL URLs for post-deploy verificationThe standard deployment path is via CI/CD — pushing to environment branches triggers auto-deploy. Manual deployment instructions below are for when CI/CD is not suitable.
Use for JS-only changes (no native module changes).
Verify EAS CLI:
eas whoami
If not authenticated: eas login
Copy environment file:
cp .env.{environment} .env
Deploy OTA update:
STAGE={env} NODE_OPTIONS="--max-old-space-size=8192" eas update --auto --channel={env} --message="Manual update"
Verify deployment:
eas update:list --branch {env} --limit 3
app.config.ts or native modules change)eas build --platform all --non-interactive --no-wait --profile={profile}
Check build status:
eas build:list --limit 5
Verify AWS credentials (discover the profile from backend package.json or remote-routine
~/.aws/config):
cd "${BACKEND_DIR:-../backend-v2}"
aws sts get-caller-identity --profile {aws-profile}
If this is an interactive local session and credentials are expired, refresh the backend's local AWS signin flow. In a headless or remote-routine session, use the environment-backed assume-role profile and do not start an SSO browser/device flow.
Deploy all functions:
cd "${BACKEND_DIR:-../backend-v2}"
bun run deploy:{env}
Verify (use the GraphQL URL from .env.{environment}):
curl -sf {graphql-url} -X POST \
-H "Content-Type: application/json" \
-d '{"query":"{ __typename }"}' \
-w "\nHTTP %{http_code} in %{time_total}s\n"
Discover available function names from backend package.json deploy:function:* scripts:
cd "${BACKEND_DIR:-../backend-v2}"
FUNCTION_NAME={fn} bun run deploy:function:{env}
After any deployment:
ops-verify-health skill)ops-check-logs skill)ops-monitor-errors skill)ops-browser-uat skill)Report deployment result as a table:
| Target | Environment | Method | Status | Verification | |--------|-------------|--------|--------|-------------| | Frontend | dev | EAS Update | SUCCESS/FAIL | URL responds | | Backend | dev | Serverless | SUCCESS/FAIL | GraphQL responds |
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.
tools
Configure the official SonarQube plugin + MCP as Lisa's single Sonar substrate across every supported coding agent. Installs/updates the SonarQube CLI, authenticates (browser login on a dev machine, or SONARQUBE_CLI_TOKEN headless), selects the Test Manager target, runs `sonar integrate <agent>` for each supported agent (Claude, Codex, Cursor, Copilot, Antigravity) and wires the MCP for OpenCode, then writes only non-secret policy to .lisa.config.json. Separate from the CI SonarCloud scan gate, which is unchanged.