[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N0VEXTK6VAS8XR59JHBZ7M":3,"skill-same:01M6N0VEXTK6VAS8XR59JHBZ7M":94},{"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":66,"commitSha":67,"skillDirectory":68,"forksCount":69,"repositoryHtmlUrl":70,"repositoryHomepageUrl":6,"ownerHtmlUrl":71,"ownerBlogUrl":72,"ownerDescription":73,"updatedAt":74,"install":75,"resources":87},"01M6N0VEXTK6VAS8XR59JHBZ7M","skillpack-harvest",null,"Lift a proven skill from a host repo (e.g. your OpenClaw fork) back into\ngbrain's bundle so other clients can scaffold it. Editorial workflow:\nthe CLI does the file copy + privacy lint; this skill drives the\njudgment-heavy genericization (scrub real names, generalize triggers,\nlift fork-specific conventions to references).","garrytan\u002Fgbrain","garrytan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F19957?v=4","01M6DJCCDDG53MTYYRTXAXFG17","Garry Tan","01M6MZQZCEN3RRMD33E1X9ZZR9",32847,"MIT","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Fskillpack-harvest\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"skillpack harvest","harvest","upstream","editorial","scrub","my","lift","host","false","judgment","openclaw","back","references","repo","publish","promote","my skill","core","workflow","cli","2026-11-10 10:12:30",false,"---\nname: skillpack-harvest\nversion: 0.33.0\ndescription: |\n  Lift a proven skill from a host repo (e.g. your OpenClaw fork) back into\n  gbrain's bundle so other clients can scaffold it. Editorial workflow:\n  the CLI does the file copy + privacy lint; this skill drives the\n  judgment-heavy genericization (scrub real names, generalize triggers,\n  lift fork-specific conventions to references).\ntriggers:\n  - \"harvest this skill\"\n  - \"harvest my skill\"\n  - \"publish this skill to gbrain\"\n  - \"lift this skill\"\n  - \"share this skill\"\n  - \"promote this skill\"\n  - \"promote my skill\"\n  - \"skill upstream\"\n  - \"into the gbrain core\"\n  - \"gbrain bundle\"\nmutating: true\nwrites_pages: false\nwrites_to:\n  - skills\u002F\u003Charvested-slug>\u002F\n  - openclaw.plugin.json\n---\n\n# skillpack-harvest — Editorial workflow for lifting host skills into gbrain\n\n> **Convention:** see [_brain-filing-rules.md](..\u002F_brain-filing-rules.md) for\n> file placement rules. This skill writes into gbrain's own tree, not the\n> brain repo's notes.\n\nThis skill is the inverse of `gbrain skillpack scaffold`. Scaffold ships\nskills downstream (gbrain → host). Harvest lifts proven patterns\nupstream (host → gbrain) so they become references every other client\ncan scaffold.\n\n## Contract\n\nA harvest is \"properly done\" when:\n\n1. The host skill is mature (used in production, recent routing-eval\n   cases pass).\n2. The editorial genericization in Phase 3 has scrubbed every\n   fork-specific reference (names, real entities, internal channels).\n3. `gbrain skillpack harvest --dry-run` previewed the file set.\n4. The real `gbrain skillpack harvest \u003Cslug> --from \u003Chost>` succeeded\n   with `status: harvested` (no privacy-lint hits).\n5. `bun test test\u002Fskills-conformance.test.ts` passes on the new\n   `skills\u002F\u003Cslug>\u002FSKILL.md`.\n6. The user has reviewed the diff in gbrain and explicitly approved\n   the commit.\n\nIf any of these is incomplete, the skill is NOT yet harvested — the\nfiles may sit in gbrain's working tree, but they're not landed.\n\n## Output Format\n\nThis skill produces three artifacts in gbrain's working tree:\n\n1. `skills\u002F\u003Charvested-slug>\u002FSKILL.md` (and any sibling files like\n   `routing-eval.jsonl`)\n2. Paired source files at their mirror paths (e.g.\n   `src\u002Fcommands\u002F\u003Cslug>.ts`) when the host SKILL.md declared them\n   in frontmatter `sources:`\n3. An updated `openclaw.plugin.json` with the new slug added to\n   `skills:` (sorted)\n\nThe session output to the user is a one-line success summary plus\na list of files written. JSON mode (`--json`) returns the full\n`HarvestResult` shape for machine consumption.\n\n## When it fails\n\nFollow the [agent operator protocol](..\u002Fconventions\u002Fagent-operator-protocol.md) for any gbrain error `code`, exit code, `[AGENT]` block or notice block. Specific to this skill:\n\n- `lint_failed`: the privacy linter caught a real name or private detail; go back to Phase 3 and replace it with placeholders (`alice-example`, `acme-example`, `fund-a`).\n- `gbrain skillpack check --strict` reports drift after the harvest: regenerate the bundle and re-run; never ship a drifting skillpack.\n\n## Anti-Patterns\n\n- **Skipping the dry-run.** Always preview first. Files land in\n  gbrain's working tree; cleanup is a `git checkout` away, but you\n  shouldn't need to.\n- **Trusting the linter alone.** The default regex set catches the\n  common cases. It doesn't catch every proper noun. Phase 3 (the\n  editorial pass) is the primary defense.\n- **Harvesting `--no-lint` without justification.** The lint exists\n  for a reason. If you bypass it, document why in the commit.\n- **Harvesting a skill that's still in flux.** Wait until the host\n  version stabilizes. Otherwise you'll harvest, then re-harvest,\n  then re-harvest, and that churns gbrain's bundle for no benefit.\n- **Moving files instead of copying.** Harvest is a copy. The host\n  retains its skill. Don't `rm -rf` the source after harvesting.\n- **Harvesting batch (multiple skills at once).** Not supported, and\n  for good reason — the editorial review per skill is real work.\n\n## When to invoke\n\n- The user developed a skill in their host fork (your OpenClaw or any\n  private downstream fork) and wants other gbrain clients to be able to use it\n- A skill has proven itself in production and is ready to generalize\n- The user explicitly asks to \"harvest\" or \"publish\" a skill upstream\n\nDo NOT invoke when:\n- The skill is still in flux locally — let it stabilize first\n- The skill references private content that can't be generalized\n- The user just wants to share a one-off draft (use a gist instead)\n\n## Preconditions\n\nBefore running this skill, confirm:\n\n1. **The skill is mature.** Recent `routing-eval.jsonl` cases pass; the\n   skill has been used in production at least a few times.\n\n2. **The skill is generalizable.** Strip-test in your head: replace\n   every fork-specific name. Does it still make sense as a skill?\n\n3. **The user owns the gbrain checkout.** The harvest writes into\n   gbrain's working tree. They'll review and commit. Don't harvest\n   into a checkout the user doesn't intend to commit from.\n\n## Workflow\n\n### Phase 1 — Plan\n\nAsk the user:\n- What slug should the harvested skill have? (Slugs must be kebab-case,\n  globally unique in the gbrain bundle.)\n- Which host repo is the source? (Path to repo root, not to the skill\n  directory — e.g. `~\u002Fgit\u002Fagent-fork`, not `~\u002Fgit\u002Fagent-fork\u002Fskills\u002Ffoo`.)\n- Should paired source files come along? (Check the host SKILL.md's\n  frontmatter `sources:` array.)\n\n### Phase 2 — Dry-run + privacy-lint preview\n\nRun the CLI with `--dry-run`:\n\n```bash\ngbrain skillpack harvest \u003Cslug> --from \u003Chost-repo-root> --dry-run\n```\n\nThe output shows:\n- Which files would land in gbrain's tree\n- Whether paired sources are included\n- (Implicit) The skill's frontmatter triggers — read them and check\n  they generalize\n\nDo **not** skip the dry-run. The privacy linter only runs on a real\nharvest, but the dry-run preview lets you see the files before they\nland. Spot-check the SKILL.md and any paired source for things the\nlinter might miss (proper nouns, internal project names, etc.).\n\n### Phase 3 — Genericization checklist (the editorial pass)\n\nBefore running the real harvest, walk the host's `skills\u002F\u003Cslug>\u002F`\nfiles and apply this checklist. If anything matches, edit the host\nfile FIRST, then run harvest.\n\n1. **Fork-specific names → generic phrasing**\n   - `\u003Cpersonal-fork-name>` → `your OpenClaw` (or `OpenClaw deployment`);\n     any pet name for the user's private agent gets the same treatment\n   - Personal first names (`garry`, `jane`, etc.) → `the user` \u002F\n     `you` \u002F a generic placeholder\n\n2. **Real entities → placeholders**\n   - Real people, companies, deals, funds → placeholder slugs\n     (`alice-example`, `acme-example`, `fund-a`, etc.)\n   - Email addresses → strip entirely OR use `example@example.com`\n   - Internal Slack channels → `#some-channel` or strip\n   - Specific tracker IDs \u002F Linear ticket numbers → strip\n\n3. **Fork-specific conventions → references**\n   - Mentions of `\u003Chost-repo>\u002Fdocs\u002F...` files → either lift the doc\n     into gbrain OR replace with a generic placeholder explanation\n   - Mentions of `\u003Chost-repo>\u002Fskills\u002F\u003Cother-fork-only-skill>` → either\n     decide to harvest that one too, or replace with a generic\n     pattern reference\n\n4. **Triggers array generalizes**\n   - Read every entry in frontmatter `triggers:`. None should\n     reference the user's name, fork name, or internal tools.\n   - \"Have garry sign off on it\" → \"have the user sign off on it\"\n\n5. **routing-eval.jsonl examples are scrubbed**\n   - Open `skills\u002F\u003Cslug>\u002Frouting-eval.jsonl`. Every `intent` field\n     gets the same scrub as `triggers:`.\n\n6. **Code comments + log strings**\n   - If a paired source is going to be harvested, walk it for the\n     same private-pattern leaks. Comments are the most common\n     hiding spot.\n\n### Phase 4 — Real harvest\n\nOnce Phase 3 is complete, run the real harvest:\n\n```bash\ngbrain skillpack harvest \u003Cslug> --from \u003Chost-repo-root>\n```\n\nDefault behavior:\n- Path-confinement + symlink rejection at file copy\n- Privacy linter runs against `~\u002F.gbrain\u002Fharvest-private-patterns.txt`\n  (plus built-in defaults — the canonical private fork name, email\n  addresses, Slack channels; see `src\u002Fcore\u002Fskillpack\u002Fharvest-lint.ts`)\n- On any match → rollback (delete the harvested files) + exit non-zero\n- `openclaw.plugin.json` updated to add the slug, sorted\n\nOutcomes:\n- `harvested` — success, manifest updated, files in gbrain's tree\n- `lint_failed` — privacy linter caught something. Go back to Phase 3,\n  scrub the host file, retry.\n- `slug_collision` — gbrain already has a skill at that slug. Either\n  use a different slug, or pass `--overwrite-local` if you really\n  mean to replace.\n\n### Phase 5 — Verify in gbrain\n\nAfter a successful harvest:\n\n1. `bun test test\u002Fskills-conformance.test.ts` — confirms the new\n   SKILL.md meets the frontmatter contract.\n2. `gbrain skillpack check --strict` — confirms no drift between\n   bundle and gbrain's own checkout.\n3. `gbrain skillpack list` — confirms the slug shows up in the bundle.\n4. Review the diff: `cd \u003CgbrainRoot> && git diff -- skills\u002F\u003Cslug>\u002F`\n5. Commit the additions in gbrain (do NOT commit any leftover files\n   in the host repo — harvest is a copy, not a move).\n\n### Phase 6 — Downstream announcement (optional)\n\nIf other gbrain clients should pick up the new skill:\n- Note it in `CHANGELOG.md` under \"Skills added\" for the next release\n- Tag the user \u002F contributor in the PR if the skill came from\n  someone outside the core team\n\n## Bypass: `--no-lint`\n\nThe privacy linter is the safety net. The editorial pass is the\nprimary defense. If you've completed Phase 3 thoroughly and the\nlinter is still firing on a false positive, use `--no-lint`:\n\n```bash\ngbrain skillpack harvest \u003Cslug> --from \u003Chost-repo-root> --no-lint\n```\n\n**Document the bypass in the commit message.** Future maintainers\nshould be able to see WHY the lint was bypassed (e.g. \"the fork name\nappears in a citation, not a real reference — verified manually\").\n\nNever bypass the linter on a casual basis. The whole point of the\ndefault-on lint is that real names occasionally slip through the\neditorial pass.\n\n## What harvest does NOT do\n\n- It does NOT move files (it copies). The host's `skills\u002F\u003Cslug>\u002F`\n  stays in place.\n- It does NOT auto-scrub names. The editorial pass is human-driven.\n- It does NOT publish to npm or a remote bundle. It writes to\n  gbrain's working tree; the user commits + ships via the normal\n  gbrain release process.\n- It does NOT support `--all` (no batch harvest). One skill at a\n  time keeps the editorial review tractable.\n\n## Files this skill touches\n\n- gbrain's `skills\u002F\u003Cslug>\u002F` — every file in the host skill dir\n  (copy)\n- gbrain's mirror path for declared paired sources\n  (e.g. `src\u002Fcommands\u002F\u003Cslug>.ts` if the host SKILL.md declares it\n  in frontmatter)\n- gbrain's `openclaw.plugin.json` — adds the slug to `skills:`\n  array, sorted alphabetically, without removing OpenClaw-native plugin fields\n  like `id`, `configSchema`, or `contracts`\n","# skillpack-harvest — Editorial workflow for lifting host skills into gbrain\n\n> **Convention:** see [_brain-filing-rules.md](..\u002F_brain-filing-rules.md) for\n> file placement rules. This skill writes into gbrain's own tree, not the\n> brain repo's notes.\n\nThis skill is the inverse of `gbrain skillpack scaffold`. Scaffold ships\nskills downstream (gbrain → host). Harvest lifts proven patterns\nupstream (host → gbrain) so they become references every other client\ncan scaffold.\n\n## Contract\n\nA harvest is \"properly done\" when:\n\n1. The host skill is mature (used in production, recent routing-eval\n   cases pass).\n2. The editorial genericization in Phase 3 has scrubbed every\n   fork-specific reference (names, real entities, internal channels).\n3. `gbrain skillpack harvest --dry-run` previewed the file set.\n4. The real `gbrain skillpack harvest \u003Cslug> --from \u003Chost>` succeeded\n   with `status: harvested` (no privacy-lint hits).\n5. `bun test test\u002Fskills-conformance.test.ts` passes on the new\n   `skills\u002F\u003Cslug>\u002FSKILL.md`.\n6. The user has reviewed the diff in gbrain and explicitly approved\n   the commit.\n\nIf any of these is incomplete, the skill is NOT yet harvested — the\nfiles may sit in gbrain's working tree, but they're not landed.\n\n## Output Format\n\nThis skill produces three artifacts in gbrain's working tree:\n\n1. `skills\u002F\u003Charvested-slug>\u002FSKILL.md` (and any sibling files like\n   `routing-eval.jsonl`)\n2. Paired source files at their mirror paths (e.g.\n   `src\u002Fcommands\u002F\u003Cslug>.ts`) when the host SKILL.md declared them\n   in frontmatter `sources:`\n3. An updated `openclaw.plugin.json` with the new slug added to\n   `skills:` (sorted)\n\nThe session output to the user is a one-line success summary plus\na list of files written. JSON mode (`--json`) returns the full\n`HarvestResult` shape for machine consumption.\n\n## When it fails\n\nFollow the [agent operator protocol](..\u002Fconventions\u002Fagent-operator-protocol.md) for any gbrain error `code`, exit code, `[AGENT]` block or notice block. Specific to this skill:\n\n- `lint_failed`: the privacy linter caught a real name or private detail; go back to Phase 3 and replace it with placeholders (`alice-example`, `acme-example`, `fund-a`).\n- `gbrain skillpack check --strict` reports drift after the harvest: regenerate the bundle and re-run; never ship a drifting skillpack.\n\n## Anti-Patterns\n\n- **Skipping the dry-run.** Always preview first. Files land in\n  gbrain's working tree; cleanup is a `git checkout` away, but you\n  shouldn't need to.\n- **Trusting the linter alone.** The default regex set catches the\n  common cases. It doesn't catch every proper noun. Phase 3 (the\n  editorial pass) is the primary defense.\n- **Harvesting `--no-lint` without justification.** The lint exists\n  for a reason. If you bypass it, document why in the commit.\n- **Harvesting a skill that's still in flux.** Wait until the host\n  version stabilizes. Otherwise you'll harvest, then re-harvest,\n  then re-harvest, and that churns gbrain's bundle for no benefit.\n- **Moving files instead of copying.** Harvest is a copy. The host\n  retains its skill. Don't `rm -rf` the source after harvesting.\n- **Harvesting batch (multiple skills at once).** Not supported, and\n  for good reason — the editorial review per skill is real work.\n\n## When to invoke\n\n- The user developed a skill in their host fork (your OpenClaw or any\n  private downstream fork) and wants other gbrain clients to be able to use it\n- A skill has proven itself in production and is ready to generalize\n- The user explicitly asks to \"harvest\" or \"publish\" a skill upstream\n\nDo NOT invoke when:\n- The skill is still in flux locally — let it stabilize first\n- The skill references private content that can't be generalized\n- The user just wants to share a one-off draft (use a gist instead)\n\n## Preconditions\n\nBefore running this skill, confirm:\n\n1. **The skill is mature.** Recent `routing-eval.jsonl` cases pass; the\n   skill has been used in production at least a few times.\n\n2. **The skill is generalizable.** Strip-test in your head: replace\n   every fork-specific name. Does it still make sense as a skill?\n\n3. **The user owns the gbrain checkout.** The harvest writes into\n   gbrain's working tree. They'll review and commit. Don't harvest\n   into a checkout the user doesn't intend to commit from.\n\n## Workflow\n\n### Phase 1 — Plan\n\nAsk the user:\n- What slug should the harvested skill have? (Slugs must be kebab-case,\n  globally unique in the gbrain bundle.)\n- Which host repo is the source? (Path to repo root, not to the skill\n  directory — e.g. `~\u002Fgit\u002Fagent-fork`, not `~\u002Fgit\u002Fagent-fork\u002Fskills\u002Ffoo`.)\n- Should paired source files come along? (Check the host SKILL.md's\n  frontmatter `sources:` array.)\n\n### Phase 2 — Dry-run + privacy-lint preview\n\nRun the CLI with `--dry-run`:\n\n```bash\ngbrain skillpack harvest \u003Cslug> --from \u003Chost-repo-root> --dry-run\n```\n\nThe output shows:\n- Which files would land in gbrain's tree\n- Whether paired sources are included\n- (Implicit) The skill's frontmatter triggers — read them and check\n  they generalize\n\nDo **not** skip the dry-run. The privacy linter only runs on a real\nharvest, but the dry-run preview lets you see the files before they\nland. Spot-check the SKILL.md and any paired source for things the\nlinter might miss (proper nouns, internal project names, etc.).\n\n### Phase 3 — Genericization checklist (the editorial pass)\n\nBefore running the real harvest, walk the host's `skills\u002F\u003Cslug>\u002F`\nfiles and apply this checklist. If anything matches, edit the host\nfile FIRST, then run harvest.\n\n1. **Fork-specific names → generic phrasing**\n   - `\u003Cpersonal-fork-name>` → `your OpenClaw` (or `OpenClaw deployment`);\n     any pet name for the user's private agent gets the same treatment\n   - Personal first names (`garry`, `jane`, etc.) → `the user` \u002F\n     `you` \u002F a generic placeholder\n\n2. **Real entities → placeholders**\n   - Real people, companies, deals, funds → placeholder slugs\n     (`alice-example`, `acme-example`, `fund-a`, etc.)\n   - Email addresses → strip entirely OR use `example@example.com`\n   - Internal Slack channels → `#some-channel` or strip\n   - Specific tracker IDs \u002F Linear ticket numbers → strip\n\n3. **Fork-specific conventions → references**\n   - Mentions of `\u003Chost-repo>\u002Fdocs\u002F...` files → either lift the doc\n     into gbrain OR replace with a generic placeholder explanation\n   - Mentions of `\u003Chost-repo>\u002Fskills\u002F\u003Cother-fork-only-skill>` → either\n     decide to harvest that one too, or replace with a generic\n     pattern reference\n\n4. **Triggers array generalizes**\n   - Read every entry in frontmatter `triggers:`. None should\n     reference the user's name, fork name, or internal tools.\n   - \"Have garry sign off on it\" → \"have the user sign off on it\"\n\n5. **routing-eval.jsonl examples are scrubbed**\n   - Open `skills\u002F\u003Cslug>\u002Frouting-eval.jsonl`. Every `intent` field\n     gets the same scrub as `triggers:`.\n\n6. **Code comments + log strings**\n   - If a paired source is going to be harvested, walk it for the\n     same private-pattern leaks. Comments are the most common\n     hiding spot.\n\n### Phase 4 — Real harvest\n\nOnce Phase 3 is complete, run the real harvest:\n\n```bash\ngbrain skillpack harvest \u003Cslug> --from \u003Chost-repo-root>\n```\n\nDefault behavior:\n- Path-confinement + symlink rejection at file copy\n- Privacy linter runs against `~\u002F.gbrain\u002Fharvest-private-patterns.txt`\n  (plus built-in defaults — the canonical private fork name, email\n  addresses, Slack channels; see `src\u002Fcore\u002Fskillpack\u002Fharvest-lint.ts`)\n- On any match → rollback (delete the harvested files) + exit non-zero\n- `openclaw.plugin.json` updated to add the slug, sorted\n\nOutcomes:\n- `harvested` — success, manifest updated, files in gbrain's tree\n- `lint_failed` — privacy linter caught something. Go back to Phase 3,\n  scrub the host file, retry.\n- `slug_collision` — gbrain already has a skill at that slug. Either\n  use a different slug, or pass `--overwrite-local` if you really\n  mean to replace.\n\n### Phase 5 — Verify in gbrain\n\nAfter a successful harvest:\n\n1. `bun test test\u002Fskills-conformance.test.ts` — confirms the new\n   SKILL.md meets the frontmatter contract.\n2. `gbrain skillpack check --strict` — confirms no drift between\n   bundle and gbrain's own checkout.\n3. `gbrain skillpack list` — confirms the slug shows up in the bundle.\n4. Review the diff: `cd \u003CgbrainRoot> && git diff -- skills\u002F\u003Cslug>\u002F`\n5. Commit the additions in gbrain (do NOT commit any leftover files\n   in the host repo — harvest is a copy, not a move).\n\n### Phase 6 — Downstream announcement (optional)\n\nIf other gbrain clients should pick up the new skill:\n- Note it in `CHANGELOG.md` under \"Skills added\" for the next release\n- Tag the user \u002F contributor in the PR if the skill came from\n  someone outside the core team\n\n## Bypass: `--no-lint`\n\nThe privacy linter is the safety net. The editorial pass is the\nprimary defense. If you've completed Phase 3 thoroughly and the\nlinter is still firing on a false positive, use `--no-lint`:\n\n```bash\ngbrain skillpack harvest \u003Cslug> --from \u003Chost-repo-root> --no-lint\n```\n\n**Document the bypass in the commit message.** Future maintainers\nshould be able to see WHY the lint was bypassed (e.g. \"the fork name\nappears in a citation, not a real reference — verified manually\").\n\nNever bypass the linter on a casual basis. The whole point of the\ndefault-on lint is that real names occasionally slip through the\neditorial pass.\n\n## What harvest does NOT do\n\n- It does NOT move files (it copies). The host's `skills\u002F\u003Cslug>\u002F`\n  stays in place.\n- It does NOT auto-scrub names. The editorial pass is human-driven.\n- It does NOT publish to npm or a remote bundle. It writes to\n  gbrain's working tree; the user commits + ships via the normal\n  gbrain release process.\n- It does NOT support `--all` (no batch harvest). One skill at a\n  time keeps the editorial review tractable.\n\n## Files this skill touches\n\n- gbrain's `skills\u002F\u003Cslug>\u002F` — every file in the host skill dir\n  (copy)\n- gbrain's mirror path for declared paired sources\n  (e.g. `src\u002Fcommands\u002F\u003Cslug>.ts` if the host SKILL.md declares it\n  in frontmatter)\n- gbrain's `openclaw.plugin.json` — adds the slug to `skills:`\n  array, sorted alphabetically, without removing OpenClaw-native plugin fields\n  like `id`, `configSchema`, or `contracts`\n",{"name":5,"version":49,"mutating":50,"triggers":51,"writes_to":62,"description":65,"writes_pages":45},"0.33.0",true,[52,53,54,55,56,57,58,59,60,61],"harvest this skill","harvest my skill","publish this skill to gbrain","lift this skill","share this skill","promote this skill","promote my skill","skill upstream","into the gbrain core","gbrain bundle",[63,64],"skills\u002F\u003Charvested-slug>\u002F","openclaw.plugin.json","Lift a proven skill from a host repo (e.g. your OpenClaw fork) back into\ngbrain's bundle so other clients can scaffold it. Editorial workflow:\nthe CLI does the file copy + privacy lint; this skill drives the\njudgment-heavy genericization (scrub real names, generalize triggers,\nlift fork-specific conventions to references).\n","master","074ec301549ded4930f04d2c3b22d709a6c095cc","skills\u002Fskillpack-harvest",4902,"https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain","https:\u002F\u002Fgithub.com\u002Fgarrytan","https:\u002F\u002Fblog.garrytan.com","Writes software, dreams. ","2026-11-14 04:11:30",{"source":8,"skillName":5,"commands":76,"prompt":86,"zipAvailable":50},[77,80,83],{"tool":78,"command":79},"npx","npx skills add garrytan\u002Fgbrain --skill skillpack-harvest",{"tool":81,"command":82},"bunx","bunx skills add garrytan\u002Fgbrain --skill skillpack-harvest",{"tool":84,"command":85},"pnpm","pnpm dlx skills add garrytan\u002Fgbrain --skill skillpack-harvest","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Fskillpack-harvest\u002FSKILL.md",[88],{"path":89,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":92,"sourceHtmlUrl":93},"routing-eval.jsonl","OTHER","其他",1819,"https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Fskills\u002Fskillpack-harvest\u002Frouting-eval.jsonl",[95,107,113,136,163,176],{"skillNo":96,"name":97,"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":98,"categories":99,"keywords":100,"publishedAt":44},"01M6N109FNGH1PK49T734PZXGB","query-helper","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fquery-helper\u002FSKILL.md",[],[101,102,103,104,105,106,32],"query helper","helper","query","search","page","find",{"skillNo":108,"name":109,"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":110,"categories":111,"keywords":112,"publishedAt":44},"01M6N108A23GW6NGQEQ0E7GV0A","broken","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbroken\u002FSKILL.md",[],[109],{"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":119,"publishedAt":44},"01M6N105E88C5K2H03H0CC79G1","brain-ops","Read, enrich, and write brain pages with source attribution.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog\u002Fskills\u002Fbrain-ops\u002FSKILL.md",[],[120,121,122,123,124,105,125,126,127,128,103,129,130,131,132,133,134,135,104],"brain ops","brain","ops","true","attribution","read","write","up","look","pages","people","with","enrich","web","path","source",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":147,"publishedAt":44},"01M6N102GRMF22TVCNT6RK5MRD","meeting-prep","Build a briefing before you meet someone, from their recent threads, open loops and what they care about.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Fmeeting-prep\u002FSKILL.md",[142],{"categoryNo":143,"categoryName":144,"taxonomyType":145,"taxonomyTypeDesc":146},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[148,149,150,151,152,104,153,154,155,103,32,156,157,158,159,160,161,162],"meeting","prep","meeting prep","me","prepare","brief","open","build","loops","about","you","briefing","threads","for","Meet",{"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":169,"publishedAt":44},"01M6N1005QK7REHX5KGMNR5PF0","inbox-zero","Triage the inbox into replies, delegations and archives.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Finbox-zero\u002FSKILL.md",[],[170,171,172,104,173,32,174,29,175],"inbox zero","ZeRO","inbox","clear","replies","triage",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":44},"01M6N0ZXQ8RRRW71PNV61T57GP","deal-memo","Draft an investment memo from the deal pages and the founder history already in the brain.","https:\u002F\u002Fgithub.com\u002Fgarrytan\u002Fgbrain\u002Fblob\u002Fmaster\u002Ftest\u002Ffixtures\u002Fskill-catalog-query\u002Fskills\u002Fdeal-memo\u002FSKILL.md",[],[183,184,185,129,121,186,187,126,188,123,104,189],"deal memo","deal","memo","draft","investment","history","founder"]