[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71S699SAPKWK7W9QB3427PW":3,"skill-same:01M71S699SAPKWK7W9QB3427PW":78},{"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":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":6,"updatedAt":57,"install":58,"resources":71},"01M71S699SAPKWK7W9QB3427PW","test-reasoning",null,"Validate that reasoning parameters are correctly serialized and sent to provider APIs. Use when the user asks to test reasoning serialization, run reasoning tests, verify reasoning config fields, or check that ReasoningConfig maps correctly to provider-specific JSON (OpenRouter, Anthropic, GitHub Copilot, Codex).","justrach\u002Fcodegraff2","justrach","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54503978?v=4","01M71S58M9PP0QSMVY7GB4CYHR","Rach","01M71S58N3CYPB4BKRR47Q9KAF",28,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff2\u002Fblob\u002Fmain\u002F.forge\u002Fskills\u002Ftest-reasoning\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"test reasoning","reasoning","test","fields","validate","config","json","run","verify","github","codex","openrouter","check","maps","when","use","tests","copilot","provider","github copilot","2026-11-10 13:02:02",false,"---\nname: test-reasoning\ndescription: Validate that reasoning parameters are correctly serialized and sent to provider APIs. Use when the user asks to test reasoning serialization, run reasoning tests, verify reasoning config fields, or check that ReasoningConfig maps correctly to provider-specific JSON (OpenRouter, Anthropic, GitHub Copilot, Codex).\n---\n\n# Test Reasoning Serialization\n\nValidates that `ReasoningConfig` fields are correctly serialized into provider-specific JSON\nfor OpenRouter, Anthropic, GitHub Copilot, and Codex.\n\n## Quick Start\n\nRun all tests with the bundled script:\n\n```bash\n.\u002Fscripts\u002Ftest-reasoning.sh\n```\n\nThe script builds forge in debug mode, runs each provider\u002Fmodel combination, captures the\noutgoing HTTP request body via `FORGE_DEBUG_REQUESTS`, and asserts the correct JSON fields.\n\n## Running a Single Test Manually\n\n```bash\nFORGE_DEBUG_REQUESTS=\"forge.request.json\" \\\nFORGE_SESSION__PROVIDER_ID=\u003Cprovider_id> \\\nFORGE_SESSION__MODEL_ID=\u003Cmodel_id> \\\nFORGE_REASONING__EFFORT=\u003Ceffort> \\\ntarget\u002Fdebug\u002Fforge -p \"Hello!\"\n```\n\nThen inspect `.forge\u002Fforge.request.json` for the expected fields.\n\n## Test Coverage\n\n| Provider         | Model                        | Config fields                                     | Expected JSON field               |\n| ---------------- | ---------------------------- | ------------------------------------------------- | --------------------------------- |\n| `open_router`    | `openai\u002Fo4-mini`             | `effort: none\\|minimal\\|low\\|medium\\|high\\|xhigh` | `reasoning.effort`                |\n| `open_router`    | `openai\u002Fo4-mini`             | `max_tokens: 4000`                                | `reasoning.max_tokens`            |\n| `open_router`    | `openai\u002Fo4-mini`             | `effort: high` + `exclude: true`                  | `reasoning.effort` + `.exclude`   |\n| `open_router`    | `openai\u002Fo4-mini`             | `enabled: true`                                   | `reasoning.enabled`               |\n| `open_router`    | `anthropic\u002Fclaude-opus-4-5`  | `max_tokens: 4000`                                | `reasoning.max_tokens`            |\n| `open_router`    | `moonshotai\u002Fkimi-k2`         | `max_tokens: 4000`                                | `reasoning.max_tokens`            |\n| `open_router`    | `moonshotai\u002Fkimi-k2`         | `effort: high`                                    | `reasoning.effort`                |\n| `open_router`    | `minimax\u002Fminimax-m2`         | `max_tokens: 4000`                                | `reasoning.max_tokens`            |\n| `open_router`    | `minimax\u002Fminimax-m2`         | `effort: high`                                    | `reasoning.effort`                |\n| `anthropic`      | `claude-opus-4-6`            | `effort: low\\|medium\\|high\\|max`                  | `output_config.effort`            |\n| `anthropic`      | `claude-3-7-sonnet-20250219` | `enabled: true` + `max_tokens: 8000`              | `thinking.type` + `budget_tokens` |\n| `github_copilot` | `o4-mini`                    | `effort: none\\|minimal\\|low\\|medium\\|high\\|xhigh` | `reasoning_effort` (top-level)    |\n| `codex`          | `gpt-5.1-codex`              | `effort: none\\|minimal\\|low\\|medium\\|high\\|xhigh` | `reasoning.effort` + `.summary`   |\n| `codex`          | `gpt-5.1-codex`              | `effort: medium` + `exclude: true`                | `reasoning.summary = \"concise\"`   |\n| all providers    | one model each               | `effort: invalid`                                 | non-zero exit, no request written |\n\nTests for unconfigured providers are skipped automatically. Invalid-effort tests run regardless of credentials — the rejection happens at config parse time before any provider interaction.\n\n## References\n\n- [OpenAI Reasoning guide](https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Freasoning)\n- [OpenAI Chat Completions API reference](https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Freference\u002Fresources\u002Fchat\u002Fsubresources\u002Fcompletions\u002Fmethods\u002Fcreate)\n- [Anthropic Extended Thinking](https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Feffort)\n- [OpenRouter Reasoning Tokens](https:\u002F\u002Fopenrouter.ai\u002Fdocs\u002Fguides\u002Fbest-practices\u002Freasoning-tokens)\n","# Test Reasoning Serialization\n\nValidates that `ReasoningConfig` fields are correctly serialized into provider-specific JSON\nfor OpenRouter, Anthropic, GitHub Copilot, and Codex.\n\n## Quick Start\n\nRun all tests with the bundled script:\n\n```bash\n.\u002Fscripts\u002Ftest-reasoning.sh\n```\n\nThe script builds forge in debug mode, runs each provider\u002Fmodel combination, captures the\noutgoing HTTP request body via `FORGE_DEBUG_REQUESTS`, and asserts the correct JSON fields.\n\n## Running a Single Test Manually\n\n```bash\nFORGE_DEBUG_REQUESTS=\"forge.request.json\" \\\nFORGE_SESSION__PROVIDER_ID=\u003Cprovider_id> \\\nFORGE_SESSION__MODEL_ID=\u003Cmodel_id> \\\nFORGE_REASONING__EFFORT=\u003Ceffort> \\\ntarget\u002Fdebug\u002Fforge -p \"Hello!\"\n```\n\nThen inspect `.forge\u002Fforge.request.json` for the expected fields.\n\n## Test Coverage\n\n| Provider         | Model                        | Config fields                                     | Expected JSON field               |\n| ---------------- | ---------------------------- | ------------------------------------------------- | --------------------------------- |\n| `open_router`    | `openai\u002Fo4-mini`             | `effort: none\\|minimal\\|low\\|medium\\|high\\|xhigh` | `reasoning.effort`                |\n| `open_router`    | `openai\u002Fo4-mini`             | `max_tokens: 4000`                                | `reasoning.max_tokens`            |\n| `open_router`    | `openai\u002Fo4-mini`             | `effort: high` + `exclude: true`                  | `reasoning.effort` + `.exclude`   |\n| `open_router`    | `openai\u002Fo4-mini`             | `enabled: true`                                   | `reasoning.enabled`               |\n| `open_router`    | `anthropic\u002Fclaude-opus-4-5`  | `max_tokens: 4000`                                | `reasoning.max_tokens`            |\n| `open_router`    | `moonshotai\u002Fkimi-k2`         | `max_tokens: 4000`                                | `reasoning.max_tokens`            |\n| `open_router`    | `moonshotai\u002Fkimi-k2`         | `effort: high`                                    | `reasoning.effort`                |\n| `open_router`    | `minimax\u002Fminimax-m2`         | `max_tokens: 4000`                                | `reasoning.max_tokens`            |\n| `open_router`    | `minimax\u002Fminimax-m2`         | `effort: high`                                    | `reasoning.effort`                |\n| `anthropic`      | `claude-opus-4-6`            | `effort: low\\|medium\\|high\\|max`                  | `output_config.effort`            |\n| `anthropic`      | `claude-3-7-sonnet-20250219` | `enabled: true` + `max_tokens: 8000`              | `thinking.type` + `budget_tokens` |\n| `github_copilot` | `o4-mini`                    | `effort: none\\|minimal\\|low\\|medium\\|high\\|xhigh` | `reasoning_effort` (top-level)    |\n| `codex`          | `gpt-5.1-codex`              | `effort: none\\|minimal\\|low\\|medium\\|high\\|xhigh` | `reasoning.effort` + `.summary`   |\n| `codex`          | `gpt-5.1-codex`              | `effort: medium` + `exclude: true`                | `reasoning.summary = \"concise\"`   |\n| all providers    | one model each               | `effort: invalid`                                 | non-zero exit, no request written |\n\nTests for unconfigured providers are skipped automatically. Invalid-effort tests run regardless of credentials — the rejection happens at config parse time before any provider interaction.\n\n## References\n\n- [OpenAI Reasoning guide](https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Freasoning)\n- [OpenAI Chat Completions API reference](https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Freference\u002Fresources\u002Fchat\u002Fsubresources\u002Fcompletions\u002Fmethods\u002Fcreate)\n- [Anthropic Extended Thinking](https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Feffort)\n- [OpenRouter Reasoning Tokens](https:\u002F\u002Fopenrouter.ai\u002Fdocs\u002Fguides\u002Fbest-practices\u002Freasoning-tokens)\n",{"name":5,"description":7},"main","e5610ede9cf38ac3bd71d5f984fa8936f21539d3",".forge\u002Fskills\u002Ftest-reasoning",3,"https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff2","https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff","https:\u002F\u002Fgithub.com\u002Fjustrach","https:\u002F\u002Fjustrach.com","2026-06-12 16:28:22",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add justrach\u002Fcodegraff2 --skill test-reasoning",{"tool":64,"command":65},"bunx","bunx skills add justrach\u002Fcodegraff2 --skill test-reasoning",{"tool":67,"command":68},"pnpm","pnpm dlx skills add justrach\u002Fcodegraff2 --skill test-reasoning","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff2\u002Fblob\u002Fmain\u002F.forge\u002Fskills\u002Ftest-reasoning\u002FSKILL.md",true,[72],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"scripts\u002Ftest-reasoning.sh","SCRIPT","脚本",19063,"https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff2\u002Fblob\u002Fmain\u002F.forge\u002Fskills\u002Ftest-reasoning\u002Fscripts\u002Ftest-reasoning.sh",[79,104,127,152,163,173],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":44},"01M71S6QW9FHPKR0VMCG0B9W4A","github-pr-description","Generate and create pull request descriptions automatically using GitHub CLI. Use when the user asks to create a PR, generate a PR description, make a pull request, or submit changes for review. Analyzes git diff and commit history to create comprehensive, meaningful PR descriptions that explain what changed, why it matters, and how to test it.","https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff2\u002Fblob\u002Fmain\u002Fcrates\u002Fforge_repo\u002Fsrc\u002Fskills\u002Fgithub-pr-description\u002FSKILL.md",[],[86,87,88,89,33,90,91,92,93,94,95,96,97,98,99,100,101,102,38,103],"github pr description","pr","pr description","github pr","review","git","request","why","how","make","generate","cli","github cli","create","submit","using github","how to","commit",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":44},"01M71S6P2MSFVC7HXGBW96MZYN","execute-plan","Execute structured task plans with status tracking. Use when the user provides a plan file path in the format `plans\u002F{current-date}-{task-name}-{version}.md` or explicitly asks you to execute a plan file.","https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff2\u002Fblob\u002Fmain\u002Fcrates\u002Fforge_repo\u002Fsrc\u002Fskills\u002Fexecute-plan\u002FSKILL.md",[],[111,112,113,114,115,116,117,118,119,38,120,39,121,122,123,124,125,126],"execute","execute plan","plan","task","structured","user","file","version","you","tracking","plans","status","format","name","with","path",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":136,"publishedAt":44},"01M71S6J9VMWAHRD34KY0324DD","create-skill","Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends your capabilities with specialized knowledge, workflows, or tool integrations.","https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff2\u002Fblob\u002Fmain\u002Fcrates\u002Fforge_repo\u002Fsrc\u002Fskills\u002Fcreate-skill\u002FSKILL.md",[133],{"categoryNo":134,"categoryName":135,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[99,137,138,139,140,141,142,143,144,145,146,125,147,148,38,149,150,151],"create skill","update","users","Existing","tool","for","integrations","existing skill","guide","new skill","capabilities","specialized","workflows","new","knowledge",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":160,"publishedAt":44},"01M71S6GG2QN728FSQQ0QB6HQ5","test-skill","A test skill with resources","https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff2\u002Fblob\u002Fmain\u002Fcrates\u002Fforge_repo\u002Fsrc\u002Ffixtures\u002Fskills_with_resources\u002Ftest-skill\u002FSKILL.md",[158,159],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":134,"categoryName":135,"taxonomyType":21,"taxonomyTypeDesc":22},[26,161,125,162],"Test Skill","resources",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":170,"publishedAt":44},"01M71S6FMADGSKZTNRSWFKJSSG","minimal-skill","A minimal skill with no resources","https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff2\u002Fblob\u002Fmain\u002Fcrates\u002Fforge_repo\u002Fsrc\u002Ffixtures\u002Fskills_with_resources\u002Fminimal-skill\u002FSKILL.md",[169],{"categoryNo":134,"categoryName":135,"taxonomyType":21,"taxonomyTypeDesc":22},[171,172,162,125],"minimal skill","minimal",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":179,"publishedAt":44},"01M71S6CGWXEWRQR5C0P6J1WE4","write-release-notes","Generate engaging, high-energy release notes for a given version tag. Fetches the release from GitHub, retrieves every linked PR's title and description, then synthesizes all changes into a polished, user-facing release note with an enthusiastic tone. Use when the user asks to write, generate, or create release notes for a version (e.g. \"write release notes for v1.32.0\", \"generate release notes for the latest release\", \"create changelog for v2.0\").","https:\u002F\u002Fgithub.com\u002Fjustrach\u002Fcodegraff2\u002Fblob\u002Fmain\u002F.forge\u002Fskills\u002Fwrite-release-notes\u002FSKILL.md",[],[180,181,182,183,184,185,186,187,188,189,99,125,118,190,38,39,191,142,87,192],"release notes","notes","release","write","write release notes","tone","changes","energy","title","changelog","v1","high-energy","create release"]