{"id":"810eb44f-a4b4-4702-915d-23f771d573b3","shortId":"JEnq32","kind":"skill","title":"github-actions-setup","tagline":"Setup assistant for running Stably Playwright tests in GitHub Actions CI/CD.\nUse this skill when setting up CI, configuring GitHub Actions, or debugging\nCI workflow failures. Triggers on \"setup github actions\", \"CI setup\",\n\"github actions for tests\", \"configure CI\", \"run tests in","description":"# GitHub Actions Setup for Stably Playwright Tests\n\nYou are an expert CI/CD assistant that helps users set up GitHub Actions workflows to run Stably Playwright tests. Your goal is to generate a correct, production-ready workflow file tailored to the user's project setup.\n\n## Critical Behavior Rules\n\n1. **Work autonomously** - Detect the project setup and generate the workflow without unnecessary questions\n2. **Ask permission only for:**\n   - Writing the workflow file\n   - Enabling optional features (self-healing, scheduled runs)\n3. **Show what you're doing** - Announce each step as you begin it\n4. **Handle errors gracefully** - If detection fails, ask the user rather than guessing\n\n## Your Task\n\nGuide the user through setting up a GitHub Actions workflow for their Stably Playwright tests by following these steps in order.\n\n**IMPORTANT: Start immediately without asking for confirmation.** Begin with Step 1 as soon as the user invokes you.\n\n---\n\n## Step 1: Detect Project Setup\n\n**Announce:**\n```\nSetting up GitHub Actions for Stably Playwright tests!\n\nStep 1 of 5: Detecting your project setup...\n```\n\n**Detect the following automatically:**\n\n### 1a. Package Manager\nCheck for lock files in the project root (and monorepo subdirectories):\n- `pnpm-lock.yaml` -> pnpm\n- `yarn.lock` -> yarn (then check version — see 1b)\n- `package-lock.json` -> npm\n\n### 1b. Yarn Version Detection (if yarn detected)\n- Check for `.yarnrc.yml` -> yarn berry (v2+)\n- Check `packageManager` field in `package.json` (e.g., `\"yarn@4.1.0\"`) -> berry if >= 2\n- If neither exists, assume yarn classic (v1)\n- This matters: berry uses `--immutable`, classic uses `--frozen-lockfile`; berry requires `corepack enable`, classic does not\n\n### 1c. Node.js Version\nCheck for version hints:\n- `.nvmrc` or `.node-version` file\n- `engines.node` in `package.json`\n- Default to `'20'` if not specified\n\n### 1d. Test Directory and Playwright Config\n- Find `playwright.config.ts` / `playwright.config.js` / `playwright.config.mjs`\n- Read the `testDir` setting from the config\n- If no config found, check for common test directories: `tests/`, `e2e/`, `test/`\n\n### 1e. Monorepo Detection\n- Check if `playwright.config.*` is in a subdirectory (not project root)\n- Check for `workspaces` in root `package.json`, `pnpm-workspace.yaml`, or `lerna.json`\n- If monorepo detected, identify the `working-directory` for the workflow\n\n### 1f. Stably CLI Package\n- Check if `stably` (the CLI) is in `devDependencies` in `package.json`\n- This is separate from `@stablyai/playwright-test` (the SDK) — the SDK does NOT include the CLI\n- If `stably` is missing, flag it — the workflow will fail with `stably: command not found`\n- Offer to install it: `npm install -D stably` (or pnpm/yarn equivalent)\n\n### 1g. Existing Workflows\n- Check if `.github/workflows/` already exists\n- Look for existing Playwright or test workflows to avoid conflicts\n- If a Stably workflow already exists, offer to update it instead\n\n**Report findings:**\n```\nDetected setup:\n- Package manager: [pnpm/yarn/npm]\n- Stably CLI (`stably`): [installed / MISSING — needs install]\n- Node.js version: [version]\n- Playwright config: [path]\n- Test directory: [path]\n- Monorepo: [yes/no, working directory if applicable]\n- Existing workflows: [list or none]\n\nProceeding to Step 2...\n```\n\n---\n\n## Step 2: Choose Workflow Features\n\n**Ask the user:**\n```\nStep 2 of 5: Choose workflow features\n\nWhich features would you like in your CI workflow?\n\n1. **Basic** - Run tests on push/PR (recommended to start)\n2. **Self-healing** - Run tests + auto-fix failures + create PR with fixes\n3. **Scheduled** - Run tests on a cron schedule (e.g., nightly)\n4. **Custom** - Let me know what you need\n\nDefault: Basic (option 1)\n```\n\n**WAIT for user's choice.** If they just say \"yes\" or \"go ahead\", use Basic.\n\n---\n\n## Step 3: Generate Workflow File\n\n**Announce:**\n```\nStep 3 of 5: Generating workflow file...\n```\n\nGenerate the workflow YAML based on detected setup and chosen features. Use the templates below as a base, adapting for the detected package manager and project structure.\n\n### Common Pitfalls to Handle\n\nThese are real failure modes from production — the generated workflow MUST address all of them:\n\n1. **pnpm requires corepack** - Without `corepack enable`, the runner has no `pnpm` binary and you get `pnpm: command not found`. Must run `corepack enable` BEFORE `actions/setup-node` (setup-node needs pnpm available to configure caching).\n2. **yarn (berry/v2+) requires corepack** - Same as pnpm. For yarn classic (v1), it's pre-installed on GitHub runners.\n3. **Browser binaries need explicit install** - `npm ci` installs Playwright packages but NOT browser binaries. Must run `stably install --with-deps chromium` as a separate step. `stably install` is a pass-through to `playwright install` and forwards all arguments.\n4. **`--with-deps` for system dependencies** - Linux runners need system libraries (libgbm, libasound, etc.). The `--with-deps` flag installs them. Without it, browser launch fails with missing library errors. Specifying `chromium` (instead of all browsers) speeds up the install.\n5. **Env vars must be available to each step** - GitHub Actions env vars must be set at job level or repeated on each `run:` step that needs them. Prefer job-level `env:` to avoid forgetting.\n6. **Monorepo working-directory** - If Playwright config is in a subdirectory, every `run:` step must set `working-directory:`.\n7. **`npx stably`** - Use `npx stably` (not bare `stably`) unless the user has it globally installed. `npx` resolves from the project's local `node_modules`.\n8. **`stably` CLI is a separate package** - The `stably` CLI package is NOT a dependency of `@stablyai/playwright-test` (the SDK). Users must have `stably` in their `devDependencies` for `npx stably` to work. If it's missing, the skill should add it. Check `package.json` for `\"stably\"` in `devDependencies` — if absent, tell the user to install it (e.g., `npm install -D stably`).\n\n### Template: npm\n\n```yaml\nname: Stably E2E Tests\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\njobs:\n  e2e-tests:\n    runs-on: ubuntu-latest\n    timeout-minutes: 30\n    env:\n      STABLY_API_KEY: ${{ secrets.STABLY_API_KEY }}\n      STABLY_PROJECT_ID: ${{ secrets.STABLY_PROJECT_ID }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: '20'\n          cache: 'npm'\n\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Install browsers\n        run: npx stably install --with-deps chromium\n\n      - name: Run tests\n        run: npx stably test\n\n      - name: Upload test artifacts\n        if: ${{ !cancelled() }}\n        uses: actions/upload-artifact@v4\n        with:\n          name: playwright-report\n          path: playwright-report/\n          retention-days: 30\n```\n\n### Template: pnpm\n\n```yaml\nname: Stably E2E Tests\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\njobs:\n  e2e-tests:\n    runs-on: ubuntu-latest\n    timeout-minutes: 30\n    env:\n      STABLY_API_KEY: ${{ secrets.STABLY_API_KEY }}\n      STABLY_PROJECT_ID: ${{ secrets.STABLY_PROJECT_ID }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Enable corepack\n        run: corepack enable\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: '20'\n          cache: 'pnpm'\n\n      - name: Install dependencies\n        run: pnpm install --frozen-lockfile\n\n      - name: Install browsers\n        run: pnpm exec stably install --with-deps chromium\n\n      - name: Run tests\n        run: pnpm exec stably test\n\n      - name: Upload test artifacts\n        if: ${{ !cancelled() }}\n        uses: actions/upload-artifact@v4\n        with:\n          name: playwright-report\n          path: playwright-report/\n          retention-days: 30\n```\n\n### Template: yarn berry (v2+)\n\n```yaml\nname: Stably E2E Tests\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\njobs:\n  e2e-tests:\n    runs-on: ubuntu-latest\n    timeout-minutes: 30\n    env:\n      STABLY_API_KEY: ${{ secrets.STABLY_API_KEY }}\n      STABLY_PROJECT_ID: ${{ secrets.STABLY_PROJECT_ID }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Enable corepack\n        run: corepack enable\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: '20'\n          cache: 'yarn'\n\n      - name: Install dependencies\n        run: yarn install --immutable\n\n      - name: Install browsers\n        run: yarn stably install --with-deps chromium\n\n      - name: Run tests\n        run: yarn stably test\n\n      - name: Upload test artifacts\n        if: ${{ !cancelled() }}\n        uses: actions/upload-artifact@v4\n        with:\n          name: playwright-report\n          path: playwright-report/\n          retention-days: 30\n```\n\n> **Note:** Yarn berry (v2+) resolves local bin entries via `yarn <bin>`, so `yarn stably` works directly.\n> This does NOT work in yarn classic — see the classic template below.\n\n### Template: yarn classic (v1)\n\n```yaml\nname: Stably E2E Tests\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\njobs:\n  e2e-tests:\n    runs-on: ubuntu-latest\n    timeout-minutes: 30\n    env:\n      STABLY_API_KEY: ${{ secrets.STABLY_API_KEY }}\n      STABLY_PROJECT_ID: ${{ secrets.STABLY_PROJECT_ID }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: '20'\n          cache: 'yarn'\n\n      - name: Install dependencies\n        run: yarn install --frozen-lockfile\n\n      - name: Install browsers\n        run: npx stably install --with-deps chromium\n\n      - name: Run tests\n        run: npx stably test\n\n      - name: Upload test artifacts\n        if: ${{ !cancelled() }}\n        uses: actions/upload-artifact@v4\n        with:\n          name: playwright-report\n          path: playwright-report/\n          retention-days: 30\n```\n\n> **Note:** Yarn classic (v1) is pre-installed on GitHub runners — no `corepack enable` needed.\n> Use `npx stably` instead of `yarn stably` since yarn classic doesn't resolve bin entries the same way.\n\n### Monorepo Adaptation\n\nIf the project is a monorepo, add `defaults.run.working-directory` at the job level:\n\n```yaml\njobs:\n  e2e-tests:\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ./packages/app  # adjust to detected path\n    # ... rest of job\n```\n\nAnd adjust the `cache-dependency-path` so `setup-node` finds the lockfile:\n```yaml\n# pnpm\ncache-dependency-path: 'packages/app/pnpm-lock.yaml'\n# npm\ncache-dependency-path: 'packages/app/package-lock.json'\n# yarn\ncache-dependency-path: 'packages/app/yarn.lock'\n```\n\n> **Note:** `defaults.run.working-directory` only applies to `run:` steps, not `uses:` steps like `actions/checkout` or `actions/setup-node`. This is correct — you want to checkout at the repo root.\n\n### Self-Healing Addition\n\nIf the user chose self-healing (option 2), add `permissions` at the job level and append these steps after the test step:\n\n```yaml\njobs:\n  e2e-tests:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    # ... env, steps as before, then:\n\n      - name: Run tests\n        id: test\n        continue-on-error: true\n        run: npx stably test\n\n      - name: Auto-fix failures\n        if: steps.test.outcome == 'failure'\n        continue-on-error: true\n        run: npx stably fix\n\n      - name: Create PR with fixes\n        if: steps.test.outcome == 'failure'\n        continue-on-error: true\n        run: |\n          if [ -n \"$(git status --porcelain)\" ]; then\n            BRANCH=\"stably-fix/${{ github.run_id }}\"\n            git config user.name \"github-actions[bot]\"\n            git config user.email \"github-actions[bot]@users.noreply.github.com\"\n            git checkout -b \"$BRANCH\"\n            git add -A\n            git commit -m \"fix: auto-repair failing tests\"\n            git push origin \"$BRANCH\"\n            gh pr create \\\n              --title \"fix: auto-repair failing tests\" \\\n              --body \"Automated PR from Stably Fix after test failures in run #${{ github.run_number }}.\" \\\n              --base \"${{ github.event.pull_request.base.ref || github.ref_name }}\" \\\n              --head \"$BRANCH\"\n          fi\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Upload test artifacts\n        if: ${{ !cancelled() }}\n        uses: actions/upload-artifact@v4\n        with:\n          name: playwright-report\n          path: playwright-report/\n          retention-days: 30\n\n      - name: Fail if tests failed\n        if: steps.test.outcome == 'failure'\n        run: |\n          echo \"::error::Tests failed. A fix PR may have been created.\"\n          exit 1\n```\n\n**Important:**\n- The `permissions` block is required — without `contents: write` and `pull-requests: write`, the push and PR creation will fail with 403 errors.\n- The test step MUST have `id: test` and `continue-on-error: true` so downstream steps can still run.\n- The `--base` uses `github.event.pull_request.base.ref` on PR events (where `github.ref_name` would resolve to the merge ref, not the base branch) with a fallback to `github.ref_name` for push events.\n- Self-healing will not work on PRs from forks (the `GITHUB_TOKEN` cannot push to the base repo). Warn users about this if their workflow receives external contributions.\n- `stably fix` auto-detects the run ID in GitHub Actions via CI environment variables (automatically set by GitHub). No explicit run ID argument is needed.\n- The `gh` CLI (used for `gh pr create`) is pre-installed on `ubuntu-latest` runners. If using a custom runner image, ensure `gh` is available.\n- The artifact upload step preserves test reports and traces even on failure — useful for debugging.\n\n### Scheduled Addition\n\nIf the user chose scheduled (option 3), add cron and manual triggers alongside the existing push/PR triggers:\n\n```yaml\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n  schedule:\n    - cron: '0 6 * * *'  # Daily at 6 AM UTC\n  workflow_dispatch:  # Allow manual triggers from the Actions tab\n```\n\nIf the user wants schedule-only (no push/PR), remove the `push` and `pull_request` triggers.\n\n---\n\n## Step 4: Write Workflow File and Guide Secrets Setup\n\n**Show the generated workflow to the user and ask:**\n```\nStep 4 of 5: Write workflow file\n\nI'll create the following file:\n  .github/workflows/stably-e2e.yml\n\n[show full YAML]\n\nMay I write this file?\n```\n\n**WAIT for confirmation before writing.**\n\nAfter writing, guide secrets setup:\n```\nNow you need to add your Stably credentials as GitHub repository secrets:\n\n1. Go to your repo on GitHub -> Settings -> Secrets and variables -> Actions\n2. Click \"New repository secret\" and add:\n   - Name: STABLY_API_KEY    Value: (from https://auth.stably.ai/org/api_keys/)\n   - Name: STABLY_PROJECT_ID Value: (from your Stably dashboard)\n\nWithout these secrets, the workflow will fail with authentication errors.\n```\n\nIf the user chose self-healing, also mention:\n```\nThe GITHUB_TOKEN secret is automatically provided by GitHub Actions -\nno additional setup needed for the auto-fix PR step.\n```\n\n---\n\n## Step 5: Verify and Summarize\n\n**Announce:**\n```\nStep 5 of 5: Verification\n\nChecking the generated workflow...\n```\n\n**Verify:**\n1. The YAML file exists and is syntactically valid\n2. The workflow references the correct paths for the detected project structure\n3. All required env vars are referenced\n\n**Final summary:**\n```\nGitHub Actions setup complete!\n\nCreated: .github/workflows/stably-e2e.yml\n\nYour workflow will:\n- Trigger on [push/PR to main | schedule | etc.]\n- Install [npm/pnpm/yarn] dependencies with caching\n- Install Playwright browsers\n- Run Stably tests\n[- Auto-fix failures and create PRs (if self-healing)]\n[- Run on schedule: daily at 6 AM UTC (if scheduled)]\n\nNext steps:\n1. Add STABLY_API_KEY and STABLY_PROJECT_ID to GitHub Secrets\n   (Settings -> Secrets and variables -> Actions)\n2. Push this workflow to your repository\n3. Watch the run in the Actions tab\n\nTroubleshooting:\n- \"stably: command not found\" -> ensure `stably` is in package.json devDependencies (this is the CLI package; `@stablyai/playwright-test` is the SDK)\n- \"browser not found\" -> the 'Install browsers' step should handle this\n- Auth errors -> verify your GitHub Secrets are set correctly\n- pnpm not found -> ensure corepack enable runs before setup-node\n\nHappy testing!\n```\n\n---\n\n## Important Guidelines\n\n- **Detect, don't assume** - Always check the project for package manager, config location, and structure\n- **Use `npx stably` / `pnpm exec stably` / `yarn stably` (berry) / `npx stably` (yarn classic)** - Never use bare `stably` command in CI\n- **Job-level env vars** - Put `STABLY_API_KEY` and `STABLY_PROJECT_ID` at the job level to avoid repetition\n- **corepack before setup-node** - For pnpm and yarn berry (v2+), `corepack enable` MUST come before `actions/setup-node` because setup-node needs the package manager binary to set up caching. Yarn classic (v1) does not need corepack.\n- **`--frozen-lockfile` / `--immutable`** - Always use lockfile-strict install in CI to prevent drift\n- **Browser install is separate** - `npm ci` does NOT install browser binaries; always add the explicit install step\n- **Monorepo awareness** - If playwright config is in a subdirectory, set `working-directory` on the job\n- **Never hardcode secrets** - Always use `${{ secrets.* }}` references","tags":["github","actions","setup","agent","skills","stablyai","agent-skills"],"capabilities":["skill","source-stablyai","skill-github-actions-setup","topic-agent-skills"],"categories":["agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/stablyai/agent-skills/github-actions-setup","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add stablyai/agent-skills","source_repo":"https://github.com/stablyai/agent-skills","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 6 github stars · SKILL.md body (17,527 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:15:06.971Z","embedding":null,"createdAt":"2026-05-18T13:22:55.814Z","updatedAt":"2026-05-18T19:15:06.971Z","lastSeenAt":"2026-05-18T19:15:06.971Z","tsv":"'/org/api_keys/)':2059 '/packages/app':1449 '0':1938 '1':95,185,194,208,521,565,640,1736,2032,2125,2205 '1a':219 '1b':241,244 '1c':292 '1d':314 '1e':343 '1f':376 '1g':430 '2':109,267,496,498,506,530,675,1528,2044,2134,2222 '20':310,972,1082,1199,1333 '3':126,544,582,588,695,1914,2146,2229 '30':947,1020,1051,1135,1168,1248,1308,1384,1714 '4':139,554,736,1971,1989 '4.1.0':264 '403':1759 '5':210,508,590,777,1991,2110,2116,2118 '6':813,1939,1942,2198 '7':833 '8':858 'absent':905 'action':3,14,25,35,39,48,66,162,202,787,1628,1635,1848,1952,2043,2097,2156,2221,2235 'actions/checkout':963,1067,1184,1324,1502 'actions/setup-node':665,966,1076,1193,1327,1504,2362 'actions/upload-artifact':1006,1121,1234,1370,1700 'adapt':612,1419 'add':896,1426,1529,1643,1915,2024,2050,2206,2410 'addit':1519,1907,2099 'address':636 'adjust':1450,1458 'ahead':578 'allow':1947 'alongsid':1920 'alreadi':436,452 'also':2086 'alway':2295,2387,2409,2434 'announc':132,198,586,2114 'api':950,953,1054,1057,1171,1174,1311,1314,2053,2208,2333 'append':1536 'appli':1494 'applic':487 'argument':735,1861 'artifact':1002,1117,1230,1366,1696,1892 'ask':110,146,179,502,1987 'assist':6,59 'assum':271,2294 'auth':2267 'auth.stably.ai':2058 'auth.stably.ai/org/api_keys/)':2057 'authent':2077 'auto':537,1582,1650,1664,1841,2105,2183 'auto-detect':1840 'auto-fix':536,1581,2104,2182 'auto-repair':1649,1663 'autom':1669 'automat':218,1853,2093 'autonom':97 'avail':671,782,1890 'avoid':446,811,2344 'awar':2416 'b':1640 'bare':840,2321 'base':598,611,1681,1781,1798,1826 'basic':522,563,580 'begin':137,182 'behavior':93 'berri':255,265,277,285,1138,1251,2314,2355 'berry/v2':677 'bin':1255,1413 'binari':652,697,709,2371,2408 'block':1740 'bodi':1668 'bot':1629,1636 'branch':926,931,1030,1035,1147,1152,1287,1292,1617,1641,1657,1686,1799,1928,1933 'browser':696,708,760,772,983,1096,1211,1347,2178,2257,2262,2398,2407 'cach':674,973,1083,1200,1334,1461,1474,1480,1486,2175,2375 'cache-dependency-path':1460,1473,1479,1485 'cancel':1004,1119,1232,1368,1698 'cannot':1822 'check':222,238,251,257,295,335,346,356,380,433,898,2120,2296 'checkout':1511,1639 'choic':570 'choos':499,509 'chose':1523,1911,2082 'chosen':603 'chromium':717,768,991,1105,1219,1355 'ci':22,28,36,43,519,702,980,1850,2325,2394,2403 'ci/cd':15,58 'classic':273,280,289,685,1270,1273,1278,1387,1409,2318,2377 'cli':378,384,403,467,860,867,1866,2251 'click':2045 'come':2360 'command':416,657,2239,2323 'commit':1646 'common':337,621 'complet':2158 'config':319,330,333,477,820,1624,1631,2302,2419 'configur':23,42,673 'confirm':181,2012 'conflict':447 'content':1555,1744 'continu':1572,1589,1606,1770 'continue-on-error':1571,1588,1605,1769 'contribut':1837 'corepack':287,643,645,662,679,1071,1073,1188,1190,1397,2280,2346,2357,2382 'correct':79,1507,2139,2275 'creat':540,1598,1660,1734,1871,1997,2159,2187 'creation':1755 'credenti':2027 'critic':92 'cron':550,1916,1937 'custom':555,1884 'd':425,915 'daili':1940,2196 'dashboard':2068 'day':1019,1134,1247,1383,1713 'debug':27,1905 'default':308,562,1444 'defaults.run.working':1427,1491 'dep':716,739,754,990,1104,1218,1354 'depend':742,872,977,1087,1204,1338,1462,1475,1481,1487,2173 'detect':98,144,195,211,215,247,250,345,367,461,600,615,1452,1842,2143,2291 'devdepend':387,883,903,2247 'direct':1263 'directori':316,339,372,480,485,817,832,1428,1448,1492,2427 'dispatch':1946 'doesn':1410 'downstream':1775 'drift':2397 'e.g':262,552,912 'e2e':341,922,936,1026,1040,1143,1157,1283,1297,1436,1546 'e2e-tests':935,1039,1156,1296,1435,1545 'echo':1724 'enabl':118,288,646,663,1070,1074,1187,1191,1398,2281,2358 'engines.node':305 'ensur':1887,2242,2279 'entri':1256,1414 'env':778,788,809,948,1052,1169,1309,1561,1688,2149,2329 'environ':1851 'equival':429 'error':141,766,1574,1591,1608,1725,1760,1772,2078,2268 'etc':750,2170 'even':1900 'event':1786,1808 'everi':825 'exec':1099,1111,2310 'exist':270,431,437,440,453,488,1922,2129 'exit':1735 'expert':57 'explicit':699,1858,2412 'extern':1836 'fail':145,413,762,1652,1666,1716,1719,1727,1757,2075 'failur':30,539,628,1584,1587,1604,1676,1722,1902,2185 'fallback':1802 'featur':120,501,511,513,604 'fi':1687 'field':259 'file':84,117,225,304,585,593,1974,1994,2000,2009,2128 'final':2153 'find':320,460,1468 'fix':538,543,1583,1596,1601,1620,1648,1662,1673,1729,1839,2106,2184 'flag':408,755 'follow':170,217,1999 'forget':812 'fork':1818 'forward':733 'found':334,418,659,2241,2259,2278 'frozen':283,1092,1343,2384 'frozen-lockfil':282,1091,1342,2383 'full':2003 'generat':77,103,583,591,594,633,1981,2122 'get':655 'gh':1658,1689,1865,1869,1888 'git':1613,1623,1630,1638,1642,1645,1654 'github':2,13,24,34,38,47,65,161,201,693,786,1394,1627,1634,1820,1847,1856,2029,2038,2089,2096,2155,2215,2271 'github-act':1626,1633 'github-actions-setup':1 'github.event.pull_request.base.ref':1682,1783 'github.ref':1683,1788,1804 'github.run':1621,1679 'github/workflows':435 'github/workflows/stably-e2e.yml':2001,2160 'global':847 'go':577,2033 'goal':74 'grace':142 'guess':151 'guid':154,1976,2017 'guidelin':2290 'handl':140,624,2265 'happi':2287 'hardcod':2432 'head':1685 'heal':123,533,1518,1526,1811,2085,2192 'help':61 'hint':298 'id':957,960,1061,1064,1178,1181,1318,1321,1569,1622,1766,1845,1860,2063,2213,2338 'identifi':368 'imag':1886 'immedi':177 'immut':279,1208,2386 'import':175,1737,2289 'includ':401 'instal':421,424,469,472,691,700,703,713,723,731,756,776,848,910,914,976,982,987,1086,1090,1095,1101,1203,1207,1210,1215,1337,1341,1346,1351,1392,1875,2171,2176,2261,2392,2399,2406,2413 'instead':458,769,1403 'invok':191 'job':794,807,934,1038,1155,1295,1431,1434,1456,1533,1544,2327,2341,2430 'job-level':806,2326 'key':951,954,1055,1058,1172,1175,1312,1315,2054,2209,2334 'know':558 'latest':943,1047,1164,1304,1443,1553,1879 'launch':761 'lerna.json':364 'let':556 'level':795,808,1432,1534,2328,2342 'libasound':749 'libgbm':748 'librari':747,765 'like':516,1501 'linux':743 'list':490 'll':1996 'local':855,1254 'locat':2303 'lock':224 'lockfil':284,1093,1344,1470,2385,2390 'lockfile-strict':2389 'look':438 'm':1647 'main':927,932,1031,1036,1148,1153,1288,1293,1929,1934,2168 'manag':221,464,617,2301,2370 'manual':1918,1948 'master':928,933,1032,1037,1149,1154,1289,1294,1930,1935 'matter':276 'may':1731,2005 'mention':2087 'merg':1794 'minut':946,1050,1167,1307 'miss':407,470,764,892 'mode':629 'modul':857 'monorepo':231,344,366,482,814,1418,1425,2415 'must':635,660,710,780,790,828,878,1764,2359 'n':1612 'name':920,975,981,992,999,1009,1024,1069,1085,1094,1106,1114,1124,1141,1186,1202,1209,1220,1227,1237,1281,1336,1345,1356,1363,1373,1566,1580,1597,1684,1693,1703,1715,1789,1805,2051,2060 'need':471,561,669,698,745,803,1399,1863,2022,2101,2367,2381 'neither':269 'never':2319,2431 'new':2046 'next':2203 'night':553 'node':302,668,856,970,1080,1197,1331,1467,2286,2350,2366 'node-vers':301,969,1079,1196,1330 'node.js':293,473 'none':492 'note':1249,1385,1490 'npm':243,423,701,913,918,974,979,1478,2402 'npm/pnpm/yarn':2172 'npx':834,837,849,885,985,996,1349,1360,1401,1577,1594,2307,2315 'number':1680 'nvmrc':299 'offer':419,454 'option':119,564,1527,1913 'order':174 'origin':1656 'packag':220,379,463,616,705,864,868,2252,2300,2369 'package-lock.json':242 'package.json':261,307,361,389,899,2246 'packagemanag':258 'packages/app/package-lock.json':1483 'packages/app/pnpm-lock.yaml':1477 'packages/app/yarn.lock':1489 'pass':727 'pass-through':726 'path':478,481,1013,1128,1241,1377,1453,1463,1476,1482,1488,1707,2140 'permiss':111,1530,1554,1739 'pitfal':622 'playwright':10,52,71,167,205,318,441,476,704,730,819,1011,1015,1126,1130,1239,1243,1375,1379,1705,1709,2177,2418 'playwright-report':1010,1014,1125,1129,1238,1242,1374,1378,1704,1708 'playwright.config':348 'playwright.config.js':322 'playwright.config.mjs':323 'playwright.config.ts':321 'pnpm':234,641,651,656,670,682,1022,1084,1089,1098,1110,1472,2276,2309,2352 'pnpm-lock.yaml':233 'pnpm-workspace.yaml':362 'pnpm/yarn':428 'pnpm/yarn/npm':465 'porcelain':1615 'pr':541,1599,1659,1670,1730,1754,1785,1870,2107 'pre':690,1391,1874 'pre-instal':689,1390,1873 'prefer':805 'preserv':1895 'prevent':2396 'proceed':493 'product':81,631 'production-readi':80 'project':90,100,196,213,228,354,619,853,956,959,1060,1063,1177,1180,1317,1320,1422,2062,2144,2212,2298,2337 'provid':2094 'prs':1816,2188 'pull':929,1033,1150,1290,1558,1748,1931,1967 'pull-request':1557,1747 'push':925,1029,1146,1286,1655,1752,1807,1823,1927,1965,2223 'push/pr':526,1923,1962,2166 'put':2331 'question':108 'rather':149 're':130 'read':324 'readi':82 'real':627 'receiv':1835 'recommend':527 'ref':1795 'refer':2137,2437 'referenc':2152 'remov':1963 'repair':1651,1665 'repeat':797 'repetit':2345 'repo':1514,1827,2036 'report':459,1012,1016,1127,1131,1240,1244,1376,1380,1706,1710,1897 'repositori':2030,2047,2228 'request':930,1034,1151,1291,1559,1749,1932,1968 'requir':286,642,678,1742,2148 'resolv':850,1253,1412,1791 'rest':1454 'retent':1018,1133,1246,1382,1712 'retention-day':1017,1132,1245,1381,1711 'root':229,355,360,1515 'rule':94 'run':8,44,69,125,523,534,546,661,711,800,826,939,978,984,993,995,1043,1072,1088,1097,1107,1109,1160,1189,1205,1212,1221,1223,1300,1339,1348,1357,1359,1439,1445,1496,1549,1567,1576,1593,1610,1678,1723,1779,1844,1859,2179,2193,2232,2282 'runner':648,694,744,1395,1880,1885 'runs-on':938,1042,1159,1299,1438,1548 'say':574 'schedul':124,545,551,1906,1912,1936,1959,2169,2195,2202 'schedule-on':1958 'sdk':396,398,876,2256 'secret':1977,2018,2031,2040,2048,2071,2091,2216,2218,2272,2433,2436 'secrets.github':1691 'secrets.stably':952,958,1056,1062,1173,1179,1313,1319 'see':240,1271 'self':122,532,1517,1525,1810,2084,2191 'self-heal':121,531,1516,1524,1809,2083,2190 'separ':392,720,863,2401 'set':20,63,158,199,327,792,829,1854,2039,2217,2274,2373,2424 'setup':4,5,33,37,49,91,101,197,214,462,601,667,1466,1978,2019,2100,2157,2285,2349,2365 'setup-nod':666,1465,2284,2348,2364 'show':127,1979,2002 'sinc':1407 'skill':18,894 'skill-github-actions-setup' 'soon':187 'source-stablyai' 'specifi':313,767 'speed':773 'stabli':9,51,70,166,204,377,382,405,415,426,450,466,468,712,722,835,838,841,859,866,880,886,901,916,921,949,955,986,997,1025,1053,1059,1100,1112,1142,1170,1176,1214,1225,1261,1282,1310,1316,1350,1361,1402,1406,1578,1595,1619,1672,1838,2026,2052,2061,2067,2180,2207,2211,2238,2243,2308,2311,2313,2316,2322,2332,2336 'stably-fix':1618 'stablyai/playwright-test':394,874,2253 'start':176,529 'status':1614 'step':134,172,184,193,207,495,497,505,581,587,721,785,801,827,961,1065,1182,1322,1497,1500,1538,1542,1562,1763,1776,1894,1970,1988,2108,2109,2115,2204,2263,2414 'steps.test.outcome':1586,1603,1721 'still':1778 'strict':2391 'structur':620,2145,2305 'subdirectori':232,352,824,2423 'summar':2113 'summari':2154 'syntact':2132 'system':741,746 'tab':1953,2236 'tailor':85 'task':153 'tell':906 'templat':607,917,1021,1136,1274,1276 'test':11,41,45,53,72,168,206,315,338,340,342,443,479,524,535,547,923,937,994,998,1001,1027,1041,1108,1113,1116,1144,1158,1222,1226,1229,1284,1298,1358,1362,1365,1437,1541,1547,1568,1570,1579,1653,1667,1675,1695,1718,1726,1762,1767,1896,2181,2288 'testdir':326 'timeout':945,1049,1166,1306 'timeout-minut':944,1048,1165,1305 'titl':1661 'token':1690,1692,1821,2090 'topic-agent-skills' 'trace':1899 'trigger':31,1919,1924,1949,1969,2164 'troubleshoot':2237 'true':1575,1592,1609,1773 'ubuntu':942,1046,1163,1303,1442,1552,1878 'ubuntu-latest':941,1045,1162,1302,1441,1551,1877 'unless':842 'unnecessari':107 'updat':456 'upload':1000,1115,1228,1364,1694,1893 'use':16,278,281,579,605,836,962,965,1005,1066,1075,1120,1183,1192,1233,1323,1326,1369,1400,1499,1699,1782,1867,1882,1903,2306,2320,2388,2435 'user':62,88,148,156,190,504,568,844,877,908,1522,1829,1910,1956,1985,2081 'user.email':1632 'user.name':1625 'users.noreply.github.com':1637 'utc':1944,2200 'v1':274,686,1279,1388,2378 'v2':256,1139,1252,2356 'v4':964,967,1007,1068,1077,1122,1185,1194,1235,1325,1328,1371,1701 'valid':2133 'valu':2055,2064 'var':779,789,2150,2330 'variabl':1852,2042,2220 'verif':2119 'verifi':2111,2124,2269 'version':239,246,294,297,303,474,475,971,1081,1198,1332 'via':1257,1849 'wait':566,2010 'want':1509,1957 'warn':1828 'watch':2230 'way':1417 'with-dep':714,737,752,988,1102,1216,1352 'without':106,178,644,758,1743,2069 'work':96,371,484,816,831,888,1262,1267,1447,1814,2426 'workflow':29,67,83,105,116,163,375,411,432,444,451,489,500,510,520,584,592,596,634,1834,1945,1973,1982,1993,2073,2123,2136,2162,2225 'working-directori':370,815,830,1446,2425 'workspac':358 'would':514,1790 'write':114,1556,1560,1745,1750,1972,1992,2007,2014,2016 'yaml':597,919,1023,1140,1280,1433,1471,1543,1925,2004,2127 'yarn':236,245,249,254,263,272,676,684,1137,1201,1206,1213,1224,1250,1258,1260,1269,1277,1335,1340,1386,1405,1408,1484,2312,2317,2354,2376 'yarn.lock':235 'yarnrc.yml':253 'yes':575 'yes/no':483","prices":[{"id":"c2aad3de-623e-4cfa-a18b-cb275e6e8bea","listingId":"810eb44f-a4b4-4702-915d-23f771d573b3","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"stablyai","category":"agent-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:22:55.814Z"}],"sources":[{"listingId":"810eb44f-a4b4-4702-915d-23f771d573b3","source":"github","sourceId":"stablyai/agent-skills/github-actions-setup","sourceUrl":"https://github.com/stablyai/agent-skills/tree/main/skills/github-actions-setup","isPrimary":false,"firstSeenAt":"2026-05-18T13:22:55.814Z","lastSeenAt":"2026-05-18T19:15:06.971Z"}],"details":{"listingId":"810eb44f-a4b4-4702-915d-23f771d573b3","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"stablyai","slug":"github-actions-setup","github":{"repo":"stablyai/agent-skills","stars":6,"topics":["agent-skills"],"license":null,"html_url":"https://github.com/stablyai/agent-skills","pushed_at":"2026-04-15T08:16:48Z","description":"AI agent skills for the Stably Playwright SDK.","skill_md_sha":"1acd51427fb6dd17e80d4726cc8200c762457881","skill_md_path":"skills/github-actions-setup/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/stablyai/agent-skills/tree/main/skills/github-actions-setup"},"layout":"multi","source":"github","category":"agent-skills","frontmatter":{"name":"github-actions-setup","license":"MIT","description":"Setup assistant for running Stably Playwright tests in GitHub Actions CI/CD.\nUse this skill when setting up CI, configuring GitHub Actions, or debugging\nCI workflow failures. Triggers on \"setup github actions\", \"CI setup\",\n\"github actions for tests\", \"configure CI\", \"run tests in CI\",\n\"github workflow\", or \"CI pipeline for playwright\"."},"skills_sh_url":"https://skills.sh/stablyai/agent-skills/github-actions-setup"},"updatedAt":"2026-05-18T19:15:06.971Z"}}