[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71H8V9X3P7M7N85EABCZ8AX":3,"skill-same:01M71H8V9X3P7M7N85EABCZ8AX":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":27,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":13,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":50,"install":51,"resources":64},"01M71H8V9X3P7M7N85EABCZ8AX","03-api-contracts",null,"Effect-TS 4 HttpApi schema-first REST contracts — route definitions, error schemas, and typed client","lambda-solver\u002Flambdabench-pro","lambda-solver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F279071046?v=4","01M71H55W2WK3PM6RRAY9JZWAJ","01M71H55WRT9XAFDAVACTCC2XP",0,"MIT","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Feffect-ts\u002Fschema\u002F03-api-contracts\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[28,29,30,31,32,33,34,35,36,37,38,39],"03 api contracts","api contracts","contracts","api","error","route","effect","REST","first","opencode","schema","client","2026-11-10 10:12:30",false,"---\nname: 03-api-contracts\ndescription: Effect-TS 4 HttpApi schema-first REST contracts — route definitions, error schemas, and typed client\nlicense: MIT\ncompatibility: opencode\n---\n\n# API Contracts\n\n## HttpApi — schema-first REST definition\n\n```typescript\nimport { Schema } from \"effect\";\nimport { HttpApi, HttpApiEndpoint, HttpApiGroup } from \"effect\u002Funstable\u002Fhttpapi\";\n\nclass UsersGroup extends HttpApiGroup.make(\"users\")\n  .add(HttpApiEndpoint.get(\"list\", \"\u002F\").addSuccess(Schema.Array(User)))\n  .add(HttpApiEndpoint.get(\"get\", \"\u002F:id\").addSuccess(User).addError(NotFoundError))\n  .add(HttpApiEndpoint.post(\"create\", \"\u002F\").setPayload(CreateUserInput).addSuccess(User))\n  .prefix(\"\u002Fusers\") {}\n\nexport const Api = HttpApi.make(\"Api\").add(UsersGroup);\n```\n\n## HttpApiClient — generated typed client\n\n```typescript\nimport { HttpApiClient } from \"effect\u002Funstable\u002Fhttpapi\";\nimport { HttpClient, HttpClientRequest, Schedule } from \"effect\u002Funstable\u002Fhttp\";\n\nconst client =\n  yield *\n  HttpApiClient.make(Api, {\n    transformClient: (c) =>\n      c.pipe(\n        HttpClient.mapRequest(HttpClientRequest.prependUrl(\"http:\u002F\u002Flocalhost:3000\")),\n        HttpClient.retryTransient({\n          schedule: Schedule.exponential(\"100 millis\"),\n          times: 3,\n        }),\n      ),\n  });\n\nconst users = yield * client.users.list();\nconst user = yield * client.users.get({ path: { id: \"123\" } });\nconst newUser = yield * client.users.create({ body: { name: \"Ada\" } });\n```\n\n## RPC — streaming \u002F request-response\n\n```typescript\nimport { Schema } from \"effect\";\nimport { Rpc, RpcGroup } from \"effect\u002Funstable\u002Frpc\";\n\nexport class BenchmarkRpc extends RpcGroup.make(\n  Rpc.make(\"runEval\", {\n    payload: Schema.Struct({ taskId: Schema.String }),\n    success: EvalResult,\n  }),\n  Rpc.make(\"streamResults\", {\n    payload: Schema.Struct({ modelId: Schema.String }),\n    success: EvalResult,\n    stream: true,\n  }),\n) {}\n```\n\n## Domain schema export pattern\n\nAlways export the Schema constant AND the derived TypeScript type together:\n\n```typescript\nexport const Ranking = Schema.Struct({\n  model: Schema.String,\n  right: Schema.Number,\n  total: Schema.Number,\n  pct: Schema.String,\n  avgTime: Schema.Number,\n  tasks: Schema.Record(Schema.String, Schema.Boolean),\n  taskBits: Schema.Record(Schema.String, Schema.Number),\n  rlm: Schema.optional(Schema.Number),\n  rlmDepth: Schema.optional(Schema.Number),\n});\nexport type Ranking = Schema.Schema.Type\u003Ctypeof Ranking>;\n\nexport const BenchmarkData = Schema.Struct({\n  rankings: Schema.Array(Ranking),\n  tasks: Schema.Array(BenchmarkTask),\n  generatedAt: Schema.String,\n});\nexport type BenchmarkData = Schema.Schema.Type\u003Ctypeof BenchmarkData>;\n```\n\n## Error schemas for API boundaries\n\n```typescript\nexport class NotFoundError extends Schema.TaggedErrorClass\u003CNotFoundError>()(\"NotFoundError\", { id: Schema.String }) {}\n\nexport class ValidationError extends Schema.TaggedErrorClass\u003CValidationError>()(\"ValidationError\", {\n  field: Schema.String,\n  message: Schema.String,\n}) {}\n```\n\n## Layer.provide for API server\n\n```typescript\nconst AppLayer = Layer.mergeAll(HttpApiServer.layer, UsersHandler.layer, DbPool.layer);\nBunRuntime.runMain(Layer.launch(AppLayer));\n```\n","# API Contracts\n\n## HttpApi — schema-first REST definition\n\n```typescript\nimport { Schema } from \"effect\";\nimport { HttpApi, HttpApiEndpoint, HttpApiGroup } from \"effect\u002Funstable\u002Fhttpapi\";\n\nclass UsersGroup extends HttpApiGroup.make(\"users\")\n  .add(HttpApiEndpoint.get(\"list\", \"\u002F\").addSuccess(Schema.Array(User)))\n  .add(HttpApiEndpoint.get(\"get\", \"\u002F:id\").addSuccess(User).addError(NotFoundError))\n  .add(HttpApiEndpoint.post(\"create\", \"\u002F\").setPayload(CreateUserInput).addSuccess(User))\n  .prefix(\"\u002Fusers\") {}\n\nexport const Api = HttpApi.make(\"Api\").add(UsersGroup);\n```\n\n## HttpApiClient — generated typed client\n\n```typescript\nimport { HttpApiClient } from \"effect\u002Funstable\u002Fhttpapi\";\nimport { HttpClient, HttpClientRequest, Schedule } from \"effect\u002Funstable\u002Fhttp\";\n\nconst client =\n  yield *\n  HttpApiClient.make(Api, {\n    transformClient: (c) =>\n      c.pipe(\n        HttpClient.mapRequest(HttpClientRequest.prependUrl(\"http:\u002F\u002Flocalhost:3000\")),\n        HttpClient.retryTransient({\n          schedule: Schedule.exponential(\"100 millis\"),\n          times: 3,\n        }),\n      ),\n  });\n\nconst users = yield * client.users.list();\nconst user = yield * client.users.get({ path: { id: \"123\" } });\nconst newUser = yield * client.users.create({ body: { name: \"Ada\" } });\n```\n\n## RPC — streaming \u002F request-response\n\n```typescript\nimport { Schema } from \"effect\";\nimport { Rpc, RpcGroup } from \"effect\u002Funstable\u002Frpc\";\n\nexport class BenchmarkRpc extends RpcGroup.make(\n  Rpc.make(\"runEval\", {\n    payload: Schema.Struct({ taskId: Schema.String }),\n    success: EvalResult,\n  }),\n  Rpc.make(\"streamResults\", {\n    payload: Schema.Struct({ modelId: Schema.String }),\n    success: EvalResult,\n    stream: true,\n  }),\n) {}\n```\n\n## Domain schema export pattern\n\nAlways export the Schema constant AND the derived TypeScript type together:\n\n```typescript\nexport const Ranking = Schema.Struct({\n  model: Schema.String,\n  right: Schema.Number,\n  total: Schema.Number,\n  pct: Schema.String,\n  avgTime: Schema.Number,\n  tasks: Schema.Record(Schema.String, Schema.Boolean),\n  taskBits: Schema.Record(Schema.String, Schema.Number),\n  rlm: Schema.optional(Schema.Number),\n  rlmDepth: Schema.optional(Schema.Number),\n});\nexport type Ranking = Schema.Schema.Type\u003Ctypeof Ranking>;\n\nexport const BenchmarkData = Schema.Struct({\n  rankings: Schema.Array(Ranking),\n  tasks: Schema.Array(BenchmarkTask),\n  generatedAt: Schema.String,\n});\nexport type BenchmarkData = Schema.Schema.Type\u003Ctypeof BenchmarkData>;\n```\n\n## Error schemas for API boundaries\n\n```typescript\nexport class NotFoundError extends Schema.TaggedErrorClass\u003CNotFoundError>()(\"NotFoundError\", { id: Schema.String }) {}\n\nexport class ValidationError extends Schema.TaggedErrorClass\u003CValidationError>()(\"ValidationError\", {\n  field: Schema.String,\n  message: Schema.String,\n}) {}\n```\n\n## Layer.provide for API server\n\n```typescript\nconst AppLayer = Layer.mergeAll(HttpApiServer.layer, UsersHandler.layer, DbPool.layer);\nBunRuntime.runMain(Layer.launch(AppLayer));\n```\n",{"name":5,"license":14,"description":7,"compatibility":37},"main","816c073aaf171300af3605b06f7ec5aa7370ef0b","reference\u002Fghui\u002F.opencode\u002Fskills\u002Feffect-ts\u002Fschema\u002F03-api-contracts","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro","https:\u002F\u002Fgithub.com\u002Flambda-solver","2026-05-31 17:08:46",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add lambda-solver\u002Flambdabench-pro --skill 03-api-contracts",{"tool":57,"command":58},"bunx","bunx skills add lambda-solver\u002Flambdabench-pro --skill 03-api-contracts",{"tool":60,"command":61},"pnpm","pnpm dlx skills add lambda-solver\u002Flambdabench-pro --skill 03-api-contracts","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Feffect-ts\u002Fschema\u002F03-api-contracts\u002FSKILL.md",true,[],[66,95,117,136,157,175],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":75,"publishedAt":40},"01M71H9FNA5D6Y4ANXD18Z1Z3X","tmux-workflow","Development workflow with tmux — run dev servers, Storybook, and background processes in persistent sessions with live logs, while keeping OpenCode free for chat","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Ftmux\u002FSKILL.md",[72],{"categoryNo":73,"categoryName":74,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[76,77,78,79,80,81,82,83,84,85,86,37,87,88,89,90,91,92,93,94],"tmux","workflow","tmux workflow","chat","dev servers","background","processes","storybook","live","servers","run","with","logs","development workflow","free","dev","sessions","for","development",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":104,"publishedAt":40},"01M71H9DQJDAJVZX37NDN99D3P","04-anti-patterns","React anti-patterns to avoid — manual JSX repetition, useEffect misuse, reference instability, prop drilling, conditional hooks, and common performance traps","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Freact\u002Fpatterns\u002F04-anti-patterns\u002FSKILL.md",[101],{"categoryNo":102,"categoryName":103,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",[105,106,107,108,109,110,111,112,113,114,115,37,116],"patterns","anti patterns","04 anti patterns","common","jsx","reference","conditional","hooks","manual","performance","anti-patterns","react",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":124,"publishedAt":40},"01M71H9BXF511W2R3B73S5P9ZN","03-state-management","React state management patterns — lifting state, colocation, URL state, server state with TanStack Query, local state with useState\u002FuseReducer","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Freact\u002Fpatterns\u002F03-state-management\u002FSKILL.md",[123],{"categoryNo":102,"categoryName":103,"taxonomyType":20,"taxonomyTypeDesc":21},[125,126,127,128,116,129,105,130,131,132,133,37,134,87,135],"management","state management","state","03 state management","query","URL","tanstack","react state management","local","server","tanstack query",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":143,"publishedAt":40},"01M71H9AAGVWMYQ4NG82QPYCTE","02-component-composition","React component composition patterns — render props, compound components, list rendering with map, slot patterns, and layout primitives","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Freact\u002Fpatterns\u002F02-component-composition\u002FSKILL.md",[142],{"categoryNo":102,"categoryName":103,"taxonomyType":20,"taxonomyTypeDesc":21},[144,145,146,37,87,147,148,116,149,105,150,151,152,153,154,155,156],"02 component composition","component","Composition","compound","components","primitives","composition patterns","list","map","rendering","render","react component","layout",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":164,"publishedAt":40},"01M71H98RDXRQZDR496SRD906M","01-fp-style","React functional programming style — pure components, hooks conventions, Effect Atom integration, and Tailwind patterns","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Freact\u002Fpatterns\u002F01-fp-style\u002FSKILL.md",[163],{"categoryNo":102,"categoryName":103,"taxonomyType":20,"taxonomyTypeDesc":21},[165,166,167,105,168,169,37,170,116,171,148,112,172,173,174,34],"01 fp style","style","atom","conventions","integration","functional","programming","Tailwind","tailwind patterns","functional programming",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":182,"publishedAt":40},"01M71H95PYGAWBS5C8KN0C4WGT","react-animation","React animation with react\u002Fmotion (Framer Motion) — declarative animations, gestures, layout animations, and performance best practices","https:\u002F\u002Fgithub.com\u002Flambda-solver\u002Flambdabench-pro\u002Fblob\u002Fmain\u002Freference\u002Fghui\u002F.opencode\u002Fskills\u002Freact\u002Fanimation\u002FSKILL.md",[181],{"categoryNo":102,"categoryName":103,"taxonomyType":20,"taxonomyTypeDesc":21},[116,183,184,114,185,37,156,186,187,87,188,189,190,191],"react animation","Animation","framer motion","motion","best practices","framer","gestures","animations","declarative"]