@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.
- 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,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: custom-codereview-guide
|
|
3
|
+
description: Repository-specific code review guidelines for OpenHands/extensions
|
|
4
|
+
triggers:
|
|
5
|
+
- /codereview
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Extensions Repo — Code Review Guidelines
|
|
9
|
+
|
|
10
|
+
## SDK Documentation Placement
|
|
11
|
+
|
|
12
|
+
If a PR adds or modifies OpenHands SDK-specific documentation (API guides, SDK usage examples, SDK feature descriptions), flag it:
|
|
13
|
+
|
|
14
|
+
- The canonical source of truth for SDK documentation is <https://docs.openhands.dev/sdk> and its `llms.txt` index.
|
|
15
|
+
- The `skills/openhands-sdk/SKILL.md` in this repo is a thin pointer to the docs site. It should NOT contain duplicated SDK content.
|
|
16
|
+
- **Push back**: ask the submitter to contribute SDK documentation changes to [OpenHands/docs](https://github.com/OpenHands/docs) instead.
|
|
17
|
+
|
|
18
|
+
## Pre-release Integration Catalog Changes
|
|
19
|
+
|
|
20
|
+
The `@openhands/extensions/mcps` catalog was experimental and pre-release. If a
|
|
21
|
+
PR intentionally replaces it with the broader `integrations` catalog and updates
|
|
22
|
+
known downstream consumers in the same coordinated stack, do not require
|
|
23
|
+
backward-compatible `mcps` aliases or a deprecation window. Require migration
|
|
24
|
+
documentation for consumers, but accept a clean breaking change for this
|
|
25
|
+
pre-release surface.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<!-- Keep this PR as draft until it is ready for review. -->
|
|
2
|
+
|
|
3
|
+
<!-- AI/LLM agents: be concise and specific. Do not check the box below. -->
|
|
4
|
+
|
|
5
|
+
- [ ] A human has tested these changes.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Why
|
|
10
|
+
|
|
11
|
+
<!-- Describe problem, motivation, etc.-->
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
|
|
15
|
+
<!-- 1-3 bullets describing what changed. -->
|
|
16
|
+
-
|
|
17
|
+
|
|
18
|
+
## Issue Number
|
|
19
|
+
<!-- Required if there is a relevant issue to this PR. -->
|
|
20
|
+
|
|
21
|
+
## How to Test
|
|
22
|
+
|
|
23
|
+
<!--
|
|
24
|
+
Required. Share the steps for the reviewer to be able to test your PR. e.g. You can test by running `npm install` then `npm build dev`.
|
|
25
|
+
|
|
26
|
+
If you could not test this, say why.
|
|
27
|
+
-->
|
|
28
|
+
|
|
29
|
+
## Video/Screenshots
|
|
30
|
+
|
|
31
|
+
<!--
|
|
32
|
+
Provide a video or screenshots of testing your PR. e.g. you added a new feature to the gui, show us the video of you testing it successfully.
|
|
33
|
+
|
|
34
|
+
-->
|
|
35
|
+
|
|
36
|
+
## Notes
|
|
37
|
+
|
|
38
|
+
<!-- Optional: migrations, config changes, rollout concerns, follow-ups, or anything reviewers should know. -->
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
changelog:
|
|
2
|
+
categories:
|
|
3
|
+
- title: Features
|
|
4
|
+
labels: ["type: feat"]
|
|
5
|
+
- title: Bug Fixes
|
|
6
|
+
labels: ["type: fix"]
|
|
7
|
+
- title: Performance
|
|
8
|
+
labels: ["type: perf"]
|
|
9
|
+
- title: Documentation
|
|
10
|
+
labels: ["type: docs"]
|
|
11
|
+
- title: Maintenance
|
|
12
|
+
labels: ["type: chore", "type: build", "type: ci", "type: refactor", "type: style", "type: test", "type: revert"]
|
|
13
|
+
- title: Other Changes
|
|
14
|
+
labels: ["*"]
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
name: Check Extensions
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: ["*"]
|
|
6
|
+
push:
|
|
7
|
+
branches: ["main", "master"]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
validate-claude-code:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- name: Checkout repository
|
|
14
|
+
uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- name: Setup Node.js
|
|
17
|
+
uses: actions/setup-node@v4
|
|
18
|
+
with:
|
|
19
|
+
node-version: "20"
|
|
20
|
+
|
|
21
|
+
- name: Install Claude Code CLI
|
|
22
|
+
run: npm install -g @anthropic-ai/claude-code
|
|
23
|
+
|
|
24
|
+
- name: Validate all plugins with Claude Code
|
|
25
|
+
run: |
|
|
26
|
+
failed=0
|
|
27
|
+
for plugin_dir in plugins/*/; do
|
|
28
|
+
if [ -d "${plugin_dir}.plugin" ]; then
|
|
29
|
+
echo "Validating ${plugin_dir}..."
|
|
30
|
+
if ! claude plugin validate "${plugin_dir}"; then
|
|
31
|
+
echo "❌ Validation failed for ${plugin_dir}"
|
|
32
|
+
failed=1
|
|
33
|
+
else
|
|
34
|
+
echo "✅ ${plugin_dir} is valid"
|
|
35
|
+
fi
|
|
36
|
+
fi
|
|
37
|
+
done
|
|
38
|
+
if [ "$failed" -ne 0 ]; then
|
|
39
|
+
echo "::error::One or more plugins failed Claude Code validation"
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
sync-extensions:
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
steps:
|
|
46
|
+
- name: Checkout repository
|
|
47
|
+
uses: actions/checkout@v4
|
|
48
|
+
|
|
49
|
+
- name: Setup Python
|
|
50
|
+
uses: actions/setup-python@v5
|
|
51
|
+
with:
|
|
52
|
+
python-version: "3.12"
|
|
53
|
+
|
|
54
|
+
- name: Install dependencies
|
|
55
|
+
run: pip install pyyaml
|
|
56
|
+
|
|
57
|
+
- name: Check extensions are in sync
|
|
58
|
+
run: python scripts/sync_extensions.py --check
|
|
59
|
+
|
|
60
|
+
sync-sdk-skill:
|
|
61
|
+
runs-on: ubuntu-latest
|
|
62
|
+
steps:
|
|
63
|
+
- name: Checkout repository
|
|
64
|
+
uses: actions/checkout@v4
|
|
65
|
+
|
|
66
|
+
- name: Setup Python
|
|
67
|
+
uses: actions/setup-python@v5
|
|
68
|
+
with:
|
|
69
|
+
python-version: "3.12"
|
|
70
|
+
|
|
71
|
+
- name: Check SDK skill is up to date
|
|
72
|
+
run: python scripts/sync_openhands_sdk_skill.py --check
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
name: Publish to npm
|
|
2
|
+
|
|
3
|
+
# Publishes @openhands/extensions to npm via OIDC trusted publishing (no token).
|
|
4
|
+
# Fires when release-please pushes a version tag (v*) cut from main; the manual
|
|
5
|
+
# dispatch path re-publishes a specific tag. Trusted publishing must be
|
|
6
|
+
# configured for this package on npmjs.com (this repo + this workflow file).
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
tags:
|
|
10
|
+
- 'v*'
|
|
11
|
+
workflow_dispatch:
|
|
12
|
+
inputs:
|
|
13
|
+
tag:
|
|
14
|
+
description: 'Release tag to publish (e.g. v0.1.0)'
|
|
15
|
+
required: true
|
|
16
|
+
type: string
|
|
17
|
+
|
|
18
|
+
concurrency:
|
|
19
|
+
group: npm-publish-${{ inputs.tag || github.ref }}
|
|
20
|
+
cancel-in-progress: false
|
|
21
|
+
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
id-token: write
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
publish:
|
|
28
|
+
name: Publish to npm
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
timeout-minutes: 15
|
|
31
|
+
|
|
32
|
+
steps:
|
|
33
|
+
- name: Check out repository
|
|
34
|
+
uses: actions/checkout@v6
|
|
35
|
+
with:
|
|
36
|
+
ref: ${{ inputs.tag || github.ref }}
|
|
37
|
+
|
|
38
|
+
# Trusted publishing requires Node 22.14.0+ and npm 11.5.1+
|
|
39
|
+
# See: https://docs.npmjs.com/trusted-publishers/
|
|
40
|
+
- name: Set up Node.js for npm trusted publishing
|
|
41
|
+
uses: actions/setup-node@v6
|
|
42
|
+
with:
|
|
43
|
+
node-version: '24'
|
|
44
|
+
registry-url: https://registry.npmjs.org
|
|
45
|
+
|
|
46
|
+
- name: Verify npm version supports trusted publishing
|
|
47
|
+
run: |
|
|
48
|
+
echo "Node version: $(node --version)"
|
|
49
|
+
echo "npm version: $(npm --version)"
|
|
50
|
+
NPM_VERSION=$(npm --version)
|
|
51
|
+
NPM_MAJOR=$(echo $NPM_VERSION | cut -d. -f1)
|
|
52
|
+
NPM_MINOR=$(echo $NPM_VERSION | cut -d. -f2)
|
|
53
|
+
if [ "$NPM_MAJOR" -lt 11 ] || ([ "$NPM_MAJOR" -eq 11 ] && [ "$NPM_MINOR" -lt 5 ]); then
|
|
54
|
+
echo "Error: npm 11.5.1+ required for trusted publishing, got $NPM_VERSION"
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
echo "✓ npm $NPM_VERSION meets trusted publishing requirements"
|
|
58
|
+
|
|
59
|
+
# No install/test/build steps: @openhands/extensions ships source directly
|
|
60
|
+
# (plain ESM + hand-written .d.ts + JSON catalogs) with only peerDependencies,
|
|
61
|
+
# and has no build script, test suite, or lockfile.
|
|
62
|
+
|
|
63
|
+
- name: Verify package contents
|
|
64
|
+
run: npm pack --dry-run
|
|
65
|
+
|
|
66
|
+
- name: Validate package version matches release tag
|
|
67
|
+
env:
|
|
68
|
+
# Pass inputs.tag via env var to prevent script injection from
|
|
69
|
+
# GitHub Actions expression interpolation inside run blocks.
|
|
70
|
+
INPUT_TAG: ${{ inputs.tag }}
|
|
71
|
+
run: |
|
|
72
|
+
PACKAGE_VERSION=$(node -p "require('./package.json').version")
|
|
73
|
+
# Resolve tag: prefer workflow_dispatch input, fall back to push-event GITHUB_REF
|
|
74
|
+
if [ -n "$INPUT_TAG" ]; then
|
|
75
|
+
RAW_TAG="$INPUT_TAG"
|
|
76
|
+
else
|
|
77
|
+
RAW_TAG="${GITHUB_REF#refs/tags/}"
|
|
78
|
+
fi
|
|
79
|
+
TAG_VERSION="${RAW_TAG#v}"
|
|
80
|
+
echo "Package version: $PACKAGE_VERSION"
|
|
81
|
+
echo "Release tag version: $TAG_VERSION"
|
|
82
|
+
if [ "$PACKAGE_VERSION" != "$TAG_VERSION" ]; then
|
|
83
|
+
echo "Error: package.json version ($PACKAGE_VERSION) doesn't match release tag ($TAG_VERSION)"
|
|
84
|
+
exit 1
|
|
85
|
+
fi
|
|
86
|
+
echo "✓ Version $PACKAGE_VERSION matches release tag"
|
|
87
|
+
|
|
88
|
+
- name: Publish to npm with provenance
|
|
89
|
+
run: npm publish --access public --provenance
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: pr
|
|
2
|
+
|
|
3
|
+
# Caller workflow for the shared PR-title lint/label in OpenHands/release-actions.
|
|
4
|
+
#
|
|
5
|
+
# Trigger is pull_request_target (NOT pull_request) so the lint/label also runs
|
|
6
|
+
# on PRs from forks — e.g. external contributors who aren't org members. On a
|
|
7
|
+
# fork-originated `pull_request`, GITHUB_TOKEN is read-only, so the label step
|
|
8
|
+
# (which needs pull-requests: write) would fail; pull_request_target runs in the
|
|
9
|
+
# base repo's context with a writable token.
|
|
10
|
+
#
|
|
11
|
+
# pull_request_target is safe here — and only stays safe — because of two
|
|
12
|
+
# invariants enforced by the reusable workflow:
|
|
13
|
+
# 1. It NEVER checks out or executes any code from the PR. It only reads the
|
|
14
|
+
# PR title from the event payload, so fork code never runs with the base
|
|
15
|
+
# repo's token/secrets. Do not add a checkout step.
|
|
16
|
+
# 2. This caller does NOT pass `secrets: inherit`, so the release App's
|
|
17
|
+
# credentials are not in scope for the title workflow — it runs on the
|
|
18
|
+
# default GITHUB_TOKEN alone. Do not add `secrets: inherit`.
|
|
19
|
+
on:
|
|
20
|
+
pull_request_target:
|
|
21
|
+
# synchronize is needed alongside the title events: required status checks
|
|
22
|
+
# attach to a head SHA, and release-please force-pushes new commits to its
|
|
23
|
+
# release PR, so the lint must re-run on each update to stay green.
|
|
24
|
+
types: [opened, edited, reopened, synchronize]
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
pr-title:
|
|
28
|
+
permissions:
|
|
29
|
+
pull-requests: write
|
|
30
|
+
uses: OpenHands/release-actions/.github/workflows/pr-title.yml@main
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
|
|
3
|
+
# Caller workflow for the shared release automation in OpenHands/release-actions.
|
|
4
|
+
# This file owns the trigger; the reusable workflow owns the logic.
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
branches:
|
|
8
|
+
- main
|
|
9
|
+
# Maintenance/freeze branches (e.g. release/0.2). The reusable workflow
|
|
10
|
+
# scopes the release to whichever branch triggered this run.
|
|
11
|
+
- 'release/**'
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
release-please:
|
|
15
|
+
# The caller must grant the permissions the reusable workflow needs; the
|
|
16
|
+
# effective token is the intersection of the two.
|
|
17
|
+
permissions:
|
|
18
|
+
contents: write
|
|
19
|
+
pull-requests: write
|
|
20
|
+
# Passes the org-level RELEASE_APP_ID / RELEASE_APP_PRIVATE_KEY through so the
|
|
21
|
+
# reusable workflow can mint the GitHub App token. These are org secrets —
|
|
22
|
+
# nothing to create per-repo.
|
|
23
|
+
secrets: inherit
|
|
24
|
+
uses: OpenHands/release-actions/.github/workflows/release-please.yml@main
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: ["*"]
|
|
6
|
+
push:
|
|
7
|
+
branches: ["main", "master"]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- name: Checkout repository
|
|
14
|
+
uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- name: Install uv
|
|
17
|
+
uses: astral-sh/setup-uv@v7
|
|
18
|
+
with:
|
|
19
|
+
enable-cache: true
|
|
20
|
+
python-version: "3.12"
|
|
21
|
+
|
|
22
|
+
- name: Run tests
|
|
23
|
+
run: uv run --group test pytest tests/
|
|
24
|
+
env:
|
|
25
|
+
PYTHONPATH: ${{ github.workspace }}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Vulnerability Scan and Remediation Workflow
|
|
2
|
+
#
|
|
3
|
+
# This is a thin wrapper that uses the OpenHands vulnerability-remediation action.
|
|
4
|
+
# It auto-updates when the action in OpenHands/extensions is updated.
|
|
5
|
+
#
|
|
6
|
+
# INSTALLATION:
|
|
7
|
+
# curl -o .github/workflows/vulnerability-scan.yml \
|
|
8
|
+
# https://raw.githubusercontent.com/OpenHands/extensions/main/plugins/vulnerability-remediation/workflows/vulnerability-scan.yml
|
|
9
|
+
#
|
|
10
|
+
# REQUIRED SECRETS:
|
|
11
|
+
# - LLM_API_KEY: API key for your LLM provider (OpenAI, Anthropic, etc.)
|
|
12
|
+
#
|
|
13
|
+
# OPTIONAL SECRETS:
|
|
14
|
+
# - PAT_TOKEN: GitHub PAT for creating PRs (uses GITHUB_TOKEN if not set)
|
|
15
|
+
#
|
|
16
|
+
# The action will:
|
|
17
|
+
# 1. Run a Trivy security scan
|
|
18
|
+
# 2. Skip agent if no vulnerabilities found (saves costs)
|
|
19
|
+
# 3. Create PRs for fixable vulnerabilities
|
|
20
|
+
|
|
21
|
+
name: Vulnerability Scan and Remediation
|
|
22
|
+
|
|
23
|
+
on:
|
|
24
|
+
# Run weekly on Monday at 9am UTC
|
|
25
|
+
schedule:
|
|
26
|
+
- cron: '0 9 * * 1'
|
|
27
|
+
|
|
28
|
+
# Allow manual trigger
|
|
29
|
+
workflow_dispatch:
|
|
30
|
+
inputs:
|
|
31
|
+
severity_threshold:
|
|
32
|
+
description: 'Minimum severity to remediate'
|
|
33
|
+
required: false
|
|
34
|
+
default: 'HIGH'
|
|
35
|
+
type: choice
|
|
36
|
+
options:
|
|
37
|
+
- CRITICAL
|
|
38
|
+
- HIGH
|
|
39
|
+
- MEDIUM
|
|
40
|
+
- LOW
|
|
41
|
+
max_vulnerabilities:
|
|
42
|
+
description: 'Maximum vulnerabilities to fix (0 = unlimited)'
|
|
43
|
+
required: false
|
|
44
|
+
default: '5'
|
|
45
|
+
type: string
|
|
46
|
+
llm_model:
|
|
47
|
+
description: 'LLM model to use for remediation'
|
|
48
|
+
required: false
|
|
49
|
+
default: 'anthropic/claude-sonnet-4-5-20250929'
|
|
50
|
+
type: string
|
|
51
|
+
llm_base_url:
|
|
52
|
+
description: 'Custom LLM base URL (optional)'
|
|
53
|
+
required: false
|
|
54
|
+
default: ''
|
|
55
|
+
type: string
|
|
56
|
+
|
|
57
|
+
permissions:
|
|
58
|
+
contents: write
|
|
59
|
+
pull-requests: write
|
|
60
|
+
security-events: read
|
|
61
|
+
|
|
62
|
+
jobs:
|
|
63
|
+
scan-and-remediate:
|
|
64
|
+
runs-on: ubuntu-latest
|
|
65
|
+
timeout-minutes: 60
|
|
66
|
+
|
|
67
|
+
steps:
|
|
68
|
+
# Uses @main to auto-update when the action is improved
|
|
69
|
+
- name: Run Vulnerability Remediation
|
|
70
|
+
id: remediate
|
|
71
|
+
uses: OpenHands/extensions/plugins/vulnerability-remediation@main
|
|
72
|
+
with:
|
|
73
|
+
severity-threshold: ${{ inputs.severity_threshold || 'HIGH' }}
|
|
74
|
+
max-vulnerabilities: ${{ inputs.max_vulnerabilities || '5' }}
|
|
75
|
+
llm-model: ${{ inputs.llm_model || 'anthropic/claude-sonnet-4-5-20250929' }}
|
|
76
|
+
llm-base-url: ${{ inputs.llm_base_url || '' }}
|
|
77
|
+
llm-api-key: ${{ secrets.LLM_API_KEY }}
|
|
78
|
+
github-token: ${{ secrets.OPENHANDS_BOT_GITHUB_PAT_PUBLIC || secrets.GITHUB_TOKEN }}
|
|
79
|
+
|
|
80
|
+
- name: Summary
|
|
81
|
+
run: |
|
|
82
|
+
echo "### Vulnerability Scan Results" >> $GITHUB_STEP_SUMMARY
|
|
83
|
+
if [ "${{ steps.remediate.outputs.scan-only }}" == "true" ]; then
|
|
84
|
+
echo "✅ No vulnerabilities found that need remediation." >> $GITHUB_STEP_SUMMARY
|
|
85
|
+
else
|
|
86
|
+
echo "🔍 Found ${{ steps.remediate.outputs.vulnerabilities-found }} vulnerabilities to remediate." >> $GITHUB_STEP_SUMMARY
|
|
87
|
+
fi
|
package/AGENTS.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# OpenHands Extensions — Agent Notes
|
|
2
|
+
|
|
3
|
+
This repository (`OpenHands/extensions`) is the **public extensions registry** for OpenHands.
|
|
4
|
+
It contains **shareable skills and plugins** that can be loaded by OpenHands (CLI/GUI/Cloud) and by client code using the **Software Agent SDK**.
|
|
5
|
+
|
|
6
|
+
## What this repo contains
|
|
7
|
+
|
|
8
|
+
- `skills/` — a catalog of skills, **one directory per skill**.
|
|
9
|
+
- `skills/<skill-name>/SKILL.md` — the skill definition (AgentSkills-style progressive disclosure)
|
|
10
|
+
- `skills/<skill-name>/README.md` — optional extra docs/examples for humans
|
|
11
|
+
|
|
12
|
+
- `plugins/` — a catalog of plugins with executable code components.
|
|
13
|
+
- `plugins/<plugin-name>/SKILL.md` — the plugin definition
|
|
14
|
+
- `plugins/<plugin-name>/hooks/` — lifecycle hooks (optional)
|
|
15
|
+
- `plugins/<plugin-name>/scripts/` — utility scripts (optional)
|
|
16
|
+
|
|
17
|
+
There is no application code here; the primary artifacts are Markdown skill definitions and plugin configurations, which can contain `scripts/`, `hooks/` sub-directories.
|
|
18
|
+
|
|
19
|
+
## How client code uses this repo
|
|
20
|
+
|
|
21
|
+
### OpenHands Applications
|
|
22
|
+
|
|
23
|
+
OpenHands can load skills from a project directory (repo-level) and from user-level locations.
|
|
24
|
+
This repository is the **global/public** registry referenced by the docs.
|
|
25
|
+
|
|
26
|
+
### Skill loading models to know
|
|
27
|
+
|
|
28
|
+
OpenHands supports two complementary mechanisms:
|
|
29
|
+
|
|
30
|
+
1. **Always-on context (repository rules)**
|
|
31
|
+
- Loaded at conversation start.
|
|
32
|
+
- Prefer a root `AGENTS.md` (and optionally model-specific variants like `CLAUDE.md` / `GEMINI.md`).
|
|
33
|
+
|
|
34
|
+
2. **AgentSkills (progressive disclosure), with an OpenHands extension for keyword triggers**
|
|
35
|
+
- Each skill lives in its own directory with a `SKILL.md` entry point.
|
|
36
|
+
- The agent is shown a catalog (name/description/location) and decides when to open/read the full content.
|
|
37
|
+
- **OpenHands extension**: the `SKILL.md` may include optional `triggers:` frontmatter to enable keyword-based activation.
|
|
38
|
+
|
|
39
|
+
This registry primarily provides (2). Client repositories typically add (1) for repo-specific, always-on instructions.
|
|
40
|
+
|
|
41
|
+
### Software Agent SDK
|
|
42
|
+
|
|
43
|
+
SDK consumers typically load skills either:
|
|
44
|
+
|
|
45
|
+
- as **always-loaded context** (e.g., `AGENTS.md`), and/or
|
|
46
|
+
- as **trigger-loaded keyword skills**, and/or
|
|
47
|
+
- as **progressive-disclosure AgentSkills** by discovering `SKILL.md` files under a directory.
|
|
48
|
+
|
|
49
|
+
See: https://docs.openhands.dev/sdk/guides/skill
|
|
50
|
+
|
|
51
|
+
## AgentSkills / Skill authoring rules (follow these)
|
|
52
|
+
|
|
53
|
+
OpenHands uses an **extended AgentSkills standard**:
|
|
54
|
+
|
|
55
|
+
- **Compatible with the AgentSkills specification** (https://agentskills.io/specification)
|
|
56
|
+
- **Extended with optional `triggers:` frontmatter** for keyword-based activation
|
|
57
|
+
|
|
58
|
+
When editing or adding skills in this repo, follow these rules (and add new skills to `marketplaces/openhands-extensions.json`):
|
|
59
|
+
|
|
60
|
+
1. **One skill per directory**
|
|
61
|
+
- Create `skills/<skill-name>/SKILL.md`.
|
|
62
|
+
- Keep the directory name stable; it is used as the skill identifier/location.
|
|
63
|
+
|
|
64
|
+
2. **SKILL.md should be progressive disclosure**
|
|
65
|
+
- Put a concise summary/description first.
|
|
66
|
+
- Include only the information needed for an agent to decide whether to open/read the skill.
|
|
67
|
+
- If the skill needs large references, keep them in the same directory (e.g., `references/`) and point to them.
|
|
68
|
+
|
|
69
|
+
3. **Be specific and operational**
|
|
70
|
+
- Prefer checklists, steps, and concrete examples.
|
|
71
|
+
- Avoid vague guidance like “be careful” without actionable criteria.
|
|
72
|
+
|
|
73
|
+
4. **Avoid repo-local assumptions**
|
|
74
|
+
- Skills here are **public and reusable**.
|
|
75
|
+
- Don’t reference private paths, secrets, or company-specific URLs.
|
|
76
|
+
|
|
77
|
+
5. **Do not include secrets or sensitive data**
|
|
78
|
+
- Never commit API keys, tokens, credentials, private endpoints, or internal customer data.
|
|
79
|
+
|
|
80
|
+
6. **Prefer minimal, composable skills**
|
|
81
|
+
- Keep a skill focused on a single domain/task.
|
|
82
|
+
- If it grows large, split it into multiple skills.
|
|
83
|
+
|
|
84
|
+
7. **Compatibility notes**
|
|
85
|
+
- The legacy `.openhands/microagents/` location may still exist in user repos, but this registry uses the current skills layout.
|
|
86
|
+
|
|
87
|
+
## Repository conventions
|
|
88
|
+
|
|
89
|
+
- **Punctuation style**: Use plain hyphens (`-`) instead of em dashes (`—` / `\u2014`) in skill descriptions, SKILL.md content, and marketplace JSON entries.
|
|
90
|
+
- Keep formatting consistent across skills.
|
|
91
|
+
- If you change a skill’s behavior or scope, update its `README.md` (if present) accordingly.
|
|
92
|
+
- If you change top-level documentation, ensure links still resolve.
|
|
93
|
+
- `integrations/catalog/*.json` and `integrations/index.js` are the source of truth consumed by `@openhands/extensions`; agent-canvas and integrations-hub import this package directly, so integration marketplace fixes belong here rather than in app-local constants. When upstream MCP projects move repos, verify both `docsUrl` and the connection option (`transport`, `command`/`args`, or URL), not just links.
|
|
94
|
+
- For Python test runs, prefer `uv sync --group test` followed by `uv run pytest -q`; the full suite depends on `openhands-sdk`, which is not available in the base environment.
|
|
95
|
+
- Agent-driven plugins (for example `plugins/pr-review` and `plugins/release-notes`) use `uv run --with openhands-sdk --with openhands-tools ...` and require an `LLM_API_KEY` in addition to `GITHUB_TOKEN`.
|
|
96
|
+
- For OpenHands Cloud API guidance, automations, and CLI integration, use `plugins/openhands`. It is the canonical unified OpenHands plugin covering the V1 Cloud API, Automations API, and CLI. The individual skills (`skills/openhands-api`, `skills/openhands-automation`) are also available standalone.
|
|
97
|
+
- When reviewing or editing `skills/openhands-sdk`, validate copy-paste imports against the released packages with `uv run --with openhands-tools --with openhands-workspace --with openhands-agent-server python ...`. In the current released workspace package, the exported remote workspace classes are `APIRemoteWorkspace` / `OpenHandsCloudWorkspace`; `RemoteAPIWorkspace` is not available.
|
|
98
|
+
- For agent-driven plugin scripts, prefer `from openhands.sdk.plugin import PluginSource` and pass `plugins=[PluginSource(source=...)]` into `Conversation`. In the current released SDK (`openhands-sdk` 1.18.x), `Plugin` is not exported from `openhands.sdk.plugin`, so direct `Plugin.load(...)` imports can break CI.
|
|
99
|
+
- `plugins/qa-changes/action.yml` now has a preflight guard for fork PRs in `pull_request` context: if the PR comes from a fork and `LLM_API_KEY` is unavailable (normal for forks), the action exits successfully with a clear skip notice instead of failing.
|
|
100
|
+
- `skills/bitbucket` should not tell agents to rewrite remotes proactively. In OpenHands, `BITBUCKET_TOKEN` is commonly kept in unencoded `user:token` form for API calls like `curl --user "$BITBUCKET_TOKEN" ...`; only split and URL-encode it when constructing a non-interactive HTTPS Git remote URL.
|
|
101
|
+
|
|
102
|
+
- `plugins/release-notes` now has a standalone validator at `plugins/release-notes/scripts/validate_release_notes.py`; it rebuilds the deterministic tag-range context, fails if a change bullet omits explicit PR/commit refs or matching author handles, and enforces full PR/author coverage by appending a compact `### 🔎 Small Fixes/Internal Changes` appendix grouped by author when the agent omits lower-signal items. New contributor detection in `generate_release_notes.py` should use merged PR history for human authors (excluding bots) rather than commit-author lookup.
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
## CI / validation gotchas
|
|
106
|
+
|
|
107
|
+
- The test suite expects **every directory under `skills/`** to be listed in a marketplace. If you add a new skill (or rebase onto a main branch that added skills), update the appropriate marketplace file or CI will fail with `Skills missing from marketplace: [...]`.
|
|
108
|
+
- `scripts/sync_extensions.py` keeps generated artifacts in sync: Claude Code command files, README catalog section, coverage checks, and vendor symlinks. Run `python scripts/sync_extensions.py --check` (or just push — CI runs it) to verify everything is consistent. Run without `--check` to auto-fix. The "Quick Start" section in `README.md` (OpenHands SDK, Claude Code, and Codex setup instructions) is **manually maintained** above the auto-generated catalog markers and is intentionally not generated by the sync script.
|
|
109
|
+
- The sync script uses PyYAML to parse SKILL.md frontmatter. If you add a skill with a slash trigger (e.g., `triggers: ["/mycommand"]`), the script auto-generates `commands/mycommand.md`. **Note:** Slash triggers in SKILL.md frontmatter are deprecated — prefer adding a `commands/command-name.md` file to the plugin's `commands/` directory instead. Keyword triggers (non-slash) remain the recommended way to activate skills by topic.
|
|
110
|
+
|
|
111
|
+
## OpenHands SDK documentation policy
|
|
112
|
+
|
|
113
|
+
- **Do NOT add SDK-specific or SDK-related documentation to this repo.** The canonical source of truth for SDK documentation is the [OpenHands docs site](https://docs.openhands.dev/sdk) and its structured index at <https://docs.openhands.dev/llms.txt>.
|
|
114
|
+
- The `skills/openhands-sdk/SKILL.md` is **auto-generated** by `scripts/sync_openhands_sdk_skill.py`. It pulls class names, guides, examples, and the hello-world snippet directly from the docs site and the SDK repo. **Do not edit SKILL.md by hand** - run the script to regenerate it.
|
|
115
|
+
- CI runs `python scripts/sync_openhands_sdk_skill.py --check` on every PR. If the skill is out of date, regenerate it with `python scripts/sync_openhands_sdk_skill.py`.
|
|
116
|
+
- If a PR adds or modifies SDK-specific documentation in this repo, **push back**: ask the submitter to contribute those changes to [OpenHands/docs](https://github.com/OpenHands/docs) instead.
|
|
117
|
+
|
|
118
|
+
## PR review plugin notes
|
|
119
|
+
|
|
120
|
+
- The `code-review` and `codereview-roasted` skills have been merged into a single `code-review` skill. The `/codereview-roasted` trigger is kept as an alias for backward compatibility. The `review-style` action input is deprecated and ignored.
|
|
121
|
+
- `plugins/pr-review` supports an optional `require-evidence` action input that tells the reviewer to require end-to-end proof in the PR description that the code works; test output alone is not sufficient evidence.
|
|
122
|
+
- The corresponding `REQUIRE_EVIDENCE` env flag is consumed by `plugins/pr-review/scripts/agent_script.py` and injected into the review prompt via `plugins/pr-review/scripts/prompt.py`.
|
|
123
|
+
- `plugins/pr-review` exposes an `enable-uv-cache` input (default `'false'`) that toggles `setup-uv`'s GitHub Actions cache. Default stays off because a prompt-injected reviewer could poison a shared cache that higher-privilege workflows later consume; opt in only on single-tenant self-hosted runners. The README's "Caching and Security" section documents the threat model and recommends a host-level uv cache volume as the preferred alternative for self-hosted setups.
|
|
124
|
+
- GitHub review suggestions that only delete lines can look empty in `PullRequestReviewComment.body`; the rendered content is available via `bodyText`/`bodyHTML`, so review-context formatting should fall back there before treating a suggestion as empty.
|
|
125
|
+
- Prompt coverage for this behavior lives in `tests/test_pr_review_prompt.py`.
|
|
126
|
+
- `plugins/pr-review`'s `collect-feedback` input should append a short thumbs up/down footer to the main GitHub review body via `agent_script.py` / `prompt.py`, rather than posting a separate PR comment. `evaluate_review.py` should read feedback from review-body reactions while still tolerating legacy issue-comment markers.
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
## When uncertain
|
|
130
|
+
|
|
131
|
+
- Prefer the official OpenHands docs on skills: https://docs.openhands.dev/overview/skills
|
|
132
|
+
- Prefer the SDK skill guide: https://docs.openhands.dev/sdk/guides/skill
|
package/README.md
CHANGED
|
@@ -45,6 +45,16 @@ React logo components are isolated behind a separate export so data-only consume
|
|
|
45
45
|
import { INTEGRATION_LOGOS } from "@openhands/extensions/integrations/logos";
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
+
The package ships the whole repo, so the `skills/`, `plugins/`, and `marketplaces/` trees are available from the installed package. Resolve content files to a path, or import JSON manifests directly:
|
|
49
|
+
|
|
50
|
+
```js
|
|
51
|
+
// .md / .py / etc.: resolve to a path, then read with fs
|
|
52
|
+
const skillPath = import.meta.resolve("@openhands/extensions/skills/code-review/SKILL.md");
|
|
53
|
+
|
|
54
|
+
// .json: import directly
|
|
55
|
+
import marketplace from "@openhands/extensions/marketplaces/openhands-extensions.json" with { type: "json" };
|
|
56
|
+
```
|
|
57
|
+
|
|
48
58
|
See [`integrations/README.md`](integrations/README.md), [`automations/README.md`](automations/README.md), and [`MIGRATION.md`](MIGRATION.md) for catalog-specific details.
|
|
49
59
|
|
|
50
60
|
## Extensions Catalog
|