[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CVKVT6ZVYN2XPESS5EGDKE":3,"skill-same:01M6CVKVT6ZVYN2XPESS5EGDKE":74},{"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":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M6CVKVT6ZVYN2XPESS5EGDKE","sync-upstream-skills",null,"Re-transplant owned skills from their mattpocock upstream after a git pull, applying upstream content changes while preserving opencode-native frontmatter. Also checks for duplicate skill names and dangling cross-skill references. Use when the user says \"sync skills\", \"refresh from upstream\", \"pull matt's skills\", \"sync upstream\", \"update the transplanted skills\", or wants to bring the owned transplanted skills up to date. Do not use to add or rename a transplanted skill — that stays manual.","georgernstgraf\u002Fopencode-helpers","georgernstgraf","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F115418377?v=4","01M6CVHJ34JS0CF98EFFN0FZ76","Georg Graf SPG","01M6CVHJ7VV5VK6RXY62SR0NE2",1,"MIT","https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf\u002Fopencode-helpers\u002Fblob\u002Fmain\u002Fskills\u002Fsync-upstream-skills\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"sync upstream","upstream","sync","sync upstream skills","frontmatter","native","changes","duplicate","when","re","for","bring","user","content","use","git","up","duplicate skill","opencode","refresh","references","pull","2026-11-10 10:12:30",false,"---\nname: sync-upstream-skills\ndescription: Re-transplant owned skills from their mattpocock upstream after a git pull, applying upstream content changes while preserving opencode-native frontmatter. Also checks for duplicate skill names and dangling cross-skill references. Use when the user says \"sync skills\", \"refresh from upstream\", \"pull matt's skills\", \"sync upstream\", \"update the transplanted skills\", or wants to bring the owned transplanted skills up to date. Do not use to add or rename a transplanted skill — that stays manual.\nlicense: MIT\n---\n\n# Sync Upstream Skills\n\nThis repo owns a small set of skills transplanted from mattpocock's `skills` repo. They live here with opencode-native frontmatter (the upstream's `disable-model-invocation: true` becomes `metadata.opencode\u002Fautoinvoke: false` or is dropped; `argument-hint` and other Claude-specific fields are dropped). This skill re-applies upstream changes on demand without re-introducing a live second source.\n\n## The mapping\n\nRead [mapping.json](.\u002Fmapping.json) in this directory. Each entry maps an owned skill name (the directory name under `skills\u002F`) to its upstream path relative to `~\u002Frepos\u002Fmattpocock\u002Fskills\u002Fskills\u002F`.\n\n## Procedure\n\n### 1. Update the upstream\n\n```\ngit -C ~\u002Frepos\u002Fmattpocock\u002Fskills pull\n```\n\nIf already up to date, report that and stop.\n\n### 2. For each mapped skill\n\nFor each `name -> upstream-path` entry in mapping.json:\n\n1. Read the upstream `SKILL.md` at `~\u002Frepos\u002Fmattpocock\u002Fskills\u002Fskills\u002F\u003Cupstream-path>\u002FSKILL.md`.\n2. Read the owned `SKILL.md` at `skills\u002F\u003Cname>\u002FSKILL.md`.\n3. Compare the **body** (everything after the frontmatter delimiter). opencode ignores Claude-specific frontmatter fields (`disable-model-invocation`, `argument-hint`, `policy.*` in `agents\u002Fopenai.yaml`), so ignore those when diffing; only the prose body is what changes upstream.\n4. If the body changed:\n   - Take the upstream body verbatim.\n   - Re-attach the owned frontmatter (preserve `name`, `description`, `metadata.opencode\u002Fautoinvoke`, `license`). If the upstream `description` changed, update ours to match verbatim (the description is what steers the model's invocation in opencode, so it must stay in sync).\n   - Write the merged file back to `skills\u002F\u003Cname>\u002FSKILL.md`.\n5. Copy any **sibling files** the upstream changed (e.g. `*-FORMAT.md`, `GLOSSARY.md`). These are resource files referenced by the skill body. Copy verbatim; they carry no opencode frontmatter.\n6. If the upstream **added** a new sibling file the owned copy doesn't have, copy it. If the upstream **removed** one, delete ours.\n\n### 3. Dup-name check\n\nAfter syncing, scan every `skills\u002F*\u002FSKILL.md` in this repo:\n\n- Extract the `name` field from each frontmatter.\n- Report any name that appears more than once. opencode requires the directory name to match the `name` field and last-write-wins resolves duplicates by source order, so two skills with the same `name` silently shadow each other.\n- Also report any skill directory whose name doesn't match its frontmatter `name` (opencode validation: `^[a-z0-9]+(-[a-z0-9]+)*$`, must match the directory).\n\n### 4. Dangling cross-reference check\n\nSeveral transplanted skills reference other skills by name in their body (e.g. `grill-with-docs` calls `\u002Fdomain-modeling`, `grill-me` calls `\u002Fgrilling`). For each `\u002Fskill-name` reference in any owned skill body:\n\n- If `skill-name` is **not** in mapping.json and **not** present as a directory under `skills\u002F`, report it as a dangling reference. The skill would tell the agent to load a skill that doesn't exist in this repo.\n\n### 5. Report\n\nSummarize: which skills changed, which sibling files changed, any dup-name or dangling-reference issues found. Then ask the user to review and commit.\n\n## What this skill does NOT do\n\n- It does **not** add a live `~\u002F.opencode\u002Fskills` source or a `skills` array pointing at matt's repo. The single-source rule stands: this repo is the only global source, matt's repo is pull-only.\n- It does **not** transplanted-skills sync rename or namespace skills. If you want to rename a transplanted skill, edit the directory + frontmatter `name` together and remove the entry from mapping.json (or point it at a new upstream) manually.\n- It does **not** add new transplanted skills. To add one, create the directory, copy `SKILL.md` + siblings, write opencode-native frontmatter, and add an entry to mapping.json by hand.\n\n## Done when\n\n- [ ] The upstream was pulled and its state reported — or \"already up to date\"\n      ended the run.\n- [ ] Every entry in `mapping.json` was compared body-only and merged with the\n      owned frontmatter preserved.\n- [ ] Added, changed and removed sibling files were copied or deleted.\n- [ ] The dup-name check scanned every `skills\u002F*\u002FSKILL.md` and reported duplicate\n      `name` values and directory\u002Fname mismatches.\n- [ ] The `\u002Fskill-name` dangling-reference check ran.\n- [ ] The summary names the changed skills, the changed siblings, and any\n      dup-name or dangling-reference issues, and the user was asked to review and\n      commit.\n- [ ] `tests\u002Ftest_skill_frontmatter.py` passes.\n\n## Frontmatter translation table\n\nWhen syncing, translate upstream frontmatter to opencode-native:\n\n| Upstream field | Owned field |\n|---|---|\n| `name` | `name` (verbatim) |\n| `description` | `description` (verbatim; keep up to date, this steers model invocation) |\n| `disable-model-invocation: true` | `metadata.opencode\u002Fautoinvoke: false` (user-invoked) |\n| (no `disable-model-invocation`) | omit `metadata.opencode\u002Fautoinvoke` (model-invoked) |\n| `argument-hint` | drop (opencode ignores it) |\n| `policy.*` in `agents\u002Fopenai.yaml` | drop (opencode-specific; not transplanted) |\n| (none) | `license: MIT` (attribution) |\n\nOpenCode 2 reads `name` and `description` (display + selection) and `metadata.opencode\u002Fautoinvoke` (set `false` to keep a skill out of the model's list while it stays loadable by ID). `license`\u002F`compatibility` are accepted but not interpreted; **`slash: true` is ignored** — it was never an opencode field, so do not re-introduce it. Guard: `tests\u002Ftest_skill_frontmatter.py`.\n","# Sync Upstream Skills\n\nThis repo owns a small set of skills transplanted from mattpocock's `skills` repo. They live here with opencode-native frontmatter (the upstream's `disable-model-invocation: true` becomes `metadata.opencode\u002Fautoinvoke: false` or is dropped; `argument-hint` and other Claude-specific fields are dropped). This skill re-applies upstream changes on demand without re-introducing a live second source.\n\n## The mapping\n\nRead [mapping.json](.\u002Fmapping.json) in this directory. Each entry maps an owned skill name (the directory name under `skills\u002F`) to its upstream path relative to `~\u002Frepos\u002Fmattpocock\u002Fskills\u002Fskills\u002F`.\n\n## Procedure\n\n### 1. Update the upstream\n\n```\ngit -C ~\u002Frepos\u002Fmattpocock\u002Fskills pull\n```\n\nIf already up to date, report that and stop.\n\n### 2. For each mapped skill\n\nFor each `name -> upstream-path` entry in mapping.json:\n\n1. Read the upstream `SKILL.md` at `~\u002Frepos\u002Fmattpocock\u002Fskills\u002Fskills\u002F\u003Cupstream-path>\u002FSKILL.md`.\n2. Read the owned `SKILL.md` at `skills\u002F\u003Cname>\u002FSKILL.md`.\n3. Compare the **body** (everything after the frontmatter delimiter). opencode ignores Claude-specific frontmatter fields (`disable-model-invocation`, `argument-hint`, `policy.*` in `agents\u002Fopenai.yaml`), so ignore those when diffing; only the prose body is what changes upstream.\n4. If the body changed:\n   - Take the upstream body verbatim.\n   - Re-attach the owned frontmatter (preserve `name`, `description`, `metadata.opencode\u002Fautoinvoke`, `license`). If the upstream `description` changed, update ours to match verbatim (the description is what steers the model's invocation in opencode, so it must stay in sync).\n   - Write the merged file back to `skills\u002F\u003Cname>\u002FSKILL.md`.\n5. Copy any **sibling files** the upstream changed (e.g. `*-FORMAT.md`, `GLOSSARY.md`). These are resource files referenced by the skill body. Copy verbatim; they carry no opencode frontmatter.\n6. If the upstream **added** a new sibling file the owned copy doesn't have, copy it. If the upstream **removed** one, delete ours.\n\n### 3. Dup-name check\n\nAfter syncing, scan every `skills\u002F*\u002FSKILL.md` in this repo:\n\n- Extract the `name` field from each frontmatter.\n- Report any name that appears more than once. opencode requires the directory name to match the `name` field and last-write-wins resolves duplicates by source order, so two skills with the same `name` silently shadow each other.\n- Also report any skill directory whose name doesn't match its frontmatter `name` (opencode validation: `^[a-z0-9]+(-[a-z0-9]+)*$`, must match the directory).\n\n### 4. Dangling cross-reference check\n\nSeveral transplanted skills reference other skills by name in their body (e.g. `grill-with-docs` calls `\u002Fdomain-modeling`, `grill-me` calls `\u002Fgrilling`). For each `\u002Fskill-name` reference in any owned skill body:\n\n- If `skill-name` is **not** in mapping.json and **not** present as a directory under `skills\u002F`, report it as a dangling reference. The skill would tell the agent to load a skill that doesn't exist in this repo.\n\n### 5. Report\n\nSummarize: which skills changed, which sibling files changed, any dup-name or dangling-reference issues found. Then ask the user to review and commit.\n\n## What this skill does NOT do\n\n- It does **not** add a live `~\u002F.opencode\u002Fskills` source or a `skills` array pointing at matt's repo. The single-source rule stands: this repo is the only global source, matt's repo is pull-only.\n- It does **not** transplanted-skills sync rename or namespace skills. If you want to rename a transplanted skill, edit the directory + frontmatter `name` together and remove the entry from mapping.json (or point it at a new upstream) manually.\n- It does **not** add new transplanted skills. To add one, create the directory, copy `SKILL.md` + siblings, write opencode-native frontmatter, and add an entry to mapping.json by hand.\n\n## Done when\n\n- [ ] The upstream was pulled and its state reported — or \"already up to date\"\n      ended the run.\n- [ ] Every entry in `mapping.json` was compared body-only and merged with the\n      owned frontmatter preserved.\n- [ ] Added, changed and removed sibling files were copied or deleted.\n- [ ] The dup-name check scanned every `skills\u002F*\u002FSKILL.md` and reported duplicate\n      `name` values and directory\u002Fname mismatches.\n- [ ] The `\u002Fskill-name` dangling-reference check ran.\n- [ ] The summary names the changed skills, the changed siblings, and any\n      dup-name or dangling-reference issues, and the user was asked to review and\n      commit.\n- [ ] `tests\u002Ftest_skill_frontmatter.py` passes.\n\n## Frontmatter translation table\n\nWhen syncing, translate upstream frontmatter to opencode-native:\n\n| Upstream field | Owned field |\n|---|---|\n| `name` | `name` (verbatim) |\n| `description` | `description` (verbatim; keep up to date, this steers model invocation) |\n| `disable-model-invocation: true` | `metadata.opencode\u002Fautoinvoke: false` (user-invoked) |\n| (no `disable-model-invocation`) | omit `metadata.opencode\u002Fautoinvoke` (model-invoked) |\n| `argument-hint` | drop (opencode ignores it) |\n| `policy.*` in `agents\u002Fopenai.yaml` | drop (opencode-specific; not transplanted) |\n| (none) | `license: MIT` (attribution) |\n\nOpenCode 2 reads `name` and `description` (display + selection) and `metadata.opencode\u002Fautoinvoke` (set `false` to keep a skill out of the model's list while it stays loadable by ID). `license`\u002F`compatibility` are accepted but not interpreted; **`slash: true` is ignored** — it was never an opencode field, so do not re-introduce it. Guard: `tests\u002Ftest_skill_frontmatter.py`.\n",{"name":5,"license":15,"description":7},"main","adef05bd2193559aced970b8591fc8182a916301","skills\u002Fsync-upstream-skills",0,"https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf\u002Fopencode-helpers","https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf","https:\u002F\u002Fwww.spengergasse.at\u002F","2026-11-11 16:51:38",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add georgernstgraf\u002Fopencode-helpers --skill sync-upstream-skills",{"tool":60,"command":61},"bunx","bunx skills add georgernstgraf\u002Fopencode-helpers --skill sync-upstream-skills",{"tool":63,"command":64},"pnpm","pnpm dlx skills add georgernstgraf\u002Fopencode-helpers --skill sync-upstream-skills","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf\u002Fopencode-helpers\u002Fblob\u002Fmain\u002Fskills\u002Fsync-upstream-skills\u002FSKILL.md",true,[68],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"mapping.json","REFERENCE","参考文档",262,"https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf\u002Fopencode-helpers\u002Fblob\u002Fmain\u002Fskills\u002Fsync-upstream-skills\u002Fmapping.json",[75,92,109,124,136,160],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":86,"publishedAt":41},"01M6CVKZ762FN4SW18V26P65TD","teach","Teach the user a new skill or concept, within this workspace.","https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf\u002Fopencode-helpers\u002Fblob\u002Fmain\u002Fskills\u002Fteach\u002FSKILL.md",[81],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[77,87,88,31,89,90,91],"workspace","new skill","concept","new","false",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":41},"01M6CVKNEPEY1WA7E5FWQ85NJW","repograde","Grade student repositories with optional date filtering in single-repo or bulk mode. Use when the user says \"repograde\", \"grade the repos\", \"grade this repo since \u003Cdate>\", \"bewerte die Abgaben\", \"korrigiere die Repos\", or asks for a repo grading run over a class folder or a single student repository. Do not use for project grading with issues and PRs (use projectgrade) or for knowledge-check exams (use knowledge-assessment).","https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf\u002Fopencode-helpers\u002Fblob\u002Fmain\u002Fskills\u002Frepograde\u002FSKILL.md",[],[94,37,99,100,101,102,103,104,105,106,107,108],"repo","execution","filtering","education","bulk","mode","student","single","repositories","with",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":41},"01M6CVKF9MVFPHBH3W2D5ETEB6","projectgrade","Grade student project repositories based on Git commits, GitHub Issues, and Pull Requests. Use when the user says \"projectgrade\", \"grade the project\", \"bewerte das Projekt\", \"Projektarbeit benoten\", or asks for a holistic grading of a collaborative repository from inside it, based on commits, issues, reviews and PRs. Do not use for per-lesson assignments (use repograde) or for knowledge-check exams (use knowledge-assessment).","https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf\u002Fopencode-helpers\u002Fblob\u002Fmain\u002Fskills\u002Fprojectgrade\u002FSKILL.md",[],[111,116,37,117,34,118,102,119,105,120,107,121,100,40,122,123],"pull requests","github","github issues","project","git commits","requests","commits","issues",{"skillNo":125,"name":126,"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":130,"publishedAt":41},"01M6CVKA8J284DZTBE7QRN45SG","lehrplan","Richtet österreichische HTL-Unterrichts-Repositorien ein und pflegt sie — drei Kernaufgaben: das gesetzliche Lehrplan-Material eines Ausbildungszweigs (z. B. WII, WIT, KIF) aus dem RIS beschaffen inklusive jährlichem Novellen-Check, den Lehrplan eines konkreten Gegenstands aus dem Gesetz extrahieren (mit Erläuterung pro Lernziel: was der Inhalt tatsächlich IST, plus praktische Anwendungen), und Semesterpläne interaktiv entwerfen. Use when der Nutzer 'Lehrplan', 'Unterrichtsvorbereitung prüfen', 'Lehrplan auf Novellen prüfen', 'RIS sync', 'Gesetzesmaterial holen', 'Lehrplan extrahieren', 'Jahrespläne neu ziehen', 'Erläuterungen ergänzen', 'Semesterplan erstellen\u002Füberarbeiten' oder 'Einheiten erstellen' sagt, oder wenn in einem Repo gearbeitet wird, das der lehrplan\u002F-Konvention folgt. Do not use for Prepared Lessons (create-lesson), Aufgaben im Kohortenordner (homework) oder Wissensüberprüfungen (knowledge-exam).","https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf\u002Fopencode-helpers\u002Fblob\u002Fmain\u002Fskills\u002Flehrplan\u002FSKILL.md",[],[126,37,99,102,131,21,132,133,134,135],"check","curriculum","pro","material","drei",{"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":41},"01M6CVK6QMR16MSMS2MRG097GV","knowledge-persistence","Persist session context into the structured docs\u002Fai knowledge files (OKF bundle; committed and pushed at the end). Use when the user says \"remember\", \"merk dir das\", \"save context\", \"persist knowledge\" or \"update knowledge file\", at a session checkpoint, or when an observation in this session contradicts docs\u002Fai\u002F or AGENTS.md. Do not use for reading the knowledge files at session start — that is plain bootstrapping.","https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf\u002Fopencode-helpers\u002Fblob\u002Fmain\u002Fskills\u002Fknowledge-persistence\u002FSKILL.md",[142],{"categoryNo":143,"categoryName":144,"taxonomyType":145,"taxonomyTypeDesc":146},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[148,149,150,151,152,153,154,155,156,37,157,158,159],"persistence","knowledge persistence","knowledge","structured","session","session context","files","workflow","documentation","docs","context","persist",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":167,"publishedAt":41},"01M6CVK3ED9F94R65AD5PG0RRH","knowledge-exam","Generate German knowledge-check exams and solution files from the taught material (class Git history + WebUntis Lehrstoff). Use when the user says \"Wissensüberprüfung erstellen\", \"Knowledge-Check generieren\", \"Prüfung schreiben\", \"create the knowledge check\", \"generate a mini-exam\" or \"make the exam for class X\", or asks for exam questions plus solutions from what was actually taught. Do not use for grading submissions (knowledge-assessment) or for assignments in the class folder (homework).","https:\u002F\u002Fgithub.com\u002Fgeorgernstgraf\u002Fopencode-helpers\u002Fblob\u002Fmain\u002Fskills\u002Fknowledge-exam\u002FSKILL.md",[166],{"categoryNo":143,"categoryName":144,"taxonomyType":145,"taxonomyTypeDesc":146},[150,168,169,170,102,134,154,34,171,131,37,172],"exam","knowledge exam","german","generate","history"]