[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71KEGX8MAMSHYCA965VCXAT":3,"skill-same:01M71KEGX8MAMSHYCA965VCXAT":72},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":54,"repositoryHomepageUrl":6,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":6,"updatedAt":57,"install":58,"resources":71},"01M71KEGX8MAMSHYCA965VCXAT","roundtrip-check",null,"Verify that every adapter's Render output can be adopted back into canonical without drift. Catches mismatches between path conventions in internal\u002Ftools\u002F and reverse matchers in internal\u002Fsyncer\u002Fadopt.go. Run after adding or modifying an adapter, or after editing adopt.go.","noah-hrbth\u002Fagent-tool-sync","noah-hrbth","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F78396377?v=4","01M71KE9YFAYQ79YBHR2TA6D8K","Noah","01M71KE9Z1FHAXYJT40KM7MD24",2,"MIT","https:\u002F\u002Fgithub.com\u002Fnoah-hrbth\u002Fagent-tool-sync\u002Fblob\u002Fmain\u002F.agentsync\u002Fskills\u002Froundtrip-check\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"roundtrip check","check","go","conventions","grep","edit","write","read","run","verify","adopt","output","can","drift","Bash","adapter","render","editing","reverse","back","2026-11-10 10:12:30",false,"---\nname: roundtrip-check\ndescription: Verify that every adapter's Render output can be adopted back into canonical without drift. Catches mismatches between path conventions in internal\u002Ftools\u002F and reverse matchers in internal\u002Fsyncer\u002Fadopt.go. Run after adding or modifying an adapter, or after editing adopt.go.\nallowed-tools: [Read, Edit, Write, Bash, Glob, Grep]\n---\n\n# Roundtrip Check: Render → Adopt → Compare\n\nGoal: prove that for every adapter where `adopt.go` claims a path is reversible, `Render(canonical) → AdoptExternal(rendered_path) → reload canonical` produces the same canonical entity bytes.\n\n## Procedure\n\nOperate in a temp workspace — do not pollute `examples\u002Fsandbox\u002F` or the repo's `.agentsync\u002F`.\n\n### 1. Build a probe canonical\n\nCreate `\u002Ftmp\u002Fagentsync-roundtrip\u002F.agentsync\u002F` with:\n\n- `AGENTS.md` — non-trivial multi-line content with code fences and unicode.\n- `rules\u002Fsample-rule.md` — frontmatter (`description`, `paths: [src\u002F**\u002F*.ts]`) + body.\n- `skills\u002Fsample-skill\u002FSKILL.md` — frontmatter with every field set (`name`, `description`, `allowed-tools`, `disable-model-invocation: true`, `paths`).\n- `agents\u002Fsample-agent.md` — frontmatter (`name`, `description`, `tools`, `model: sonnet`) + body.\n- `commands\u002Fsample-command.md` — frontmatter (`description`, `argument-hint`, `allowed-tools`, `model`) + body.\n\nThe reserved name `general` must not appear — it will fail load.\n\n### 2. Render via every adapter for both scopes\n\nWrite a small Go test (or a `go run`-able script under `scripts\u002F`) that:\n\n```go\nc, _ := canonical.Load(tmpWorkspace)\nfor _, a := range tools.All() {\n    for _, scope := range []tools.Scope{tools.ScopeProject, tools.ScopeUser} {\n        if !a.SupportsScope(scope).Supported { continue }\n        writes, _ := a.Render(c, scope)\n        for _, fw := range writes {\n            \u002F\u002F write fw to disk under tmpWorkspace\n        }\n    }\n}\n```\n\n### 3. Adopt every written path\n\nFor each `fw.Path` written above, call `syncer.AdoptExternal(tmpWorkspace, fw.Path)`. Track which paths return errors — those are paths the adapter emits that `adopt.go` does not handle. Three valid outcomes:\n\n- **Adopted successfully** — proceed to step 4.\n- **Adopted with the wrong canonical entity** — bug in `adopt.go` matchers.\n- **Returns \"no canonical mapping for path\"** — either expected (concatenated rule bodies, alias files like `general.mdc` → `AGENTS.md`) or a missing matcher. The adapter file should document which paths are intentionally non-reversible.\n\n### 4. Compare canonical-after vs canonical-before\n\nAfter adopting each path, reload canonical with `canonical.Load(tmpWorkspace)` and diff the relevant entity (rule\u002Fskill\u002Fagent\u002Fcommand\u002FAGENTS.md) against the original byte-for-byte. Mismatches indicate frontmatter round-trip loss (e.g. field reordering, dropped fields, escaping changes).\n\nKnown acceptable lossy paths:\n\n- `.cursor\u002Frules\u002Fgeneral.mdc` round-trips back to `AGENTS.md` with the Cursor frontmatter wrapper stripped. Compare body only, not frontmatter.\n- Any tool that emits rules concatenated into the root memory cannot reverse-map individual rules — skip those paths.\n\n### 5. Report\n\n```\n# Roundtrip check\n\n## Adapters covered\n\u003Clist>\n\n## Paths written: N\n## Paths adopted cleanly: N\n## Paths intentionally skipped: N (with reason)\n## Paths with adoption errors: N\n## Paths with canonical drift after roundtrip: N\n\n## Failures\n- \u003Cpath> — \u003Creason \u002F diff>\n```\n\nIf any \"adoption errors\" or \"canonical drift\" rows are non-zero and not in the known-lossy list, the check fails. Surface the failures and stop — do not auto-fix.\n\n## When to run\n\n- After adding a new adapter (use the `add-adapter` skill, then this).\n- After editing `internal\u002Fsyncer\u002Fadopt.go` matchers.\n- After changing a frontmatter field on `Rule`, `Skill`, `Agent`, or `Command` in `internal\u002Fcanonical\u002Ftypes.go`.\n\nThis is not part of `make test` today. If you find yourself running it routinely, consider promoting the probe canonical to `testdata\u002Fscenarios\u002Froundtrip\u002F` and adding a `TestRoundtrip` table-driven test.\n","# Roundtrip Check: Render → Adopt → Compare\n\nGoal: prove that for every adapter where `adopt.go` claims a path is reversible, `Render(canonical) → AdoptExternal(rendered_path) → reload canonical` produces the same canonical entity bytes.\n\n## Procedure\n\nOperate in a temp workspace — do not pollute `examples\u002Fsandbox\u002F` or the repo's `.agentsync\u002F`.\n\n### 1. Build a probe canonical\n\nCreate `\u002Ftmp\u002Fagentsync-roundtrip\u002F.agentsync\u002F` with:\n\n- `AGENTS.md` — non-trivial multi-line content with code fences and unicode.\n- `rules\u002Fsample-rule.md` — frontmatter (`description`, `paths: [src\u002F**\u002F*.ts]`) + body.\n- `skills\u002Fsample-skill\u002FSKILL.md` — frontmatter with every field set (`name`, `description`, `allowed-tools`, `disable-model-invocation: true`, `paths`).\n- `agents\u002Fsample-agent.md` — frontmatter (`name`, `description`, `tools`, `model: sonnet`) + body.\n- `commands\u002Fsample-command.md` — frontmatter (`description`, `argument-hint`, `allowed-tools`, `model`) + body.\n\nThe reserved name `general` must not appear — it will fail load.\n\n### 2. Render via every adapter for both scopes\n\nWrite a small Go test (or a `go run`-able script under `scripts\u002F`) that:\n\n```go\nc, _ := canonical.Load(tmpWorkspace)\nfor _, a := range tools.All() {\n    for _, scope := range []tools.Scope{tools.ScopeProject, tools.ScopeUser} {\n        if !a.SupportsScope(scope).Supported { continue }\n        writes, _ := a.Render(c, scope)\n        for _, fw := range writes {\n            \u002F\u002F write fw to disk under tmpWorkspace\n        }\n    }\n}\n```\n\n### 3. Adopt every written path\n\nFor each `fw.Path` written above, call `syncer.AdoptExternal(tmpWorkspace, fw.Path)`. Track which paths return errors — those are paths the adapter emits that `adopt.go` does not handle. Three valid outcomes:\n\n- **Adopted successfully** — proceed to step 4.\n- **Adopted with the wrong canonical entity** — bug in `adopt.go` matchers.\n- **Returns \"no canonical mapping for path\"** — either expected (concatenated rule bodies, alias files like `general.mdc` → `AGENTS.md`) or a missing matcher. The adapter file should document which paths are intentionally non-reversible.\n\n### 4. Compare canonical-after vs canonical-before\n\nAfter adopting each path, reload canonical with `canonical.Load(tmpWorkspace)` and diff the relevant entity (rule\u002Fskill\u002Fagent\u002Fcommand\u002FAGENTS.md) against the original byte-for-byte. Mismatches indicate frontmatter round-trip loss (e.g. field reordering, dropped fields, escaping changes).\n\nKnown acceptable lossy paths:\n\n- `.cursor\u002Frules\u002Fgeneral.mdc` round-trips back to `AGENTS.md` with the Cursor frontmatter wrapper stripped. Compare body only, not frontmatter.\n- Any tool that emits rules concatenated into the root memory cannot reverse-map individual rules — skip those paths.\n\n### 5. Report\n\n```\n# Roundtrip check\n\n## Adapters covered\n\u003Clist>\n\n## Paths written: N\n## Paths adopted cleanly: N\n## Paths intentionally skipped: N (with reason)\n## Paths with adoption errors: N\n## Paths with canonical drift after roundtrip: N\n\n## Failures\n- \u003Cpath> — \u003Creason \u002F diff>\n```\n\nIf any \"adoption errors\" or \"canonical drift\" rows are non-zero and not in the known-lossy list, the check fails. Surface the failures and stop — do not auto-fix.\n\n## When to run\n\n- After adding a new adapter (use the `add-adapter` skill, then this).\n- After editing `internal\u002Fsyncer\u002Fadopt.go` matchers.\n- After changing a frontmatter field on `Rule`, `Skill`, `Agent`, or `Command` in `internal\u002Fcanonical\u002Ftypes.go`.\n\nThis is not part of `make test` today. If you find yourself running it routinely, consider promoting the probe canonical to `testdata\u002Fscenarios\u002Froundtrip\u002F` and adding a `TestRoundtrip` table-driven test.\n",{"name":5,"description":7,"allowed-tools":44},[45,46,47,33,48,49],"Read","Edit","Write","Glob","Grep","main","3b6d4dd03c2efaabac9d24bac067186575670b54",".agentsync\u002Fskills\u002Froundtrip-check",0,"https:\u002F\u002Fgithub.com\u002Fnoah-hrbth\u002Fagent-tool-sync","https:\u002F\u002Fgithub.com\u002Fnoah-hrbth","noah-hrbth.dev","2026-08-21 13:43:41",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add noah-hrbth\u002Fagent-tool-sync --skill roundtrip-check",{"tool":64,"command":65},"bunx","bunx skills add noah-hrbth\u002Fagent-tool-sync --skill roundtrip-check",{"tool":67,"command":68},"pnpm","pnpm dlx skills add noah-hrbth\u002Fagent-tool-sync --skill roundtrip-check","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fnoah-hrbth\u002Fagent-tool-sync\u002Fblob\u002Fmain\u002F.agentsync\u002Fskills\u002Froundtrip-check\u002FSKILL.md",true,[],[73,94,107,125,134,143],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":84,"publishedAt":39},"01M71KFJ5BKV6Y4S3PXR0BSNYW","code-reviewer","Reviews code for quality, bugs, and security issues.","https:\u002F\u002Fgithub.com\u002Fnoah-hrbth\u002Fagent-tool-sync\u002Fblob\u002Fmain\u002Ftestdata\u002Fscenarios\u002Fempty-workspace\u002Finput\u002F.agentsync\u002Fskills\u002Fcode-reviewer\u002FSKILL.md",[79],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[85,86,87,88,89,90,91,92,93],"code","reviewer","code reviewer","issues","quality","for","bugs","security","reviews",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":39},"01M71KFGQNE7T84G9X0JEZXVM8","commit","Conventional commit helper sourced from Mistral Vibe","https:\u002F\u002Fgithub.com\u002Fnoah-hrbth\u002Fagent-tool-sync\u002Fblob\u002Fmain\u002Fexamples\u002Fsandbox\u002F.vibe\u002Fskills\u002Fcommit\u002FSKILL.md",[],[96,101,102,103,104,105,106],"true","commit helper","helper","Mistral","conventional commit","vibe",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":119,"publishedAt":39},"01M71KFETSGVYNWR2Z9VEP5XQG","code-review","Code reviewer sourced from Mistral Vibe. Use to review or audit changes.","https:\u002F\u002Fgithub.com\u002Fnoah-hrbth\u002Fagent-tool-sync\u002Fblob\u002Fmain\u002Fexamples\u002Fsandbox\u002F.vibe\u002Fskills\u002Fcode-review\u002FSKILL.md",[113,118],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},[120,121,85,106,122,123,87,124,104,26,86,23],"review","code review","changes","use","audit",{"skillNo":126,"name":109,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":132,"publishedAt":39},"01M71KFDXCM6P17ZTGECET584V","Code reviewer sourced from JetBrains Junie. Use to review or audit changes.","https:\u002F\u002Fgithub.com\u002Fnoah-hrbth\u002Fagent-tool-sync\u002Fblob\u002Fmain\u002Fexamples\u002Fsandbox\u002F.junie\u002Fskills\u002Fcode-review\u002FSKILL.md",[130,131],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},[120,121,85,133,122,123,87,124,86],"jetbrains",{"skillNo":135,"name":109,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":141,"publishedAt":39},"01M71KFAEW9WXYWCSMDM4E85NK","Code reviewer sourced from Cline. Use to review or audit changes.","https:\u002F\u002Fgithub.com\u002Fnoah-hrbth\u002Fagent-tool-sync\u002Fblob\u002Fmain\u002Fexamples\u002Fsandbox\u002F.cline\u002Fskills\u002Fcode-review\u002FSKILL.md",[139,140],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},[120,121,85,142,122,123,87,124,86],"cline",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":39},"01M71KF52DECGRXMSZ3PENK1EA","path-scoped","Context-aware TypeScript helper. Auto-activates when TypeScript files are in scope.","https:\u002F\u002Fgithub.com\u002Fnoah-hrbth\u002Fagent-tool-sync\u002Fblob\u002Fmain\u002Fexamples\u002Fsandbox-seed\u002F.agentsync\u002Fskills\u002Fpath-scoped\u002FSKILL.md",[],[150,151,152,153,154,26,155,156,23,157,158,159,103,160,161],"scoped","path","path scoped","scope","lib","src","typescript","files","auto","when","context","typescript helper"]