[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6X6S62VJ5CZXTPN397SS6WV":3,"skill-same:01M6X6S62VJ5CZXTPN397SS6WV":88},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":60,"ownerHtmlUrl":61,"ownerBlogUrl":60,"ownerDescription":62,"updatedAt":63,"install":64,"resources":77},"01M6X6S62VJ5CZXTPN397SS6WV","github-ci",null,"When working with GitHub Actions — workflow YAML, quality gates, test matrices, deployment triggers, reusable workflows — even when the user just says 'my CI is failing' or 'add a check'.","event4u-app\u002Fagent-config","event4u-app","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F199339632?v=4","01M6X5TWBNCQCE1VDKT4E9KF7N","event4u.app","01M6X5TWF4HRM266RG2Q5VVH1X",19,"MIT","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fgithub-ci\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"github ci","ci","github","check","failing","when","my","with","add","triggers","gates","reusable","just","github actions","actions","quality gates","deployment","workflows","test","workflow","2026-11-10 10:12:30",false,"---\nmodel_tier: medium\nname: github-ci\ndescription: \"When working with GitHub Actions — workflow YAML, quality gates, test matrices, deployment triggers, reusable workflows — even when the user just says 'my CI is failing' or 'add a check'.\"\ndomain: devops\nworkspaces:\n  - engineering\npacks:\n  - engineering-base\n---\n\n# github-ci\n\n## When to use\n\nUse this skill when working with GitHub Actions workflows, CI pipeline configuration, or understanding the automated quality and deployment process.\n\n## Procedure: Modify CI workflows\n\n1. Read `.github\u002Fworkflows\u002F` to understand the full pipeline.\n2. Check `AGENTS.md` for quality tool commands and testing setup.\n3. Read `commands\u002Ffix\u002Fci.md` for CI failure debugging workflow.\n\n## Workflow overview\n\nDo not assume a pipeline shape — read `.github\u002Fworkflows\u002F` and tabulate, per\nworkflow, its trigger (`on:`) and the environment or target it reaches:\n\n| Workflow | Trigger | Environment \u002F target |\n|---|---|---|\n| *(one row per file you read)* | | |\n\nNote which jobs are **privileged** — they hold `id-token: write`,\n`contents: write`, or a secret other than `GITHUB_TOKEN` — because the security\nconventions below bind tighter there.\n\n## Conventions\n\n### Workflow structure\n\n- Use **pinned action versions** with SHA hashes (not tags): `actions\u002Fcheckout@\u003Csha> # v6.0.2`\n- Use **concurrency groups** to prevent duplicate runs: `group: ${{ github.workflow }}-${{ github.ref }}`\n- Use **`fail-fast: false`** in matrix strategies for independent job execution.\n- Extract shared logic into **reusable workflows** (`on: workflow_call`).\n- **Free text reaches a script only through `env:`.** A `${{ }}` reading a\n  free-text context — a `type: string` or untyped input, a release tag\u002Fname\u002Fbody,\n  a PR title\u002Fbody\u002Fhead ref, `github.head_ref`, a commit message, a label name —\n  never sits inline in `run:` or a github-script `script:`; set it as a step\n  `env:` variable and read it as `\"$VAR\"`. Hold a value that later steps\n  re-interpolate (a resolved tag) to a fixed shape. Linter rule:\n  `template-injection`.\n- **Every `actions\u002Fcheckout` states `persist-credentials`.** `false` by default;\n  `true` only where a later step pushes, with a comment naming that step. Linter\n  rule: `persist-credentials`.\n- **No Actions cache in a privileged job.** A job with `id-token: write`,\n  `contents: write` or a non-default secret does not restore a cache (`cache:`\n  on a `setup-*` action, or `actions\u002Fcache`) — a lower-privilege workflow can\n  write the entry it restores. Linter rule: `privileged-job-cache`.\n- A job with **`container:`** MUST run `git config --global --add safe.directory \"$GITHUB_WORKSPACE\"` immediately after `actions\u002Fcheckout` — the checkout is owned by a different UID than the container user, so without it every git-backed step dies with `fatal: detected dubious ownership`.\n\n### Runtime version\n\n- **Never hardcode** the language runtime version in workflows.\n- Read it from the project's own source of truth (a Dockerfile `ARG`, `.nvmrc`,\n  `engines`, `.tool-versions`) and pass it via job outputs to dependent jobs.\n\n### Runners\n\nCheck `.github\u002Fworkflows\u002F` for the runner types used. Common patterns:\n- Standard runners (`ubuntu-latest`) for light jobs.\n- Larger or custom runners for heavy jobs (static analysis, tests).\n- ARM runners if the project deploys to ARM-based infrastructure.\n\n### Environment variables\n\n- Use `env:` at job level for shared secrets.\n- Use `$GITHUB_OUTPUT` for passing data between steps.\n- Use `$GITHUB_ENV` for variables needed across multiple steps.\n\n## Debugging CI failures\n\n1. Get the failing run: `GET \u002Frepos\u002F{owner}\u002F{repo}\u002Factions\u002Fruns?branch={branch}`\n2. Get failed jobs: `GET \u002Frepos\u002F{owner}\u002F{repo}\u002Factions\u002Fruns\u002F{run_id}\u002Fjobs`\n3. Get logs: `GET \u002Frepos\u002F{owner}\u002F{repo}\u002Factions\u002Fjobs\u002F{job_id}\u002Flogs`\n4. Fix locally, verify in container, then push.\n\nSee `commands\u002Ffix\u002Fci.md` for the full debugging workflow.\n\n\n## Output format\n\n1. Modified workflow YAML file(s) in `.github\u002Fworkflows\u002F`\n2. Summary of pipeline changes and affected triggers\n\n## Auto-trigger keywords\n\n- GitHub Actions\n- CI\u002FCD\n- workflow\n- pipeline\n- quality checks\n\n## Gotcha\n\n- CI workflows run on Ubuntu, not macOS — don't assume macOS-specific tools are available.\n- The model forgets to add `--env=testing` to artisan commands in CI — tests will hit the wrong database.\n- Secret names are case-sensitive in GitHub Actions — double-check the casing.\n- Don't add `continue-on-error: true` to hide failures — fix the actual error.\n\n## Do NOT\n\n- Do NOT use unpinned action versions (e.g., `actions\u002Fcheckout@v4`).\n- Do NOT hardcode the runtime version — read it from the project's own source.\n- Do NOT interpolate free text into `run:` — pass it through `env:`.\n- Do NOT add new secrets without documenting them.\n- Do NOT change runner types without considering cost and architecture (ARM vs x86).\n","# github-ci\n\n## When to use\n\nUse this skill when working with GitHub Actions workflows, CI pipeline configuration, or understanding the automated quality and deployment process.\n\n## Procedure: Modify CI workflows\n\n1. Read `.github\u002Fworkflows\u002F` to understand the full pipeline.\n2. Check `AGENTS.md` for quality tool commands and testing setup.\n3. Read `commands\u002Ffix\u002Fci.md` for CI failure debugging workflow.\n\n## Workflow overview\n\nDo not assume a pipeline shape — read `.github\u002Fworkflows\u002F` and tabulate, per\nworkflow, its trigger (`on:`) and the environment or target it reaches:\n\n| Workflow | Trigger | Environment \u002F target |\n|---|---|---|\n| *(one row per file you read)* | | |\n\nNote which jobs are **privileged** — they hold `id-token: write`,\n`contents: write`, or a secret other than `GITHUB_TOKEN` — because the security\nconventions below bind tighter there.\n\n## Conventions\n\n### Workflow structure\n\n- Use **pinned action versions** with SHA hashes (not tags): `actions\u002Fcheckout@\u003Csha> # v6.0.2`\n- Use **concurrency groups** to prevent duplicate runs: `group: ${{ github.workflow }}-${{ github.ref }}`\n- Use **`fail-fast: false`** in matrix strategies for independent job execution.\n- Extract shared logic into **reusable workflows** (`on: workflow_call`).\n- **Free text reaches a script only through `env:`.** A `${{ }}` reading a\n  free-text context — a `type: string` or untyped input, a release tag\u002Fname\u002Fbody,\n  a PR title\u002Fbody\u002Fhead ref, `github.head_ref`, a commit message, a label name —\n  never sits inline in `run:` or a github-script `script:`; set it as a step\n  `env:` variable and read it as `\"$VAR\"`. Hold a value that later steps\n  re-interpolate (a resolved tag) to a fixed shape. Linter rule:\n  `template-injection`.\n- **Every `actions\u002Fcheckout` states `persist-credentials`.** `false` by default;\n  `true` only where a later step pushes, with a comment naming that step. Linter\n  rule: `persist-credentials`.\n- **No Actions cache in a privileged job.** A job with `id-token: write`,\n  `contents: write` or a non-default secret does not restore a cache (`cache:`\n  on a `setup-*` action, or `actions\u002Fcache`) — a lower-privilege workflow can\n  write the entry it restores. Linter rule: `privileged-job-cache`.\n- A job with **`container:`** MUST run `git config --global --add safe.directory \"$GITHUB_WORKSPACE\"` immediately after `actions\u002Fcheckout` — the checkout is owned by a different UID than the container user, so without it every git-backed step dies with `fatal: detected dubious ownership`.\n\n### Runtime version\n\n- **Never hardcode** the language runtime version in workflows.\n- Read it from the project's own source of truth (a Dockerfile `ARG`, `.nvmrc`,\n  `engines`, `.tool-versions`) and pass it via job outputs to dependent jobs.\n\n### Runners\n\nCheck `.github\u002Fworkflows\u002F` for the runner types used. Common patterns:\n- Standard runners (`ubuntu-latest`) for light jobs.\n- Larger or custom runners for heavy jobs (static analysis, tests).\n- ARM runners if the project deploys to ARM-based infrastructure.\n\n### Environment variables\n\n- Use `env:` at job level for shared secrets.\n- Use `$GITHUB_OUTPUT` for passing data between steps.\n- Use `$GITHUB_ENV` for variables needed across multiple steps.\n\n## Debugging CI failures\n\n1. Get the failing run: `GET \u002Frepos\u002F{owner}\u002F{repo}\u002Factions\u002Fruns?branch={branch}`\n2. Get failed jobs: `GET \u002Frepos\u002F{owner}\u002F{repo}\u002Factions\u002Fruns\u002F{run_id}\u002Fjobs`\n3. Get logs: `GET \u002Frepos\u002F{owner}\u002F{repo}\u002Factions\u002Fjobs\u002F{job_id}\u002Flogs`\n4. Fix locally, verify in container, then push.\n\nSee `commands\u002Ffix\u002Fci.md` for the full debugging workflow.\n\n\n## Output format\n\n1. Modified workflow YAML file(s) in `.github\u002Fworkflows\u002F`\n2. Summary of pipeline changes and affected triggers\n\n## Auto-trigger keywords\n\n- GitHub Actions\n- CI\u002FCD\n- workflow\n- pipeline\n- quality checks\n\n## Gotcha\n\n- CI workflows run on Ubuntu, not macOS — don't assume macOS-specific tools are available.\n- The model forgets to add `--env=testing` to artisan commands in CI — tests will hit the wrong database.\n- Secret names are case-sensitive in GitHub Actions — double-check the casing.\n- Don't add `continue-on-error: true` to hide failures — fix the actual error.\n\n## Do NOT\n\n- Do NOT use unpinned action versions (e.g., `actions\u002Fcheckout@v4`).\n- Do NOT hardcode the runtime version — read it from the project's own source.\n- Do NOT interpolate free text into `run:` — pass it through `env:`.\n- Do NOT add new secrets without documenting them.\n- Do NOT change runner types without considering cost and architecture (ARM vs x86).\n",{"name":5,"packs":49,"domain":51,"model_tier":52,"workspaces":53,"description":7},[50],"engineering-base","devops","medium",[54],"engineering","main","12bd765ce1d800501d45dfb8232102793af01290","src\u002Fskills\u002Fgithub-ci",1,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config","https:\u002F\u002Fevent4u.app","https:\u002F\u002Fgithub.com\u002Fevent4u-app","Your events in your hand","2026-11-14 02:29:41",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add event4u-app\u002Fagent-config --skill github-ci",{"tool":70,"command":71},"bunx","bunx skills add event4u-app\u002Fagent-config --skill github-ci",{"tool":73,"command":74},"pnpm","pnpm dlx skills add event4u-app\u002Fagent-config --skill github-ci","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fgithub-ci\u002FSKILL.md",true,[78,84],{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"evals\u002Fevals.json","REFERENCE","参考文档",1043,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fgithub-ci\u002Fevals\u002Fevals.json",{"path":85,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":86,"sourceHtmlUrl":87},"evals\u002Ftriggers.json",2637,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fgithub-ci\u002Fevals\u002Ftriggers.json",[89,103,116,128,140,150],{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":96,"publishedAt":44},"01M6X84PK96XBPENXH66JCTSD1","unknown-key-fixture","Declares a key the schema does not know.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Funknown-key\u002FSKILL.md",[95],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[97,98,99,100,101,102],"unknown key fixture","Unknown key","fixture","unknown","schema","package",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":110,"publishedAt":44},"01M6X84HW7NAHZ7GZMQ9RXK1XJ","portable-fixture","Declares only semantics the MCP-lite carrier transports whole.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fportable\u002FSKILL.md",[109],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[99,111,112,113,114,102,115],"portable","portable fixture","engineer","only","MCP",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":123,"publishedAt":44},"01M6X84F29FE0RGGZ1ZTFGZTX2","non-portable-fixture","Declares a runtime semantic the carrier drops.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fnon-portable\u002FSKILL.md",[122],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[112,124,111,99,125,126,127,102],"non portable fixture","semantic","high","runtime",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":135,"publishedAt":44},"01M6X848F706PT9MDCX75JKJ6B","candidate-zero-width","A candidate whose prose carries an invisible joiner.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fzero-width-injection\u002FSKILL.md",[134],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[136,137,138,139],"candidate zero width","candidate","ZeRO","prose",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":147,"publishedAt":44},"01M6X841SSC2T31VDF41SA6DG1","candidate-disclosure-suppression","A candidate whose prose tells the agent to withhold from the user.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdisclosure-suppression\u002FSKILL.md",[146],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[148,137,139,149],"candidate disclosure suppression","user",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":157,"publishedAt":44},"01M6X83TFS5AGPBPVTQNWP0BB3","candidate-dangerous-frontmatter","A candidate claiming an unscoped tool grant and a permission bypass.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdangerous-frontmatter\u002FSKILL.md",[156],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[158,137,159,160,161,162],"candidate dangerous frontmatter","frontmatter","shell","permission","tool"]