@openhands/extensions 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/.agents/skills/custom-codereview-guide.md +25 -0
  2. package/.github/pull_request_template.md +38 -0
  3. package/.github/release.yml +14 -0
  4. package/.github/workflows/check-extensions.yml +72 -0
  5. package/.github/workflows/npm-publish.yml +89 -0
  6. package/.github/workflows/pr.yml +30 -0
  7. package/.github/workflows/release.yml +24 -0
  8. package/.github/workflows/tests.yml +25 -0
  9. package/.github/workflows/vulnerability-scan.yml +87 -0
  10. package/.release-please-manifest.json +3 -0
  11. package/AGENTS.md +132 -0
  12. package/README.md +10 -0
  13. package/analysis_results.md +162 -0
  14. package/marketplaces/large-codebase.json +66 -0
  15. package/marketplaces/openhands-extensions.json +682 -0
  16. package/package.json +4 -10
  17. package/plugins/README.md +30 -0
  18. package/plugins/city-weather/.plugin/plugin.json +13 -0
  19. package/plugins/city-weather/README.md +145 -0
  20. package/plugins/city-weather/commands/now.md +56 -0
  21. package/plugins/cobol-modernization/.plugin/plugin.json +19 -0
  22. package/plugins/cobol-modernization/README.md +201 -0
  23. package/plugins/cobol-modernization/references/troubleshooting.md +18 -0
  24. package/plugins/cobol-modernization/skills/build-setup/SKILL.md +78 -0
  25. package/plugins/cobol-modernization/skills/build-setup/scripts/install-gnucobol.sh +32 -0
  26. package/plugins/cobol-modernization/skills/cobol-modernization-overview/SKILL.md +113 -0
  27. package/plugins/cobol-modernization/skills/mainfraime-removal/SKILL.md +62 -0
  28. package/plugins/cobol-modernization/skills/mainfraime-removal/references/cics-transformation-examples.md +45 -0
  29. package/plugins/cobol-modernization/skills/mainframe-planning/SKILL.md +78 -0
  30. package/plugins/cobol-modernization/skills/to-java-migration/SKILL.md +59 -0
  31. package/plugins/cobol-modernization/skills/to-java-migration/references/cobol-to-java-example.md +58 -0
  32. package/plugins/cobol-modernization/skills/to-java-migration/references/datatype-mappings.md +19 -0
  33. package/plugins/issue-duplicate-checker/.plugin/plugin.json +13 -0
  34. package/plugins/issue-duplicate-checker/README.md +51 -0
  35. package/plugins/issue-duplicate-checker/action.yml +349 -0
  36. package/plugins/issue-duplicate-checker/scripts/auto_close_duplicate_issues.py +569 -0
  37. package/plugins/issue-duplicate-checker/scripts/issue_duplicate_check_openhands.py +681 -0
  38. package/plugins/issue-duplicate-checker/scripts/post_duplicate_notice.js +220 -0
  39. package/plugins/issue-duplicate-checker/scripts/remove_duplicate_candidate_label.js +27 -0
  40. package/plugins/magic-test/.plugin/plugin.json +13 -0
  41. package/plugins/magic-test/skills/magic-word/SKILL.md +33 -0
  42. package/plugins/migration-scoring/.plugin/plugin.json +19 -0
  43. package/plugins/migration-scoring/README.md +244 -0
  44. package/plugins/migration-scoring/skills/migration-mapping/SKILL.md +72 -0
  45. package/plugins/migration-scoring/skills/migration-report/SKILL.md +118 -0
  46. package/plugins/migration-scoring/skills/migration-scoring-overview/SKILL.md +126 -0
  47. package/plugins/migration-scoring/skills/score-quality/SKILL.md +54 -0
  48. package/plugins/migration-scoring/skills/score-quality/references/scoring-criteria.md +30 -0
  49. package/plugins/migration-scoring/skills/score-style/SKILL.md +106 -0
  50. package/plugins/onboarding/.plugin/plugin.json +20 -0
  51. package/plugins/onboarding/README.md +30 -0
  52. package/plugins/onboarding/references/criteria.md +144 -0
  53. package/plugins/onboarding/skills/agent-readiness-report/README.md +23 -0
  54. package/plugins/onboarding/skills/agent-readiness-report/SKILL.md +122 -0
  55. package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_agent_instructions.sh +88 -0
  56. package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_build_env.sh +114 -0
  57. package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_feedback_loops.sh +133 -0
  58. package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_policy.sh +113 -0
  59. package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_workflows.sh +127 -0
  60. package/plugins/onboarding/skills/improve-agent-readiness/README.md +19 -0
  61. package/plugins/onboarding/skills/improve-agent-readiness/SKILL.md +167 -0
  62. package/plugins/onboarding/skills/setup-agents-md/README.md +15 -0
  63. package/plugins/onboarding/skills/setup-agents-md/SKILL.md +150 -0
  64. package/plugins/onboarding/skills/setup-openhands/README.md +20 -0
  65. package/plugins/onboarding/skills/setup-openhands/SKILL.md +56 -0
  66. package/plugins/onboarding/skills/setup-pr-review/README.md +23 -0
  67. package/plugins/onboarding/skills/setup-pr-review/SKILL.md +72 -0
  68. package/plugins/openhands/.plugin/plugin.json +13 -0
  69. package/plugins/openhands/README.md +52 -0
  70. package/plugins/openhands/SKILL.md +61 -0
  71. package/plugins/openhands/commands/create.md +55 -0
  72. package/plugins/openhands/commands/openhands-cloud.md +8 -0
  73. package/plugins/openhands/scripts/run.sh +69 -0
  74. package/plugins/pr-review/.plugin/plugin.json +13 -0
  75. package/plugins/pr-review/README.md +393 -0
  76. package/plugins/pr-review/action.yml +298 -0
  77. package/plugins/pr-review/scripts/agent_script.py +1282 -0
  78. package/plugins/pr-review/scripts/evaluate_review.py +655 -0
  79. package/plugins/pr-review/scripts/prompt.py +260 -0
  80. package/plugins/pr-review/workflows/pr-review-by-openhands.yml +51 -0
  81. package/plugins/pr-review/workflows/pr-review-evaluation.yml +85 -0
  82. package/plugins/qa-changes/.plugin/plugin.json +11 -0
  83. package/plugins/qa-changes/README.md +185 -0
  84. package/plugins/qa-changes/action.yml +181 -0
  85. package/plugins/qa-changes/scripts/agent_script.py +406 -0
  86. package/plugins/qa-changes/scripts/evaluate_qa_changes.py +385 -0
  87. package/plugins/qa-changes/scripts/prompt.py +174 -0
  88. package/plugins/qa-changes/workflows/qa-changes-by-openhands.yml +50 -0
  89. package/plugins/qa-changes/workflows/qa-changes-evaluation.yml +85 -0
  90. package/plugins/release-notes/.plugin/plugin.json +19 -0
  91. package/plugins/release-notes/README.md +283 -0
  92. package/plugins/release-notes/SKILL.md +83 -0
  93. package/plugins/release-notes/action.yml +117 -0
  94. package/plugins/release-notes/commands/release-notes.md +8 -0
  95. package/plugins/release-notes/scripts/agent_script.py +292 -0
  96. package/plugins/release-notes/scripts/generate_release_notes.py +733 -0
  97. package/plugins/release-notes/scripts/prompt.py +90 -0
  98. package/plugins/release-notes/scripts/validate_release_notes.py +328 -0
  99. package/plugins/release-notes/workflows/release-notes.yml +76 -0
  100. package/plugins/vulnerability-remediation/.plugin/plugin.json +19 -0
  101. package/plugins/vulnerability-remediation/README.md +217 -0
  102. package/plugins/vulnerability-remediation/action.yml +187 -0
  103. package/plugins/vulnerability-remediation/scripts/scan_and_remediate.py +561 -0
  104. package/plugins/vulnerability-remediation/workflows/vulnerability-scan.yml +87 -0
  105. package/pyproject.toml +12 -0
  106. package/release-please-config.json +16 -0
  107. package/scripts/sync_extensions.py +494 -0
  108. package/scripts/sync_openhands_sdk_skill.py +264 -0
  109. package/skills/README.md +159 -0
  110. package/skills/add-javadoc/.plugin/plugin.json +18 -0
  111. package/skills/add-javadoc/README.md +40 -0
  112. package/skills/add-javadoc/SKILL.md +35 -0
  113. package/skills/add-javadoc/references/example.md +32 -0
  114. package/skills/add-skill/.plugin/plugin.json +18 -0
  115. package/skills/add-skill/README.md +67 -0
  116. package/skills/add-skill/SKILL.md +47 -0
  117. package/skills/add-skill/scripts/fetch_skill.py +259 -0
  118. package/skills/agent-creator/.plugin/plugin.json +20 -0
  119. package/skills/agent-creator/README.md +104 -0
  120. package/skills/agent-creator/SKILL.md +190 -0
  121. package/skills/agent-creator/commands/agent-creator.md +8 -0
  122. package/skills/agent-creator/references/fallback.md +117 -0
  123. package/skills/agent-memory/.plugin/plugin.json +18 -0
  124. package/skills/agent-memory/README.md +35 -0
  125. package/skills/agent-memory/SKILL.md +30 -0
  126. package/skills/agent-memory/commands/remember.md +8 -0
  127. package/skills/agent-sdk-builder/.plugin/plugin.json +18 -0
  128. package/skills/agent-sdk-builder/README.md +40 -0
  129. package/skills/agent-sdk-builder/SKILL.md +37 -0
  130. package/skills/agent-sdk-builder/commands/agent-builder.md +8 -0
  131. package/skills/azure-devops/.plugin/plugin.json +18 -0
  132. package/skills/azure-devops/README.md +55 -0
  133. package/skills/azure-devops/SKILL.md +50 -0
  134. package/skills/bitbucket/.plugin/plugin.json +17 -0
  135. package/skills/bitbucket/README.md +50 -0
  136. package/skills/bitbucket/SKILL.md +45 -0
  137. package/skills/code-review/.plugin/plugin.json +19 -0
  138. package/skills/code-review/README.md +18 -0
  139. package/skills/code-review/SKILL.md +208 -0
  140. package/skills/code-review/commands/codereview-roasted.md +8 -0
  141. package/skills/code-review/commands/codereview.md +8 -0
  142. package/skills/code-review/references/risk-evaluation.md +41 -0
  143. package/skills/code-review/references/supply-chain-security.md +31 -0
  144. package/skills/code-simplifier/.plugin/plugin.json +21 -0
  145. package/skills/code-simplifier/README.md +30 -0
  146. package/skills/code-simplifier/SKILL.md +91 -0
  147. package/skills/code-simplifier/commands/simplify.md +8 -0
  148. package/skills/code-simplifier/references/code-quality-review.md +86 -0
  149. package/skills/code-simplifier/references/code-reuse-review.md +63 -0
  150. package/skills/code-simplifier/references/efficiency-review.md +81 -0
  151. package/skills/datadog/.plugin/plugin.json +19 -0
  152. package/skills/datadog/README.md +100 -0
  153. package/skills/datadog/SKILL.md +95 -0
  154. package/skills/deno/.plugin/plugin.json +18 -0
  155. package/skills/deno/README.md +5 -0
  156. package/skills/deno/SKILL.md +99 -0
  157. package/skills/deno/references/README.md +6 -0
  158. package/skills/discord/.plugin/plugin.json +18 -0
  159. package/skills/discord/README.md +31 -0
  160. package/skills/discord/SKILL.md +109 -0
  161. package/skills/discord/__init__.py +0 -0
  162. package/skills/discord/references/REFERENCE.md +78 -0
  163. package/skills/discord/scripts/__init__.py +0 -0
  164. package/skills/discord/scripts/_http.py +127 -0
  165. package/skills/discord/scripts/post_webhook.py +106 -0
  166. package/skills/discord/scripts/send_message.py +102 -0
  167. package/skills/docker/.plugin/plugin.json +17 -0
  168. package/skills/docker/README.md +34 -0
  169. package/skills/docker/SKILL.md +29 -0
  170. package/skills/evidence-based-citations/.plugin/plugin.json +20 -0
  171. package/skills/evidence-based-citations/README.md +31 -0
  172. package/skills/evidence-based-citations/SKILL.md +59 -0
  173. package/skills/flarglebargle/.plugin/plugin.json +16 -0
  174. package/skills/flarglebargle/README.md +14 -0
  175. package/skills/flarglebargle/SKILL.md +9 -0
  176. package/skills/frontend-design/.plugin/plugin.json +21 -0
  177. package/skills/frontend-design/LICENSE.txt +177 -0
  178. package/skills/frontend-design/README.md +42 -0
  179. package/skills/frontend-design/SKILL.md +42 -0
  180. package/skills/github/.plugin/plugin.json +19 -0
  181. package/skills/github/README.md +42 -0
  182. package/skills/github/SKILL.md +106 -0
  183. package/skills/github-pr-review/.plugin/plugin.json +18 -0
  184. package/skills/github-pr-review/README.md +145 -0
  185. package/skills/github-pr-review/SKILL.md +148 -0
  186. package/skills/github-pr-review/commands/github-pr-review.md +8 -0
  187. package/skills/github-pr-reviewer/.plugin/plugin.json +20 -0
  188. package/skills/github-pr-reviewer/README.md +34 -0
  189. package/skills/github-pr-reviewer/SKILL.md +89 -0
  190. package/skills/github-pr-reviewer/commands/pr-reviewer:setup.md +8 -0
  191. package/skills/github-repo-monitor/.plugin/plugin.json +22 -0
  192. package/skills/github-repo-monitor/README.md +70 -0
  193. package/skills/github-repo-monitor/SKILL.md +316 -0
  194. package/skills/github-repo-monitor/commands/github-monitor:poll.md +8 -0
  195. package/skills/github-repo-monitor/references/github-api.md +241 -0
  196. package/skills/github-repo-monitor/references/state-schema.md +160 -0
  197. package/skills/github-repo-monitor/scripts/main.py +915 -0
  198. package/skills/github-repo-monitor/tests/test_main.py +400 -0
  199. package/skills/gitlab/.plugin/plugin.json +17 -0
  200. package/skills/gitlab/README.md +37 -0
  201. package/skills/gitlab/SKILL.md +32 -0
  202. package/skills/incident-retrospective/.plugin/plugin.json +21 -0
  203. package/skills/incident-retrospective/README.md +34 -0
  204. package/skills/incident-retrospective/SKILL.md +98 -0
  205. package/skills/incident-retrospective/commands/incident-retro:setup.md +8 -0
  206. package/skills/iterate/.plugin/plugin.json +13 -0
  207. package/skills/iterate/README.md +25 -0
  208. package/skills/iterate/SKILL.md +399 -0
  209. package/skills/iterate/commands/babysit.md +8 -0
  210. package/skills/iterate/commands/iterate.md +8 -0
  211. package/skills/iterate/commands/verify.md +8 -0
  212. package/skills/iterate/references/heuristics.md +58 -0
  213. package/skills/iterate/references/verification.md +96 -0
  214. package/skills/jupyter/.plugin/plugin.json +18 -0
  215. package/skills/jupyter/README.md +55 -0
  216. package/skills/jupyter/SKILL.md +50 -0
  217. package/skills/kubernetes/.plugin/plugin.json +18 -0
  218. package/skills/kubernetes/README.md +53 -0
  219. package/skills/kubernetes/SKILL.md +48 -0
  220. package/skills/learn-from-code-review/.plugin/plugin.json +19 -0
  221. package/skills/learn-from-code-review/README.md +64 -0
  222. package/skills/learn-from-code-review/SKILL.md +186 -0
  223. package/skills/learn-from-code-review/commands/learn-from-reviews.md +8 -0
  224. package/skills/linear/.plugin/plugin.json +19 -0
  225. package/skills/linear/README.md +58 -0
  226. package/skills/linear/SKILL.md +213 -0
  227. package/skills/linear-triage/.plugin/plugin.json +21 -0
  228. package/skills/linear-triage/README.md +34 -0
  229. package/skills/linear-triage/SKILL.md +91 -0
  230. package/skills/linear-triage/commands/linear-triage:setup.md +8 -0
  231. package/skills/notion/.plugin/plugin.json +17 -0
  232. package/skills/notion/README.md +114 -0
  233. package/skills/notion/SKILL.md +109 -0
  234. package/skills/npm/.plugin/plugin.json +17 -0
  235. package/skills/npm/README.md +14 -0
  236. package/skills/npm/SKILL.md +9 -0
  237. package/skills/openhands-api/.plugin/plugin.json +22 -0
  238. package/skills/openhands-api/README.md +48 -0
  239. package/skills/openhands-api/SKILL.md +399 -0
  240. package/skills/openhands-api/references/README.md +33 -0
  241. package/skills/openhands-api/references/TROUBLESHOOTING.md +81 -0
  242. package/skills/openhands-api/references/example_prompt.md +12 -0
  243. package/skills/openhands-api/scripts/openhands_api.py +606 -0
  244. package/skills/openhands-api/scripts/openhands_api.ts +252 -0
  245. package/skills/openhands-automation/.plugin/plugin.json +19 -0
  246. package/skills/openhands-automation/README.md +89 -0
  247. package/skills/openhands-automation/SKILL.md +875 -0
  248. package/skills/openhands-automation/commands/automation:create.md +8 -0
  249. package/skills/openhands-automation/references/ab-testing.md +185 -0
  250. package/skills/openhands-automation/references/custom-automation.md +644 -0
  251. package/skills/openhands-sdk/.plugin/plugin.json +20 -0
  252. package/skills/openhands-sdk/README.md +22 -0
  253. package/skills/openhands-sdk/SKILL.md +229 -0
  254. package/skills/openhands-sdk/commands/sdk.md +8 -0
  255. package/skills/pdflatex/.plugin/plugin.json +18 -0
  256. package/skills/pdflatex/README.md +39 -0
  257. package/skills/pdflatex/SKILL.md +34 -0
  258. package/skills/prd/.plugin/plugin.json +19 -0
  259. package/skills/prd/README.md +28 -0
  260. package/skills/prd/SKILL.md +237 -0
  261. package/skills/prd/commands/prd.md +8 -0
  262. package/skills/qa-changes/README.md +18 -0
  263. package/skills/qa-changes/SKILL.md +229 -0
  264. package/skills/qa-changes/commands/qa-changes.md +8 -0
  265. package/skills/release-notes/README.md +24 -0
  266. package/skills/release-notes/SKILL.md +19 -0
  267. package/skills/release-notes/commands/release-notes.md +8 -0
  268. package/skills/research-brief/.plugin/plugin.json +20 -0
  269. package/skills/research-brief/README.md +34 -0
  270. package/skills/research-brief/SKILL.md +99 -0
  271. package/skills/research-brief/commands/research-brief:setup.md +8 -0
  272. package/skills/security/.plugin/plugin.json +18 -0
  273. package/skills/security/README.md +38 -0
  274. package/skills/security/SKILL.md +33 -0
  275. package/skills/skill-creator/.plugin/plugin.json +17 -0
  276. package/skills/skill-creator/LICENSE.txt +202 -0
  277. package/skills/skill-creator/README.md +182 -0
  278. package/skills/skill-creator/SKILL.md +545 -0
  279. package/skills/skill-creator/references/output-patterns.md +82 -0
  280. package/skills/skill-creator/references/workflows.md +28 -0
  281. package/skills/skill-creator/scripts/init_skill.py +303 -0
  282. package/skills/skill-creator/scripts/quick_validate.py +95 -0
  283. package/skills/slack-channel-monitor/.plugin/plugin.json +21 -0
  284. package/skills/slack-channel-monitor/README.md +91 -0
  285. package/skills/slack-channel-monitor/SKILL.md +276 -0
  286. package/skills/slack-channel-monitor/commands/slack-monitor:poll.md +8 -0
  287. package/skills/slack-channel-monitor/references/slack-api.md +207 -0
  288. package/skills/slack-channel-monitor/references/state-schema.md +180 -0
  289. package/skills/slack-channel-monitor/scripts/main.py +962 -0
  290. package/skills/slack-standup-digest/.plugin/plugin.json +21 -0
  291. package/skills/slack-standup-digest/README.md +34 -0
  292. package/skills/slack-standup-digest/SKILL.md +92 -0
  293. package/skills/slack-standup-digest/commands/standup-digest:setup.md +8 -0
  294. package/skills/spark-version-upgrade/.plugin/plugin.json +20 -0
  295. package/skills/spark-version-upgrade/README.md +54 -0
  296. package/skills/spark-version-upgrade/SKILL.md +233 -0
  297. package/skills/ssh/.plugin/plugin.json +18 -0
  298. package/skills/ssh/README.md +140 -0
  299. package/skills/ssh/SKILL.md +135 -0
  300. package/skills/swift-linux/.plugin/plugin.json +17 -0
  301. package/skills/swift-linux/README.md +86 -0
  302. package/skills/swift-linux/SKILL.md +81 -0
  303. package/skills/theme-factory/.plugin/plugin.json +19 -0
  304. package/skills/theme-factory/LICENSE.txt +202 -0
  305. package/skills/theme-factory/README.md +58 -0
  306. package/skills/theme-factory/SKILL.md +59 -0
  307. package/skills/theme-factory/theme-showcase.pdf +0 -0
  308. package/skills/theme-factory/themes/arctic-frost.md +19 -0
  309. package/skills/theme-factory/themes/botanical-garden.md +19 -0
  310. package/skills/theme-factory/themes/desert-rose.md +19 -0
  311. package/skills/theme-factory/themes/forest-canopy.md +19 -0
  312. package/skills/theme-factory/themes/golden-hour.md +19 -0
  313. package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  314. package/skills/theme-factory/themes/modern-minimalist.md +19 -0
  315. package/skills/theme-factory/themes/ocean-depths.md +19 -0
  316. package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  317. package/skills/theme-factory/themes/tech-innovation.md +19 -0
  318. package/skills/uv/.plugin/plugin.json +18 -0
  319. package/skills/uv/README.md +5 -0
  320. package/skills/uv/SKILL.md +95 -0
  321. package/skills/uv/references/README.md +5 -0
  322. package/skills/vercel/.plugin/plugin.json +18 -0
  323. package/skills/vercel/README.md +108 -0
  324. package/skills/vercel/SKILL.md +103 -0
  325. package/tests/test_add_skill_installs_to_agents_dir.py +42 -0
  326. package/tests/test_catalogs.py +109 -0
  327. package/tests/test_code_review_risk_evaluation.py +94 -0
  328. package/tests/test_issue_duplicate_checker.py +240 -0
  329. package/tests/test_openhands_api_python.py +152 -0
  330. package/tests/test_plugin_manifest.py +83 -0
  331. package/tests/test_pr_review_diff_payload.py +202 -0
  332. package/tests/test_pr_review_feedback.py +263 -0
  333. package/tests/test_pr_review_prompt.py +152 -0
  334. package/tests/test_pr_review_review_context.py +253 -0
  335. package/tests/test_qa_changes.py +232 -0
  336. package/tests/test_qa_changes_evaluation.py +259 -0
  337. package/tests/test_release_notes_generator.py +990 -0
  338. package/tests/test_sdk_loading.py +150 -0
  339. package/tests/test_skill_plugin_loading.py +149 -0
  340. package/tests/test_skills_have_readme.py +66 -0
  341. package/tests/test_sync_extensions.py +292 -0
  342. package/tests/test_workflow_sync.py +46 -0
  343. package/utils/analysis/README.md +7 -0
  344. package/utils/analysis/laminar_signals/README.md +211 -0
  345. package/utils/analysis/laminar_signals/analyze.py +780 -0
  346. package/utils/analysis/laminar_signals/templates/default.j2 +49 -0
  347. package/utils/analysis/laminar_signals/templates/pr_review.j2 +61 -0
