agent-health
Reads production/traces/agent-metrics.jsonl and displays a per-agent performance summary table for the current or a specified session. Highlights agents with…
Deploys Puppeteer browser automation on Google Cloud Run with Docker. Use when running headless browser tasks on Cloud Run, or when the user mentions Cloud Run, Puppeteer, headless Chrome, or serverless browser automation.
$ npx -y skills add tranhieutt/software_development_department --skill cloud-run-puppeteer --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/cloud-run-puppeteerContext preview
The summary Claude sees to decide when to auto-load this skill.
Deploys Puppeteer browser automation on Google Cloud Run with Docker. Use when running headless browser tasks on Cloud Run, or when the user mentions Cloud Run, Puppeteer, headless Chrome, or serverless browser automation.
name: cloud-run-puppeteer type: reference description: "Deploys Puppeteer browser automation on Google Cloud Run with Docker. Use when running headless browser tasks on Cloud Run, or when the user mentions Cloud Run, Puppeteer, headless Chrome, or serverless browser automation." effort: 2 allowed-tools: Read, Glob, Grep, Bash user-invocable: true when_to_use: "When deploying a Node.js + Puppeteer / headless Chrome service to Google Cloud Run"
Hard-won lessons from deploying Puppeteer to Cloud Run. These are non-obvious gotchas that cost significant debug time.
Cloud Run **gen1** uses gVisor sandbox — blocks Linux syscalls Chrome needs to create processes. Puppeteer will hang/timeout silently.
gcloud run deploy my-service \ --execution-environment gen2 # <-- required for Chrome/Puppeteer
Never deploy a Puppeteer service on gen1.
---
`node:18` base image does not include libraries Chrome needs. Missing any one of these causes launch failure.
FROM node:18
RUN apt-get update && apt-get install -y \
ca-certificates fonts-liberation fonts-ipafont-gothic fonts-wqy-zenhei \
libasound2 libatk-bridge2.0-0 libatk1.0-0 libcairo2 libcups2 \
libdbus-1-3 libdrm2 libgbm1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 \
libpango-1.0-0 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 \
libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 \
libxss1 libxtst6 xdg-utils --no-install-recommends \
&& rm -rf /var/lib/apt/lists/*---
Nếu mount secret vào cùng path với `WORKDIR`, volume mount sẽ **che toàn bộ thư mục** — chỉ còn file secret, code biến mất.
# SAI — mount trùng WORKDIR /app --set-secrets "/app/service-account.json=my-secret:latest" # ĐÚNG — mount ra path riêng --set-secrets "/secrets/service-account.json=my-secret:latest"
ENV GOOGLE_CREDS_PATH=/secrets/service-account.json
> **Windows/Git Bash warning:** `--set-env-vars` với path Unix sẽ bị Git Bash convert thành Windows path. Set `ENV` trực tiếp trong Dockerfile thay vì truyền qua CLI.
---
const browser = await puppeteer.launch({
headless: 'new',
timeout: 60000, // cold start cần thời gian — mặc định 30s không đủ
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage', // /dev/shm nhỏ trong container
'--single-process',
'--no-zygote',
'--disable-gpu',
],
});---
Chỉ có 4 giá trị hợp lệ — `'commit'` (từ Playwright) KHÔNG tồn tại:
| Giá trị | Ý nghĩa | |---------|---------| | `load` | Chờ event `load` (chậm nhất) | | `domcontentloaded` | Chờ DOM parse xong (khuyên dùng) | | `networkidle0` | Không còn request nào trong 500ms | | `networkidle2` | ≤ 2 request đang chờ trong 500ms |
Với trang nặng từ server overseas, dùng `domcontentloaded` + timeout cao + `waitForFunction` chờ content cụ thể:
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 120000 });
await page.waitForFunction(
() => document.body && document.body.innerText.includes('target-text'),
{ timeout: 60000 }
);---
Chặn images, CSS, fonts giảm băng thông đáng kể — quan trọng khi crawl từ server overseas:
await page.setRequestInterception(true);
page.on('request', (req) => {
if (['image', 'stylesheet', 'font', 'media'].includes(req.resourceType())) {
req.abort();
} else {
req.continue();
}
});---
gcloud run deploy my-service \ --image gcr.io/PROJECT_ID/my-image \ --region asia-southeast1 \ --platform managed \ --execution-environment gen2 \ --memory 2Gi \ --cpu 2 \ --timeout 300 \ --set-secrets "/secrets/service-account.json=my-secret:latest" \ --allow-unauthenticated
Puppeteer cần ít nhất **2Gi RAM** — Chrome dùng nhiều memory.
Repo: tranhieutt/software_development_department
Reads production/traces/agent-metrics.jsonl and displays a per-agent performance summary table for the current or a specified session. Highlights agents with…
Provides the vendored agent-style v0.3.5 prose rule pack as a portable Claude skill. Use when installing, syncing, applying, or auditing SDD Agent-Style…
Provides Angular best practices for components, modules, services, and reactive patterns. Use when working with Angular TypeScript files, component templates,…
Records unexpected API behaviors, undocumented caveats, version bugs, or non-obvious workarounds into .claude/memory/annotations.md. Use immediately when an…
Defines REST and GraphQL API contracts including endpoints, request/response schemas, auth flows, and versioning strategy. Use when designing a new API,…
Manages the ADR (Architecture Decision Record) registry. Use when recording tech-stack choices, design patterns, or infrastructure decisions with context,…