[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BXAYBCPCBTSPCP8Z5394JG":3,"skill-same:01M6BXAYBCPCBTSPCP8Z5394JG":51},{"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":24,"linkOnly":25,"markdownContent":26,"markdownBody":27,"frontMatter":28,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":32,"repositoryHtmlUrl":33,"repositoryHomepageUrl":34,"ownerHtmlUrl":35,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":36,"install":37,"resources":50},"01M6BXAYBCPCBTSPCP8Z5394JG","downstream-sync",null,"Refresh every downstream repo (beet_atproto, beet_egress, beet_esp, beet_eval, beetmash) with beet's AGENTS.md marker block, its MIT\u002FApache licenses and shared config files. Use after changing AGENTS.md, the licenses or rustfmt.toml.","mrchantey\u002Fbeet","mrchantey","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F25616826?v=4","01M6BXAMJ2N7RBWM0HZ0R6QRTV","Pete Hayman","01M6BXAMPVSZ84Q545AHAMT9N8",134,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmrchantey\u002Fbeet\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdownstream-sync\u002FSKILL.md",[],[19,20,21,22,23],"sync","downstream sync","config","apache","ESP","2026-11-10 10:12:30",false,"---\nname: downstream-sync\ndescription: Refresh every downstream repo (beet_atproto, beet_egress, beet_esp, beet_eval, beetmash) with beet's AGENTS.md marker block, its MIT\u002FApache licenses and shared config files. Use after changing AGENTS.md, the licenses or rustfmt.toml.\n---\n\n# Downstream Sync\n\nBeet has downstream repos (separate git repos building on beet via a path dependency). Each inherits beet's conventions rather than fracturing into its own: a verbatim copy of beet's `AGENTS.md` lives inside a marker block at the bottom of the downstream `AGENTS.md`, and beet's licenses and shared config files are copied as-is. This skill refreshes all of that; `downstream-create` scaffolds a new repo and registers it here.\n\n## Downstream repos\n\n- `\u002Fhome\u002Fpete\u002Fme\u002Fbeet_atproto`\n- `\u002Fhome\u002Fpete\u002Fme\u002Fbeet_egress`\n- `\u002Fhome\u002Fpete\u002Fme\u002Fbeet_esp`\n- `\u002Fhome\u002Fpete\u002Fme\u002Fbeet_eval`\n- `\u002Fhome\u002Fpete\u002Fme\u002Fbeetmash`, the business built on beet, which is not open source and so takes no license files (the `UNLICENSED` array below)\n\n`downstream-create` adds a new repo to this list and to the `DOWNSTREAM` array below.\n\n## What is synced\n\n1. `rustfmt.toml`, `LICENSE-MIT.txt`, `LICENSE-APACHE.txt`: verbatim copies of beet's, so every downstream formats like beet and is dual licensed `MIT OR Apache-2.0` like beet. An `UNLICENSED` repo takes `rustfmt.toml` alone.\n2. `AGENTS.md` inherited block: everything between the markers is replaced with beet's current `AGENTS.md` (the working tree version, so in-flight edits propagate):\n\n```md\n\u003C!-- beet:sync:begin, beet's AGENTS.md refreshed by the downstream-sync skill, do not hand-edit -->\n\u003C!-- beet:sync:end -->\n```\n\n3. `CLAUDE.md -> AGENTS.md` symlink.\n\n## Skills are not synced\n\nNo skill is copied into a downstream. A skill an agent working on a crate built on beet would invoke lives in the shared user-level `~\u002F.agents\u002Fskills` (stowed from `\u002Fhome\u002Fpete\u002Fme\u002Farch-config\u002Fstow\u002Fagents\u002F.agents\u002Fskills`), so every repo already sees it: the generic ones under their own names (`docs-diataxis`, `release`, `phased-plan`, ..), the beet-specific ones prefixed `beet-` (`beet-rendering`, `beet-create-cli`, `beet-audit-free-fns`).\n\nBeet-repo procedures stay in `$BEET\u002F.agents\u002Fskills`, since they name beet's justfile recipes, worktrees, example set, site and deploy; they are reachable at that path like every other beet-relative path in the block. A downstream's own equivalents (its test command, its deploy entry) belong in its `AGENTS.md` header, and its `.agents\u002Fskills` holds only its own skills (`beet_egress` keeps `download-takeout` there), never named like a shared one.\n\n## The contract\n\n- A downstream `AGENTS.md` is its repo-specific header followed by the synced block. Where the header conflicts with the block, the header wins; downstream deltas (target quirks, path-dep notes, test attribute spellings) belong in the header, never as edits inside the block.\n- Never hand-edit inside the markers; the next sync clobbers it.\n- Leave all changes unstaged in every repo, including this one. Never commit.\n- A downstream `AGENTS.md` missing the markers is malformed, and a missing `AGENTS.md` is the same case: the script warns and skips it. Write the header by hand with the markers at the end (`downstream-create`'s template is the shape), never append a second copy of anything, then rerun.\n\n## Run it\n\n```sh\nBEET=\u002Fhome\u002Fpete\u002Fme\u002Fbeet\nDOWNSTREAM=(\u002Fhome\u002Fpete\u002Fme\u002Fbeet_atproto \u002Fhome\u002Fpete\u002Fme\u002Fbeet_egress \u002Fhome\u002Fpete\u002Fme\u002Fbeet_esp \u002Fhome\u002Fpete\u002Fme\u002Fbeet_eval \u002Fhome\u002Fpete\u002Fme\u002Fbeetmash)\n# not open source: beet's conventions, never its licenses\nUNLICENSED=(\u002Fhome\u002Fpete\u002Fme\u002Fbeetmash)\n\nfor repo in \"${DOWNSTREAM[@]}\"; do\n\tfiles=(rustfmt.toml)\n\t[[ \" ${UNLICENSED[*]} \" == *\" $repo \"* ]] || files+=(LICENSE-MIT.txt LICENSE-APACHE.txt)\n\tfor file in \"${files[@]}\"; do\n\t\tcp \"$BEET\u002F$file\" \"$repo\u002F$file\"\n\tdone\n\tif grep -q '\u003C!-- beet:sync:begin' \"$repo\u002FAGENTS.md\" 2>\u002Fdev\u002Fnull; then\n\t\tawk -v src=\"$BEET\u002FAGENTS.md\" '\n\t\t\t\u002F\u003C!-- beet:sync:begin\u002F { print; while ((getline line \u003C src) > 0) print line; close(src); skip=1; next }\n\t\t\t\u002F\u003C!-- beet:sync:end\u002F { skip=0 }\n\t\t\t!skip { print }\n\t\t' \"$repo\u002FAGENTS.md\" > \"$repo\u002FAGENTS.md.tmp\" && mv \"$repo\u002FAGENTS.md.tmp\" \"$repo\u002FAGENTS.md\"\n\t\tln -sf AGENTS.md \"$repo\u002FCLAUDE.md\"\n\telse\n\t\techo \"$repo\u002FAGENTS.md: missing or no sync markers, write the header by hand\" >&2\n\tfi\ndone\n```\n\nAfterwards spot-check one downstream repo: `AGENTS.md` header intact, exactly one block with beet's current text inside it, and both license files present, or absent in an `UNLICENSED` repo.\n\n## Candidates deliberately not synced\n\n- `justfile`, `.cargo\u002Fconfig.toml`, `.gitignore`: repo-shaped, they drift for real reasons; `downstream-create` writes their initial shape.\n- `Cargo.toml`: repo-shaped; its `license = \"MIT OR Apache-2.0\"` (on the package, or `[workspace.package]` in a workspace) is set once, and `downstream-create`'s template carries it.\n- `.github\u002Fworkflows\u002Ftest.yml`: revisit when a downstream gains CI.\n","# Downstream Sync\n\nBeet has downstream repos (separate git repos building on beet via a path dependency). Each inherits beet's conventions rather than fracturing into its own: a verbatim copy of beet's `AGENTS.md` lives inside a marker block at the bottom of the downstream `AGENTS.md`, and beet's licenses and shared config files are copied as-is. This skill refreshes all of that; `downstream-create` scaffolds a new repo and registers it here.\n\n## Downstream repos\n\n- `\u002Fhome\u002Fpete\u002Fme\u002Fbeet_atproto`\n- `\u002Fhome\u002Fpete\u002Fme\u002Fbeet_egress`\n- `\u002Fhome\u002Fpete\u002Fme\u002Fbeet_esp`\n- `\u002Fhome\u002Fpete\u002Fme\u002Fbeet_eval`\n- `\u002Fhome\u002Fpete\u002Fme\u002Fbeetmash`, the business built on beet, which is not open source and so takes no license files (the `UNLICENSED` array below)\n\n`downstream-create` adds a new repo to this list and to the `DOWNSTREAM` array below.\n\n## What is synced\n\n1. `rustfmt.toml`, `LICENSE-MIT.txt`, `LICENSE-APACHE.txt`: verbatim copies of beet's, so every downstream formats like beet and is dual licensed `MIT OR Apache-2.0` like beet. An `UNLICENSED` repo takes `rustfmt.toml` alone.\n2. `AGENTS.md` inherited block: everything between the markers is replaced with beet's current `AGENTS.md` (the working tree version, so in-flight edits propagate):\n\n```md\n\u003C!-- beet:sync:begin, beet's AGENTS.md refreshed by the downstream-sync skill, do not hand-edit -->\n\u003C!-- beet:sync:end -->\n```\n\n3. `CLAUDE.md -> AGENTS.md` symlink.\n\n## Skills are not synced\n\nNo skill is copied into a downstream. A skill an agent working on a crate built on beet would invoke lives in the shared user-level `~\u002F.agents\u002Fskills` (stowed from `\u002Fhome\u002Fpete\u002Fme\u002Farch-config\u002Fstow\u002Fagents\u002F.agents\u002Fskills`), so every repo already sees it: the generic ones under their own names (`docs-diataxis`, `release`, `phased-plan`, ..), the beet-specific ones prefixed `beet-` (`beet-rendering`, `beet-create-cli`, `beet-audit-free-fns`).\n\nBeet-repo procedures stay in `$BEET\u002F.agents\u002Fskills`, since they name beet's justfile recipes, worktrees, example set, site and deploy; they are reachable at that path like every other beet-relative path in the block. A downstream's own equivalents (its test command, its deploy entry) belong in its `AGENTS.md` header, and its `.agents\u002Fskills` holds only its own skills (`beet_egress` keeps `download-takeout` there), never named like a shared one.\n\n## The contract\n\n- A downstream `AGENTS.md` is its repo-specific header followed by the synced block. Where the header conflicts with the block, the header wins; downstream deltas (target quirks, path-dep notes, test attribute spellings) belong in the header, never as edits inside the block.\n- Never hand-edit inside the markers; the next sync clobbers it.\n- Leave all changes unstaged in every repo, including this one. Never commit.\n- A downstream `AGENTS.md` missing the markers is malformed, and a missing `AGENTS.md` is the same case: the script warns and skips it. Write the header by hand with the markers at the end (`downstream-create`'s template is the shape), never append a second copy of anything, then rerun.\n\n## Run it\n\n```sh\nBEET=\u002Fhome\u002Fpete\u002Fme\u002Fbeet\nDOWNSTREAM=(\u002Fhome\u002Fpete\u002Fme\u002Fbeet_atproto \u002Fhome\u002Fpete\u002Fme\u002Fbeet_egress \u002Fhome\u002Fpete\u002Fme\u002Fbeet_esp \u002Fhome\u002Fpete\u002Fme\u002Fbeet_eval \u002Fhome\u002Fpete\u002Fme\u002Fbeetmash)\n# not open source: beet's conventions, never its licenses\nUNLICENSED=(\u002Fhome\u002Fpete\u002Fme\u002Fbeetmash)\n\nfor repo in \"${DOWNSTREAM[@]}\"; do\n\tfiles=(rustfmt.toml)\n\t[[ \" ${UNLICENSED[*]} \" == *\" $repo \"* ]] || files+=(LICENSE-MIT.txt LICENSE-APACHE.txt)\n\tfor file in \"${files[@]}\"; do\n\t\tcp \"$BEET\u002F$file\" \"$repo\u002F$file\"\n\tdone\n\tif grep -q '\u003C!-- beet:sync:begin' \"$repo\u002FAGENTS.md\" 2>\u002Fdev\u002Fnull; then\n\t\tawk -v src=\"$BEET\u002FAGENTS.md\" '\n\t\t\t\u002F\u003C!-- beet:sync:begin\u002F { print; while ((getline line \u003C src) > 0) print line; close(src); skip=1; next }\n\t\t\t\u002F\u003C!-- beet:sync:end\u002F { skip=0 }\n\t\t\t!skip { print }\n\t\t' \"$repo\u002FAGENTS.md\" > \"$repo\u002FAGENTS.md.tmp\" && mv \"$repo\u002FAGENTS.md.tmp\" \"$repo\u002FAGENTS.md\"\n\t\tln -sf AGENTS.md \"$repo\u002FCLAUDE.md\"\n\telse\n\t\techo \"$repo\u002FAGENTS.md: missing or no sync markers, write the header by hand\" >&2\n\tfi\ndone\n```\n\nAfterwards spot-check one downstream repo: `AGENTS.md` header intact, exactly one block with beet's current text inside it, and both license files present, or absent in an `UNLICENSED` repo.\n\n## Candidates deliberately not synced\n\n- `justfile`, `.cargo\u002Fconfig.toml`, `.gitignore`: repo-shaped, they drift for real reasons; `downstream-create` writes their initial shape.\n- `Cargo.toml`: repo-shaped; its `license = \"MIT OR Apache-2.0\"` (on the package, or `[workspace.package]` in a workspace) is set once, and `downstream-create`'s template carries it.\n- `.github\u002Fworkflows\u002Ftest.yml`: revisit when a downstream gains CI.\n",{"name":5,"description":7},"main","9b5840ae0d850b477ffc451d20edf49b65c6f6eb",".agents\u002Fskills\u002Fdownstream-sync",8,"https:\u002F\u002Fgithub.com\u002Fmrchantey\u002Fbeet","https:\u002F\u002Fbeet.org","https:\u002F\u002Fgithub.com\u002Fmrchantey","2026-10-23 10:06:21",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add mrchantey\u002Fbeet --skill downstream-sync",{"tool":43,"command":44},"bunx","bunx skills add mrchantey\u002Fbeet --skill downstream-sync",{"tool":46,"command":47},"pnpm","pnpm dlx skills add mrchantey\u002Fbeet --skill downstream-sync","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmrchantey\u002Fbeet\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdownstream-sync\u002FSKILL.md",true,[],[52,66,74,95,104,115],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":58,"publishedAt":24},"01M6BXBJB92PMF5T0GB1GK8CMP","worktree-sync-upstream","Sync a detached-HEAD worktree with its upstream branch in the main repo in both directions, rebasing only owned commits and fast-forwarding upstream, with recovery steps for tangled history and helpers for prose and secrets.toml conflicts. Use from inside a worktree.","https:\u002F\u002Fgithub.com\u002Fmrchantey\u002Fbeet\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fworktree-sync-upstream\u002FSKILL.md",[],[59,60,19,61,62,63,64,65],"worktree sync upstream","worktree","sync upstream","commits","secrets","recovery","fast",{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":24},"01M6BXBGPK0T0YWC85M5AZR59N","worktree-sync-all","Sync the main branch with every worktree in both directions, applying the worktree-sync-upstream skill to each in turn, then levelling them. Use when asked to sync all worktrees.","https:\u002F\u002Fgithub.com\u002Fmrchantey\u002Fbeet\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fworktree-sync-all\u002FSKILL.md",[],[73,60,19],"worktree sync all",{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":85,"publishedAt":24},"01M6BXBE53M9HRGTWNB1W9VKAT","test-the-works","Maximal project health pass. Run core tests, all tests, the example smoke set, the rsx_site verification and every downstream repo in sequence, fixing every failure and warning surfaced along the way. Use when asked to run 'the works' or fully verify the project.","https:\u002F\u002Fgithub.com\u002Fmrchantey\u002Fbeet\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ftest-the-works\u002FSKILL.md",[80],{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[86,87,88,89,90,91,92,93,94],"test the works","test","run","core","site","health","verify","SET","verification",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":102,"publishedAt":24},"01M6BXBBRK6XD63BKX60WKFDCW","test-run","Run the core test suite (just test-core) to a clean, warning-free pass, with recipes for hanging tests and mold linker flakes. Use when asked to run or fix the test suite.","https:\u002F\u002Fgithub.com\u002Fmrchantey\u002Fbeet\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ftest-run\u002FSKILL.md",[101],{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},[103,88,87,89],"test run",{"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":111,"publishedAt":24},"01M6BXB90ZEVHBM1R3C4Y95J3X","test-examples","Run the workspace example smoke set to catch regressions unit tests miss, covering every feature gate combination with self-terminating examples and curl-probed servers. Use when asked to run or verify the examples.","https:\u002F\u002Fgithub.com\u002Fmrchantey\u002Fbeet\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ftest-examples\u002FSKILL.md",[110],{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},[112,87,113,93,92,114,88],"examples","test examples","unit tests",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":122,"publishedAt":24},"01M6BXB6QDY5NH0TMHWTCXX0C2","test-dependency-audit","Audit every crate's Cargo.toml for unused, duplicate or misplaced dependencies, moving shared deps to the workspace and feature-gating where sensible. Use when asked to audit or slim dependencies.","https:\u002F\u002Fgithub.com\u002Fmrchantey\u002Fbeet\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ftest-dependency-audit\u002FSKILL.md",[121],{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},[123,87,124,125,126],"audit","dependency audit","test dependency audit","deps"]