@openhands/extensions 0.0.1-alpha → 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,252 @@
1
+ /*
2
+ OpenHands Cloud API (V1) minimal client.
3
+
4
+ Audience: AI agents.
5
+
6
+ App server (Cloud):
7
+ - Base: https://app.all-hands.dev
8
+ - Prefix: /api/v1
9
+ - Auth: Authorization: Bearer <OPENHANDS_CLOUD_API_KEY>
10
+
11
+ Agent server (sandbox runtime):
12
+ - Base: {agent_server_url}/api
13
+ - Auth: X-Session-API-Key: <session_api_key>
14
+
15
+ This is intentionally small and keeps responses mostly untyped (unknown/record)
16
+ so it is easy to adapt.
17
+ */
18
+
19
+ export type OpenHandsOptions = {
20
+ apiKey: string;
21
+ baseUrl?: string;
22
+ };
23
+
24
+ const AGENT_EVENTS_SEARCH_MAX_LIMIT = 100;
25
+
26
+
27
+ export class OpenHandsAPI {
28
+ private readonly apiKey: string;
29
+ private readonly baseUrl: string;
30
+
31
+ constructor(opts: OpenHandsOptions) {
32
+ if (!opts.apiKey) throw new Error("Missing apiKey");
33
+ this.apiKey = opts.apiKey;
34
+ this.baseUrl = (opts.baseUrl ?? "https://app.all-hands.dev").replace(/\/$/, "");
35
+ }
36
+
37
+ private get apiV1Url(): string {
38
+ return `${this.baseUrl}/api/v1`;
39
+ }
40
+
41
+ private async baseRequest<T>(
42
+ url: string,
43
+ init: RequestInit | undefined,
44
+ headers: Record<string, string>,
45
+ parseAs: "json" | "blob" = "json",
46
+ ): Promise<T> {
47
+ const res = await fetch(url, {
48
+ ...init,
49
+ headers: {
50
+ ...headers,
51
+ ...(init?.headers ?? {}),
52
+ },
53
+ });
54
+
55
+ if (!res.ok) {
56
+ const text = await res.text().catch(() => "");
57
+ throw new Error(`OpenHands API error ${res.status} ${res.statusText}: ${text}`);
58
+ }
59
+
60
+ if (parseAs === "blob") return (await res.blob()) as unknown as T;
61
+ return (await res.json()) as T;
62
+ }
63
+
64
+ private async request<T>(
65
+ url: string,
66
+ init?: RequestInit,
67
+ parseAs: "json" | "blob" = "json",
68
+ ): Promise<T> {
69
+ return await this.baseRequest(
70
+ url,
71
+ init,
72
+ { Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json" },
73
+ parseAs,
74
+ );
75
+ }
76
+
77
+ // -----------------------------
78
+ // App server endpoints
79
+ // -----------------------------
80
+
81
+ async usersMe(): Promise<Record<string, unknown>> {
82
+ return await this.request(`${this.apiV1Url}/users/me`, { method: "GET" });
83
+ }
84
+
85
+ async appConversationsSearch(limit = 20): Promise<Record<string, unknown>> {
86
+ const safeLimit = Number.isFinite(limit) ? Math.trunc(limit) : 1;
87
+ const params = new URLSearchParams({ limit: String(Math.max(1, safeLimit)) });
88
+ return await this.request(`${this.apiV1Url}/app-conversations/search?${params.toString()}`, {
89
+ method: "GET",
90
+ });
91
+ }
92
+
93
+ async appConversationsGetBatch(ids: string[]): Promise<Array<Record<string, unknown>>> {
94
+ if (ids.length === 0) return [];
95
+ const params = new URLSearchParams();
96
+ for (const id of ids) params.append("ids", id);
97
+ return await this.request(`${this.apiV1Url}/app-conversations?${params.toString()}`, {
98
+ method: "GET",
99
+ });
100
+ }
101
+
102
+ async conversationEventsCount(appConversationId: string): Promise<number> {
103
+ const res = await this.request<number>(
104
+ `${this.apiV1Url}/conversation/${encodeURIComponent(appConversationId)}/events/count`,
105
+ { method: "GET" },
106
+ );
107
+ return Number(res);
108
+ }
109
+
110
+ async appConversationDownloadZip(appConversationId: string): Promise<Blob> {
111
+ const url = `${this.apiV1Url}/app-conversations/${encodeURIComponent(appConversationId)}/download`;
112
+ return await this.request<Blob>(url, { method: "GET" }, "blob");
113
+ }
114
+
115
+ async appConversationStart(req: {
116
+ initialMessage: string;
117
+ selectedRepository?: string;
118
+ selectedBranch?: string;
119
+ title?: string;
120
+ run?: boolean;
121
+ }): Promise<Record<string, unknown>> {
122
+ // NOTE: In many deployments this returns a *start-task* object.
123
+ // `id` is usually the start_task_id; use `app_conversation_id` (if present)
124
+ // for `/download` and `/conversation/.../events/...` endpoints.
125
+ // If `app_conversation_id` is missing, fetch it via:
126
+ // GET /api/v1/app-conversations/start-tasks?ids=<start_task_id>
127
+
128
+ const payload: Record<string, unknown> = {
129
+ initial_message: {
130
+ role: "user",
131
+ // V1 expects `content` as an array of parts, even for a single text message.
132
+ content: [{ type: "text", text: req.initialMessage }],
133
+ run: req.run ?? true,
134
+ },
135
+ };
136
+ if (req.selectedRepository) payload.selected_repository = req.selectedRepository;
137
+ if (req.selectedBranch) payload.selected_branch = req.selectedBranch;
138
+ if (req.title) payload.title = req.title;
139
+
140
+ return await this.request(`${this.apiV1Url}/app-conversations`, {
141
+ method: "POST",
142
+ body: JSON.stringify(payload),
143
+ });
144
+ }
145
+
146
+ async appConversationsStartTasksGetBatch(ids: string[]): Promise<Array<Record<string, unknown>>> {
147
+ if (ids.length === 0) return [];
148
+ const params = new URLSearchParams();
149
+ for (const id of ids) params.append("ids", id);
150
+ return await this.request(`${this.apiV1Url}/app-conversations/start-tasks?${params.toString()}`, {
151
+ method: "GET",
152
+ });
153
+ }
154
+
155
+ // -----------------------------
156
+ // Agent server endpoints
157
+ // -----------------------------
158
+
159
+ private async agentRequest<T>(
160
+ agentServerUrl: string,
161
+ sessionApiKey: string,
162
+ path: string,
163
+ init?: RequestInit,
164
+ ): Promise<T> {
165
+ const base = agentServerUrl.replace(/\/$/, "");
166
+ const url = `${base}${path}`;
167
+ return await this.baseRequest(
168
+ url,
169
+ init,
170
+ { "X-Session-API-Key": sessionApiKey, "Content-Type": "application/json" },
171
+ "json",
172
+ );
173
+ }
174
+
175
+ private buildAgentEventFilterParams(opts?: {
176
+ timestampGte?: string;
177
+ timestampLt?: string;
178
+ kind?: string;
179
+ source?: string;
180
+ body?: string;
181
+ }): URLSearchParams {
182
+ const params = new URLSearchParams();
183
+ if (opts?.timestampGte) params.set("timestamp__gte", opts.timestampGte);
184
+ if (opts?.timestampLt) params.set("timestamp__lt", opts.timestampLt);
185
+ if (opts?.kind) params.set("kind", opts.kind);
186
+ if (opts?.source) params.set("source", opts.source);
187
+ if (opts?.body) params.set("body", opts.body);
188
+ return params;
189
+ }
190
+
191
+ async agentEventsCount(agentServerUrl: string, sessionApiKey: string, conversationId: string, opts?: {
192
+ timestampGte?: string;
193
+ timestampLt?: string;
194
+ kind?: string;
195
+ source?: string;
196
+ body?: string;
197
+ }): Promise<number> {
198
+ const qs = this.buildAgentEventFilterParams(opts).toString();
199
+ const suffix = qs ? `?${qs}` : "";
200
+
201
+ const n = await this.agentRequest<number>(
202
+ agentServerUrl,
203
+ sessionApiKey,
204
+ `/api/conversations/${encodeURIComponent(conversationId)}/events/count${suffix}`,
205
+ { method: "GET" },
206
+ );
207
+ return Number(n);
208
+ }
209
+
210
+ async agentEventsSearch(agentServerUrl: string, sessionApiKey: string, conversationId: string, opts?: {
211
+ limit?: number;
212
+ sortOrder?: "TIMESTAMP" | "TIMESTAMP_DESC";
213
+ timestampGte?: string;
214
+ timestampLt?: string;
215
+ kind?: string;
216
+ source?: string;
217
+ body?: string;
218
+ }): Promise<Record<string, unknown>> {
219
+ const params = this.buildAgentEventFilterParams(opts);
220
+
221
+ // Cap limit to keep responses small and consistent across clients.
222
+ const rawLimit = opts?.limit ?? 50;
223
+ const safeLimit = Number.isFinite(rawLimit) ? Math.trunc(rawLimit) : 1;
224
+ const limit = Math.max(1, Math.min(AGENT_EVENTS_SEARCH_MAX_LIMIT, safeLimit));
225
+ params.set("limit", String(limit));
226
+
227
+ if (opts?.sortOrder) params.set("sort_order", opts.sortOrder);
228
+
229
+ return await this.agentRequest<Record<string, unknown>>(
230
+ agentServerUrl,
231
+ sessionApiKey,
232
+ `/api/conversations/${encodeURIComponent(conversationId)}/events/search?${params.toString()}`,
233
+ { method: "GET" },
234
+ );
235
+ }
236
+
237
+ async agentExecuteBash(agentServerUrl: string, sessionApiKey: string, command: string, cwd?: string): Promise<Record<string, unknown>> {
238
+ const payload: Record<string, unknown> = { command, timeout: 30 };
239
+ if (cwd) payload.cwd = cwd;
240
+
241
+ return await this.agentRequest<Record<string, unknown>>(
242
+ agentServerUrl,
243
+ sessionApiKey,
244
+ `/api/bash/execute_bash_command`,
245
+ { method: "POST", body: JSON.stringify(payload) },
246
+ );
247
+ }
248
+ }
249
+
250
+
251
+ export type OpenHandsV1Options = OpenHandsOptions;
252
+ export { OpenHandsAPI as OpenHandsV1API };
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "openhands-automation",
3
+ "version": "1.0.0",
4
+ "description": "Create and manage OpenHands automations - scheduled tasks that run in sandboxes. Use the prompt preset to create automations from natural language, or manage existing automations.",
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
+ "automation",
14
+ "cron",
15
+ "scheduled-task",
16
+ "sandbox",
17
+ "openhands"
18
+ ]
19
+ }
@@ -0,0 +1,89 @@
1
+ # Automation Skill
2
+
3
+ Create and manage OpenHands automations — tasks that run in sandboxes on a cron schedule or triggered by webhook events (GitHub, custom services).
4
+
5
+ ## Triggers
6
+
7
+ This skill is activated by keywords:
8
+ - `automation` / `automations`
9
+ - `scheduled task`
10
+ - `cron job` / `cron schedule`
11
+ - `webhook` / `webhooks`
12
+ - `event trigger`
13
+ - `github event`
14
+ - `pull request automation`
15
+ - `issue automation`
16
+
17
+ ## Features
18
+
19
+ - **Prompt-based creation**: Create automations from a natural language prompt (recommended)
20
+ - **Event-triggered automations**: Trigger on GitHub events (PR opened, issue commented, push, etc.)
21
+ - **Custom webhooks**: Register webhooks for any service (Stripe, Slack, Linear, etc.)
22
+ - **JMESPath filters**: Match events based on payload content (labels, mentions, repos)
23
+ - **Automation management**: List, update, enable/disable, and delete automations
24
+ - **Manual dispatch**: Trigger automation runs on-demand
25
+ - **Custom automations**: For advanced users who need full control (see [references/custom-automation.md](references/custom-automation.md))
26
+
27
+ ## API Base URL
28
+
29
+ All automation endpoints are at: `https://app.all-hands.dev/api/automation/v1`
30
+
31
+ ## Quick Start
32
+
33
+ ### Cron-Triggered Automation
34
+
35
+ ```bash
36
+ curl -X POST "https://app.all-hands.dev/api/automation/v1/preset/prompt" \
37
+ -H "Authorization: Bearer ${OPENHANDS_API_KEY}" \
38
+ -H "Content-Type: application/json" \
39
+ -d '{
40
+ "name": "Daily Report",
41
+ "prompt": "Generate a daily status report and save it to the workspace",
42
+ "trigger": {"type": "cron", "schedule": "0 9 * * 1-5", "timezone": "UTC"}
43
+ }'
44
+ ```
45
+
46
+ ### Event-Triggered Automation (GitHub)
47
+
48
+ Respond to @openhands mentions in issue comments:
49
+
50
+ ```bash
51
+ curl -X POST "https://app.all-hands.dev/api/automation/v1/preset/prompt" \
52
+ -H "Authorization: Bearer ${OPENHANDS_API_KEY}" \
53
+ -H "Content-Type: application/json" \
54
+ -d '{
55
+ "name": "Mention Responder",
56
+ "prompt": "Analyze the issue context and respond helpfully",
57
+ "trigger": {
58
+ "type": "event",
59
+ "source": "github",
60
+ "on": "issue_comment.created",
61
+ "filter": "icontains(comment.body, '\''@openhands'\'')"
62
+ }
63
+ }'
64
+ ```
65
+
66
+ Auto-review PRs with the "openhands" label:
67
+
68
+ ```bash
69
+ curl -X POST "https://app.all-hands.dev/api/automation/v1/preset/prompt" \
70
+ -H "Authorization: Bearer ${OPENHANDS_API_KEY}" \
71
+ -H "Content-Type: application/json" \
72
+ -d '{
73
+ "name": "Auto Review PRs",
74
+ "prompt": "Review this PR for code quality and best practices",
75
+ "trigger": {
76
+ "type": "event",
77
+ "source": "github",
78
+ "on": "pull_request.labeled",
79
+ "filter": "contains(pull_request.labels[].name, '\''openhands'\'')"
80
+ }
81
+ }'
82
+ ```
83
+
84
+ The service handles SDK code generation, tarball packaging, upload, and automation creation automatically.
85
+
86
+ ## See Also
87
+
88
+ - [SKILL.md](SKILL.md) — Full API reference, agent behavior rules, event keys, filters, and examples
89
+ - [references/custom-automation.md](references/custom-automation.md) — Reference for custom automations with user-provided SDK scripts