[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71F0B9CBJ5X6ZHST9QF63EX":3,"skill-same:01M71F0B9CBJ5X6ZHST9QF63EX":88},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":6,"ownerHtmlUrl":62,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":63,"install":64,"resources":77},"01M71F0B9CBJ5X6ZHST9QF63EX","qodana-pr-review",null,"PR-mode code review with Qodana before opening a pull request in this repo. Runs `qodana scan` with the Go linter (qodana-go, native mode) over the current worktree, reporting only problems NEW relative to `development` via a baseline SARIF, then drives a fix \u002F baseline \u002F continue decision with the user before opening the PR toward development. Trigger: before opening a PR, \"qodana review\", \"review con qodana\", pre-PR quality check.","parada1104\u002Fai-specs-cli","parada1104","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F57575053?v=4","01M71EZZV71KAFZKJ47FQ99ZVS","01M71EZZW7JJBY2VAWA5HRD944",0,"MIT","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Fai-specs\u002Fskills\u002Fqodana-pr-review\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"review","qodana pr review","pr","pr review","fix","code review","for","mode","trigger","feature","quality check","scan","only","linter","repo","branch","decision","continue","pull","development","2026-11-10 10:12:30",false,"---\nname: qodana-pr-review\ndescription: >\n  PR-mode code review with Qodana before opening a pull request in this repo.\n  Runs `qodana scan` with the Go linter (qodana-go, native mode) over the\n  current worktree, reporting only problems NEW relative to `development` via\n  a baseline SARIF, then drives a fix \u002F baseline \u002F continue decision with the\n  user before opening the PR toward development. Trigger: before opening a PR,\n  \"qodana review\", \"review con qodana\", pre-PR quality check.\nlicense: MIT\nmetadata:\n  author: ai-specs\n  version: \"1.0\"\n  scope: [root]\n  auto_invoke:\n    - \"Before opening a PR from a feature branch or worktree\"\n    - \"User asks for a Qodana review or pre-PR quality check\"\n---\n\n# Qodana PR Review\n\nStatic-review gate before opening a PR toward `development`. Runs Qodana in\nPR mode: only problems introduced by this branch are reported.\n\n## Critical rules\n\n1. **PR base is always `development`.** Never open a PR toward `main`.\n2. **Project token required.** The Go linter (`qodana-go`) is a licensed\n   linter: it needs `QODANA_TOKEN` = the **project token** of a qodana.cloud\n   project (JWT with `\"token_type\":\"project\"`). A *personal API token* is\n   declined (\"token was declined by Qodana Cloud server\"). The Free plan\n   grants the license (\"Licensed to Free Customer\").\n   - There is **no Community Go edition**: `qodana-go-community` is rejected\n     as a `--linter` value by CLI 2026.2.2 and `jetbrains\u002Fqodana-go-community`\n     does not exist on Docker Hub. Do not \"fix\" the script back to it.\n   - Token lookup order: `QODANA_TOKEN` env → `ai-specs.env` of this worktree\n     → `ai-specs.env` of the main checkout (worktrees under `.worktrees\u002F`\n     inherit its direnv `.envrc`) → `~\u002F.qodana\u002Ftoken` → `.qodana\u002Ftoken`.\n     All are git-ignored. Never commit or echo the token.\n3. **Native mode by default** (`--within-docker=false`, no Docker). Set\n   `QODANA_DOCKER=1` to run in Docker instead. `--image` always forces Docker.\n4. **Ask before acting on findings.** After the report, ask the user with the\n   ask-user tool. Never silently fix, baseline, or ignore new issues.\n5. Everything under `.qodana\u002F` is git-ignored, including the baseline\n   (~1.5 MB). It is regenerated per worktree from the merge-base with\n   `development` (~1 min), so accepted issues live as long as the branch;\n   once merged they are part of `development` and of every later baseline.\n\n## Files\n\n| File | Role |\n|------|------|\n| `scripts\u002Fqodana-pr-review.sh` | Resolves CLI + token, ensures baseline, runs PR-mode scan, prints report |\n| `scripts\u002Fsarif_new_issues.py` | Reports `baselineState == \"new\"` results; `--accept` moves selected ones to the baseline |\n| `tests\u002Ftest_qodana_pr_review_report.py` | Contract tests for the reporter (repo `tests\u002F`) |\n\n## Flow\n\n1. **Preflight** — verify, do not assume (the CLI may still be installing):\n   ```bash\n   qodana --version && qodana scan --help\n   ```\n   The script also tries `\u002Fopt\u002Fhomebrew\u002Fbin\u002Fqodana` and `~\u002Fhomebrew\u002Fbin\u002Fqodana`,\n   and waits\u002Fretries up to `QODANA_MAX_WAIT_SECS` (default 900s) while\n   `brew install jetbrains\u002Futils\u002Fqodana` finishes. If flags differ from the\n   ones the script uses (`-l`, `--within-docker`, `-i`, `-o`, `-b`,\n   `--save-report`), stop and adapt the script before running.\n\n2. **Run the PR-mode scan** from the worktree root (~1 min per scan once the\n   linter is cached; the first run downloads it):\n   ```bash\n   .\u002Fai-specs\u002Fskills\u002Fqodana-pr-review\u002Fscripts\u002Fqodana-pr-review.sh [base-branch]\n   ```\n   - If `.qodana\u002Fbaseline.sarif.json` is missing, it scans the merge-base of\n     `development` and `HEAD` in a temporary local clone and saves that SARIF\n     as the baseline.\n   - Scans the worktree with `-b .qodana\u002Fbaseline.sarif.json` and prints the\n     new issues, numbered `#N`, grouped by Qodana severity\n     (Critical\u002FHigh\u002FModerate\u002FLow\u002FInfo) with `file:line`, rule and message.\n\n3. **Present and ask.** Show the counts per severity and the numbered list,\n   then ask with `ask_user_question` (multiSelect) which issues go where:\n   - **Fix now** → fix the selected issues, then re-run step 2 to confirm.\n   - **Send to baseline** → accept the selected issue numbers:\n     ```bash\n     python3 ai-specs\u002Fskills\u002Fqodana-pr-review\u002Fscripts\u002Fsarif_new_issues.py \\\n       --accept 2,3 .qodana\u002Fresults\u002Fqodana.sarif.json .qodana\u002Fbaseline.sarif.json\n     ```\n     Re-run step 2; accepted issues now count as `UNCHANGED`. Mention them\n     in the PR description (the baseline itself is not committed).\n   - **Continue as-is** → proceed with the remaining new issues unresolved;\n     mention them in the PR description.\n\n4. **Open the PR toward `development`** (only after the decision; pushing and\n   opening the PR need the user's explicit go-ahead per repo policy):\n   ```bash\n   git push -u origin \"$(git branch --show-current)\"\n   gh pr create --base development --head \"$(git branch --show-current)\" ...\n   ```\n   Check `--base development` is present before running. Include the Qodana\n   summary (new \u002F fixed \u002F baselined) in the PR body.\n\n## Example\n\n```\nUser: revisa con qodana antes de abrir el PR\n\nAgent: .\u002Fai-specs\u002Fskills\u002Fqodana-pr-review\u002Fscripts\u002Fqodana-pr-review.sh\n  === Qodana PR review: 2 new issue(s) vs baseline ===\n    High: 2\n    #1 [High] GoUnhandledErrorResult  catalog\u002Frecipes\u002Fworktree-flow\u002Fgate\u002Fqodana_probe.go:5\n            Unhandled error\n    #2 [High] GoUnusedFunction  catalog\u002Frecipes\u002Fworktree-flow\u002Fgate\u002Fqodana_probe.go:5\n            Unused function 'qodanaProbe'\n\nAgent → ask_user_question: \"¿Qué hacemos con cada issue nuevo?\"\n  [Arreglar ahora] [Mandar al baseline] [Continuar igual]\nUser: arreglar #1, baseline #2\n\nAgent: fixes #1 (handles the error), then\n  python3 ...\u002Fsarif_new_issues.py --accept 2 .qodana\u002Fresults\u002Fqodana.sarif.json .qodana\u002Fbaseline.sarif.json\n  re-runs the scan → \"0 new issue(s)\", commits the fix,\n  then (after user OK) gh pr create --base development --head \u003Cbranch>\n```\n","# Qodana PR Review\n\nStatic-review gate before opening a PR toward `development`. Runs Qodana in\nPR mode: only problems introduced by this branch are reported.\n\n## Critical rules\n\n1. **PR base is always `development`.** Never open a PR toward `main`.\n2. **Project token required.** The Go linter (`qodana-go`) is a licensed\n   linter: it needs `QODANA_TOKEN` = the **project token** of a qodana.cloud\n   project (JWT with `\"token_type\":\"project\"`). A *personal API token* is\n   declined (\"token was declined by Qodana Cloud server\"). The Free plan\n   grants the license (\"Licensed to Free Customer\").\n   - There is **no Community Go edition**: `qodana-go-community` is rejected\n     as a `--linter` value by CLI 2026.2.2 and `jetbrains\u002Fqodana-go-community`\n     does not exist on Docker Hub. Do not \"fix\" the script back to it.\n   - Token lookup order: `QODANA_TOKEN` env → `ai-specs.env` of this worktree\n     → `ai-specs.env` of the main checkout (worktrees under `.worktrees\u002F`\n     inherit its direnv `.envrc`) → `~\u002F.qodana\u002Ftoken` → `.qodana\u002Ftoken`.\n     All are git-ignored. Never commit or echo the token.\n3. **Native mode by default** (`--within-docker=false`, no Docker). Set\n   `QODANA_DOCKER=1` to run in Docker instead. `--image` always forces Docker.\n4. **Ask before acting on findings.** After the report, ask the user with the\n   ask-user tool. Never silently fix, baseline, or ignore new issues.\n5. Everything under `.qodana\u002F` is git-ignored, including the baseline\n   (~1.5 MB). It is regenerated per worktree from the merge-base with\n   `development` (~1 min), so accepted issues live as long as the branch;\n   once merged they are part of `development` and of every later baseline.\n\n## Files\n\n| File | Role |\n|------|------|\n| `scripts\u002Fqodana-pr-review.sh` | Resolves CLI + token, ensures baseline, runs PR-mode scan, prints report |\n| `scripts\u002Fsarif_new_issues.py` | Reports `baselineState == \"new\"` results; `--accept` moves selected ones to the baseline |\n| `tests\u002Ftest_qodana_pr_review_report.py` | Contract tests for the reporter (repo `tests\u002F`) |\n\n## Flow\n\n1. **Preflight** — verify, do not assume (the CLI may still be installing):\n   ```bash\n   qodana --version && qodana scan --help\n   ```\n   The script also tries `\u002Fopt\u002Fhomebrew\u002Fbin\u002Fqodana` and `~\u002Fhomebrew\u002Fbin\u002Fqodana`,\n   and waits\u002Fretries up to `QODANA_MAX_WAIT_SECS` (default 900s) while\n   `brew install jetbrains\u002Futils\u002Fqodana` finishes. If flags differ from the\n   ones the script uses (`-l`, `--within-docker`, `-i`, `-o`, `-b`,\n   `--save-report`), stop and adapt the script before running.\n\n2. **Run the PR-mode scan** from the worktree root (~1 min per scan once the\n   linter is cached; the first run downloads it):\n   ```bash\n   .\u002Fai-specs\u002Fskills\u002Fqodana-pr-review\u002Fscripts\u002Fqodana-pr-review.sh [base-branch]\n   ```\n   - If `.qodana\u002Fbaseline.sarif.json` is missing, it scans the merge-base of\n     `development` and `HEAD` in a temporary local clone and saves that SARIF\n     as the baseline.\n   - Scans the worktree with `-b .qodana\u002Fbaseline.sarif.json` and prints the\n     new issues, numbered `#N`, grouped by Qodana severity\n     (Critical\u002FHigh\u002FModerate\u002FLow\u002FInfo) with `file:line`, rule and message.\n\n3. **Present and ask.** Show the counts per severity and the numbered list,\n   then ask with `ask_user_question` (multiSelect) which issues go where:\n   - **Fix now** → fix the selected issues, then re-run step 2 to confirm.\n   - **Send to baseline** → accept the selected issue numbers:\n     ```bash\n     python3 ai-specs\u002Fskills\u002Fqodana-pr-review\u002Fscripts\u002Fsarif_new_issues.py \\\n       --accept 2,3 .qodana\u002Fresults\u002Fqodana.sarif.json .qodana\u002Fbaseline.sarif.json\n     ```\n     Re-run step 2; accepted issues now count as `UNCHANGED`. Mention them\n     in the PR description (the baseline itself is not committed).\n   - **Continue as-is** → proceed with the remaining new issues unresolved;\n     mention them in the PR description.\n\n4. **Open the PR toward `development`** (only after the decision; pushing and\n   opening the PR need the user's explicit go-ahead per repo policy):\n   ```bash\n   git push -u origin \"$(git branch --show-current)\"\n   gh pr create --base development --head \"$(git branch --show-current)\" ...\n   ```\n   Check `--base development` is present before running. Include the Qodana\n   summary (new \u002F fixed \u002F baselined) in the PR body.\n\n## Example\n\n```\nUser: revisa con qodana antes de abrir el PR\n\nAgent: .\u002Fai-specs\u002Fskills\u002Fqodana-pr-review\u002Fscripts\u002Fqodana-pr-review.sh\n  === Qodana PR review: 2 new issue(s) vs baseline ===\n    High: 2\n    #1 [High] GoUnhandledErrorResult  catalog\u002Frecipes\u002Fworktree-flow\u002Fgate\u002Fqodana_probe.go:5\n            Unhandled error\n    #2 [High] GoUnusedFunction  catalog\u002Frecipes\u002Fworktree-flow\u002Fgate\u002Fqodana_probe.go:5\n            Unused function 'qodanaProbe'\n\nAgent → ask_user_question: \"¿Qué hacemos con cada issue nuevo?\"\n  [Arreglar ahora] [Mandar al baseline] [Continuar igual]\nUser: arreglar #1, baseline #2\n\nAgent: fixes #1 (handles the error), then\n  python3 ...\u002Fsarif_new_issues.py --accept 2 .qodana\u002Fresults\u002Fqodana.sarif.json .qodana\u002Fbaseline.sarif.json\n  re-runs the scan → \"0 new issue(s)\", commits the fix,\n  then (after user OK) gh pr create --base development --head \u003Cbranch>\n```\n",{"name":5,"license":14,"metadata":48,"description":56},{"scope":49,"author":51,"version":52,"auto_invoke":53},[50],"root","ai-specs","1.0",[54,55],"Before opening a PR from a feature branch or worktree","User asks for a Qodana review or pre-PR quality check","PR-mode code review with Qodana before opening a pull request in this repo. Runs `qodana scan` with the Go linter (qodana-go, native mode) over the current worktree, reporting only problems NEW relative to `development` via a baseline SARIF, then drives a fix \u002F baseline \u002F continue decision with the user before opening the PR toward development. Trigger: before opening a PR, \"qodana review\", \"review con qodana\", pre-PR quality check.\n","main","c092fc1f51280350a4434827e2f6d6d99e3431ca","ai-specs\u002Fskills\u002Fqodana-pr-review",2,"https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli","https:\u002F\u002Fgithub.com\u002Fparada1104","2026-11-13 04:28:21",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add parada1104\u002Fai-specs-cli --skill qodana-pr-review",{"tool":70,"command":71},"bunx","bunx skills add parada1104\u002Fai-specs-cli --skill qodana-pr-review",{"tool":73,"command":74},"pnpm","pnpm dlx skills add parada1104\u002Fai-specs-cli --skill qodana-pr-review","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Fai-specs\u002Fskills\u002Fqodana-pr-review\u002FSKILL.md",true,[78,84],{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"scripts\u002Fqodana-pr-review.sh","SCRIPT","脚本",5410,"https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Fai-specs\u002Fskills\u002Fqodana-pr-review\u002Fscripts\u002Fqodana-pr-review.sh",{"path":85,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":86,"sourceHtmlUrl":87},"scripts\u002Fsarif_new_issues.py",3630,"https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Fai-specs\u002Fskills\u002Fqodana-pr-review\u002Fscripts\u002Fsarif_new_issues.py",[89,107,121,130,139,152],{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":101,"publishedAt":43},"01M71F2TF9TS9DNCJ68M7C3B5S","test-skill","Test skill for fixture purposes.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Frecipes\u002Ftest-fixture\u002Fskills\u002Ftest-skill\u002FSKILL.md",[95,98],{"categoryNo":96,"categoryName":97,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":99,"categoryName":100,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[102,103,29,50,104,105,106],"Test Skill","test","fixtures","fixture","testing",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":116,"publishedAt":43},"01M71F2RTH94ZB7XEAW4P6ZG0D","obsidian-markdown","Fixture skill for obsidian-markdown.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fkepano-obsidian-skills\u002Fskills\u002Fobsidian-markdown\u002FSKILL.md",[113],{"categoryNo":114,"categoryName":115,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000002","文档处理",[117,118,119,29,105,120],"markdown","obsidian markdown","obsidian","fixture skill",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":43},"01M71F2R20CPTJXD9F7DP4JPP6","obsidian-cli","Fixture skill for obsidian-cli.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fkepano-obsidian-skills\u002Fskills\u002Fobsidian-cli\u002FSKILL.md",[],[128,119,129,29,105,120],"obsidian cli","cli",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":43},"01M71F2PCH4NWVTT1J57SHJX33","obsidian-bases","Fixture skill for obsidian-bases.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fkepano-obsidian-skills\u002Fskills\u002Fobsidian-bases\u002FSKILL.md",[],[137,138,119,29,105,120],"bases","obsidian bases",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":148,"publishedAt":43},"01M71F2MSS6EVFEYVYAA1KBYCC","json-canvas","Fixture skill for json-canvas.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fkepano-obsidian-skills\u002Fskills\u002Fjson-canvas\u002FSKILL.md",[145],{"categoryNo":146,"categoryName":147,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",[149,150,151,120,105,29],"json","json canvas","canvas",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":43},"01M71F2KY5QVNEN1Q3REFB0MQZ","defuddle","Fixture skill for defuddle.","https:\u002F\u002Fgithub.com\u002Fparada1104\u002Fai-specs-cli\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fkepano-obsidian-skills\u002Fskills\u002Fdefuddle\u002FSKILL.md",[],[154,120,105,29]]