[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71B95PBCBFXFD9YY8GKNGMS":3,"skill-same:01M71B95PBCBFXFD9YY8GKNGMS":74},{"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":28,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":58,"ownerDescription":6,"updatedAt":59,"install":60,"resources":73},"01M71B95PBCBFXFD9YY8GKNGMS","generate-api-docs",null,"Generate API reference documentation from existing route definitions, controllers, and schemas. Produces a markdown API reference or OpenAPI YAML spec. Use when the API has no docs, outdated Swagger, or the team wants a readable markdown reference.","superMLdev\u002Fsmart-sdlc","superMLdev","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F214327565?v=4","01M71B92B8VKCZZ0YCSNAJ9CB1","superML.dev","01M71B92BVCWP4F23ANQ0ZKF6S",8,"MIT","https:\u002F\u002Fgithub.com\u002FsuperMLdev\u002Fsmart-sdlc\u002Fblob\u002Fmaster\u002Fskills\u002F0-relearn\u002Fgenerate-api-docs\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"generate api docs","generate","docs","api","swagger","reference","yaml","spec","markdown","api reference documentation","route","documentation","team","when","Existing","use","openapi","2026-11-10 10:12:30",false,"---\nname: generate-api-docs\ndescription: \"Generate API reference documentation from existing route definitions, controllers, and schemas. Produces a markdown API reference or OpenAPI YAML spec. Use when the API has no docs, outdated Swagger, or the team wants a readable markdown reference.\"\n---\n\n# Generate API Documentation\n\nProduce complete, accurate API documentation by reading route files, controllers, and schema definitions directly.\n\n## When to Use\n\n- API has no documentation\n- Swagger\u002FOpenAPI spec is missing or outdated\n- Team wants a human-readable markdown API reference\n- Preparing docs to push to Confluence or a developer portal\n\n## Step 1: Locate API Definitions\n\nSearch for route\u002Fendpoint definitions in this priority order:\n\n**Express\u002FNode.js:**\n- Router files: `src\u002Froutes\u002F`, `src\u002Fapi\u002Froutes\u002F`, `app\u002Froutes\u002F`\n- Controller files: `src\u002Fcontrollers\u002F`, `src\u002Fapi\u002Fcontrollers\u002F`\n- Main app file where routes are registered\n\n**FastAPI\u002FPython:**\n- Router files: `app\u002Frouters\u002F`, `src\u002Fapi\u002F`\n- `main.py` or `app.py` where routes are registered\n- Pydantic models for request\u002Fresponse schemas\n\n**NestJS:**\n- `*.controller.ts` files\n- `*.module.ts` for route grouping\n- DTO files: `*.dto.ts`\n\n**Spring Boot:**\n- `@RestController` annotated classes\n- `@RequestMapping`, `@GetMapping`, etc.\n- Request\u002Fresponse DTO classes\n\n**Other:**\n- OpenAPI spec files: `openapi.yaml`, `swagger.json`, `api-spec.yaml`\n- `.proto` files (gRPC)\n- GraphQL schema files: `schema.graphql`, `typeDefs.ts`\n\n## Step 2: Extract Endpoint Information\n\nFor each endpoint, capture:\n\n```\nMethod:    GET \u002F POST \u002F PUT \u002F PATCH \u002F DELETE\nPath:      \u002Fapi\u002Fv1\u002Fusers\u002F:id\nAuth:      required (JWT) | optional | none\nSummary:   Get user by ID\nHandler:   UserController.getById (file:line)\n\nPath params:\n  id  UUID  User's unique identifier\n\nQuery params:\n  include  string (optional)  Comma-separated relations to include (e.g., \"posts,sessions\")\n\nRequest body: (if applicable)\n  {JSON schema or TypeScript interface}\n\nResponse 200:\n  {shape found in controller return statement or serializer}\n\nResponse codes:\n  200  Success\n  400  Validation error\n  401  Unauthenticated\n  403  Unauthorized\n  404  Not found\n  500  Internal error\n```\n\n## Step 3: Extract Auth Requirements\n\nDocument globally:\n- What auth scheme is used (JWT, API Key, Session, OAuth2)\n- How to obtain credentials (if visible in auth routes)\n- Where to pass them (Authorization header, query param, cookie)\n- Which endpoints are public vs protected\n\n## Step 4: Extract Common Error Formats\n\nFind the error response shape (look at error middleware or existing 4xx\u002F5xx responses):\n\n```json\n{\n  \"message\": \"string\",\n  \"code\": \"string\",\n  \"details\": {}\n}\n```\n\n## Step 5: Output Format Choice\n\nAsk: \"Which format do you need?\"\n- **A** — Markdown API reference (human-readable, good for Confluence\u002FGitHub)\n- **B** — OpenAPI 3.0 YAML (machine-readable, Swagger UI compatible)\n- **C** — Both\n\n---\n\n## Output A: API_REFERENCE.md\n\nWrite to: `{project-root}\u002Fdocs\u002FAPI_REFERENCE.md`\n\n```markdown\n# API Reference — {project_name}\n\n> Generated by Scout on {date}. Source: route files in `{src\u002Fapi\u002F}`.\n\n## Base URL\n\n`{\u002Fapi\u002Fv1}` (configure via {BASE_URL} env var)\n\n## Authentication\n\n**Type:** {JWT Bearer Token}\n\nInclude token in all authenticated requests:\n```\nAuthorization: Bearer \u003Cyour_token>\n```\n\nObtain token via: `POST \u002Fauth\u002Flogin`\n\n---\n\n## Resources\n\n### Users\n\n#### GET \u002Fusers\nList users.\n\n**Auth:** Required  \n**Query params:**\n| Param | Type | Default | Description |\n|-------|------|---------|-------------|\n| page | number | 1 | Page number |\n| limit | number | 20 | Results per page |\n\n**Response 200:**\n```json\n{\n  \"data\": [{ \"id\": \"uuid\", \"email\": \"string\", \"name\": \"string\" }],\n  \"total\": 100,\n  \"page\": 1\n}\n```\n\n---\n\n#### POST \u002Fusers\nCreate a user.\n\n{... and so on per endpoint ...}\n\n---\n\n## Error Responses\n\nAll errors follow this format:\n```json\n{\n  \"message\": \"Human-readable error\",\n  \"code\": \"MACHINE_READABLE_CODE\"\n}\n```\n\n| HTTP Code | Meaning |\n|-----------|---------|\n| 400 | Validation error — check `details` field |\n| 401 | Missing or invalid token |\n| 403 | Insufficient permissions |\n| 404 | Resource not found |\n| 500 | Internal server error |\n```\n\n---\n\n## Output B: openapi.yaml\n\nWrite to: `{project-root}\u002Fdocs\u002Fopenapi.yaml`\n\n```yaml\nopenapi: \"3.0.3\"\ninfo:\n  title: {project_name} API\n  version: \"{version from package.json or 1.0.0}\"\n  description: \"{description}\"\nservers:\n  - url: http:\u002F\u002Flocalhost:{PORT}\u002Fapi\u002Fv1\n    description: Local development\n\ncomponents:\n  securitySchemes:\n    BearerAuth:\n      type: http\n      scheme: bearer\n      bearerFormat: JWT\n  schemas:\n    {User}:\n      type: object\n      properties:\n        id:\n          type: string\n          format: uuid\n        email:\n          type: string\n          format: email\n      required: [id, email]\n    Error:\n      type: object\n      properties:\n        message: { type: string }\n        code: { type: string }\n\npaths:\n  \u002Fusers:\n    get:\n      summary: List users\n      security:\n        - BearerAuth: []\n      parameters:\n        - name: page\n          in: query\n          schema: { type: integer, default: 1 }\n      responses:\n        '200':\n          description: Success\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  data:\n                    type: array\n                    items:\n                      $ref: '#\u002Fcomponents\u002Fschemas\u002FUser'\n```\n\n## Handling Undocumented Behaviors\n\nIf a handler doesn't have clear response typing:\n- Trace through the controller to the service return value\n- Note: `> Response shape inferred from service return type — verify before publishing`\n\n## TODOs\n\nMark any endpoint that couldn't be fully documented:\n```\n\u003C!-- TODO: Response shape for GET \u002Fusers\u002F:id\u002Fposts not determinable — \n     UserController.getPosts has implicit any return type -->\n```\n\nList all TODOs at the end so user knows what needs manual review.\n","# Generate API Documentation\n\nProduce complete, accurate API documentation by reading route files, controllers, and schema definitions directly.\n\n## When to Use\n\n- API has no documentation\n- Swagger\u002FOpenAPI spec is missing or outdated\n- Team wants a human-readable markdown API reference\n- Preparing docs to push to Confluence or a developer portal\n\n## Step 1: Locate API Definitions\n\nSearch for route\u002Fendpoint definitions in this priority order:\n\n**Express\u002FNode.js:**\n- Router files: `src\u002Froutes\u002F`, `src\u002Fapi\u002Froutes\u002F`, `app\u002Froutes\u002F`\n- Controller files: `src\u002Fcontrollers\u002F`, `src\u002Fapi\u002Fcontrollers\u002F`\n- Main app file where routes are registered\n\n**FastAPI\u002FPython:**\n- Router files: `app\u002Frouters\u002F`, `src\u002Fapi\u002F`\n- `main.py` or `app.py` where routes are registered\n- Pydantic models for request\u002Fresponse schemas\n\n**NestJS:**\n- `*.controller.ts` files\n- `*.module.ts` for route grouping\n- DTO files: `*.dto.ts`\n\n**Spring Boot:**\n- `@RestController` annotated classes\n- `@RequestMapping`, `@GetMapping`, etc.\n- Request\u002Fresponse DTO classes\n\n**Other:**\n- OpenAPI spec files: `openapi.yaml`, `swagger.json`, `api-spec.yaml`\n- `.proto` files (gRPC)\n- GraphQL schema files: `schema.graphql`, `typeDefs.ts`\n\n## Step 2: Extract Endpoint Information\n\nFor each endpoint, capture:\n\n```\nMethod:    GET \u002F POST \u002F PUT \u002F PATCH \u002F DELETE\nPath:      \u002Fapi\u002Fv1\u002Fusers\u002F:id\nAuth:      required (JWT) | optional | none\nSummary:   Get user by ID\nHandler:   UserController.getById (file:line)\n\nPath params:\n  id  UUID  User's unique identifier\n\nQuery params:\n  include  string (optional)  Comma-separated relations to include (e.g., \"posts,sessions\")\n\nRequest body: (if applicable)\n  {JSON schema or TypeScript interface}\n\nResponse 200:\n  {shape found in controller return statement or serializer}\n\nResponse codes:\n  200  Success\n  400  Validation error\n  401  Unauthenticated\n  403  Unauthorized\n  404  Not found\n  500  Internal error\n```\n\n## Step 3: Extract Auth Requirements\n\nDocument globally:\n- What auth scheme is used (JWT, API Key, Session, OAuth2)\n- How to obtain credentials (if visible in auth routes)\n- Where to pass them (Authorization header, query param, cookie)\n- Which endpoints are public vs protected\n\n## Step 4: Extract Common Error Formats\n\nFind the error response shape (look at error middleware or existing 4xx\u002F5xx responses):\n\n```json\n{\n  \"message\": \"string\",\n  \"code\": \"string\",\n  \"details\": {}\n}\n```\n\n## Step 5: Output Format Choice\n\nAsk: \"Which format do you need?\"\n- **A** — Markdown API reference (human-readable, good for Confluence\u002FGitHub)\n- **B** — OpenAPI 3.0 YAML (machine-readable, Swagger UI compatible)\n- **C** — Both\n\n---\n\n## Output A: API_REFERENCE.md\n\nWrite to: `{project-root}\u002Fdocs\u002FAPI_REFERENCE.md`\n\n```markdown\n# API Reference — {project_name}\n\n> Generated by Scout on {date}. Source: route files in `{src\u002Fapi\u002F}`.\n\n## Base URL\n\n`{\u002Fapi\u002Fv1}` (configure via {BASE_URL} env var)\n\n## Authentication\n\n**Type:** {JWT Bearer Token}\n\nInclude token in all authenticated requests:\n```\nAuthorization: Bearer \u003Cyour_token>\n```\n\nObtain token via: `POST \u002Fauth\u002Flogin`\n\n---\n\n## Resources\n\n### Users\n\n#### GET \u002Fusers\nList users.\n\n**Auth:** Required  \n**Query params:**\n| Param | Type | Default | Description |\n|-------|------|---------|-------------|\n| page | number | 1 | Page number |\n| limit | number | 20 | Results per page |\n\n**Response 200:**\n```json\n{\n  \"data\": [{ \"id\": \"uuid\", \"email\": \"string\", \"name\": \"string\" }],\n  \"total\": 100,\n  \"page\": 1\n}\n```\n\n---\n\n#### POST \u002Fusers\nCreate a user.\n\n{... and so on per endpoint ...}\n\n---\n\n## Error Responses\n\nAll errors follow this format:\n```json\n{\n  \"message\": \"Human-readable error\",\n  \"code\": \"MACHINE_READABLE_CODE\"\n}\n```\n\n| HTTP Code | Meaning |\n|-----------|---------|\n| 400 | Validation error — check `details` field |\n| 401 | Missing or invalid token |\n| 403 | Insufficient permissions |\n| 404 | Resource not found |\n| 500 | Internal server error |\n```\n\n---\n\n## Output B: openapi.yaml\n\nWrite to: `{project-root}\u002Fdocs\u002Fopenapi.yaml`\n\n```yaml\nopenapi: \"3.0.3\"\ninfo:\n  title: {project_name} API\n  version: \"{version from package.json or 1.0.0}\"\n  description: \"{description}\"\nservers:\n  - url: http:\u002F\u002Flocalhost:{PORT}\u002Fapi\u002Fv1\n    description: Local development\n\ncomponents:\n  securitySchemes:\n    BearerAuth:\n      type: http\n      scheme: bearer\n      bearerFormat: JWT\n  schemas:\n    {User}:\n      type: object\n      properties:\n        id:\n          type: string\n          format: uuid\n        email:\n          type: string\n          format: email\n      required: [id, email]\n    Error:\n      type: object\n      properties:\n        message: { type: string }\n        code: { type: string }\n\npaths:\n  \u002Fusers:\n    get:\n      summary: List users\n      security:\n        - BearerAuth: []\n      parameters:\n        - name: page\n          in: query\n          schema: { type: integer, default: 1 }\n      responses:\n        '200':\n          description: Success\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                properties:\n                  data:\n                    type: array\n                    items:\n                      $ref: '#\u002Fcomponents\u002Fschemas\u002FUser'\n```\n\n## Handling Undocumented Behaviors\n\nIf a handler doesn't have clear response typing:\n- Trace through the controller to the service return value\n- Note: `> Response shape inferred from service return type — verify before publishing`\n\n## TODOs\n\nMark any endpoint that couldn't be fully documented:\n```\n\u003C!-- TODO: Response shape for GET \u002Fusers\u002F:id\u002Fposts not determinable — \n     UserController.getPosts has implicit any return type -->\n```\n\nList all TODOs at the end so user knows what needs manual review.\n",{"name":5,"description":7},"master","86f9b15bf32a913d78f2dce364b9fe56e53ddf12","skills\u002F0-relearn\u002Fgenerate-api-docs",1,"https:\u002F\u002Fgithub.com\u002FsuperMLdev\u002Fsmart-sdlc","https:\u002F\u002Fsupermldev.github.io\u002Fsmart-sdlc\u002F","https:\u002F\u002Fgithub.com\u002FsuperMLdev","https:\u002F\u002Fsuperml.dev","2026-05-12 11:55:28",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add superMLdev\u002Fsmart-sdlc --skill generate-api-docs",{"tool":66,"command":67},"bunx","bunx skills add superMLdev\u002Fsmart-sdlc --skill generate-api-docs",{"tool":69,"command":70},"pnpm","pnpm dlx skills add superMLdev\u002Fsmart-sdlc --skill generate-api-docs","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FsuperMLdev\u002Fsmart-sdlc\u002Fblob\u002Fmaster\u002Fskills\u002F0-relearn\u002Fgenerate-api-docs\u002FSKILL.md",true,[],[75,93,106,118,136,148],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":46},"01M71BD2HCRX8SP34Y37NZGVX2","jira-sync","Bulk sync all epics and stories from the local backlog to JIRA. Use when the user says 'sync to JIRA', 'push everything to JIRA', or 'create all JIRA tickets'.","https:\u002F\u002Fgithub.com\u002FsuperMLdev\u002Fsmart-sdlc\u002Fblob\u002Fmaster\u002Fskills\u002Fintegrations\u002Fjira\u002Fsync\u002FSKILL.md",[],[82,83,84,85,86,87,88,89,44,42,90,91,92],"jira sync","jira","sync","user","bulk","push","backlog","local","stories","create","tickets",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":46},"01M71BD0C5A3A3J7WF4YCGJJPY","jira-create-story","Create a single story ticket in JIRA from a local story file. Use when the user says 'create this story in JIRA' or 'push story to JIRA'.","https:\u002F\u002Fgithub.com\u002FsuperMLdev\u002Fsmart-sdlc\u002Fblob\u002Fmaster\u002Fskills\u002Fintegrations\u002Fjira\u002Fcreate-story\u002FSKILL.md",[],[100,83,91,101,102,87,103,89,104,44,42,105,85],"Story","create story","jira create story","ticket","single","file",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":46},"01M71BCYVDM32DNS0XJAKTHRZ1","jira-create-epic","Create an epic in JIRA from a planning artifact. Use when the user says 'create this epic in JIRA' or 'push epic to JIRA'.","https:\u002F\u002Fgithub.com\u002FsuperMLdev\u002Fsmart-sdlc\u002Fblob\u002Fmaster\u002Fskills\u002Fintegrations\u002Fjira\u002Fcreate-epic\u002FSKILL.md",[],[91,113,83,114,115,85,42,44,116,87,117],"create epic","EPIC","jira create epic","planning","artifact",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":127,"publishedAt":46},"01M71BCWGYW8T1TD07JJ1G12G9","jira-connect","Set up and verify JIRA integration. Use when the user says 'connect to JIRA', 'set up JIRA', or 'configure JIRA'.","https:\u002F\u002Fgithub.com\u002FsuperMLdev\u002Fsmart-sdlc\u002Fblob\u002Fmaster\u002Fskills\u002Fintegrations\u002Fjira\u002Fconnect\u002FSKILL.md",[124],{"categoryNo":125,"categoryName":126,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[128,83,129,130,131,44,42,132,133,134,135,85],"jira connect","connect","SET","up","configure","verify","jira integration","integration",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":46},"01M71BCTZ1EW31JHP6AMBHEM9G","jira-conflict-detect","Check if a story is already being worked on by another team member. Use before starting any story implementation.","https:\u002F\u002Fgithub.com\u002FsuperMLdev\u002Fsmart-sdlc\u002Fblob\u002Fmaster\u002Fskills\u002Fintegrations\u002Fjira\u002Fconflict-detect\u002FSKILL.md",[],[143,83,144,145,146,44,41,147,100],"jira conflict detect","detect","conflict","check","implementation",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":46},"01M71BCRX4ZHQ60DXGRAEECHB9","gitlab-create-mr","Create a GitLab Merge Request for the current story branch. Use when the user says 'create an MR', 'open a merge request', or 'ready for review' in a GitLab project.","https:\u002F\u002Fgithub.com\u002FsuperMLdev\u002Fsmart-sdlc\u002Fblob\u002Fmaster\u002Fskills\u002Fintegrations\u002Fgitlab\u002Fcreate-mr\u002FSKILL.md",[],[91,155,156,157,158,159,160,161,162,163,44,42,164,165,166,100,85],"mr","gitlab create mr","create mr","gitlab","ready","branch","for","project","open","review","merge","request"]