@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.
- package/.agents/skills/custom-codereview-guide.md +25 -0
- package/.github/pull_request_template.md +38 -0
- package/.github/release.yml +14 -0
- package/.github/workflows/check-extensions.yml +72 -0
- package/.github/workflows/npm-publish.yml +89 -0
- package/.github/workflows/pr.yml +30 -0
- package/.github/workflows/release.yml +24 -0
- package/.github/workflows/tests.yml +25 -0
- package/.github/workflows/vulnerability-scan.yml +87 -0
- package/.release-please-manifest.json +3 -0
- package/AGENTS.md +132 -0
- package/README.md +10 -0
- package/analysis_results.md +162 -0
- package/marketplaces/large-codebase.json +66 -0
- package/marketplaces/openhands-extensions.json +682 -0
- package/package.json +4 -10
- package/plugins/README.md +30 -0
- package/plugins/city-weather/.plugin/plugin.json +13 -0
- package/plugins/city-weather/README.md +145 -0
- package/plugins/city-weather/commands/now.md +56 -0
- package/plugins/cobol-modernization/.plugin/plugin.json +19 -0
- package/plugins/cobol-modernization/README.md +201 -0
- package/plugins/cobol-modernization/references/troubleshooting.md +18 -0
- package/plugins/cobol-modernization/skills/build-setup/SKILL.md +78 -0
- package/plugins/cobol-modernization/skills/build-setup/scripts/install-gnucobol.sh +32 -0
- package/plugins/cobol-modernization/skills/cobol-modernization-overview/SKILL.md +113 -0
- package/plugins/cobol-modernization/skills/mainfraime-removal/SKILL.md +62 -0
- package/plugins/cobol-modernization/skills/mainfraime-removal/references/cics-transformation-examples.md +45 -0
- package/plugins/cobol-modernization/skills/mainframe-planning/SKILL.md +78 -0
- package/plugins/cobol-modernization/skills/to-java-migration/SKILL.md +59 -0
- package/plugins/cobol-modernization/skills/to-java-migration/references/cobol-to-java-example.md +58 -0
- package/plugins/cobol-modernization/skills/to-java-migration/references/datatype-mappings.md +19 -0
- package/plugins/issue-duplicate-checker/.plugin/plugin.json +13 -0
- package/plugins/issue-duplicate-checker/README.md +51 -0
- package/plugins/issue-duplicate-checker/action.yml +349 -0
- package/plugins/issue-duplicate-checker/scripts/auto_close_duplicate_issues.py +569 -0
- package/plugins/issue-duplicate-checker/scripts/issue_duplicate_check_openhands.py +681 -0
- package/plugins/issue-duplicate-checker/scripts/post_duplicate_notice.js +220 -0
- package/plugins/issue-duplicate-checker/scripts/remove_duplicate_candidate_label.js +27 -0
- package/plugins/magic-test/.plugin/plugin.json +13 -0
- package/plugins/magic-test/skills/magic-word/SKILL.md +33 -0
- package/plugins/migration-scoring/.plugin/plugin.json +19 -0
- package/plugins/migration-scoring/README.md +244 -0
- package/plugins/migration-scoring/skills/migration-mapping/SKILL.md +72 -0
- package/plugins/migration-scoring/skills/migration-report/SKILL.md +118 -0
- package/plugins/migration-scoring/skills/migration-scoring-overview/SKILL.md +126 -0
- package/plugins/migration-scoring/skills/score-quality/SKILL.md +54 -0
- package/plugins/migration-scoring/skills/score-quality/references/scoring-criteria.md +30 -0
- package/plugins/migration-scoring/skills/score-style/SKILL.md +106 -0
- package/plugins/onboarding/.plugin/plugin.json +20 -0
- package/plugins/onboarding/README.md +30 -0
- package/plugins/onboarding/references/criteria.md +144 -0
- package/plugins/onboarding/skills/agent-readiness-report/README.md +23 -0
- package/plugins/onboarding/skills/agent-readiness-report/SKILL.md +122 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_agent_instructions.sh +88 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_build_env.sh +114 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_feedback_loops.sh +133 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_policy.sh +113 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_workflows.sh +127 -0
- package/plugins/onboarding/skills/improve-agent-readiness/README.md +19 -0
- package/plugins/onboarding/skills/improve-agent-readiness/SKILL.md +167 -0
- package/plugins/onboarding/skills/setup-agents-md/README.md +15 -0
- package/plugins/onboarding/skills/setup-agents-md/SKILL.md +150 -0
- package/plugins/onboarding/skills/setup-openhands/README.md +20 -0
- package/plugins/onboarding/skills/setup-openhands/SKILL.md +56 -0
- package/plugins/onboarding/skills/setup-pr-review/README.md +23 -0
- package/plugins/onboarding/skills/setup-pr-review/SKILL.md +72 -0
- package/plugins/openhands/.plugin/plugin.json +13 -0
- package/plugins/openhands/README.md +52 -0
- package/plugins/openhands/SKILL.md +61 -0
- package/plugins/openhands/commands/create.md +55 -0
- package/plugins/openhands/commands/openhands-cloud.md +8 -0
- package/plugins/openhands/scripts/run.sh +69 -0
- package/plugins/pr-review/.plugin/plugin.json +13 -0
- package/plugins/pr-review/README.md +393 -0
- package/plugins/pr-review/action.yml +298 -0
- package/plugins/pr-review/scripts/agent_script.py +1282 -0
- package/plugins/pr-review/scripts/evaluate_review.py +655 -0
- package/plugins/pr-review/scripts/prompt.py +260 -0
- package/plugins/pr-review/workflows/pr-review-by-openhands.yml +51 -0
- package/plugins/pr-review/workflows/pr-review-evaluation.yml +85 -0
- package/plugins/qa-changes/.plugin/plugin.json +11 -0
- package/plugins/qa-changes/README.md +185 -0
- package/plugins/qa-changes/action.yml +181 -0
- package/plugins/qa-changes/scripts/agent_script.py +406 -0
- package/plugins/qa-changes/scripts/evaluate_qa_changes.py +385 -0
- package/plugins/qa-changes/scripts/prompt.py +174 -0
- package/plugins/qa-changes/workflows/qa-changes-by-openhands.yml +50 -0
- package/plugins/qa-changes/workflows/qa-changes-evaluation.yml +85 -0
- package/plugins/release-notes/.plugin/plugin.json +19 -0
- package/plugins/release-notes/README.md +283 -0
- package/plugins/release-notes/SKILL.md +83 -0
- package/plugins/release-notes/action.yml +117 -0
- package/plugins/release-notes/commands/release-notes.md +8 -0
- package/plugins/release-notes/scripts/agent_script.py +292 -0
- package/plugins/release-notes/scripts/generate_release_notes.py +733 -0
- package/plugins/release-notes/scripts/prompt.py +90 -0
- package/plugins/release-notes/scripts/validate_release_notes.py +328 -0
- package/plugins/release-notes/workflows/release-notes.yml +76 -0
- package/plugins/vulnerability-remediation/.plugin/plugin.json +19 -0
- package/plugins/vulnerability-remediation/README.md +217 -0
- package/plugins/vulnerability-remediation/action.yml +187 -0
- package/plugins/vulnerability-remediation/scripts/scan_and_remediate.py +561 -0
- package/plugins/vulnerability-remediation/workflows/vulnerability-scan.yml +87 -0
- package/pyproject.toml +12 -0
- package/release-please-config.json +16 -0
- package/scripts/sync_extensions.py +494 -0
- package/scripts/sync_openhands_sdk_skill.py +264 -0
- package/skills/README.md +159 -0
- package/skills/add-javadoc/.plugin/plugin.json +18 -0
- package/skills/add-javadoc/README.md +40 -0
- package/skills/add-javadoc/SKILL.md +35 -0
- package/skills/add-javadoc/references/example.md +32 -0
- package/skills/add-skill/.plugin/plugin.json +18 -0
- package/skills/add-skill/README.md +67 -0
- package/skills/add-skill/SKILL.md +47 -0
- package/skills/add-skill/scripts/fetch_skill.py +259 -0
- package/skills/agent-creator/.plugin/plugin.json +20 -0
- package/skills/agent-creator/README.md +104 -0
- package/skills/agent-creator/SKILL.md +190 -0
- package/skills/agent-creator/commands/agent-creator.md +8 -0
- package/skills/agent-creator/references/fallback.md +117 -0
- package/skills/agent-memory/.plugin/plugin.json +18 -0
- package/skills/agent-memory/README.md +35 -0
- package/skills/agent-memory/SKILL.md +30 -0
- package/skills/agent-memory/commands/remember.md +8 -0
- package/skills/agent-sdk-builder/.plugin/plugin.json +18 -0
- package/skills/agent-sdk-builder/README.md +40 -0
- package/skills/agent-sdk-builder/SKILL.md +37 -0
- package/skills/agent-sdk-builder/commands/agent-builder.md +8 -0
- package/skills/azure-devops/.plugin/plugin.json +18 -0
- package/skills/azure-devops/README.md +55 -0
- package/skills/azure-devops/SKILL.md +50 -0
- package/skills/bitbucket/.plugin/plugin.json +17 -0
- package/skills/bitbucket/README.md +50 -0
- package/skills/bitbucket/SKILL.md +45 -0
- package/skills/code-review/.plugin/plugin.json +19 -0
- package/skills/code-review/README.md +18 -0
- package/skills/code-review/SKILL.md +208 -0
- package/skills/code-review/commands/codereview-roasted.md +8 -0
- package/skills/code-review/commands/codereview.md +8 -0
- package/skills/code-review/references/risk-evaluation.md +41 -0
- package/skills/code-review/references/supply-chain-security.md +31 -0
- package/skills/code-simplifier/.plugin/plugin.json +21 -0
- package/skills/code-simplifier/README.md +30 -0
- package/skills/code-simplifier/SKILL.md +91 -0
- package/skills/code-simplifier/commands/simplify.md +8 -0
- package/skills/code-simplifier/references/code-quality-review.md +86 -0
- package/skills/code-simplifier/references/code-reuse-review.md +63 -0
- package/skills/code-simplifier/references/efficiency-review.md +81 -0
- package/skills/datadog/.plugin/plugin.json +19 -0
- package/skills/datadog/README.md +100 -0
- package/skills/datadog/SKILL.md +95 -0
- package/skills/deno/.plugin/plugin.json +18 -0
- package/skills/deno/README.md +5 -0
- package/skills/deno/SKILL.md +99 -0
- package/skills/deno/references/README.md +6 -0
- package/skills/discord/.plugin/plugin.json +18 -0
- package/skills/discord/README.md +31 -0
- package/skills/discord/SKILL.md +109 -0
- package/skills/discord/__init__.py +0 -0
- package/skills/discord/references/REFERENCE.md +78 -0
- package/skills/discord/scripts/__init__.py +0 -0
- package/skills/discord/scripts/_http.py +127 -0
- package/skills/discord/scripts/post_webhook.py +106 -0
- package/skills/discord/scripts/send_message.py +102 -0
- package/skills/docker/.plugin/plugin.json +17 -0
- package/skills/docker/README.md +34 -0
- package/skills/docker/SKILL.md +29 -0
- package/skills/evidence-based-citations/.plugin/plugin.json +20 -0
- package/skills/evidence-based-citations/README.md +31 -0
- package/skills/evidence-based-citations/SKILL.md +59 -0
- package/skills/flarglebargle/.plugin/plugin.json +16 -0
- package/skills/flarglebargle/README.md +14 -0
- package/skills/flarglebargle/SKILL.md +9 -0
- package/skills/frontend-design/.plugin/plugin.json +21 -0
- package/skills/frontend-design/LICENSE.txt +177 -0
- package/skills/frontend-design/README.md +42 -0
- package/skills/frontend-design/SKILL.md +42 -0
- package/skills/github/.plugin/plugin.json +19 -0
- package/skills/github/README.md +42 -0
- package/skills/github/SKILL.md +106 -0
- package/skills/github-pr-review/.plugin/plugin.json +18 -0
- package/skills/github-pr-review/README.md +145 -0
- package/skills/github-pr-review/SKILL.md +148 -0
- package/skills/github-pr-review/commands/github-pr-review.md +8 -0
- package/skills/github-pr-reviewer/.plugin/plugin.json +20 -0
- package/skills/github-pr-reviewer/README.md +34 -0
- package/skills/github-pr-reviewer/SKILL.md +89 -0
- package/skills/github-pr-reviewer/commands/pr-reviewer:setup.md +8 -0
- package/skills/github-repo-monitor/.plugin/plugin.json +22 -0
- package/skills/github-repo-monitor/README.md +70 -0
- package/skills/github-repo-monitor/SKILL.md +316 -0
- package/skills/github-repo-monitor/commands/github-monitor:poll.md +8 -0
- package/skills/github-repo-monitor/references/github-api.md +241 -0
- package/skills/github-repo-monitor/references/state-schema.md +160 -0
- package/skills/github-repo-monitor/scripts/main.py +915 -0
- package/skills/github-repo-monitor/tests/test_main.py +400 -0
- package/skills/gitlab/.plugin/plugin.json +17 -0
- package/skills/gitlab/README.md +37 -0
- package/skills/gitlab/SKILL.md +32 -0
- package/skills/incident-retrospective/.plugin/plugin.json +21 -0
- package/skills/incident-retrospective/README.md +34 -0
- package/skills/incident-retrospective/SKILL.md +98 -0
- package/skills/incident-retrospective/commands/incident-retro:setup.md +8 -0
- package/skills/iterate/.plugin/plugin.json +13 -0
- package/skills/iterate/README.md +25 -0
- package/skills/iterate/SKILL.md +399 -0
- package/skills/iterate/commands/babysit.md +8 -0
- package/skills/iterate/commands/iterate.md +8 -0
- package/skills/iterate/commands/verify.md +8 -0
- package/skills/iterate/references/heuristics.md +58 -0
- package/skills/iterate/references/verification.md +96 -0
- package/skills/jupyter/.plugin/plugin.json +18 -0
- package/skills/jupyter/README.md +55 -0
- package/skills/jupyter/SKILL.md +50 -0
- package/skills/kubernetes/.plugin/plugin.json +18 -0
- package/skills/kubernetes/README.md +53 -0
- package/skills/kubernetes/SKILL.md +48 -0
- package/skills/learn-from-code-review/.plugin/plugin.json +19 -0
- package/skills/learn-from-code-review/README.md +64 -0
- package/skills/learn-from-code-review/SKILL.md +186 -0
- package/skills/learn-from-code-review/commands/learn-from-reviews.md +8 -0
- package/skills/linear/.plugin/plugin.json +19 -0
- package/skills/linear/README.md +58 -0
- package/skills/linear/SKILL.md +213 -0
- package/skills/linear-triage/.plugin/plugin.json +21 -0
- package/skills/linear-triage/README.md +34 -0
- package/skills/linear-triage/SKILL.md +91 -0
- package/skills/linear-triage/commands/linear-triage:setup.md +8 -0
- package/skills/notion/.plugin/plugin.json +17 -0
- package/skills/notion/README.md +114 -0
- package/skills/notion/SKILL.md +109 -0
- package/skills/npm/.plugin/plugin.json +17 -0
- package/skills/npm/README.md +14 -0
- package/skills/npm/SKILL.md +9 -0
- package/skills/openhands-api/.plugin/plugin.json +22 -0
- package/skills/openhands-api/README.md +48 -0
- package/skills/openhands-api/SKILL.md +399 -0
- package/skills/openhands-api/references/README.md +33 -0
- package/skills/openhands-api/references/TROUBLESHOOTING.md +81 -0
- package/skills/openhands-api/references/example_prompt.md +12 -0
- package/skills/openhands-api/scripts/openhands_api.py +606 -0
- package/skills/openhands-api/scripts/openhands_api.ts +252 -0
- package/skills/openhands-automation/.plugin/plugin.json +19 -0
- package/skills/openhands-automation/README.md +89 -0
- package/skills/openhands-automation/SKILL.md +875 -0
- package/skills/openhands-automation/commands/automation:create.md +8 -0
- package/skills/openhands-automation/references/ab-testing.md +185 -0
- package/skills/openhands-automation/references/custom-automation.md +644 -0
- package/skills/openhands-sdk/.plugin/plugin.json +20 -0
- package/skills/openhands-sdk/README.md +22 -0
- package/skills/openhands-sdk/SKILL.md +229 -0
- package/skills/openhands-sdk/commands/sdk.md +8 -0
- package/skills/pdflatex/.plugin/plugin.json +18 -0
- package/skills/pdflatex/README.md +39 -0
- package/skills/pdflatex/SKILL.md +34 -0
- package/skills/prd/.plugin/plugin.json +19 -0
- package/skills/prd/README.md +28 -0
- package/skills/prd/SKILL.md +237 -0
- package/skills/prd/commands/prd.md +8 -0
- package/skills/qa-changes/README.md +18 -0
- package/skills/qa-changes/SKILL.md +229 -0
- package/skills/qa-changes/commands/qa-changes.md +8 -0
- package/skills/release-notes/README.md +24 -0
- package/skills/release-notes/SKILL.md +19 -0
- package/skills/release-notes/commands/release-notes.md +8 -0
- package/skills/research-brief/.plugin/plugin.json +20 -0
- package/skills/research-brief/README.md +34 -0
- package/skills/research-brief/SKILL.md +99 -0
- package/skills/research-brief/commands/research-brief:setup.md +8 -0
- package/skills/security/.plugin/plugin.json +18 -0
- package/skills/security/README.md +38 -0
- package/skills/security/SKILL.md +33 -0
- package/skills/skill-creator/.plugin/plugin.json +17 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/README.md +182 -0
- package/skills/skill-creator/SKILL.md +545 -0
- package/skills/skill-creator/references/output-patterns.md +82 -0
- package/skills/skill-creator/references/workflows.md +28 -0
- package/skills/skill-creator/scripts/init_skill.py +303 -0
- package/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/slack-channel-monitor/.plugin/plugin.json +21 -0
- package/skills/slack-channel-monitor/README.md +91 -0
- package/skills/slack-channel-monitor/SKILL.md +276 -0
- package/skills/slack-channel-monitor/commands/slack-monitor:poll.md +8 -0
- package/skills/slack-channel-monitor/references/slack-api.md +207 -0
- package/skills/slack-channel-monitor/references/state-schema.md +180 -0
- package/skills/slack-channel-monitor/scripts/main.py +962 -0
- package/skills/slack-standup-digest/.plugin/plugin.json +21 -0
- package/skills/slack-standup-digest/README.md +34 -0
- package/skills/slack-standup-digest/SKILL.md +92 -0
- package/skills/slack-standup-digest/commands/standup-digest:setup.md +8 -0
- package/skills/spark-version-upgrade/.plugin/plugin.json +20 -0
- package/skills/spark-version-upgrade/README.md +54 -0
- package/skills/spark-version-upgrade/SKILL.md +233 -0
- package/skills/ssh/.plugin/plugin.json +18 -0
- package/skills/ssh/README.md +140 -0
- package/skills/ssh/SKILL.md +135 -0
- package/skills/swift-linux/.plugin/plugin.json +17 -0
- package/skills/swift-linux/README.md +86 -0
- package/skills/swift-linux/SKILL.md +81 -0
- package/skills/theme-factory/.plugin/plugin.json +19 -0
- package/skills/theme-factory/LICENSE.txt +202 -0
- package/skills/theme-factory/README.md +58 -0
- package/skills/theme-factory/SKILL.md +59 -0
- package/skills/theme-factory/theme-showcase.pdf +0 -0
- package/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/theme-factory/themes/desert-rose.md +19 -0
- package/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/theme-factory/themes/golden-hour.md +19 -0
- package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/uv/.plugin/plugin.json +18 -0
- package/skills/uv/README.md +5 -0
- package/skills/uv/SKILL.md +95 -0
- package/skills/uv/references/README.md +5 -0
- package/skills/vercel/.plugin/plugin.json +18 -0
- package/skills/vercel/README.md +108 -0
- package/skills/vercel/SKILL.md +103 -0
- package/tests/test_add_skill_installs_to_agents_dir.py +42 -0
- package/tests/test_catalogs.py +109 -0
- package/tests/test_code_review_risk_evaluation.py +94 -0
- package/tests/test_issue_duplicate_checker.py +240 -0
- package/tests/test_openhands_api_python.py +152 -0
- package/tests/test_plugin_manifest.py +83 -0
- package/tests/test_pr_review_diff_payload.py +202 -0
- package/tests/test_pr_review_feedback.py +263 -0
- package/tests/test_pr_review_prompt.py +152 -0
- package/tests/test_pr_review_review_context.py +253 -0
- package/tests/test_qa_changes.py +232 -0
- package/tests/test_qa_changes_evaluation.py +259 -0
- package/tests/test_release_notes_generator.py +990 -0
- package/tests/test_sdk_loading.py +150 -0
- package/tests/test_skill_plugin_loading.py +149 -0
- package/tests/test_skills_have_readme.py +66 -0
- package/tests/test_sync_extensions.py +292 -0
- package/tests/test_workflow_sync.py +46 -0
- package/utils/analysis/README.md +7 -0
- package/utils/analysis/laminar_signals/README.md +211 -0
- package/utils/analysis/laminar_signals/analyze.py +780 -0
- package/utils/analysis/laminar_signals/templates/default.j2 +49 -0
- 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.
|