[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CAQCEPE6Z2BVQN33FFQ8A7":3,"skill-same:01M6CAQCEPE6Z2BVQN33FFQ8A7":80},{"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":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":54,"repositoryHomepageUrl":55,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6CAQCEPE6Z2BVQN33FFQ8A7","generate-factory",null,"Auto-generate test data factories from schemas, types, or models. Use when creating test data infrastructure, setting up fixtures, or reducing test setup boilerplate.","jmagly\u002Faiwg","jmagly","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1159087?v=4","01M6C10AK8N2WCSQN11FYGTJWN","Joseph Magly","01M6C10AQ8A2RMED1Y1BSVY7NF",229,"MIT","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Ftesting-quality\u002Fskills\u002Fgenerate-factory\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],"generate","factory","generate factory","auto","when","types","boilerplate","fixtures","test data","models","test setup","up","test","use","data","infrastructure","setup","2026-11-10 10:12:30",false,"---\nnamespace: aiwg\nname: generate-factory\ndescription: Auto-generate test data factories from schemas, types, or models. Use when creating test data infrastructure, setting up fixtures, or reducing test setup boilerplate.\nversion: 1.0.0\nplatforms: [all]\n\n---\n\n# Generate Factory Skill\n\n## Purpose\n\nAuto-generate test data factories from database schemas, TypeScript interfaces, or model definitions. Factories produce realistic test data using Faker.js patterns, reducing test setup time by 60%.\n\n## Research Foundation\n\n| Pattern | Source | Reference |\n|---------|--------|-----------|\n| Factory Pattern | ThoughtBot | [FactoryBot](https:\u002F\u002Fgithub.com\u002Fthoughtbot\u002Ffactory_bot) |\n| Faker.js | Open Source | [fakerjs.dev](https:\u002F\u002Ffakerjs.dev\u002F) |\n| Test Data Management | ISTQB | CT-TAS Test Automation Strategy |\n| Synthetic Data | Tonic.ai | [Faker Best Practices](https:\u002F\u002Fwww.tonic.ai\u002Fblog\u002Fhow-to-generate-simple-test-data-with-faker) |\n\n## When This Skill Applies\n\n- User needs to create test data factories\n- Setting up test infrastructure for new project\n- Existing tests use hard-coded data\n- Schema\u002Fmodel changes require test data updates\n- Need realistic but deterministic test data\n\n## Trigger Phrases\n\n| Natural Language | Action |\n|------------------|--------|\n| \"Generate factory for User model\" | Create user factory |\n| \"Create test data factories\" | Generate factories for all models |\n| \"Add faker to tests\" | Integrate faker with existing tests |\n| \"Make test data realistic\" | Convert hard-coded to factory |\n| \"Generate fixtures from schema\" | Schema-aware factory generation |\n\n## Factory Concepts\n\n### Factory vs Fixture vs Mock\n\n| Type | Purpose | When to Use |\n|------|---------|-------------|\n| **Factory** | Generate dynamic test data | When you need many variations |\n| **Fixture** | Static, predefined data | When exact values matter |\n| **Mock** | Fake external dependencies | When isolating units |\n\n### Factory Features\n\n```typescript\n\u002F\u002F Basic factory\nconst user = userFactory.build();\n\u002F\u002F { id: 'uuid-1', name: 'John Doe', email: 'john@example.com' }\n\n\u002F\u002F With overrides\nconst admin = userFactory.build({ role: 'admin' });\n\u002F\u002F { id: 'uuid-2', name: 'Jane Doe', email: 'jane@example.com', role: 'admin' }\n\n\u002F\u002F Build multiple\nconst users = userFactory.buildList(5);\n\u002F\u002F Array of 5 users\n\n\u002F\u002F With traits\nconst inactiveUser = userFactory.build({}, { trait: 'inactive' });\n\u002F\u002F { id: 'uuid-3', ..., status: 'inactive', deactivatedAt: Date }\n\n\u002F\u002F With relationships\nconst userWithOrders = userFactory.build({}, { with: ['orders'] });\n\u002F\u002F { id: 'uuid-4', ..., orders: [{ id: 'order-1', ... }] }\n```\n\n## Generation Process\n\n### 1. Analyze Source\n\nDetect schema\u002Ftype from:\n- TypeScript interfaces\n- Prisma schema\n- JSON Schema\n- Database migrations\n- OpenAPI specs\n\n```typescript\n\u002F\u002F Input: TypeScript interface\ninterface User {\n  id: string;\n  name: string;\n  email: string;\n  age: number;\n  role: 'admin' | 'user' | 'guest';\n  createdAt: Date;\n  preferences?: UserPreferences;\n}\n```\n\n### 2. Map Types to Faker\n\n```typescript\nconst TYPE_MAPPING = {\n  \u002F\u002F Primitives\n  'string': 'faker.string.alphanumeric(10)',\n  'number': 'faker.number.int({ min: 0, max: 100 })',\n  'boolean': 'faker.datatype.boolean()',\n  'Date': 'faker.date.past()',\n\n  \u002F\u002F Named fields (semantic mapping)\n  'id': 'faker.string.uuid()',\n  'name': 'faker.person.fullName()',\n  'email': 'faker.internet.email()',\n  'phone': 'faker.phone.number()',\n  'address': 'faker.location.streetAddress()',\n  'age': 'faker.number.int({ min: 18, max: 80 })',\n  'createdAt': 'faker.date.past()',\n  'updatedAt': 'faker.date.recent()',\n\n  \u002F\u002F Enums\n  'role': 'faker.helpers.arrayElement([\"admin\", \"user\", \"guest\"])',\n};\n```\n\n### 3. Generate Factory\n\n```typescript\n\u002F\u002F Generated: factories\u002Fuser.factory.ts\nimport { faker } from '@faker-js\u002Ffaker';\nimport type { User } from '..\u002Ftypes';\n\nexport const userFactory = {\n  \u002F**\n   * Build a single User with optional overrides\n   *\u002F\n  build: (overrides: Partial\u003CUser> = {}): User => ({\n    id: faker.string.uuid(),\n    name: faker.person.fullName(),\n    email: faker.internet.email(),\n    age: faker.number.int({ min: 18, max: 80 }),\n    role: faker.helpers.arrayElement(['admin', 'user', 'guest']),\n    createdAt: faker.date.past(),\n    ...overrides,\n  }),\n\n  \u002F**\n   * Build multiple Users\n   *\u002F\n  buildList: (count: number, overrides: Partial\u003CUser> = {}): User[] =>\n    Array.from({ length: count }, () => userFactory.build(overrides)),\n\n  \u002F**\n   * Traits for common variations\n   *\u002F\n  traits: {\n    admin: { role: 'admin' as const },\n    inactive: {\n      status: 'inactive',\n      deactivatedAt: faker.date.past(),\n    },\n    newUser: {\n      createdAt: faker.date.recent(),\n    },\n  },\n\n  \u002F**\n   * Build with trait\n   *\u002F\n  buildWithTrait: (trait: keyof typeof userFactory.traits, overrides: Partial\u003CUser> = {}): User =>\n    userFactory.build({ ...userFactory.traits[trait], ...overrides }),\n};\n```\n\n### 4. Generate Related Factories\n\nFor entities with relationships:\n\n```typescript\n\u002F\u002F factories\u002Forder.factory.ts\nimport { faker } from '@faker-js\u002Ffaker';\nimport { userFactory } from '.\u002Fuser.factory';\n\nexport const orderFactory = {\n  build: (overrides = {}) => ({\n    id: faker.string.uuid(),\n    userId: faker.string.uuid(),\n    items: [],\n    total: faker.number.float({ min: 10, max: 500, fractionDigits: 2 }),\n    status: faker.helpers.arrayElement(['pending', 'shipped', 'delivered']),\n    createdAt: faker.date.past(),\n    ...overrides,\n  }),\n\n  \u002F**\n   * Build with related user\n   *\u002F\n  buildWithUser: (overrides = {}) => {\n    const user = userFactory.build();\n    return {\n      ...orderFactory.build({ userId: user.id, ...overrides }),\n      user,\n    };\n  },\n};\n```\n\n## Output Format\n\n```markdown\n## Factory Generation Report\n\n**Source**: `src\u002Ftypes\u002Fuser.ts`\n**Output**: `test\u002Ffactories\u002Fuser.factory.ts`\n\n### Generated Factory\n\n```typescript\nimport { faker } from '@faker-js\u002Ffaker';\nimport type { User } from '..\u002F..\u002Fsrc\u002Ftypes';\n\nexport const userFactory = {\n  build: (overrides: Partial\u003CUser> = {}): User => ({\n    id: faker.string.uuid(),\n    name: faker.person.fullName(),\n    email: faker.internet.email(),\n    age: faker.number.int({ min: 18, max: 80 }),\n    role: faker.helpers.arrayElement(['admin', 'user', 'guest']),\n    createdAt: faker.date.past(),\n    preferences: null,\n    ...overrides,\n  }),\n\n  buildList: (count: number, overrides: Partial\u003CUser> = {}): User[] =>\n    Array.from({ length: count }, () => userFactory.build(overrides)),\n\n  traits: {\n    admin: { role: 'admin' as const },\n    inactive: { status: 'inactive' },\n  },\n};\n```\n\n### Field Mappings\n\n| Field | Type | Faker Method |\n|-------|------|--------------|\n| id | string | `faker.string.uuid()` |\n| name | string | `faker.person.fullName()` |\n| email | string | `faker.internet.email()` |\n| age | number | `faker.number.int({ min: 18, max: 80 })` |\n| role | enum | `faker.helpers.arrayElement([...])` |\n| createdAt | Date | `faker.date.past()` |\n\n### Usage Examples\n\n```typescript\n\u002F\u002F Basic usage\nconst user = userFactory.build();\n\n\u002F\u002F With override\nconst admin = userFactory.build({ role: 'admin' });\n\n\u002F\u002F Multiple users\nconst users = userFactory.buildList(10);\n\n\u002F\u002F With trait\nconst inactive = userFactory.build(userFactory.traits.inactive);\n```\n\n### Dependencies Added\n\n```json\n{\n  \"devDependencies\": {\n    \"@faker-js\u002Ffaker\": \"^8.0.0\"\n  }\n}\n```\n```\n\n## Deterministic Mode\n\nFor tests requiring reproducible data:\n\n```typescript\n\u002F\u002F Set seed for reproducible data\nimport { faker } from '@faker-js\u002Ffaker';\n\nbeforeEach(() => {\n  faker.seed(12345);  \u002F\u002F Same data every run\n});\n\n\u002F\u002F Or per-factory\nexport const userFactory = {\n  buildDeterministic: (seed: number, overrides = {}) => {\n    faker.seed(seed);\n    return userFactory.build(overrides);\n  },\n};\n```\n\n## Batch Generation\n\nGenerate factories for all models:\n\n```bash\n# From Prisma schema\nnpx generate-factory --source prisma\u002Fschema.prisma --output test\u002Ffactories\u002F\n\n# From TypeScript types\nnpx generate-factory --source src\u002Ftypes\u002F --output test\u002Ffactories\u002F\n```\n\n## Integration Points\n\n- Works with `tdd-enforce` for test data requirements\n- Used by Test Engineer for test creation\n- Feeds into integration test setup\n- Compatible with database seeders\n\n## Script Reference\n\n### factory_generator.py\nGenerate factory from schema:\n```bash\npython scripts\u002Ffactory_generator.py --source src\u002Ftypes\u002Fuser.ts\n```\n\n### batch_generate.py\nGenerate all factories:\n```bash\npython scripts\u002Fbatch_generate.py --source src\u002Ftypes\u002F --output test\u002Ffactories\u002F\n```\n\n## References\n\n- @$AIWG_ROOT\u002F${CLAUDE_PLUGIN_ROOT}\u002FREADME.md — Testing quality addon overview\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fsdlc-complete\u002FREADME.md — SDLC framework context for test infrastructure\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Faddons\u002Faiwg-utils\u002Frules\u002Fresearch-before-decision.md — Research-first for schema and type analysis\n- @$AIWG_ROOT\u002Fdocs\u002Fcli-reference.md — CLI reference\n","# Generate Factory Skill\n\n## Purpose\n\nAuto-generate test data factories from database schemas, TypeScript interfaces, or model definitions. Factories produce realistic test data using Faker.js patterns, reducing test setup time by 60%.\n\n## Research Foundation\n\n| Pattern | Source | Reference |\n|---------|--------|-----------|\n| Factory Pattern | ThoughtBot | [FactoryBot](https:\u002F\u002Fgithub.com\u002Fthoughtbot\u002Ffactory_bot) |\n| Faker.js | Open Source | [fakerjs.dev](https:\u002F\u002Ffakerjs.dev\u002F) |\n| Test Data Management | ISTQB | CT-TAS Test Automation Strategy |\n| Synthetic Data | Tonic.ai | [Faker Best Practices](https:\u002F\u002Fwww.tonic.ai\u002Fblog\u002Fhow-to-generate-simple-test-data-with-faker) |\n\n## When This Skill Applies\n\n- User needs to create test data factories\n- Setting up test infrastructure for new project\n- Existing tests use hard-coded data\n- Schema\u002Fmodel changes require test data updates\n- Need realistic but deterministic test data\n\n## Trigger Phrases\n\n| Natural Language | Action |\n|------------------|--------|\n| \"Generate factory for User model\" | Create user factory |\n| \"Create test data factories\" | Generate factories for all models |\n| \"Add faker to tests\" | Integrate faker with existing tests |\n| \"Make test data realistic\" | Convert hard-coded to factory |\n| \"Generate fixtures from schema\" | Schema-aware factory generation |\n\n## Factory Concepts\n\n### Factory vs Fixture vs Mock\n\n| Type | Purpose | When to Use |\n|------|---------|-------------|\n| **Factory** | Generate dynamic test data | When you need many variations |\n| **Fixture** | Static, predefined data | When exact values matter |\n| **Mock** | Fake external dependencies | When isolating units |\n\n### Factory Features\n\n```typescript\n\u002F\u002F Basic factory\nconst user = userFactory.build();\n\u002F\u002F { id: 'uuid-1', name: 'John Doe', email: 'john@example.com' }\n\n\u002F\u002F With overrides\nconst admin = userFactory.build({ role: 'admin' });\n\u002F\u002F { id: 'uuid-2', name: 'Jane Doe', email: 'jane@example.com', role: 'admin' }\n\n\u002F\u002F Build multiple\nconst users = userFactory.buildList(5);\n\u002F\u002F Array of 5 users\n\n\u002F\u002F With traits\nconst inactiveUser = userFactory.build({}, { trait: 'inactive' });\n\u002F\u002F { id: 'uuid-3', ..., status: 'inactive', deactivatedAt: Date }\n\n\u002F\u002F With relationships\nconst userWithOrders = userFactory.build({}, { with: ['orders'] });\n\u002F\u002F { id: 'uuid-4', ..., orders: [{ id: 'order-1', ... }] }\n```\n\n## Generation Process\n\n### 1. Analyze Source\n\nDetect schema\u002Ftype from:\n- TypeScript interfaces\n- Prisma schema\n- JSON Schema\n- Database migrations\n- OpenAPI specs\n\n```typescript\n\u002F\u002F Input: TypeScript interface\ninterface User {\n  id: string;\n  name: string;\n  email: string;\n  age: number;\n  role: 'admin' | 'user' | 'guest';\n  createdAt: Date;\n  preferences?: UserPreferences;\n}\n```\n\n### 2. Map Types to Faker\n\n```typescript\nconst TYPE_MAPPING = {\n  \u002F\u002F Primitives\n  'string': 'faker.string.alphanumeric(10)',\n  'number': 'faker.number.int({ min: 0, max: 100 })',\n  'boolean': 'faker.datatype.boolean()',\n  'Date': 'faker.date.past()',\n\n  \u002F\u002F Named fields (semantic mapping)\n  'id': 'faker.string.uuid()',\n  'name': 'faker.person.fullName()',\n  'email': 'faker.internet.email()',\n  'phone': 'faker.phone.number()',\n  'address': 'faker.location.streetAddress()',\n  'age': 'faker.number.int({ min: 18, max: 80 })',\n  'createdAt': 'faker.date.past()',\n  'updatedAt': 'faker.date.recent()',\n\n  \u002F\u002F Enums\n  'role': 'faker.helpers.arrayElement([\"admin\", \"user\", \"guest\"])',\n};\n```\n\n### 3. Generate Factory\n\n```typescript\n\u002F\u002F Generated: factories\u002Fuser.factory.ts\nimport { faker } from '@faker-js\u002Ffaker';\nimport type { User } from '..\u002Ftypes';\n\nexport const userFactory = {\n  \u002F**\n   * Build a single User with optional overrides\n   *\u002F\n  build: (overrides: Partial\u003CUser> = {}): User => ({\n    id: faker.string.uuid(),\n    name: faker.person.fullName(),\n    email: faker.internet.email(),\n    age: faker.number.int({ min: 18, max: 80 }),\n    role: faker.helpers.arrayElement(['admin', 'user', 'guest']),\n    createdAt: faker.date.past(),\n    ...overrides,\n  }),\n\n  \u002F**\n   * Build multiple Users\n   *\u002F\n  buildList: (count: number, overrides: Partial\u003CUser> = {}): User[] =>\n    Array.from({ length: count }, () => userFactory.build(overrides)),\n\n  \u002F**\n   * Traits for common variations\n   *\u002F\n  traits: {\n    admin: { role: 'admin' as const },\n    inactive: {\n      status: 'inactive',\n      deactivatedAt: faker.date.past(),\n    },\n    newUser: {\n      createdAt: faker.date.recent(),\n    },\n  },\n\n  \u002F**\n   * Build with trait\n   *\u002F\n  buildWithTrait: (trait: keyof typeof userFactory.traits, overrides: Partial\u003CUser> = {}): User =>\n    userFactory.build({ ...userFactory.traits[trait], ...overrides }),\n};\n```\n\n### 4. Generate Related Factories\n\nFor entities with relationships:\n\n```typescript\n\u002F\u002F factories\u002Forder.factory.ts\nimport { faker } from '@faker-js\u002Ffaker';\nimport { userFactory } from '.\u002Fuser.factory';\n\nexport const orderFactory = {\n  build: (overrides = {}) => ({\n    id: faker.string.uuid(),\n    userId: faker.string.uuid(),\n    items: [],\n    total: faker.number.float({ min: 10, max: 500, fractionDigits: 2 }),\n    status: faker.helpers.arrayElement(['pending', 'shipped', 'delivered']),\n    createdAt: faker.date.past(),\n    ...overrides,\n  }),\n\n  \u002F**\n   * Build with related user\n   *\u002F\n  buildWithUser: (overrides = {}) => {\n    const user = userFactory.build();\n    return {\n      ...orderFactory.build({ userId: user.id, ...overrides }),\n      user,\n    };\n  },\n};\n```\n\n## Output Format\n\n```markdown\n## Factory Generation Report\n\n**Source**: `src\u002Ftypes\u002Fuser.ts`\n**Output**: `test\u002Ffactories\u002Fuser.factory.ts`\n\n### Generated Factory\n\n```typescript\nimport { faker } from '@faker-js\u002Ffaker';\nimport type { User } from '..\u002F..\u002Fsrc\u002Ftypes';\n\nexport const userFactory = {\n  build: (overrides: Partial\u003CUser> = {}): User => ({\n    id: faker.string.uuid(),\n    name: faker.person.fullName(),\n    email: faker.internet.email(),\n    age: faker.number.int({ min: 18, max: 80 }),\n    role: faker.helpers.arrayElement(['admin', 'user', 'guest']),\n    createdAt: faker.date.past(),\n    preferences: null,\n    ...overrides,\n  }),\n\n  buildList: (count: number, overrides: Partial\u003CUser> = {}): User[] =>\n    Array.from({ length: count }, () => userFactory.build(overrides)),\n\n  traits: {\n    admin: { role: 'admin' as const },\n    inactive: { status: 'inactive' },\n  },\n};\n```\n\n### Field Mappings\n\n| Field | Type | Faker Method |\n|-------|------|--------------|\n| id | string | `faker.string.uuid()` |\n| name | string | `faker.person.fullName()` |\n| email | string | `faker.internet.email()` |\n| age | number | `faker.number.int({ min: 18, max: 80 })` |\n| role | enum | `faker.helpers.arrayElement([...])` |\n| createdAt | Date | `faker.date.past()` |\n\n### Usage Examples\n\n```typescript\n\u002F\u002F Basic usage\nconst user = userFactory.build();\n\n\u002F\u002F With override\nconst admin = userFactory.build({ role: 'admin' });\n\n\u002F\u002F Multiple users\nconst users = userFactory.buildList(10);\n\n\u002F\u002F With trait\nconst inactive = userFactory.build(userFactory.traits.inactive);\n```\n\n### Dependencies Added\n\n```json\n{\n  \"devDependencies\": {\n    \"@faker-js\u002Ffaker\": \"^8.0.0\"\n  }\n}\n```\n```\n\n## Deterministic Mode\n\nFor tests requiring reproducible data:\n\n```typescript\n\u002F\u002F Set seed for reproducible data\nimport { faker } from '@faker-js\u002Ffaker';\n\nbeforeEach(() => {\n  faker.seed(12345);  \u002F\u002F Same data every run\n});\n\n\u002F\u002F Or per-factory\nexport const userFactory = {\n  buildDeterministic: (seed: number, overrides = {}) => {\n    faker.seed(seed);\n    return userFactory.build(overrides);\n  },\n};\n```\n\n## Batch Generation\n\nGenerate factories for all models:\n\n```bash\n# From Prisma schema\nnpx generate-factory --source prisma\u002Fschema.prisma --output test\u002Ffactories\u002F\n\n# From TypeScript types\nnpx generate-factory --source src\u002Ftypes\u002F --output test\u002Ffactories\u002F\n```\n\n## Integration Points\n\n- Works with `tdd-enforce` for test data requirements\n- Used by Test Engineer for test creation\n- Feeds into integration test setup\n- Compatible with database seeders\n\n## Script Reference\n\n### factory_generator.py\nGenerate factory from schema:\n```bash\npython scripts\u002Ffactory_generator.py --source src\u002Ftypes\u002Fuser.ts\n```\n\n### batch_generate.py\nGenerate all factories:\n```bash\npython scripts\u002Fbatch_generate.py --source src\u002Ftypes\u002F --output test\u002Ffactories\u002F\n```\n\n## References\n\n- @$AIWG_ROOT\u002F${CLAUDE_PLUGIN_ROOT}\u002FREADME.md — Testing quality addon overview\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fsdlc-complete\u002FREADME.md — SDLC framework context for test infrastructure\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Faddons\u002Faiwg-utils\u002Frules\u002Fresearch-before-decision.md — Research-first for schema and type analysis\n- @$AIWG_ROOT\u002Fdocs\u002Fcli-reference.md — CLI reference\n",{"name":5,"version":46,"namespace":47,"platforms":48,"description":7},"1.0.0","aiwg",[49],"all","main","6754967c344ccb087a8de06972f55a41067b291b","agentic\u002Fcode\u002Fplugins\u002Ftesting-quality\u002Fskills\u002Fgenerate-factory",36,"https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg","https:\u002F\u002Faiwg.io","https:\u002F\u002Fgithub.com\u002Fjmagly","https:\u002F\u002Fintegrolabs.io","ml\u002Fai, industrial automation, safety\u002Fsecurity, ssi\r\n\r\nmagly.net\r\nintegrolabs.io\r\naiwg.io\r\nfortemi.com\r\npagenary.com\r\nbytecask.com","2026-11-12 00:33:10",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add jmagly\u002Faiwg --skill generate-factory",{"tool":66,"command":67},"bunx","bunx skills add jmagly\u002Faiwg --skill generate-factory",{"tool":69,"command":70},"pnpm","pnpm dlx skills add jmagly\u002Faiwg --skill generate-factory","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Ftesting-quality\u002Fskills\u002Fgenerate-factory\u002FSKILL.md",true,[74],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"agents\u002Fopenai.yaml","REFERENCE","参考文档",249,"https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fconfig_packs\u002Fai-workflow\u002Fshared\u002Fskills\u002Fagent-sort\u002Fagents\u002Fopenai.yaml",[81,109,133,139,146,160],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":88,"publishedAt":41},"01M70QA0BSYJ49EES9V4RE8QH1","host-hardening","Read-only system hardening baseline and plan-first host hardening recommendations for SSH, Docker bind addresses, firewall persistence, datastores, exporters and audit retention.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[87],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108],"host","host hardening","hardening","read","re","recommendations","remediation","plan","port","verification","Bash","access","only","retention","audit","never","firewall","bind","secrets","request",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":119,"publishedAt":41},"01M70PNT2Z4HMZPRBTAF6073NN","exposure-analysis","Read-only firewall analysis and effective host exposure reconstruction for Docker published ports, UFW bypass, stale rules, CDN scope, IPv6 asymmetry and external probe allowlists.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fforensics\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[115,118],{"categoryNo":116,"categoryName":117,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[120,121,122,92,123,97,124,125,99,126,89,127,101,128,129,104,105,130,131,132],"exposure analysis","analysis","unknown","credentials","collection","ufw","ports","internet","local","scope","reconstruction","operator","write",{"skillNo":134,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":138,"publishedAt":41},"01M70P8QATMPKA78E4FT5D2TNA","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[137],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[91,89,90,100,92,108,95,94,103,96,97,98,99,107,101,102,93,104,105,106],{"skillNo":140,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":145,"publishedAt":41},"01M70NMPVJ5H0JH131P60FW4R8","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fforensics-complete\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[143,144],{"categoryNo":116,"categoryName":117,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[121,120,104,123,97,124,99,122,89,127,101,128,129,92,105,126,125,130,131,132],{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":153,"publishedAt":41},"01M6CB4DDR0B4NNCFK7ZK7449H","fixture-skill","Exercise rule delivery.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frule-delivery\u002Fskills\u002Ffixture-skill\u002FSKILL.md",[152],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[154,155,156,157,158,159],"fixture skill","fixture","rule","delivery","true","exercise",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":167,"publishedAt":41},"01M6CB4AVK1W76MFMPP0JP32CJ","pi-local","Pi-local duplicate-precedence fixture.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fproviders\u002Fpi\u002Fproject\u002F.pi\u002Fskills\u002Fpi-local\u002FSKILL.md",[166],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[168,169,128,170,155],"pi","pi local","duplicate"]