@@ -0,0 +1,25 @@
1
+ # iterate
2
+
3
+ Iterate on a GitHub pull request — drive it through CI, code review, and QA
4
+ until it is merge-ready. The agent monitors PR state, diagnoses and fixes
5
+ problems, retries flaky failures, and keeps looping until the PR is green
6
+ or a blocker requires human help.
7
+
8
+ ## Trigger
9
+
10
+ `/iterate`
11
+
12
+ ## How it works
13
+
14
+ 1. **Snapshot** PR state using `gh` CLI commands (checks, reviews, mergeability).
15
+ 2. **Evaluate** what to do: fix CI failures, address review feedback, retry
16
+ flaky checks, or wait.
17
+ 3. **Fix and push** — then loop back to step 1.
18
+ 4. **Stop** when the PR is merge-ready, closed, or blocked.
19
+
20
+ No scripts — the agent is the orchestration loop, using only standard `gh` CLI.
21
+
22
+ ## Requirements
23
+
24
+ - GitHub CLI (`gh`) — authenticated with repo access
25
+ - A GitHub PR (or a branch to create one from)
@@ -0,0 +1,399 @@
1
+ ---
2
+ name: iterate
3
+ description: >-
4
+ Iterate on a GitHub pull request — drive it through CI, code review, and QA
5
+ until it is merge-ready. Poll verification layers with `gh` CLI, diagnose
6
+ and fix CI failures, address review feedback, retry flaky checks, push
7
+ fixes, and repeat. The agent is the orchestration loop.
8
+ triggers:
9
+ - /iterate
10
+ - /verify
11
+ - /babysit
12
+ ---
13
+
14
+ # /iterate — Drive a PR to Merge-Ready
15
+
16
+ Iterate on a pull request until it passes all verification layers.
17
+ You push, poll, fix, and push again — the loop only ends when the PR is green
18
+ or a blocker requires human help.
19
+
20
+ No scripts — you are the orchestration loop. Uses only standard `gh` CLI
21
+ commands that work on any GitHub repo.
22
+
23
+ Requires: `gh` CLI authenticated with repo access, a PR branch.
24
+
25
+ ## Discover what the repo has
26
+
27
+ Not every repo has all three verification layers. Before entering the loop,
28
+ check which ones exist. Only poll layers that are actually set up.
29
+
30
+ ```bash
31
+ gh workflow list --json name --jq '.[].name'
32
+ ```
33
+
34
+ - **CI checks** — almost every repo has these. If `gh pr checks` returns results, CI is present.
35
+ - **PR review bot** — look for a workflow named like "PR Review" or "pr-review" in the output above, or check for `.github/workflows/pr-review*.yml` in the repo. If it's not there, the repo doesn't have automated PR review. Skip step 3 entirely.
36
+ - **QA bot** — look for a workflow named like "QA" or "qa-changes". If it's not there, the repo doesn't have automated QA. Skip step 4 entirely.
37
+
38
+ A repo might have only CI. Or CI + review. Or all three. Your "all passed"
39
+ condition is: every *present* layer is green. Don't block waiting for layers
40
+ that don't exist.
41
+
42
+ ## The loop
43
+
44
+ 1. Push and ensure a draft PR exists.
45
+ 2. Poll each present verification layer.
46
+ 3. Decide: all passed? fix needed? wait?
47
+ 4. If fix needed — fix, commit, push, re-request review from bots, go to 2.
48
+ 5. If waiting — sleep per polling cadence, go to 2.
49
+ 6. If all present layers passed on the *current* SHA — mark PR ready, done.
50
+
51
+ IMPORTANT: pushing a fix is NOT the end. After every fix+push you MUST
52
+ re-request review from the review bot (if present) and go back to step 2.
53
+ The loop only ends when the verifiers pass on your latest SHA. Addressing
54
+ feedback and pushing a commit is just one iteration — the bot needs to
55
+ review the new code too.
56
+
57
+ Do not stop to ask the user whether to continue polling; continue
58
+ autonomously until a strict stop condition is met or the user interrupts.
59
+
60
+ ## Step 1 — Push and ensure PR exists (as draft)
61
+
62
+ Create the PR as a draft. This prevents repo automations (merge workflows,
63
+ artifact cleanup, auto-merge) from triggering while you're still iterating.
64
+ You mark it ready only after all verification layers pass.
65
+
66
+ ```bash
67
+ git push origin HEAD
68
+ gh pr create --fill --draft 2>/dev/null || true
69
+ gh pr view --json number,url,headRefOid,isDraft --jq '"\(.number) \(.url) \(.headRefOid) draft=\(.isDraft)"'
70
+ ```
71
+
72
+ If the PR already exists and is not a draft, convert it:
73
+
74
+ ```bash
75
+ gh pr ready --undo
76
+ ```
77
+
78
+ ## Step 2 — Poll CI checks
79
+
80
+ ```bash
81
+ gh pr checks --json name,state,bucket --jq '
82
+ { passed: [.[] | select(.bucket=="pass")] | length,
83
+ failed: [.[] | select(.bucket=="fail")] | length,
84
+ pending: [.[] | select(.bucket=="pending")] | length }'
85
+ ```
86
+
87
+ - Zero failed, zero pending → CI green.
88
+ - Any pending → wait and re-poll.
89
+ - Any failed → diagnose (see "CI failure classification" below).
90
+
91
+ To inspect a failure:
92
+
93
+ ```bash
94
+ SHA=$(gh pr view --json headRefOid --jq .headRefOid)
95
+ gh run list --commit "$SHA" --status failure --json databaseId,name,conclusion \
96
+ --jq '.[] | "\(.databaseId)\t\(.name)\t\(.conclusion)"'
97
+ gh run view <run-id> --log-failed
98
+ ```
99
+
100
+ ## Step 3 — Poll PR review (if present)
101
+
102
+ Skip this step if the repo has no review bot.
103
+
104
+ ```bash
105
+ gh pr view --json reviews --jq '
106
+ [.reviews[] | select(
107
+ .authorAssociation == "OWNER" or
108
+ .authorAssociation == "MEMBER" or
109
+ .authorAssociation == "COLLABORATOR" or
110
+ (.author.login | test("openhands|all-hands-bot"; "i"))
111
+ )] | last | { state: .state, reviewer: .author.login, body: .body[0:300] }'
112
+ ```
113
+
114
+ - `APPROVED` → review passed.
115
+ - `CHANGES_REQUESTED` → read the body and inline comments, fix code.
116
+ - `COMMENTED` → may have actionable suggestions; read and decide.
117
+ - No matching review yet → bot may still be running; wait and re-poll.
118
+
119
+ Inline review comments (when changes requested):
120
+
121
+ ```bash
122
+ gh api "repos/{owner}/{repo}/pulls/{number}/comments" \
123
+ --jq '.[] | select(.user.login | test("openhands|all-hands-bot"; "i"))
124
+ | { path: .path, line: .line, body: .body[0:200] }'
125
+ ```
126
+
127
+ On a fresh iteration, existing pending review feedback should be checked
128
+ immediately — not only comments that arrive after monitoring starts.
129
+ Already-open review comments must not be missed.
130
+
131
+ ## Step 4 — Poll QA report (if present)
132
+
133
+ Skip this step if the repo has no QA bot.
134
+
135
+ QA reports are PR issue comments with a status line like `Status: PASS`.
136
+
137
+ ```bash
138
+ gh api "repos/{owner}/{repo}/issues/{number}/comments" --paginate \
139
+ --jq '[.[] | select(
140
+ (.user.login | test("openhands|all-hands-bot"; "i")) and
141
+ (.body | test("Status:\\s*(PASS|FAIL|PARTIAL)"; "i"))
142
+ )] | last | { author: .user.login, body: .body[0:500], url: .html_url }'
143
+ ```
144
+
145
+ - `PASS` → QA passed.
146
+ - `FAIL` → read details, fix code.
147
+ - `PARTIAL` → some passed, some failed; read details.
148
+ - No QA comment yet → bot may still be running; wait and re-poll.
149
+
150
+ ## Step 5 — Decide and act
151
+
152
+ For each present layer, check its status. If a layer is not present in the
153
+ repo, treat it as passing.
154
+
155
+ - All present layers green on current SHA → done.
156
+ - CI failed → fix code, or rerun if flaky (see below).
157
+ - Review requested changes → read comments, fix, push.
158
+ - QA failed/partial → read report, fix, push.
159
+ - Anything still pending → sleep per polling cadence, re-poll.
160
+ - PR closed/merged → stop.
161
+
162
+ **Priority rule:** when both review feedback and flaky CI failures are present,
163
+ prioritize review feedback first. A new commit will retrigger CI, so avoid
164
+ rerunning flaky checks on the old SHA when you're about to push a review fix.
165
+
166
+ After fixing, commit, push, AND re-request review:
167
+
168
+ ```bash
169
+ git add -A
170
+ git commit -m "fix: address <CI failure | review feedback | QA failure>"
171
+ git push origin HEAD
172
+
173
+ # Re-request review from the bot so it reviews the new SHA:
174
+ gh pr comment --body "Addressed feedback in $(git rev-parse --short HEAD). Ready for another look."
175
+ gh api -X POST "repos/{owner}/{repo}/pulls/{number}/requested_reviewers" \
176
+ -f 'reviewers[]=all-hands-bot'
177
+ ```
178
+
179
+ Then go back to step 2. You are not done until the bot reviews the new
180
+ SHA and all present layers pass.
181
+
182
+ ## CI failure classification
183
+
184
+ Use `gh` commands to inspect failed runs before deciding to rerun:
185
+
186
+ ```bash
187
+ gh run view <run-id> --json jobs,name,workflowName,conclusion,status,url,headSha
188
+ gh run view <run-id> --log-failed
189
+ ```
190
+
191
+ **Branch-related** (fix the code):
192
+ - Compile/lint/typecheck failures in files you touched
193
+ - Deterministic test failures in changed areas
194
+ - Snapshot or static-analysis violations from your changes
195
+ - Build config changes causing deterministic failures
196
+
197
+ **Flaky / unrelated** (rerun the jobs):
198
+ - Network/DNS/registry timeouts
199
+ - Runner provisioning or startup failures
200
+ - GitHub Actions infrastructure errors
201
+ - Non-deterministic failures in code you didn't touch
202
+ - Cloud/service rate limits or transient API outages
203
+
204
+ If classification is ambiguous, perform one manual diagnosis attempt (inspect
205
+ logs) before choosing rerun.
206
+
207
+ Rerun: `gh run rerun <run-id> --failed`
208
+
209
+ Retry budget: at most 3 reruns per SHA. After that, treat as real.
210
+
211
+ Read `references/heuristics.md` for a concise decision tree.
212
+
213
+ ## Review comment handling
214
+
215
+ The review polling in Step 3 surfaces feedback from trusted sources: human
216
+ reviewers (OWNER/MEMBER/COLLABORATOR) and approved review bots (openhands,
217
+ all-hands-bot, etc.). Ignore unrelated bot noise.
218
+
219
+ Review items come from:
220
+ - PR issue comments
221
+ - Inline review comments
222
+ - Review submissions (COMMENT / APPROVED / CHANGES_REQUESTED)
223
+
224
+ When a comment is actionable and correct:
225
+ 1. Fix the code.
226
+ 2. Commit with `chore: address PR review feedback (#<n>)`.
227
+ 3. Push and continue the loop.
228
+ 4. Reply to the review thread referencing the commit SHA.
229
+ 5. Resolve the thread.
230
+
231
+ When a comment is non-actionable, already addressed, or you disagree:
232
+ reply briefly explaining why, then resolve the thread. Do not leave
233
+ threads dangling without a response.
234
+
235
+ If a review thread is already resolved in GitHub, ignore it unless new
236
+ unresolved follow-up appears.
237
+
238
+ ### Replying to and resolving review threads
239
+
240
+ Every inline review comment creates a thread. After addressing a comment
241
+ (or deciding it's non-actionable), you must:
242
+
243
+ 1. **Reply** to the thread so the reviewer can see how you addressed it:
244
+
245
+ ```bash
246
+ gh api "repos/{owner}/{repo}/pulls/{number}/comments" \
247
+ -F "body=Fixed — <describe what you changed>" \
248
+ -F "in_reply_to=<comment_database_id>"
249
+ ```
250
+
251
+ Use `-F` (not `-f`) for `in_reply_to` so it is sent as a number.
252
+
253
+ 2. **Resolve** the thread via GraphQL:
254
+
255
+ ```bash
256
+ gh api graphql \
257
+ -f query='mutation($id: ID!) {
258
+ resolveReviewThread(input: { threadId: $id }) {
259
+ thread { isResolved }
260
+ }
261
+ }' \
262
+ -f id="<thread_node_id>"
263
+ ```
264
+
265
+ To discover unresolved threads and their IDs:
266
+
267
+ ```bash
268
+ gh api graphql -f query='
269
+ query($owner: String!, $repo: String!, $pr: Int!) {
270
+ repository(owner: $owner, name: $repo) {
271
+ pullRequest(number: $pr) {
272
+ reviewThreads(last: 100) {
273
+ nodes {
274
+ id
275
+ isResolved
276
+ path
277
+ line
278
+ comments(first: 1) {
279
+ nodes { databaseId author { login } body }
280
+ }
281
+ }
282
+ }
283
+ }
284
+ }
285
+ }' -f owner="{owner}" -f repo="{repo}" -F pr="{number}" \
286
+ --jq '.data.repository.pullRequest.reviewThreads.nodes[]
287
+ | select(.isResolved == false)'
288
+ ```
289
+
290
+ **Rules:**
291
+ - Reply to every thread, even nits. A brief "Done" or "Kept as-is because…" is fine.
292
+ - Resolve threads you have addressed. Do not leave resolved-in-code threads
293
+ showing as unresolved in the GitHub UI.
294
+ - Before marking the PR ready, verify zero unresolved threads remain.
295
+
296
+ ### Requesting re-review
297
+
298
+ If the PR is green but blocked on review approval and you've addressed all
299
+ feedback, you can request another look — but only when the user explicitly
300
+ asks, or after confirming with them (avoid spamming humans):
301
+
302
+ 1. Leave a brief PR comment summarizing what changed:
303
+ ```bash
304
+ gh pr comment <pr> --body "Addressed the requested changes in <sha>. Could you take another look?"
305
+ ```
306
+ Do NOT tag humans.
307
+
308
+ 2. Re-request reviewers via the GitHub API:
309
+ ```bash
310
+ gh api -X POST repos/{owner}/{repo}/pulls/{number}/requested_reviewers \
311
+ -f reviewers[]=<reviewer>
312
+ ```
313
+
314
+ Prefer requesting review only once per new head SHA. If the API returns an
315
+ error indicating reviewers are already requested, treat it as non-fatal.
316
+
317
+ ## Polling cadence
318
+
319
+ - CI pending or failing: every 30–60 seconds.
320
+ - CI green, waiting for review/QA: start at 60s, back off exponentially
321
+ (60s → 2m → 4m → 8m → 16m → 32m), cap at 1 hour.
322
+ - Reset to 60s whenever anything changes (new SHA, check status, review
323
+ comment, mergeability change).
324
+ - If CI stops being green (new commit, rerun, regression): return to 30–60s.
325
+ - After pushing a fix: re-poll immediately.
326
+ - If any poll shows the PR is merged or closed: stop immediately.
327
+
328
+ ## Stop conditions
329
+
330
+ Stop **only** when:
331
+ - All present verification layers passed on current SHA and PR is mergeable.
332
+ - PR merged or closed (stop as soon as a poll confirms this).
333
+ - Flaky retry budget exhausted (3 reruns per SHA).
334
+ - Blocked on something requiring human input (infra outage, permissions,
335
+ ambiguity that cannot be resolved safely).
336
+
337
+ **Not** a stop condition:
338
+ - You pushed a fix. That's one iteration — keep going.
339
+ - You addressed review comments. The bot still needs to review new code.
340
+ - CI is green but review bot hasn't re-reviewed yet. Wait.
341
+ - CI is still running/queued.
342
+ - CI is green but mergeability is unknown/pending.
343
+ - CI is green and mergeable, but waiting for possible new review comments
344
+ per the green-state cadence.
345
+ - PR is green but blocked on review approval (`REVIEW_REQUIRED`); continue
346
+ polling and surface new review comments without asking for confirmation.
347
+
348
+ ## When done — mark PR ready
349
+
350
+ Once all present verification layers pass on the current SHA:
351
+
352
+ 1. Verify all review threads are resolved (zero unresolved remaining).
353
+ 2. Convert the draft PR to ready for review:
354
+
355
+ ```bash
356
+ gh pr ready
357
+ ```
358
+
359
+ Only do this at the very end, after the loop exits successfully.
360
+
361
+ ## Git safety
362
+
363
+ - Work only on the PR head branch.
364
+ - No destructive git commands.
365
+ - Do not switch branches unless necessary to recover context.
366
+ - Check for unrelated uncommitted changes before editing. If present, ask user.
367
+ - After every fix, commit and push, then re-poll.
368
+ - A push is not a terminal outcome; continue the monitoring loop.
369
+
370
+ Commit message defaults:
371
+ - `fix: CI failure on PR #<n>`
372
+ - `chore: address PR review feedback (#<n>)`
373
+
374
+ ## Output
375
+
376
+ Provide concise progress updates during monitoring:
377
+
378
+ - During long unchanged periods, avoid emitting a full update on every poll;
379
+ summarize only status changes plus occasional heartbeat updates.
380
+ - Treat push confirmations, intermediate CI snapshots, and review-action
381
+ updates as progress updates only; do not emit the final summary unless a
382
+ strict stop condition is met.
383
+ - When CI first transitions to all green for the current SHA, emit a one-time
384
+ celebratory update. Preferred style:
385
+ `🚀 CI is all green! 33/33 passed. Still watching for review.`
386
+
387
+ Final summary should include:
388
+ - Final PR SHA
389
+ - CI status summary
390
+ - Mergeability / conflict status
391
+ - Fixes pushed
392
+ - Flaky retry cycles used
393
+ - Review threads resolved (count)
394
+ - Remaining unresolved failures or review comments
395
+
396
+ ## References
397
+
398
+ - Verification stack (layers, signals, retriggering): `references/verification.md`
399
+ - CI/review heuristics and decision tree: `references/heuristics.md`
@@ -0,0 +1,8 @@
1
+ ---
2
+ # auto-generated by sync_extensions.py
3
+ description: Iterate on a GitHub pull request — drive it through CI, code review, and QA until it is merge-ready. Poll verification layers with `gh` CLI, diagnose and fix CI failures, address review feedback, retry flaky checks, push fixes, and repeat. The agent is the orchestration loop.
4
+ ---
5
+
6
+ Read and follow the complete instructions in the SKILL.md file located in this skill's directory.
7
+
8
+ $ARGUMENTS
@@ -0,0 +1,8 @@
1
+ ---
2
+ # auto-generated by sync_extensions.py
3
+ description: Iterate on a GitHub pull request — drive it through CI, code review, and QA until it is merge-ready. Poll verification layers with `gh` CLI, diagnose and fix CI failures, address review feedback, retry flaky checks, push fixes, and repeat. The agent is the orchestration loop.
4
+ ---
5
+
6
+ Read and follow the complete instructions in the SKILL.md file located in this skill's directory.
7
+
8
+ $ARGUMENTS
@@ -0,0 +1,8 @@
1
+ ---
2
+ # auto-generated by sync_extensions.py
3
+ description: Iterate on a GitHub pull request — drive it through CI, code review, and QA until it is merge-ready. Poll verification layers with `gh` CLI, diagnose and fix CI failures, address review feedback, retry flaky checks, push fixes, and repeat. The agent is the orchestration loop.
4
+ ---
5
+
6
+ Read and follow the complete instructions in the SKILL.md file located in this skill's directory.
7
+
8
+ $ARGUMENTS
@@ -0,0 +1,58 @@
1
+ # CI / Review Heuristics
2
+
3
+ ## CI classification checklist
4
+
5
+ Treat as **branch-related** when logs clearly indicate a regression caused by the PR branch:
6
+
7
+ - Compile/typecheck/lint failures in files or modules touched by the branch
8
+ - Deterministic unit/integration test failures in changed areas
9
+ - Snapshot output changes caused by UI/text changes in the branch
10
+ - Static analysis violations introduced by the latest push
11
+ - Build script/config changes in the PR causing a deterministic failure
12
+
13
+ Treat as **likely flaky or unrelated** when evidence points to transient or external issues:
14
+
15
+ - DNS/network/registry timeout errors while fetching dependencies
16
+ - Runner image provisioning or startup failures
17
+ - GitHub Actions infrastructure/service outages
18
+ - Cloud/service rate limits or transient API outages
19
+ - Non-deterministic failures in unrelated integration tests with known flake patterns
20
+
21
+ If uncertain, inspect failed logs once before choosing rerun.
22
+
23
+ ## Decision tree (fix vs rerun vs stop)
24
+
25
+ 1. If PR is merged/closed: stop.
26
+ 2. If there are failed checks:
27
+ - Diagnose first.
28
+ - If branch-related: fix locally, commit, push.
29
+ - If likely flaky/unrelated and all checks for the current SHA are terminal: rerun failed jobs.
30
+ - If checks are still pending: wait.
31
+ 3. If flaky reruns for the same SHA reach the configured limit (default 3): stop and report persistent failure.
32
+ 4. Independently, process any new human review comments.
33
+
34
+ ## Review comment agreement criteria
35
+
36
+ Address the comment when:
37
+
38
+ - The comment is technically correct.
39
+ - The change is actionable in the current branch.
40
+ - The requested change does not conflict with the user’s intent or recent guidance.
41
+ - The change can be made safely without unrelated refactors.
42
+
43
+ Do not auto-fix when:
44
+
45
+ - The comment is ambiguous and needs clarification.
46
+ - The request conflicts with explicit user instructions.
47
+ - The proposed change requires product/design decisions the user has not made.
48
+ - The codebase is in a dirty/unrelated state that makes safe editing uncertain.
49
+
50
+ ## Stop-and-ask conditions
51
+
52
+ Stop and ask the user instead of continuing automatically when:
53
+
54
+ - The local worktree has unrelated uncommitted changes.
55
+ - `gh` auth/permissions fail.
56
+ - The PR branch cannot be pushed.
57
+ - CI failures persist after the flaky retry budget.
58
+ - Reviewer feedback requires a product decision or cross-team coordination.
@@ -0,0 +1,96 @@
1
+ # Verification Stack
2
+
3
+ The **verification stack** is the set of automated, non-human verifiers that
4
+ gate a PR before it can merge. These are bots — CI runners, code-review bots,
5
+ QA bots — not humans. Because they are automated, you should feel free to
6
+ retrigger any of them at any time (e.g., re-request review, rerun checks).
7
+ You are not bothering anyone; they exist to be invoked repeatedly.
8
+
9
+ Not every repo has all three layers — see "Discover what the repo has" in
10
+ SKILL.md. Your "all passed" condition covers only the layers that exist.
11
+
12
+ ## CI checks
13
+
14
+ Source: GitHub Actions check runs / status checks on the PR.
15
+ Present in almost every repo.
16
+
17
+ Read with:
18
+ ```bash
19
+ gh pr checks --json name,state,bucket --jq '
20
+ { passed: [.[] | select(.bucket=="pass")] | length,
21
+ failed: [.[] | select(.bucket=="fail")] | length,
22
+ pending: [.[] | select(.bucket=="pending")] | length }'
23
+ ```
24
+
25
+ Bucket values: `pass`, `fail`, `pending`.
26
+
27
+ ## PR review bot (code-review)
28
+
29
+ Source: the OpenHands `pr-review` plugin posts a GitHub pull request review
30
+ via the Reviews API. Not all repos have this. This is the **code-review bot**
31
+ — an automated reviewer, not a human. Retriggering it (re-requesting review,
32
+ adding a label) is always safe and encouraged after every fix push.
33
+
34
+ Typical triggers: `pull_request_target` events (opened, ready_for_review,
35
+ labeled, review_requested), adding `review-this` label, or requesting
36
+ `openhands-agent` / `all-hands-bot` as reviewer.
37
+
38
+ Read with:
39
+ ```bash
40
+ gh pr view --json reviews --jq '
41
+ [.reviews[] | select(
42
+ .authorAssociation == "OWNER" or
43
+ .authorAssociation == "MEMBER" or
44
+ .authorAssociation == "COLLABORATOR" or
45
+ (.author.login | test("openhands|all-hands-bot"; "i"))
46
+ )] | last | { state: .state, reviewer: .author.login }'
47
+ ```
48
+
49
+ States: `APPROVED` (passed), `CHANGES_REQUESTED` (fix needed), `COMMENTED` (read and decide).
50
+
51
+ Inline comments when changes requested:
52
+ ```bash
53
+ gh api "repos/{owner}/{repo}/pulls/{number}/comments" \
54
+ --jq '.[] | select(.user.login | test("openhands|all-hands-bot"; "i"))
55
+ | { path: .path, line: .line, body: .body[0:200] }'
56
+ ```
57
+
58
+ ## QA bot
59
+
60
+ Source: the OpenHands `qa-changes` plugin posts a PR issue comment with a
61
+ status line. Not all repos have this.
62
+
63
+ Read with:
64
+ ```bash
65
+ gh api "repos/{owner}/{repo}/issues/{number}/comments" --paginate \
66
+ --jq '[.[] | select(
67
+ (.user.login | test("openhands|all-hands-bot"; "i")) and
68
+ (.body | test("Status:\\s*(PASS|FAIL|PARTIAL)"; "i"))
69
+ )] | last | { author: .user.login, body: .body[0:500] }'
70
+ ```
71
+
72
+ Status values (in comment body as `Status: <VALUE>`): `PASS`, `FAIL`, `PARTIAL`.
73
+ No QA comment found → repo doesn't use qa-changes, not blocking.
74
+
75
+ ## Retriggering the stack
76
+
77
+ All layers in the verification stack are automated. After every fix+push you
78
+ should retrigger them — there is no human to spam:
79
+
80
+ - **CI** — retriggered automatically by a new push. If you want to retry
81
+ without a new commit: `gh run rerun <run-id> --failed`.
82
+ - **Code-review bot** — re-request review so it reviews the new SHA:
83
+ ```bash
84
+ gh api -X POST "repos/{owner}/{repo}/pulls/{number}/requested_reviewers" \
85
+ -f 'reviewers[]=openhands-agent'
86
+ ```
87
+ Or add/re-add the `review-this` label if the workflow triggers on labels.
88
+ - **QA bot** — typically retriggered by a new push. If it isn't, check the
89
+ workflow trigger and re-request or re-label as needed.
90
+
91
+ These are bots. Retrigger freely on every iteration.
92
+
93
+ ## Bot login matching
94
+
95
+ The `jq` patterns use `test("openhands|all-hands-bot"; "i")` to match bot
96
+ logins case-insensitively. Adjust the regex if the repo uses a different bot.
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "jupyter",
3
+ "version": "1.0.0",
4
+ "description": "Read, modify, execute, and convert Jupyter notebooks programmatically. Use when working with .ipynb files for data science workflows, including editing cells, clearing outputs, or converting to oth...",
5
+ "author": {
6
+ "name": "OpenHands",
7
+ "email": "contact@all-hands.dev"
8
+ },
9
+ "homepage": "https://github.com/OpenHands/extensions",
10
+ "repository": "https://github.com/OpenHands/extensions",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "jupyter",
14
+ "notebook",
15
+ "ipynb",
16
+ "data-science"
17
+ ]
18
+ }
@@ -0,0 +1,55 @@
1
+ # Jupyter
2
+
3
+ Read, modify, execute, and convert Jupyter notebooks programmatically. Use when working with .ipynb files for data science workflows, including editing cells, clearing outputs, or converting to other formats.
4
+
5
+ ## Triggers
6
+
7
+ This skill is activated by the following keywords:
8
+
9
+ - `ipynb`
10
+ - `jupyter`
11
+
12
+ ## Details
13
+
14
+ # Jupyter Notebook Guide
15
+
16
+ Notebooks are JSON files. Cells are in `nb['cells']`, each has `source` (list of strings) and `cell_type` ('code', 'markdown', or 'raw').
17
+
18
+ ## Modifying Notebooks
19
+ ```python
20
+ import json
21
+ with open('notebook.ipynb') as f:
22
+ nb = json.load(f)
23
+ # Modify nb['cells'][i]['source'], then:
24
+ with open('notebook.ipynb', 'w') as f:
25
+ json.dump(nb, f, indent=1)
26
+ ```
27
+
28
+ ## Executing & Converting
29
+ ```bash
30
+ jupyter nbconvert --to notebook --execute --inplace notebook.ipynb # Execute in place
31
+ jupyter nbconvert --to html notebook.ipynb # Convert to HTML
32
+ jupyter nbconvert --to script notebook.ipynb # Convert to Python
33
+ jupyter nbconvert --to markdown notebook.ipynb # Convert to Markdown
34
+ ```
35
+
36
+ ## Finding Code
37
+ ```bash
38
+ grep -n "search_term" notebook.ipynb
39
+ ```
40
+
41
+ ## Cell Structure
42
+ ```python
43
+ # Code cell
44
+ {"cell_type": "code", "execution_count": None, "metadata": {}, "outputs": [], "source": ["code\n"]}
45
+ # Markdown cell
46
+ {"cell_type": "markdown", "metadata": {}, "source": ["# Title\n"]}
47
+ ```
48
+
49
+ ## Clear Outputs
50
+ ```python
51
+ for cell in nb['cells']:
52
+ if cell['cell_type'] == 'code':
53
+ cell['outputs'] = []
54
+ cell['execution_count'] = None
55
+ ```