[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6NKAYBCPBBM37KB56HZDMA4":3,"skill-same:01M6NKAYBCPBBM37KB56HZDMA4":50},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":22,"linkOnly":23,"markdownContent":24,"markdownBody":25,"frontMatter":26,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":6,"ownerHtmlUrl":32,"ownerBlogUrl":33,"ownerDescription":34,"updatedAt":35,"install":36,"resources":49},"01M6NKAYBCPBBM37KB56HZDMA4","pre-pr-checklist",null,"joelbarmettlerUZH\u002Fultrainit.sh","joelbarmettlerUZH","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F24369532?v=4","01M6NK9DS0035TVQP3EQ36E14N","Joel Barmettler","01M6NK9DXBM5D1GYV4414HX06T",8,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpre-pr-checklist\u002FSKILL.md",[],[18,19,20,21],"pr","checklist","pre pr","pre pr checklist","2026-11-10 10:12:30",false,"---\nname: pre-pr-checklist\ndescription: \"\n  Quality gates to run before opening a pull request for ultrainit. Use\n  before open a PR, create a pull request, push this branch, mark as ready\n  for review, or merge this. Covers syntax checks, test suite, fixture\n  consistency, and commit message format. Do NOT use for release tagging\n  — use release-ultrainit for that.\n---\n\n## Before You Start\n\n- `CLAUDE.md` — project conventions (commit format, naming, cross-platform constraints)\n- `.github\u002Fworkflows\u002Ftest.yml` — exactly what CI runs (syntax job + test job)\n- `lib\u002Fvalidate.sh` — quality gates applied to generated artifacts\n- `tests\u002Ffixtures\u002Ffindings\u002F` — fixture files that must stay in sync with schemas\n\n## Checklist\n\n### 1. Shell syntax check\n\n```bash\nmake check\n```\n\nThis runs `bash -n` on all `.sh` files (excluding `test-repos\u002F`) and `jq empty` on all `schemas\u002F*.json`. This is the same syntax job CI runs first. A failure here blocks the test job from running.\n\n### 2. Full test suite\n\n```bash\nmake test-all\n```\n\nRequires Docker. Runs unit, scripts, edge, and integration tests. If Docker is not available locally, the minimum is `make test-unit && make test-scripts && make test-edge`.\n\n**Important**: Integration tests run with `|| true` in CI and show green even when failing. After `make test-integration`, inspect the output explicitly — don't trust the exit code alone.\n\n### 3. Fixture consistency check\n\n```bash\n# Spot-check: do all 8 fixture files have valid JSON?\nfor f in tests\u002Ffixtures\u002Ffindings\u002F*.json; do\n    jq empty \"$f\" && echo \"OK: $f\" || echo \"FAIL: $f\"\ndone\n\n# Verify the merged synthesis fixture is up to date\njq -s '.[0] * .[1]' \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-docs.json \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-tooling.json \\\n    > \u002Ftmp\u002Fexpected-output.json\ndiff tests\u002Ffixtures\u002Fsynthesis\u002Foutput.json \u002Ftmp\u002Fexpected-output.json && echo \"output.json in sync\" || echo \"DIVERGED — re-merge\"\n```\n\nIf `output.json` diverged, re-merge it:\n```bash\njq -s '.[0] * .[1]' \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-docs.json \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-tooling.json \\\n    > tests\u002Ffixtures\u002Fsynthesis\u002Foutput.json\n```\n\n### 4. Commit message format\n\nAll commits must follow Conventional Commits:\n- `feat:` — new feature\n- `fix:` — bug fix\n- `test:` — test additions\u002Fchanges\n- `docs:` — documentation only\n- `refactor:` — code change without feature\u002Ffix\n- `chore:` — maintenance (CI, deps, Makefile)\n\n```bash\ngit log --oneline -10  # check recent messages follow the pattern\n```\n\n### 5. No untested code\n\nThe project rule from `CLAUDE.md` (developer answers): \"Write untested code\" is in the never-do list. For any new function in `lib\u002F`, there must be a corresponding test in `tests\u002Funit\u002F`. For changes to `scripts\u002Fvalidate-skill.sh` or `scripts\u002Fvalidate-subagent.sh`, there must be updated tests in `tests\u002Fscripts\u002F`.\n\n### 6. Cross-platform safety check\n\nScan your changes for forbidden patterns:\n\n```bash\n# Portable sed check (GNU\u002FBSD incompatible)\ngrep -n 'sed -i' lib\u002F*.sh scripts\u002F*.sh ultrainit.sh\n\n# gawk-only gensub check\ngrep -n 'gensub(' lib\u002F*.sh scripts\u002F*.sh\n\n# bash 4+ only features\ngrep -n 'declare -A\\|mapfile\\|readarray\\|wait -n\\|wait -p' lib\u002F*.sh\n```\n\nAll of these will silently break on macOS (bash 3.2, BSD sed, stock awk).\n\n### 7. No angle brackets in generated skill\u002Fsubagent descriptions\n\nIf you modified `prompts\u002Fsynthesizer-tooling.md` or `lib\u002Fsynthesize.sh`, verify `postprocess_descriptions()` is still stripping angle brackets:\n\n```bash\ngrep -n 'postprocess_descriptions\\|[\u003C>]' lib\u002Fsynthesize.sh | head -20\n```\n\n## Verify\n\n```bash\nmake check && make test-all\n```\n\nBoth must complete without error before opening the PR.\n","## Before You Start\n\n- `CLAUDE.md` — project conventions (commit format, naming, cross-platform constraints)\n- `.github\u002Fworkflows\u002Ftest.yml` — exactly what CI runs (syntax job + test job)\n- `lib\u002Fvalidate.sh` — quality gates applied to generated artifacts\n- `tests\u002Ffixtures\u002Ffindings\u002F` — fixture files that must stay in sync with schemas\n\n## Checklist\n\n### 1. Shell syntax check\n\n```bash\nmake check\n```\n\nThis runs `bash -n` on all `.sh` files (excluding `test-repos\u002F`) and `jq empty` on all `schemas\u002F*.json`. This is the same syntax job CI runs first. A failure here blocks the test job from running.\n\n### 2. Full test suite\n\n```bash\nmake test-all\n```\n\nRequires Docker. Runs unit, scripts, edge, and integration tests. If Docker is not available locally, the minimum is `make test-unit && make test-scripts && make test-edge`.\n\n**Important**: Integration tests run with `|| true` in CI and show green even when failing. After `make test-integration`, inspect the output explicitly — don't trust the exit code alone.\n\n### 3. Fixture consistency check\n\n```bash\n# Spot-check: do all 8 fixture files have valid JSON?\nfor f in tests\u002Ffixtures\u002Ffindings\u002F*.json; do\n    jq empty \"$f\" && echo \"OK: $f\" || echo \"FAIL: $f\"\ndone\n\n# Verify the merged synthesis fixture is up to date\njq -s '.[0] * .[1]' \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-docs.json \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-tooling.json \\\n    > \u002Ftmp\u002Fexpected-output.json\ndiff tests\u002Ffixtures\u002Fsynthesis\u002Foutput.json \u002Ftmp\u002Fexpected-output.json && echo \"output.json in sync\" || echo \"DIVERGED — re-merge\"\n```\n\nIf `output.json` diverged, re-merge it:\n```bash\njq -s '.[0] * .[1]' \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-docs.json \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-tooling.json \\\n    > tests\u002Ffixtures\u002Fsynthesis\u002Foutput.json\n```\n\n### 4. Commit message format\n\nAll commits must follow Conventional Commits:\n- `feat:` — new feature\n- `fix:` — bug fix\n- `test:` — test additions\u002Fchanges\n- `docs:` — documentation only\n- `refactor:` — code change without feature\u002Ffix\n- `chore:` — maintenance (CI, deps, Makefile)\n\n```bash\ngit log --oneline -10  # check recent messages follow the pattern\n```\n\n### 5. No untested code\n\nThe project rule from `CLAUDE.md` (developer answers): \"Write untested code\" is in the never-do list. For any new function in `lib\u002F`, there must be a corresponding test in `tests\u002Funit\u002F`. For changes to `scripts\u002Fvalidate-skill.sh` or `scripts\u002Fvalidate-subagent.sh`, there must be updated tests in `tests\u002Fscripts\u002F`.\n\n### 6. Cross-platform safety check\n\nScan your changes for forbidden patterns:\n\n```bash\n# Portable sed check (GNU\u002FBSD incompatible)\ngrep -n 'sed -i' lib\u002F*.sh scripts\u002F*.sh ultrainit.sh\n\n# gawk-only gensub check\ngrep -n 'gensub(' lib\u002F*.sh scripts\u002F*.sh\n\n# bash 4+ only features\ngrep -n 'declare -A\\|mapfile\\|readarray\\|wait -n\\|wait -p' lib\u002F*.sh\n```\n\nAll of these will silently break on macOS (bash 3.2, BSD sed, stock awk).\n\n### 7. No angle brackets in generated skill\u002Fsubagent descriptions\n\nIf you modified `prompts\u002Fsynthesizer-tooling.md` or `lib\u002Fsynthesize.sh`, verify `postprocess_descriptions()` is still stripping angle brackets:\n\n```bash\ngrep -n 'postprocess_descriptions\\|[\u003C>]' lib\u002Fsynthesize.sh | head -20\n```\n\n## Verify\n\n```bash\nmake check && make test-all\n```\n\nBoth must complete without error before opening the PR.\n",{},"main","197708b955e457c87d304fdf3389621f7e2f202a",".claude\u002Fskills\u002Fpre-pr-checklist",1,"https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH","https:\u002F\u002Fjoelbarmettler.xyz","M. Sc. Artificial Intelligence \r\n& Senior A.I. Architect","2026-11-02 02:33:53",{"source":7,"skillName":5,"commands":37,"prompt":47,"zipAvailable":48},[38,41,44],{"tool":39,"command":40},"npx","npx skills add joelbarmettlerUZH\u002Fultrainit.sh --skill pre-pr-checklist",{"tool":42,"command":43},"bunx","bunx skills add joelbarmettlerUZH\u002Fultrainit.sh --skill pre-pr-checklist",{"tool":45,"command":46},"pnpm","pnpm dlx skills add joelbarmettlerUZH\u002Fultrainit.sh --skill pre-pr-checklist","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpre-pr-checklist\u002FSKILL.md",true,[],[51,85,95,110,120,130],{"skillNo":52,"name":53,"nameZh":6,"description":54,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":55,"categories":56,"keywords":65,"publishedAt":22},"01M6NKEDBGZBAT592SECRS8E4N","valid-skill","Use when building or modifying API endpoints in src\u002Fapi\u002F. Covers route creation, middleware wiring, and request validation. Do NOT use for frontend components or static pages.","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fvalid-skill\u002FSKILL.md",[57,62],{"categoryNo":58,"categoryName":59,"taxonomyType":60,"taxonomyTypeDesc":61},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":63,"categoryName":64,"taxonomyType":60,"taxonomyTypeDesc":61},"01JBSEEDCAT000000000000023","Skill与智能体开发",[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],"valid","valid skill","endpoints","request","do","route","creation","pages","middleware","frontend components","for","wiring","static","use","src","api","validation","components","frontend",{"skillNo":86,"name":87,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":91,"publishedAt":22},"01M6NKEAC2NAMBFHT0S0PRYQKN","invalid-skill-no-desc","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Finvalid-skill-no-desc\u002FSKILL.md",[90],{"categoryNo":63,"categoryName":64,"taxonomyType":60,"taxonomyTypeDesc":61},[92,93,94],"invalid skill no desc","invalid","invalid skill",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":102,"publishedAt":22},"01M6NKE7MF1YCS3WCQA5AY3ZXP","invalid-skill-angle-brackets","Use when working with \u003Ccomponent> templates. Do NOT use for \u003Cother> things.","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Finvalid-skill-angle-brackets\u002FSKILL.md",[101],{"categoryNo":63,"categoryName":64,"taxonomyType":60,"taxonomyTypeDesc":61},[103,104,105,93,94,106,107,76,108,70,79,109],"invalid skill angle brackets","angle brackets","brackets","component","things","with","templates",{"skillNo":111,"name":112,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":22},"01M6NKE4EJ5EWNN7S5FJ1SFZR5","validate-generated-artifact","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.ultrainit\u002Fvalidation\u002Fskills\u002Fvalidate-generated-artifact\u002FSKILL.md",[],[116,117,118,119],"validate generated artifact","artifact","generated","validate",{"skillNo":121,"name":122,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":22},"01M6NKE157C519F1W8WHGXPRTK","tune-synthesis-context","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.ultrainit\u002Fvalidation\u002Fskills\u002Ftune-synthesis-context\u002FSKILL.md",[],[126,127,128,129],"tune synthesis context","tune","Synthesis","context",{"skillNo":131,"name":132,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":22},"01M6NKDT0VD32KKE2HTHT30FWH","run-tests","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.ultrainit\u002Fvalidation\u002Fskills\u002Frun-tests\u002FSKILL.md",[],[136,137,138],"run","run tests","tests"]