[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EER796KM8T4Q36PRAZJDBE":3,"skill-same:01M6EER796KM8T4Q36PRAZJDBE":45},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":20,"frontMatter":21,"refName":22,"commitSha":23,"skillDirectory":24,"forksCount":25,"repositoryHtmlUrl":26,"repositoryHomepageUrl":27,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6EER796KM8T4Q36PRAZJDBE","cucumber",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fcucumber\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"# Cucumber\n\n## Overview\n\nYou are an expert in Cucumber and BDD testing. You help users write feature files in Gherkin syntax, implement step definitions in JavaScript\u002FTypeScript or other languages, organize test suites with tags and hooks, and integrate Cucumber into CI. You value well-written scenarios that serve as living documentation — readable by developers, testers, and stakeholders.\n\n## Instructions\n\n### Initial Assessment\n\n1. **Language** — JavaScript\u002FTypeScript, Java, Ruby, or Python?\n2. **Scope** — API testing, UI testing, or both?\n3. **Team** — Who writes feature files? (developers, QA, product)\n4. **Existing tests** — Adding BDD to an existing suite or starting fresh?\n\n### Setup (JavaScript)\n\n```bash\n# setup-cucumber.sh — Install Cucumber.js with TypeScript support.\nnpm install --save-dev @cucumber\u002Fcucumber ts-node typescript\nmkdir -p features\u002Fstep_definitions features\u002Fsupport\n```\n\n### Feature File\n\n```gherkin\n# features\u002Flogin.feature — Login feature with multiple scenarios.\n# Written in Gherkin syntax for non-technical stakeholders.\nFeature: User Login\n  As a registered user\n  I want to log in to my account\n  So that I can access my dashboard\n\n  Background:\n    Given the application is running\n    And the database has been seeded with test users\n\n  Scenario: Successful login with valid credentials\n    Given I am on the login page\n    When I enter \"user@example.com\" as the email\n    And I enter \"password123\" as the password\n    And I click the login button\n    Then I should be redirected to the dashboard\n    And I should see \"Welcome back\" on the page\n\n  Scenario: Failed login with invalid password\n    Given I am on the login page\n    When I enter \"user@example.com\" as the email\n    And I enter \"wrongpassword\" as the password\n    And I click the login button\n    Then I should see an error message \"Invalid credentials\"\n    And I should remain on the login page\n\n  Scenario Outline: Login validation\n    Given I am on the login page\n    When I enter \"\u003Cemail>\" as the email\n    And I enter \"\u003Cpassword>\" as the password\n    And I click the login button\n    Then I should see an error message \"\u003Cerror>\"\n\n    Examples:\n      | email              | password    | error                    |\n      |                    | password123 | Email is required        |\n      | user@example.com   |             | Password is required     |\n      | not-an-email       | password123 | Invalid email format     |\n```\n\n### Step Definitions\n\n```typescript\n\u002F\u002F features\u002Fstep_definitions\u002Flogin.steps.ts — Step definitions for the login feature.\n\u002F\u002F Maps Gherkin steps to test automation code.\nimport { Given, When, Then, Before } from '@cucumber\u002Fcucumber';\nimport { expect } from 'chai';\n\nlet app: any;\nlet currentPage: string;\nlet pageContent: string;\nlet errorMessage: string;\n\nBefore(async function () {\n  app = await startTestApp();\n});\n\nGiven('the application is running', async function () {\n  const health = await app.get('\u002Fhealth');\n  expect(health.status).to.equal(200);\n});\n\nGiven('the database has been seeded with test users', async function () {\n  await app.post('\u002Ftest\u002Fseed', {\n    users: [{ email: 'user@example.com', password: 'password123' }],\n  });\n});\n\nGiven('I am on the login page', async function () {\n  currentPage = '\u002Flogin';\n  const res = await app.get('\u002Flogin');\n  expect(res.status).to.equal(200);\n});\n\nWhen('I enter {string} as the email', async function (email: string) {\n  this.email = email;\n});\n\nWhen('I enter {string} as the password', async function (password: string) {\n  this.password = password;\n});\n\nWhen('I click the login button', async function () {\n  const res = await app.post('\u002Flogin', {\n    email: this.email,\n    password: this.password,\n  });\n  this.response = res;\n  if (res.status === 200) {\n    currentPage = '\u002Fdashboard';\n    pageContent = res.data.message;\n  } else {\n    errorMessage = res.data.error;\n  }\n});\n\nThen('I should be redirected to the dashboard', function () {\n  expect(currentPage).to.equal('\u002Fdashboard');\n});\n\nThen('I should see {string} on the page', function (text: string) {\n  expect(pageContent).to.include(text);\n});\n\nThen('I should see an error message {string}', function (message: string) {\n  expect(errorMessage).to.equal(message);\n});\n\nThen('I should remain on the login page', function () {\n  expect(currentPage).to.equal('\u002Flogin');\n});\n```\n\n### Hooks and World\n\n```typescript\n\u002F\u002F features\u002Fsupport\u002Fworld.ts — Custom World object for sharing state between steps.\n\u002F\u002F Provides helpers and context available in all step definitions.\nimport { setWorldConstructor, World, IWorldOptions } from '@cucumber\u002Fcucumber';\n\nexport class CustomWorld extends World {\n  app: any;\n  authToken: string | null = null;\n\n  constructor(options: IWorldOptions) {\n    super(options);\n  }\n\n  async authenticate(email: string, password: string) {\n    const res = await this.app.post('\u002Flogin', { email, password });\n    this.authToken = res.data.token;\n    return res;\n  }\n\n  async apiGet(path: string) {\n    return this.app.get(path, {\n      headers: this.authToken ? { Authorization: `Bearer ${this.authToken}` } : {},\n    });\n  }\n}\n\nsetWorldConstructor(CustomWorld);\n```\n\n### Cucumber Configuration\n\n```javascript\n\u002F\u002F cucumber.js — Cucumber.js configuration file.\n\u002F\u002F Defines profiles for different test environments.\nmodule.exports = {\n  default: {\n    requireModule: ['ts-node\u002Fregister'],\n    require: ['features\u002Fstep_definitions\u002F**\u002F*.ts', 'features\u002Fsupport\u002F**\u002F*.ts'],\n    format: ['progress', 'html:reports\u002Fcucumber.html', 'json:reports\u002Fcucumber.json'],\n    publishQuiet: true,\n  },\n  ci: {\n    requireModule: ['ts-node\u002Fregister'],\n    require: ['features\u002Fstep_definitions\u002F**\u002F*.ts', 'features\u002Fsupport\u002F**\u002F*.ts'],\n    format: ['json:reports\u002Fcucumber.json'],\n    tags: 'not @wip',\n    publishQuiet: true,\n  },\n};\n```\n\n### Running Cucumber\n\n```bash\n# run-cucumber.sh — Common Cucumber commands.\n# Run all features, specific tags, or individual scenarios.\n\n# Run all features\nnpx cucumber-js\n\n# Run with specific profile\nnpx cucumber-js --profile ci\n\n# Run by tag\nnpx cucumber-js --tags \"@smoke\"\nnpx cucumber-js --tags \"@login and not @wip\"\n\n# Run specific feature\nnpx cucumber-js features\u002Flogin.feature\n```\n\n### CI Integration\n\n```yaml\n# .github\u002Fworkflows\u002Fcucumber.yml — Run Cucumber BDD tests in CI.\n# Publishes HTML report as artifact.\nname: BDD Tests\non: [push]\njobs:\n  cucumber:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: 20\n      - run: npm ci\n      - run: npx cucumber-js --profile ci\n      - uses: actions\u002Fupload-artifact@v4\n        if: always()\n        with:\n          name: cucumber-report\n          path: reports\u002F\n```\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Fcucumber",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill cucumber",{"tool":37,"command":38},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill cucumber",{"tool":40,"command":41},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill cucumber","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fcucumber\u002FSKILL.md",true,[],[46,60,70,79,85,92],{"skillNo":47,"name":48,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":49,"categories":50,"keywords":56,"publishedAt":18},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[51],{"categoryNo":52,"categoryName":53,"taxonomyType":54,"taxonomyTypeDesc":55},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[57,58,59],"model","model hierarchy","model hierarchy skill",{"skillNo":61,"name":62,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":66,"publishedAt":18},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[65],{"categoryNo":52,"categoryName":53,"taxonomyType":54,"taxonomyTypeDesc":55},[67,68,69],"MCP","zoom","zoom mcp",{"skillNo":71,"name":72,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":18},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[76,77,78,68],"sdk","zoom apps sdk","apps",{"skillNo":80,"name":81,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":18},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[81],{"skillNo":86,"name":87,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":91,"publishedAt":18},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[90],{"categoryNo":52,"categoryName":53,"taxonomyType":54,"taxonomyTypeDesc":55},[87],{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":18},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[94]]