[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CHS52TKPKC7WV8ZG9YDDAZ":3,"skill-same:01M6CHS52TKPKC7WV8ZG9YDDAZ":86},{"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":18,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":6,"updatedAt":56,"install":57,"resources":70},"01M6CHS52TKPKC7WV8ZG9YDDAZ","write-go-tests",null,"Use when adding or extending Go tests in strike-cli — *_test.go, table-driven cases, fixtures, httptest, tool Ask helpers, TUI harnesses, coverage gaps. Do not use for running tests only (use test-and-validate).","dayvidpham\u002Faura-plugins","dayvidpham","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22456875?v=4","01M6CHR0F6J2M4QEHFR85XRNSR","David Huu Pham","01M6CHR0KQJ4DK5KSZ9TRTP7DW",2,"MIT","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwrite-go-tests\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"go","tests","write","write go tests","extending","cli","running","when","gaps","for","harnesses","fixtures","do","strike","only","use","coverage","tui","ask","table","tool","running tests","coverage gaps","validate","test","2026-11-10 10:12:30",false,"---\nname: write-go-tests\ndescription: Use when adding or extending Go tests in strike-cli — *_test.go, table-driven cases, fixtures, httptest, tool Ask helpers, TUI harnesses, coverage gaps. Do not use for running tests only (use test-and-validate).\n---\n\n# Write Go tests (strike-cli)\n\nTests only. Never modify production code; if code is untestable or buggy, report it.\n\n## Conventions\n\n- Framework: stdlib `testing` only.\n- Placement: `package foo` tests beside source as `foo_test.go` (same package is fine and preferred for unexported helpers).\n- Style: table-driven where multiple inputs matter; plain functions for stateful sequences.\n- Isolation: `t.TempDir()`, `t.Setenv`, never touch real `~\u002F.strike` or network without `httptest`.\n- Assert observable behavior (return values, files written, events emitted, errors), not private call graphs.\n- **Bug fixes:** add at least one regression test that fails before the fix when feasible.\n\n## Helpers by domain\n\n### Tools (`internal\u002Ftool`)\n\n```go\nfunc allowAll(dir string) *Context {\n\treturn &Context{\n\t\tWorkDir: dir, \u002F\u002F usually t.TempDir()\n\t\tAsk:     func(ctx context.Context, req AskRequest) error { return nil },\n\t}\n}\n```\n\nCover where relevant: happy path, invalid JSON args, permission rejection via Ask error,\npath relative\u002Fabsolute, workspace sandbox escape attempts, filestate stale read after\nexternal change, truncation\u002Foutput caps, deferred\u002F`toolsearch` registration.\n\nTool surface is large (read\u002Fglob\u002Fgrep\u002Fedit\u002Fwrite\u002Fapply_patch\u002Fbash + sandbox, task*,\nwebfetch, todo*, memory_*, issue_*, notebook_edit, sleep, skill, question, plan_mode,\nphase_done, toolsearch, …). Prefer tests next to the module you touch; do not assume\na fixed “six tools” list.\n\n### Permissions (`internal\u002Fpermission`)\n\n- `Evaluate` last-match-wins across layered rulesets.\n- `Service.Ask` + `Reply`: once, always (session grant + sibling resolve), reject cascade, ctx cancel.\n\n### Protocol \u002F session\n\n- Round-trip event types through `protocol.Wrap` → `Envelope.Decode` when adding kinds.\n- Session: `Open` → `Append` → `Close` → `Replay`; malformed line errors.\n\n### Providers\n\n- Prefer `httptest.NewServer` against `internal\u002Fprovider\u002Fbase` and concrete adapters.\n- Engine integration: `internal\u002Fprovider\u002Fecho` (prompts starting with `run ` emit bash tool calls).\n\n### Config \u002F auth\n\n- Point HOME at `t.TempDir()` so GlobalPath\u002Fcache paths stay sandboxed.\n- Auth store must stay mode `0600`.\n\n### TUI\n\nSource lives under `internal\u002Ftui\u002F_src\u002F` and is flattened into `internal\u002Ftui` via\n`go generate .\u002Finternal\u002Ftui`. Tests may live beside `_src` or as generated\u002Fpackage\ntests under `internal\u002Ftui`.\n\nReuse helpers from `internal\u002Ftui\u002F_src\u002Fapp\u002Fapp_test.go` (same package after generate),\nincluding: `updateApp`, `runAppCmd`, `runAllAppCmds`, `receiveAppOp`, `assertNoAppOp`.\nShared support also appears under `internal\u002Ftui\u002F_src\u002Ftest\u002F` (e.g. `testsupport_test.go`).\nLoad skill `tui-components` before asserting chrome\u002Ftheme behavior.\n\n## After writing\n\n```sh\ngo test .\u002Fpath\u002Fto\u002Fpackage\u002F -count=1 -v\n# then tier gate — load test-and-validate\n```\n\n## Priority gaps (fill these first when expanding coverage)\n\n1. `internal\u002Ftool` — sandbox\u002Fworkspace, filestate freshness, caps, defer\u002Ftoolsearch  \n2. `internal\u002Fengine` — prune\u002Fcompaction, interrupt, deferred tool re-promote, multi-tool  \n3. `internal\u002Fpermission` — Evaluate + Service edge cases  \n4. `internal\u002Fprotocol` + `internal\u002Fsession` — new event kinds, replay  \n5. `internal\u002Fquestion` — multi-question ask\u002Freply  \n6. `internal\u002Fauth` — OAuth\u002FPKCE\u002Fdevice, resolve edge cases  \n7. `internal\u002Fprovider\u002F*` — SSE cancel, cache headers where applicable  \n8. `internal\u002Ftui` — keymap\u002Fdefault binds, modals, interrupt\u002Fesc paths  \n\n## Platform notes\n\n- Compare canonical paths with `filepath.EvalSymlinks` when asserting absolute paths\n  (macOS `\u002Fvar` → `\u002Fprivate\u002Fvar`).\n- Filesystem mtime granularity: sleep or content-change strategies when testing staleness.\n","# Write Go tests (strike-cli)\n\nTests only. Never modify production code; if code is untestable or buggy, report it.\n\n## Conventions\n\n- Framework: stdlib `testing` only.\n- Placement: `package foo` tests beside source as `foo_test.go` (same package is fine and preferred for unexported helpers).\n- Style: table-driven where multiple inputs matter; plain functions for stateful sequences.\n- Isolation: `t.TempDir()`, `t.Setenv`, never touch real `~\u002F.strike` or network without `httptest`.\n- Assert observable behavior (return values, files written, events emitted, errors), not private call graphs.\n- **Bug fixes:** add at least one regression test that fails before the fix when feasible.\n\n## Helpers by domain\n\n### Tools (`internal\u002Ftool`)\n\n```go\nfunc allowAll(dir string) *Context {\n\treturn &Context{\n\t\tWorkDir: dir, \u002F\u002F usually t.TempDir()\n\t\tAsk:     func(ctx context.Context, req AskRequest) error { return nil },\n\t}\n}\n```\n\nCover where relevant: happy path, invalid JSON args, permission rejection via Ask error,\npath relative\u002Fabsolute, workspace sandbox escape attempts, filestate stale read after\nexternal change, truncation\u002Foutput caps, deferred\u002F`toolsearch` registration.\n\nTool surface is large (read\u002Fglob\u002Fgrep\u002Fedit\u002Fwrite\u002Fapply_patch\u002Fbash + sandbox, task*,\nwebfetch, todo*, memory_*, issue_*, notebook_edit, sleep, skill, question, plan_mode,\nphase_done, toolsearch, …). Prefer tests next to the module you touch; do not assume\na fixed “six tools” list.\n\n### Permissions (`internal\u002Fpermission`)\n\n- `Evaluate` last-match-wins across layered rulesets.\n- `Service.Ask` + `Reply`: once, always (session grant + sibling resolve), reject cascade, ctx cancel.\n\n### Protocol \u002F session\n\n- Round-trip event types through `protocol.Wrap` → `Envelope.Decode` when adding kinds.\n- Session: `Open` → `Append` → `Close` → `Replay`; malformed line errors.\n\n### Providers\n\n- Prefer `httptest.NewServer` against `internal\u002Fprovider\u002Fbase` and concrete adapters.\n- Engine integration: `internal\u002Fprovider\u002Fecho` (prompts starting with `run ` emit bash tool calls).\n\n### Config \u002F auth\n\n- Point HOME at `t.TempDir()` so GlobalPath\u002Fcache paths stay sandboxed.\n- Auth store must stay mode `0600`.\n\n### TUI\n\nSource lives under `internal\u002Ftui\u002F_src\u002F` and is flattened into `internal\u002Ftui` via\n`go generate .\u002Finternal\u002Ftui`. Tests may live beside `_src` or as generated\u002Fpackage\ntests under `internal\u002Ftui`.\n\nReuse helpers from `internal\u002Ftui\u002F_src\u002Fapp\u002Fapp_test.go` (same package after generate),\nincluding: `updateApp`, `runAppCmd`, `runAllAppCmds`, `receiveAppOp`, `assertNoAppOp`.\nShared support also appears under `internal\u002Ftui\u002F_src\u002Ftest\u002F` (e.g. `testsupport_test.go`).\nLoad skill `tui-components` before asserting chrome\u002Ftheme behavior.\n\n## After writing\n\n```sh\ngo test .\u002Fpath\u002Fto\u002Fpackage\u002F -count=1 -v\n# then tier gate — load test-and-validate\n```\n\n## Priority gaps (fill these first when expanding coverage)\n\n1. `internal\u002Ftool` — sandbox\u002Fworkspace, filestate freshness, caps, defer\u002Ftoolsearch  \n2. `internal\u002Fengine` — prune\u002Fcompaction, interrupt, deferred tool re-promote, multi-tool  \n3. `internal\u002Fpermission` — Evaluate + Service edge cases  \n4. `internal\u002Fprotocol` + `internal\u002Fsession` — new event kinds, replay  \n5. `internal\u002Fquestion` — multi-question ask\u002Freply  \n6. `internal\u002Fauth` — OAuth\u002FPKCE\u002Fdevice, resolve edge cases  \n7. `internal\u002Fprovider\u002F*` — SSE cancel, cache headers where applicable  \n8. `internal\u002Ftui` — keymap\u002Fdefault binds, modals, interrupt\u002Fesc paths  \n\n## Platform notes\n\n- Compare canonical paths with `filepath.EvalSymlinks` when asserting absolute paths\n  (macOS `\u002Fvar` → `\u002Fprivate\u002Fvar`).\n- Filesystem mtime granularity: sleep or content-change strategies when testing staleness.\n",{"name":5,"description":7},"main","7fe8098d35c17a7d6497a81e4c08abb4c2d02735",".claude\u002Fskills\u002Fwrite-go-tests",0,"https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins","https:\u002F\u002Fgithub.com\u002Fdayvidpham","dhpham.com","2026-11-11 16:48:56",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add dayvidpham\u002Faura-plugins --skill write-go-tests",{"tool":63,"command":64},"bunx","bunx skills add dayvidpham\u002Faura-plugins --skill write-go-tests",{"tool":66,"command":67},"pnpm","pnpm dlx skills add dayvidpham\u002Faura-plugins --skill write-go-tests","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwrite-go-tests\u002FSKILL.md",true,[71,76,82],{"path":72,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"LICENSE","许可证",1071,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fmcp-servers\u002Fdanthamanvoiss-skill-boundary-audit\u002FLICENSE",{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"SOURCE.md","REFERENCE","参考文档",417,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fmcp-servers\u002Fdanthamanvoiss-skill-boundary-audit\u002FSOURCE.md",{"path":83,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":84,"sourceHtmlUrl":85},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fmcp-servers\u002Fdanthamanvoiss-skill-boundary-audit\u002FTRUST.auto.yaml",[87,113,142,147,153,158],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":44},"01M70PPVS3CW9RYWGZ4KSNV7MV","afk-implement","Run an unattended (\"AFK\") implementation session as the supervisor — scope small progressive iterations, push feature branches, open pull requests, drive review waves to clean, and never merge. Use when the user says they are going AFK or to bed, asks for overnight autonomous implementation, says \"don't block on me\", \"open PRs but don't merge\", \"progressive adoption\", or \"stack changes\".","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fafk-implement\u002FSKILL.md",[],[94,95,96,97,98,99,100,101,102,103,26,104,105,106,107,108,109,110,111,112],"implement","afk implement","pull","bed","never","scope","clean","branches","open","autonomous","review","pull requests","stack","me","run","merge","unattended","overnight","but",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":124,"publishedAt":44},"01M6CHSCKDTSV05385SJ05XWW6","protocol","Aura protocol reference documentation — 12-phase workflow, agent roles, constraints, and coding standards. Read when you need to understand the full workflow or look up conventions.","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002Fskills\u002Fprotocol\u002FSKILL.md",[119],{"categoryNo":120,"categoryName":121,"taxonomyType":122,"taxonomyTypeDesc":123},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[115,125,126,127,128,129,130,131,132,133,134,135,26,136,137,138,139,140,141],"coding","standards","documentation","read","up","coding standards","reference","look","workflow","full","constraints","you","phase","roles","understand","conventions","aura",{"skillNo":143,"name":115,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":146,"publishedAt":44},"01M6CHSBJDVKGWAJWQCNQ22F9F","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002Fnix\u002Fhm-module-test-data\u002Ffull\u002Fskills\u002Fprotocol\u002FSKILL.md",[],[115],{"skillNo":148,"name":149,"nameZh":6,"description":6,"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":152,"publishedAt":44},"01M6CHSAJY85M0W8NEAN4PRF82","example","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002Fnix\u002Fhm-module-test-data\u002Ffull\u002Fskills\u002Fexample\u002FSKILL.md",[],[149],{"skillNo":154,"name":149,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":157,"publishedAt":44},"01M6CHS9KQJYCWR1C9F2GJDZYX","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002Fnix\u002Fhm-module-test-data\u002Ffull\u002F.opencode\u002Fskill\u002Fexample\u002FSKILL.md",[],[149],{"skillNo":159,"name":149,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":162,"publishedAt":44},"01M6CHS8MSW2SDQ5Y05A3GZES4","https:\u002F\u002Fgithub.com\u002Fdayvidpham\u002Faura-plugins\u002Fblob\u002Fmain\u002Fnix\u002Fhm-module-test-data\u002Ffull\u002F.agents\u002Fskills\u002Fexample\u002FSKILL.md",[],[149]]