@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,52 @@
1
+ # OpenHands Plugin
2
+
3
+ Unified plugin that bundles all OpenHands capabilities — CLI, REST API, Automations, and Software Agent SDK.
4
+
5
+ ## What's included
6
+
7
+ | Component | Source | Description |
8
+ |---|---|---|
9
+ | **CLI integration** | `scripts/run.sh` | Send tasks to Cloud via `openhands cloud` with automatic install and auth |
10
+ | **Cloud REST API (V1)** | `skills/openhands-api` | Start/inspect conversations, delegate parallel work, access sandboxes |
11
+ | **Automations API** | `skills/openhands-automation` | Create and manage scheduled cron tasks (prompt and plugin presets) |
12
+ | **Software Agent SDK** | `skills/openhands-sdk` | Build agents with the Python SDK — custom tools, LLMs, conversations, delegation |
13
+
14
+ ## Quick start
15
+
16
+ ### Via CLI (recommended)
17
+
18
+ ```bash
19
+ ./scripts/run.sh "Fix the broken login page CSS"
20
+ ```
21
+
22
+ The script checks for the `openhands` CLI, installs it if needed, authenticates, sends the task, and opens the resulting conversation URL.
23
+
24
+ ### Via REST API
25
+
26
+ See `skills/openhands-api` for the full Cloud REST API reference.
27
+
28
+ ### Via Automations
29
+
30
+ See `skills/openhands-automation` for the full Automations API reference.
31
+
32
+ ## File structure
33
+
34
+ ```
35
+ plugins/openhands/
36
+ ├── SKILL.md # Plugin entry point (agent-facing)
37
+ ├── README.md # This file (human-facing)
38
+ ├── scripts/
39
+ │ └── run.sh # CLI wrapper (install, auth, send, open)
40
+ └── skills/
41
+ ├── openhands-api -> skills/openhands-api # Cloud REST API skill
42
+ ├── openhands-automation -> skills/openhands-automation # Automations skill
43
+ └── openhands-sdk -> skills/openhands-sdk # Software Agent SDK skill
44
+ ```
45
+
46
+ ## Bundled skills
47
+
48
+ The individual skills are also usable standalone:
49
+
50
+ - **`skills/openhands-api`** — Cloud REST API, Python/TypeScript clients, event debugging
51
+ - **`skills/openhands-automation`** — Automations presets, CRUD, cron scheduling
52
+ - **`skills/openhands-sdk`** — Software Agent SDK: building agents, custom tools, LLM config, sub-agents, MCP, security
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: openhands
3
+ description: >-
4
+ Unified OpenHands plugin — bundles the OpenHands Cloud CLI, Cloud REST API
5
+ (openhands-api), Automations (openhands-automation), and Software Agent SDK
6
+ reference (openhands-sdk) into a single plugin. Use this when you need to
7
+ interact with OpenHands Cloud or build agents with the SDK.
8
+ triggers:
9
+ - /openhands-cloud
10
+ ---
11
+
12
+ # OpenHands — Cloud, API, Automations & SDK
13
+
14
+ This plugin bundles all OpenHands capabilities under one roof:
15
+
16
+ | Capability | Skill | When to use |
17
+ |---|---|---|
18
+ | **CLI** (`openhands cloud`) | — (plugin-only) | Send a task to Cloud and get a conversation URL |
19
+ | **Cloud REST API (V1)** | `openhands-api` | Start/inspect conversations, delegate work, access sandboxes |
20
+ | **Automations API** | `openhands-automation` | Create and manage scheduled cron tasks |
21
+ | **Software Agent SDK** | `openhands-sdk` | Build agents with the Python SDK — custom tools, LLMs, conversations, delegation |
22
+
23
+ Each capability is also available as a standalone skill under `skills/`.
24
+ This plugin provides a unified entry point and the CLI integration script.
25
+
26
+ ## Authentication — try CLI first
27
+
28
+ 1. **Check if the OpenHands CLI is installed:**
29
+
30
+ ```bash
31
+ command -v openhands &>/dev/null && echo "CLI available" || echo "CLI not found"
32
+ ```
33
+
34
+ 2. **If CLI is available**, use it — it manages auth and API keys automatically.
35
+ 3. **If CLI is not available**, check for an API key:
36
+ - Preferred env var: `OPENHANDS_CLOUD_API_KEY`
37
+ - Backward-compatible: `OPENHANDS_API_KEY`
38
+ - Header: `Authorization: Bearer <key>`
39
+ 4. **If neither exists**, ask the user whether they'd like to install the CLI:
40
+ ```bash
41
+ uv tool install openhands --python 3.12
42
+ openhands cloud # starts auth flow
43
+ ```
44
+
45
+ ## Quick start — send a task via CLI
46
+
47
+ ```bash
48
+ ./scripts/run.sh "Investigate flaky tests in tests/test_api.py"
49
+ ```
50
+
51
+ The script checks for the CLI, installs it if needed, sends the task, and opens the resulting conversation URL.
52
+
53
+ If the script exits with code `2` (`AUTH_REQUIRED`), ask the user to complete authentication in the browser, then re-run.
54
+
55
+ ## Bundled skills
56
+
57
+ For full API references, see the individual skills:
58
+
59
+ - **`skills/openhands-api`** — Cloud REST API: endpoints, polling, delegation, events, debugging, Python/TypeScript clients
60
+ - **`skills/openhands-automation`** — Automations API: presets, CRUD, cron schedules, plugin preset, custom automations
61
+ - **`skills/openhands-sdk`** — Software Agent SDK: building agents, custom tools, LLM config, conversations, sub-agent delegation, MCP, security, persistence
@@ -0,0 +1,55 @@
1
+ ---
2
+ allowed-tools: Bash(curl:*), Bash(cat:*), Bash(echo:*), Bash(jq:*)
3
+ description: Create a new OpenHands automation with cron scheduling
4
+ ---
5
+
6
+ # Create OpenHands Automation
7
+
8
+ Guide the user through creating a new automation interactively.
9
+
10
+ **API Base URL:** `https://app.all-hands.dev/api/automation/v1`
11
+
12
+ **Full API Reference:** See [skills/openhands-automation/SKILL.md](../../../skills/openhands-automation/SKILL.md) for complete documentation.
13
+
14
+ > **⚠️ CRITICAL:** Always use the **preset/prompt endpoint** to create automations. Do NOT write custom SDK scripts or create tarballs unless the user explicitly requests it. If the prompt approach cannot meet the user's needs, explain the available options and let them choose.
15
+
16
+ ## Workflow
17
+
18
+ ### Step 1: Understand What the User Wants
19
+
20
+ Ask the user to describe what the automation should do. In most cases, the user's description can be used directly as the prompt for the preset endpoint.
21
+
22
+ ### Step 2: Collect Required Fields
23
+
24
+ 1. **Name**: Descriptive name for the automation (1-500 characters)
25
+ 2. **Prompt**: What the automation should do — use the user's description
26
+ 3. **Cron Schedule**: e.g., `0 9 * * 1` (Mondays at 9 AM UTC)
27
+ 4. **Timezone** (optional): IANA timezone (default: UTC)
28
+ 5. **Timeout** (optional): Max execution time in seconds
29
+
30
+ ### Step 3: Create the Automation
31
+
32
+ ```bash
33
+ curl -X POST "https://app.all-hands.dev/api/automation/v1/preset/prompt" \
34
+ -H "Authorization: Bearer ${OPENHANDS_API_KEY}" \
35
+ -H "Content-Type: application/json" \
36
+ -d '{
37
+ "name": "USER_PROVIDED_NAME",
38
+ "prompt": "USER_PROVIDED_DESCRIPTION_OF_WHAT_TO_DO",
39
+ "trigger": {
40
+ "type": "cron",
41
+ "schedule": "USER_PROVIDED_SCHEDULE",
42
+ "timezone": "USER_PROVIDED_TIMEZONE_OR_UTC"
43
+ }
44
+ }'
45
+ ```
46
+
47
+ ### Step 4: Present Result
48
+
49
+ **On success (HTTP 201):** Show automation ID, name, schedule, and status.
50
+
51
+ **On error:** Show the error message from the API response.
52
+
53
+ ### If the Preset Is Not Enough
54
+
55
+ If the user needs custom dependencies, a non-Python entrypoint, or full control over the SDK code, explain the options and let them decide. If they choose a custom automation, refer to [references/custom-automation.md](../../../skills/openhands-automation/references/custom-automation.md) for the tarball upload and custom creation workflow.
@@ -0,0 +1,8 @@
1
+ ---
2
+ # auto-generated by sync_extensions.py
3
+ description: Unified OpenHands plugin — bundles the OpenHands Cloud CLI, Cloud REST API (openhands-api), Automations (openhands-automation), and Software Agent SDK reference (openhands-sdk) into a single plugin. Use this when you need to interact with OpenHands Cloud or build agents with the SDK.
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,69 @@
1
+ #!/bin/bash
2
+ # OpenHands Cloud — install CLI, authenticate, send a task, open conversation URL
3
+ # Usage: run.sh "your message here"
4
+ # Exit codes: 0 = success, 1 = error, 2 = auth required (re-run after user authenticates)
5
+
6
+ set -o pipefail
7
+
8
+ MESSAGE="$1"
9
+
10
+ if [ -z "$MESSAGE" ]; then
11
+ echo "ERROR: No message provided"
12
+ echo "Usage: run.sh \"your message here\""
13
+ exit 1
14
+ fi
15
+
16
+ # Step 1: Ensure the OpenHands CLI is installed
17
+ if ! command -v openhands &> /dev/null; then
18
+ echo "OpenHands CLI not found. Installing..."
19
+ uv tool install openhands --python 3.12
20
+ if [ $? -ne 0 ]; then
21
+ echo "ERROR: Failed to install OpenHands CLI"
22
+ exit 1
23
+ fi
24
+ echo "OpenHands CLI installed successfully."
25
+
26
+ # Fresh install — start authentication flow
27
+ echo ""
28
+ echo "Authentication required. Starting OpenHands Cloud authentication..."
29
+ openhands cloud
30
+ echo ""
31
+ echo "AUTH_REQUIRED: Please confirm you have authenticated, then this script will be re-run."
32
+ exit 2
33
+ fi
34
+
35
+ # Step 2: Send the task
36
+ echo "Sending task to OpenHands Cloud..."
37
+ OUTPUT=$(openhands cloud -t "$MESSAGE" 2>&1)
38
+ EXIT_CODE=$?
39
+
40
+ # Check for authentication failures
41
+ if [ $EXIT_CODE -ne 0 ] || echo "$OUTPUT" | grep -qi "auth\|login\|unauthorized\|token"; then
42
+ if echo "$OUTPUT" | grep -qi "auth\|login\|unauthorized\|token\|credential"; then
43
+ echo "Authentication required. Starting OpenHands Cloud authentication..."
44
+ openhands cloud
45
+ echo ""
46
+ echo "AUTH_REQUIRED: Please confirm you have authenticated, then this script will be re-run."
47
+ exit 2
48
+ else
49
+ echo "ERROR: Command failed"
50
+ echo "$OUTPUT"
51
+ exit 1
52
+ fi
53
+ fi
54
+
55
+ # Step 3: Extract URL and open in browser
56
+ echo "$OUTPUT"
57
+
58
+ URL=$(echo "$OUTPUT" | grep -oE 'https?://[^[:space:]]+' | head -1 | sed 's/[,;)]$//')
59
+
60
+ if [ -n "$URL" ]; then
61
+ echo ""
62
+ echo "Opening $URL in browser..."
63
+ case "$(uname -s)" in
64
+ Darwin) open "$URL" ;;
65
+ Linux) xdg-open "$URL" 2>/dev/null || sensible-browser "$URL" 2>/dev/null || echo "Please open the URL manually: $URL" ;;
66
+ MINGW*|CYGWIN*|MSYS*) start "$URL" ;;
67
+ *) echo "Please open the URL manually: $URL" ;;
68
+ esac
69
+ fi
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "pr-review",
3
+ "version": "0.1.0",
4
+ "description": "Automated PR code review — analyzes diffs and posts inline review comments via the GitHub API",
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": ["pr-review", "code-review", "github", "automation"]
13
+ }
@@ -0,0 +1,393 @@
1
+ # PR Review Plugin
2
+
3
+ Automated pull request review using OpenHands agents. This plugin provides GitHub workflows that automatically review PRs with detailed, inline code review comments.
4
+
5
+ ## Quick Start
6
+
7
+ Copy both workflow files to your repository:
8
+
9
+ ```bash
10
+ mkdir -p .github/workflows
11
+ curl -o .github/workflows/pr-review-by-openhands.yml \
12
+ https://raw.githubusercontent.com/OpenHands/extensions/main/.github/workflows/pr-review-by-openhands.yml
13
+ curl -o .github/workflows/pr-review-evaluation.yml \
14
+ https://raw.githubusercontent.com/OpenHands/extensions/main/.github/workflows/pr-review-evaluation.yml
15
+ ```
16
+
17
+ Then configure the required secrets (see [Installation](#installation) below).
18
+
19
+ ## Features
20
+
21
+ - **Automated PR Reviews**: Triggered when PRs are opened, marked ready, or when a reviewer is requested
22
+ - **Inline Code Comments**: Posts review comments directly on specific lines of code
23
+ - **Unified Review Style**: Rigorous code review combining pragmatic engineering analysis with data structure and simplicity focus
24
+ - **A/B Testing**: Support for testing multiple LLM models
25
+ - **Review Context Awareness**: Considers previous reviews and unresolved threads
26
+ - **Evidence Enforcement**: Optional check that PR descriptions include concrete end-to-end proof the code works, not just test output
27
+ - **Sub-Agent Delegation**: Split large PR reviews across multiple sub-agents, one per file, then consolidate findings (see [Known Limitations](#known-limitations-sub-agent-delegation))
28
+ - **Observability**: Optional Laminar integration for tracing and evaluation
29
+
30
+ ## Plugin Contents
31
+
32
+ ```
33
+ plugins/pr-review/
34
+ ├── README.md # This file
35
+ ├── action.yml # Composite GitHub Action
36
+ ├── skills/ # Symbolic links to review skills
37
+ │ ├── code-review -> ../../../skills/code-review
38
+ │ └── github-pr-review -> ../../../skills/github-pr-review
39
+ ├── workflows/ # Example GitHub workflow files
40
+ │ ├── pr-review-by-openhands.yml
41
+ │ └── pr-review-evaluation.yml
42
+ └── scripts/ # Python scripts for review execution
43
+ ├── agent_script.py # Main PR review agent script
44
+ ├── prompt.py # Prompt template for reviews
45
+ └── evaluate_review.py # Evaluation script for merged/closed PRs
46
+ ```
47
+
48
+ ## Installation
49
+
50
+ ### 1. Copy the Workflow Files
51
+
52
+ Copy the workflow files to your repository's `.github/workflows/` directory:
53
+
54
+ ```bash
55
+ mkdir -p .github/workflows
56
+ curl -o .github/workflows/pr-review-by-openhands.yml \
57
+ https://raw.githubusercontent.com/OpenHands/extensions/main/.github/workflows/pr-review-by-openhands.yml
58
+ curl -o .github/workflows/pr-review-evaluation.yml \
59
+ https://raw.githubusercontent.com/OpenHands/extensions/main/.github/workflows/pr-review-evaluation.yml
60
+ ```
61
+
62
+ ### 2. Configure Secrets
63
+
64
+ Add the following secrets in your repository settings (**Settings → Secrets and variables → Actions**):
65
+
66
+ | Secret | Required | Description |
67
+ |--------|----------|-------------|
68
+ | `LLM_API_KEY` | Yes for `api-key` mode | API key for your LLM provider |
69
+ | `GITHUB_TOKEN` | Auto | Provided automatically by GitHub Actions |
70
+ | `LMNR_SKILLS_API_KEY` | No | Laminar API key (org-level secret; mapped to `LMNR_PROJECT_API_KEY` env var in workflows) |
71
+
72
+ **Note**: For repositories that need to post review comments from a bot account, use `ALLHANDS_BOT_GITHUB_PAT` instead of `GITHUB_TOKEN`.
73
+
74
+ ### 3. Customize the Workflow (Optional)
75
+
76
+ Edit the workflow file to customize:
77
+
78
+ ```yaml
79
+ - name: Run PR Review
80
+ uses: OpenHands/extensions/plugins/pr-review@main
81
+ with:
82
+ # LLM model(s) - comma-separated for A/B testing
83
+ llm-model: anthropic/claude-sonnet-4-5-20250929
84
+
85
+ # Optional: Custom LLM endpoint
86
+ # llm-base-url: https://your-llm-proxy.example.com
87
+
88
+ # [DEPRECATED] review-style is no longer used; standard and roasted are merged
89
+ # review-style: roasted
90
+
91
+ # Optional: require an Evidence section proving the code works end-to-end
92
+ # require-evidence: 'true'
93
+
94
+ # Pin to a specific version (tag, branch, or commit SHA)
95
+ extensions-version: main
96
+
97
+ # Secrets
98
+ llm-api-key: ${{ secrets.LLM_API_KEY }}
99
+ github-token: ${{ secrets.GITHUB_TOKEN }}
100
+
101
+ # Optional: Enable Laminar observability
102
+ # lmnr-api-key: ${{ secrets.LMNR_PROJECT_API_KEY }}
103
+ ```
104
+
105
+ #### Experimental: ACP review backend
106
+
107
+ Use `agent-kind: acp` to run the reviewer through an ACP-compatible
108
+ agent server. In this mode, OpenHands still loads review skills and plugin
109
+ prompt context, but the ACP server owns model access, authentication, and tool
110
+ execution. Install the ACP CLI and configure its authentication in the runner
111
+ environment before invoking this action. Sub-agent delegation is disabled in ACP
112
+ mode because delegation depends on OpenHands agent runtime details such as
113
+ TaskToolSet, agent registration, and tool routing that ACP servers do not expose
114
+ consistently.
115
+
116
+ ```yaml
117
+ - name: Run PR Review
118
+ uses: OpenHands/extensions/plugins/pr-review@main
119
+ with:
120
+ agent-kind: acp
121
+ acp-command: your-acp-server
122
+ llm-model: your-acp-model
123
+ github-token: ${{ secrets.GITHUB_TOKEN }}
124
+ ```
125
+
126
+ **Authentication.** ACP servers typically support two authentication methods.
127
+ The simplest is API key authentication: store your provider API key as a
128
+ repository secret (e.g. `OPENAI_API_KEY` or `ANTHROPIC_API_KEY`) and pass it to the ACP server as an
129
+ environment variable in the workflow step. Most ACP servers will pick up the
130
+ standard provider key automatically. Alternatively, subscription-based tools
131
+ such as Codex support device-code login, which lets you use a ChatGPT
132
+ Plus/Pro subscription without a separate API key - see the example below.
133
+
134
+ Codex ACP example for a runner that stores Codex auth in a GitHub secret.
135
+ Create `CODEX_AUTH_JSON_B64` from a trusted machine where the Codex CLI is
136
+ installed, then complete device-code login:
137
+
138
+ ```bash
139
+ codex login --device-auth
140
+ codex login status
141
+ ```
142
+
143
+ After login succeeds, encode the generated auth file:
144
+
145
+ ```bash
146
+ base64 -w 0 "$HOME/.codex/auth.json"
147
+ ```
148
+
149
+ Store the printed value as the repository or organization secret
150
+ `CODEX_AUTH_JSON_B64`. This secret contains your Codex authentication material;
151
+ limit it to trusted self-hosted runners and avoid exposing it to workflows that
152
+ run untrusted pull request code.
153
+
154
+ ```yaml
155
+ - name: Restore Codex auth
156
+ env:
157
+ CODEX_AUTH_JSON_B64: ${{ secrets.CODEX_AUTH_JSON_B64 }}
158
+ run: |
159
+ mkdir -p "$HOME/.codex"
160
+ printf '%s' "$CODEX_AUTH_JSON_B64" | base64 -d > "$HOME/.codex/auth.json"
161
+ chmod 600 "$HOME/.codex/auth.json"
162
+
163
+ - name: Run PR Review
164
+ uses: OpenHands/extensions/plugins/pr-review@main
165
+ with:
166
+ agent-kind: acp
167
+ acp-command: npx -y @zed-industries/codex-acp@0.12.0
168
+ llm-model: gpt-5.5
169
+ github-token: ${{ secrets.GITHUB_TOKEN }}
170
+
171
+ - name: Cleanup Codex auth
172
+ if: always()
173
+ run: rm -f "$HOME/.codex/auth.json"
174
+ ```
175
+
176
+ ### 4. Create the Review Label (Optional)
177
+
178
+ Create a `review-this` label for manual review triggers:
179
+
180
+ 1. Go to **Issues → Labels** in your repository
181
+ 2. Click **New label**
182
+ 3. Name: `review-this`
183
+ 4. Description: `Trigger OpenHands PR review`
184
+ 5. Click **Create label**
185
+
186
+ ## Usage
187
+
188
+ ### Automatic Triggers
189
+
190
+ PR reviews are automatically triggered when:
191
+
192
+ 1. A new non-draft PR is opened (by non-first-time contributors)
193
+ 2. A draft PR is marked as ready for review
194
+ 3. The `review-this` label is added
195
+ 4. `openhands-agent` or `all-hands-bot` is requested as a reviewer
196
+
197
+ ### Requesting a Review
198
+
199
+ **Option 1: Request as Reviewer (Recommended)**
200
+ 1. Open the PR
201
+ 2. Click **Reviewers** in the sidebar
202
+ 3. Select `openhands-agent` as a reviewer
203
+
204
+ **Option 2: Add Label**
205
+ 1. Open the PR
206
+ 2. Add the `review-this` label
207
+
208
+ ## Action Inputs
209
+
210
+ | Input | Required | Default | Description |
211
+ |-------|----------|---------|-------------|
212
+ | `agent-kind` | No | `openhands` | Review backend: `openhands` for the standard SDK Agent or `acp` for an ACP-compatible agent server |
213
+ | `llm-model` | No | `anthropic/claude-sonnet-4-5-20250929` | LLM model(s), comma-separated for A/B testing. In ACP mode this is passed to the ACP server when supported. |
214
+ | `acp-command` | Yes for `acp` mode | `''` | Command used to start the ACP server. The command must already be available in the runner environment or be runnable through a package manager. Examples: `npx -y @zed-industries/codex-acp@0.12.0`, `codex-acp`, `claude-agent-acp`, `npx -y @agentclientprotocol/claude-agent-acp`. |
215
+ | `acp-prompt-timeout` | No | `'1800'` | Timeout in seconds for one ACP prompt turn |
216
+ | `llm-base-url` | No | `''` | Custom LLM endpoint URL |
217
+ | `review-style` | No | `roasted` | **[DEPRECATED]** Previously chose between `standard` and `roasted` review styles. Now ignored — the styles have been merged into a single unified skill. |
218
+ | `require-evidence` | No | `'false'` | Require the reviewer to enforce an `Evidence` section in the PR description with end-to-end proof: screenshots/videos for frontend work, commands and runtime output for backend or scripts, and an agent conversation link when applicable. Test output alone does not qualify. |
219
+ | `use-sub-agents` | No | `'false'` | Enable sub-agent delegation for file-level reviews in `openhands` mode. The main agent acts as a coordinator that delegates per-file review work to `file_reviewer` sub-agents via the SDK TaskToolSet, then consolidates findings into a single PR review. Useful for large PRs with many changed files. **Disabled by default** due to high token costs and potential timeouts (see [#208](https://github.com/OpenHands/extensions/issues/208)). Set to `'true'` to opt in. Ignored in ACP mode. |
220
+ | `collect-feedback` | No | `'true'` | Append a short feedback footer to the main automated review body asking maintainers to react with thumbs up/down. The evaluation workflow records these reaction counts for analysis. |
221
+ | `extensions-repo` | No | `OpenHands/extensions` | Extensions repository |
222
+ | `extensions-version` | No | `main` | Git ref (tag, branch, or SHA) |
223
+ | `openhands-sdk-package` | No | `openhands-sdk` | Package spec passed to `uv --with`; override only when pinning a specific SDK build for testing or rollout control |
224
+ | `llm-api-key` | Yes for `openhands` mode | - | LLM API key for the OpenHands agent. Ignored in ACP mode. |
225
+ | `github-token` | Yes | - | GitHub token for API access |
226
+ | `lmnr-api-key` | No | `''` | Laminar API key for observability |
227
+ | `enable-uv-cache` | No | `'false'` | Enable setup-uv's GitHub Actions cache for Python deps. Default `false` for security (see [Caching and Security](#caching-and-security)). |
228
+
229
+ ## Caching and Security
230
+
231
+ Python dependency caching is **disabled by default**. `uv run --with ...` re-downloads OpenHands SDK and its transitive deps on every run, which is slow but safe.
232
+
233
+ **Why it's off by default:** Prompt injection can coerce the reviewer into executing arbitrary commands during the review. A compromised review run could write a malicious wheel into the shared GitHub Actions cache. Any later, higher-privilege workflow in the same repository that hits the same cache key would silently execute the attacker's code — a supply-chain pivot.
234
+
235
+ **Enabling it is safe when:**
236
+ - The runner is single-tenant (e.g. your own self-hosted runner, not shared with untrusted workflows).
237
+ - You do not run other privileged workflows in the same repository that would consume setup-uv's cache.
238
+ - You accept the residual risk in exchange for faster runs / lower disk writes.
239
+
240
+ **Self-hosted runners:** Consider mounting a host-level uv cache volume (e.g. `/home/runner/.cache` as a Docker volume) instead of — or in addition to — this option. A local volume is faster than a round trip to GHA cache storage and does not cross any trust boundary.
241
+
242
+ ## Known Limitations: Sub-Agent Delegation
243
+
244
+ The following are known constraints of the sub-agent delegation feature. These are acceptable tradeoffs for the improved review depth it provides, and none pose a security risk — in the worst case a review may be less thorough than expected, which the single-agent fallback (`use-sub-agents: 'false'`) addresses.
245
+
246
+ - **LLM-driven JSON parsing**: The coordinator agent relies on the LLM to parse and merge JSON responses from sub-agents. There is no code-level validation of sub-agent output, so malformed responses may cause incomplete reviews.
247
+ - **Potential information loss during consolidation**: When merging findings from multiple sub-agents, the coordinator may lose or deduplicate findings imperfectly, especially for cross-file issues.
248
+ - **Sub-agents have read-only tools**: File reviewer sub-agents have access to `terminal` and `file_editor` for inspecting full source files and surrounding context, but they cannot query the GitHub API or post reviews — only the coordinator handles GitHub interaction.
249
+
250
+ To opt out, set `use-sub-agents: 'false'` in your workflow.
251
+
252
+ ## A/B Testing Multiple Models
253
+
254
+ Test different LLM models by providing a comma-separated list:
255
+
256
+ ```yaml
257
+ llm-model: 'anthropic/claude-sonnet-4-5-20250929,openai/gpt-4o,anthropic/claude-3-5-haiku-20241022'
258
+ ```
259
+
260
+ One model is randomly selected for each review. When Laminar observability is enabled, the selected model is logged for comparison.
261
+
262
+ ## Observability with Laminar
263
+
264
+ ### Setting Up Laminar
265
+
266
+ 1. Create a project at [Laminar](https://www.lmnr.ai/)
267
+ 2. Copy your project API key
268
+ 3. Add `LMNR_PROJECT_API_KEY` to your repository secrets
269
+ 4. Uncomment the `lmnr-api-key` line in your workflow
270
+
271
+ ### What Gets Traced
272
+
273
+ - **Review Trace**: Full agent execution including diff analysis, review generation, and comment posting
274
+ - **Metadata**: PR number, repository, review style, model used
275
+ - **Feedback**: Optional thumbs up/down reactions on the footer appended to the generated PR review body
276
+ - **Evaluation Trace**: (Optional) Created when PR is closed/merged to measure review effectiveness
277
+
278
+ ### Review Evaluation
279
+
280
+ The evaluation workflow (`pr-review-evaluation.yml`) runs when PRs are closed and:
281
+ 1. Downloads the review trace artifact
282
+ 2. Fetches final PR state and comments
283
+ 3. Creates an evaluation span in Laminar
284
+ 4. Scores the review based on engagement metrics
285
+
286
+ ### Laminar Dashboard
287
+
288
+ In your Laminar dashboard, you can:
289
+ - Filter traces by `pr-review` or `pr-review-evaluation` tags
290
+ - Compare review effectiveness across models (A/B testing)
291
+ - Analyze engagement metrics (human responses to agent comments)
292
+ - Set up signals for automated quality scoring
293
+
294
+ ## Customizing Review Guidelines
295
+
296
+ Instead of forking the scripts, add custom guidelines to your repository:
297
+
298
+ ### Option 1: Custom Code Review Skill
299
+
300
+ Create `.agents/skills/custom-codereview-guide.md`:
301
+
302
+ ```markdown
303
+ ---
304
+ name: custom-codereview-guide
305
+ description: Custom code review guidelines for my project
306
+ triggers:
307
+ - /codereview
308
+ ---
309
+
310
+ # My Project Code Review Guidelines
311
+
312
+ You are a code reviewer for this project. Follow these guidelines:
313
+
314
+ ## Review Focus
315
+ - Security vulnerabilities and data handling
316
+ - API contract compatibility
317
+ - Test coverage for new functionality
318
+
319
+ ## Communication Style
320
+ - Be direct and constructive
321
+ - Use GitHub suggestion syntax for code fixes
322
+ ```
323
+
324
+ Use a unique skill name (for example `custom-codereview-guide`) to **supplement** the default public `code-review` skill,
325
+ rather than overriding it. Keep `/codereview` as the trigger if you want this guidance applied in PR review runs.
326
+
327
+ ### Option 2: Repository AGENTS.md
328
+
329
+ Add project-specific context to `AGENTS.md` at your repository root:
330
+
331
+ ```markdown
332
+ # Project Context
333
+
334
+ This is a Python web application using FastAPI.
335
+
336
+ ## Code Standards
337
+ - All public functions must have docstrings
338
+ - Use type hints for function signatures
339
+ - Follow PEP 8 style guidelines
340
+ ```
341
+
342
+ ## Migration from software-agent-sdk
343
+
344
+ If you were previously using workflows that referenced `OpenHands/software-agent-sdk`, update them to use this extensions repository:
345
+
346
+ **Before:**
347
+ ```yaml
348
+ uses: OpenHands/software-agent-sdk/.github/actions/pr-review@main
349
+ ```
350
+
351
+ **After:**
352
+ ```yaml
353
+ uses: OpenHands/extensions/plugins/pr-review@main
354
+ ```
355
+
356
+ Also update any `sdk-repo` and `sdk-version` inputs to `extensions-repo` and `extensions-version`.
357
+
358
+ ## Troubleshooting
359
+
360
+ ### Review Not Triggered
361
+
362
+ 1. Check that the workflow file is in `.github/workflows/`
363
+ 2. Verify the PR author association (first-time contributors need manual trigger)
364
+ 3. Ensure secrets are configured correctly
365
+
366
+ ### Review Comments Not Appearing
367
+
368
+ 1. Check the `GITHUB_TOKEN` has write permissions for pull requests
369
+ 2. Review the workflow logs for API errors
370
+ 3. Verify the LLM API key is valid
371
+
372
+ ### Rate Limiting
373
+
374
+ If you see rate limit errors:
375
+ 1. Reviews are automatically paginated to avoid limits
376
+ 2. Consider using a dedicated bot token for high-volume repositories
377
+
378
+ ## Security
379
+
380
+ - Uses `pull_request_target` when you need secrets for fork PR reviews; apply strict maintainer-controlled triggers and checkout safeguards
381
+ - Keeps GitHub Actions caching disabled in privileged review workflows to avoid cache-poisoning pivots from prompt injection
382
+ - For lower-trust or comment-only smoke-test setups, prefer `pull_request` to reduce privilege by default
383
+ - Only triggers for trusted contributors or when maintainers add labels/reviewers
384
+ - PR code is checked out explicitly; secrets are not exposed to PR code
385
+ - Credentials are not persisted during checkout
386
+
387
+ ## Contributing
388
+
389
+ See the main [extensions repository](https://github.com/OpenHands/extensions) for contribution guidelines.
390
+
391
+ ## License
392
+
393
+ This plugin is part of the OpenHands extensions repository. See [LICENSE](../../LICENSE) for details.