plugins/lisa-expo/skills/ops-run-local/SKILL.md
Manage the local development environment for Expo + serverless backend projects. Supports start, stop, restart, and status for the full stack or individual services.
npx skillsauth add codyswanngt/lisa ops-run-localInstall 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.
Manage the local development environment.
Argument: $ARGUMENTS — start, stop, restart, status, start-frontend, start-backend (default: start)
.)${BACKEND_DIR:-../backend-v2} — set BACKEND_DIR in .claude/settings.local.json if your backend is elsewhereBACKEND_DIR="${BACKEND_DIR:-../backend-v2}"
test -d "$BACKEND_DIR" && echo "Backend dir OK: $BACKEND_DIR" || echo "ERROR: Backend dir not found at $BACKEND_DIR — set BACKEND_DIR"
lsof -i :8081 2>/dev/null | grep LISTEN
lsof -i :3000 2>/dev/null | grep LISTEN
which bun && bun --version
Read the frontend package.json to find available start scripts (e.g., start:local, start:dev, start:staging). Read the backend package.json to find backend start scripts (e.g., start:local, start:dev).
Start both backend and frontend for local development.
Start backend (background):
cd "${BACKEND_DIR:-../backend-v2}" && IS_OFFLINE=true bun run start:local
Run this in the background using the Bash tool with run_in_background: true.
Wait for backend (up to 30 seconds):
for i in $(seq 1 30); do
curl -sf http://localhost:3000/graphql -X POST \
-H "Content-Type: application/json" \
-d '{"query":"{ __typename }"}' > /dev/null 2>&1 && echo "Backend ready" && break
sleep 1
done
Start frontend (background):
bun run start:local
Run this in the background using the Bash tool with run_in_background: true.
Verify frontend (up to 60 seconds — Metro bundler can be slow):
for i in $(seq 1 60); do
curl -sf http://localhost:8081 > /dev/null 2>&1 && echo "Frontend ready" && break
sleep 1
done
Report status table.
Use when the backend is already deployed and you only need the frontend.
bun run start:dev
Run in background.
Verify:
for i in $(seq 1 60); do
curl -sf http://localhost:8081 > /dev/null 2>&1 && echo "Frontend ready" && break
sleep 1
done
Check AWS credentials (discover profile from backend package.json aws:signin:* scripts):
aws sts get-caller-identity --profile {aws-profile} 2>/dev/null
If expired, run the backend's aws:signin:{env} script.
Start:
cd "${BACKEND_DIR:-../backend-v2}" && IS_OFFLINE=true bun run start:local
Run in background.
Verify:
for i in $(seq 1 30); do
curl -sf http://localhost:3000/graphql -X POST \
-H "Content-Type: application/json" \
-d '{"query":"{ __typename }"}' > /dev/null 2>&1 && echo "Backend ready" && break
sleep 1
done
Kill all local services.
# Kill frontend (Metro bundler)
lsof -ti :8081 | xargs kill -9 2>/dev/null || echo "No frontend process on :8081"
# Kill backend (Serverless Offline)
lsof -ti :3000 | xargs kill -9 2>/dev/null || echo "No backend process on :3000"
# Stop Docker if running
cd "${BACKEND_DIR:-../backend-v2}" && docker compose down 2>/dev/null || true
sleep 2Check what is currently running and responsive.
echo "=== Port Check ==="
echo -n "Frontend :8081 — "; lsof -i :8081 2>/dev/null | grep LISTEN > /dev/null && echo "LISTENING" || echo "NOT LISTENING"
echo -n "Backend :3000 — "; lsof -i :3000 2>/dev/null | grep LISTEN > /dev/null && echo "LISTENING" || echo "NOT LISTENING"
echo ""
echo "=== Health Check ==="
echo -n "Frontend :8081 — "; curl -sf -o /dev/null -w "%{http_code}" http://localhost:8081 2>/dev/null || echo "UNREACHABLE"
echo -n "Backend :3000 — "; curl -sf -o /dev/null -w "%{http_code}" http://localhost:3000/graphql -X POST -H "Content-Type: application/json" -d '{"query":"{ __typename }"}' 2>/dev/null || echo "UNREACHABLE"
echo ""
echo "=== Docker ==="
docker compose -f "${BACKEND_DIR:-../backend-v2}/compose.yaml" ps 2>/dev/null || echo "No Docker services running"
Report results as a table:
| Service | Port | Listening | Responsive | |---------|------|-----------|------------| | Frontend (Metro) | 8081 | YES/NO | YES/NO | | Backend (Serverless Offline) | 3000 | YES/NO | YES/NO |
documentation
Onboard a user to the project via its LLM Wiki. Interviews the user about themselves in relation to the project, captures that to project-scoped memory only, then gives a guided tour of what the project is and sample questions they can ask. Use when someone is new to the project or asks to be onboarded. Read-mostly — it does not open PRs or write PII into the wiki.
documentation
Migrate an existing, hand-rolled wiki implementation onto the lisa-wiki kernel — phased and compatibility-first, with a strict no-loss guarantee. Use when adopting lisa-wiki in a repo that already has its own wiki/, ingest skills, docs, or roles. Renaming things into the canonical shape is fine; losing functionality or data is not. Ends by running /doctor.
development
Health-check the LLM Wiki. Reports orphan pages, contradictions, stale claims, broken internal links, missing index/log coverage, structure-manifest violations, and secret/tenant leaks. Use periodically or before hardening a wiki. Read-only — it reports findings, it does not fix them.
testing
Ingest source material into the LLM Wiki. With an argument (URL, file path, or prompt) it ingests that one source; with no argument it runs a full ingest across every enabled non-external-write source. Routes to the right connector, then runs the ordered pipeline (source note → synthesis → index → log → verify → state → commit/PR). Use whenever new knowledge should enter the wiki.