openhands-extensions 0.11.0__tar.gz → 0.12.0__tar.gz
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.
- openhands_extensions-0.12.0/.release-please-manifest.json +3 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/AGENTS.md +2 -1
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/MIGRATION.md +31 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/PKG-INFO +1 -1
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/README.md +9 -7
- openhands_extensions-0.12.0/automations/README.md +258 -0
- openhands_extensions-0.12.0/automations/catalog/github-pr-reviewer/manifest.json +82 -0
- openhands_extensions-0.12.0/automations/catalog/github-repo-monitor/manifest.json +82 -0
- openhands_extensions-0.12.0/automations/catalog/incident-retrospective-drafter/manifest.json +100 -0
- openhands_extensions-0.11.0/automations/catalog/jira-issue-to-pr.json → openhands_extensions-0.12.0/automations/catalog/jira-issue-to-pr/manifest.json +10 -5
- openhands_extensions-0.11.0/automations/catalog/linear-triage-assistant.json → openhands_extensions-0.12.0/automations/catalog/linear-triage-assistant/manifest.json +8 -4
- openhands_extensions-0.11.0/automations/catalog/research-brief-writer.json → openhands_extensions-0.12.0/automations/catalog/research-brief-writer/manifest.json +11 -5
- openhands_extensions-0.11.0/automations/catalog/slack-channel-monitor.json → openhands_extensions-0.12.0/automations/catalog/slack-channel-monitor/manifest.json +7 -2
- openhands_extensions-0.11.0/automations/catalog/slack-standup-digest.json → openhands_extensions-0.12.0/automations/catalog/slack-standup-digest/manifest.json +8 -5
- openhands_extensions-0.12.0/automations/catalog-index.js +23 -0
- openhands_extensions-0.12.0/automations/catalog.schema.json +273 -0
- openhands_extensions-0.12.0/automations/index.d.ts +122 -0
- openhands_extensions-0.12.0/automations/index.js +23 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/index.d.ts +16 -1
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/datadog.json +3 -3
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/index.d.ts +1 -1
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/package.json +6 -3
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-sdk/SKILL.md +2 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/skills/github/SKILL.md +0 -1
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/pyproject.toml +1 -1
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/python/openhands_extensions/__init__.py +0 -4
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/python/openhands_extensions/_version.py +3 -2
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/python/openhands_extensions/integrations.py +8 -30
- openhands_extensions-0.12.0/scripts/build-automation-catalog.mjs +51 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/bitbucket/SKILL.md +0 -1
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/gitlab/SKILL.md +0 -1
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/index.js +4 -7
- openhands_extensions-0.12.0/tests/fixtures/automations/capabilities.json +92 -0
- openhands_extensions-0.12.0/tests/fixtures/automations/github-pr-reviewer.json +251 -0
- openhands_extensions-0.12.0/tests/fixtures/automations/github-repo-monitor.json +180 -0
- openhands_extensions-0.12.0/tests/fixtures/automations/incident-retrospective-drafter.json +91 -0
- openhands_extensions-0.12.0/tests/test_automation_setup.py +526 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_catalogs.py +37 -12
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_deprecations.py +39 -4
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_integration_catalog_in_sync.py +50 -60
- openhands_extensions-0.11.0/.release-please-manifest.json +0 -3
- openhands_extensions-0.11.0/automations/README.md +0 -15
- openhands_extensions-0.11.0/automations/catalog/github-pr-reviewer.json +0 -13
- openhands_extensions-0.11.0/automations/catalog/github-repo-monitor.json +0 -11
- openhands_extensions-0.11.0/automations/catalog/incident-retrospective-drafter.json +0 -15
- openhands_extensions-0.11.0/automations/index.d.ts +0 -14
- openhands_extensions-0.11.0/automations/index.js +0 -20
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.agents/skills/custom-codereview-guide.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.claude-plugin/marketplace.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.github/pull_request_template.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.github/release.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.github/workflows/check-extensions.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.github/workflows/deprecation-check.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.github/workflows/npm-publish.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.github/workflows/pr.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.github/workflows/pypi-publish.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.github/workflows/release.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.github/workflows/tests.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.github/workflows/vulnerability-scan.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/.gitignore +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/LICENSE +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/analysis_results.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/index.js +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/airtable.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/apify.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/asana.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/atlassian-rovo.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/atlassian.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/bitbucket.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/box.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/brave-search.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/browser-mcp.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/canva.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/clickhouse.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/cloudflare-bindings.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/cloudflare-browser-rendering.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/cloudflare-builds.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/cloudflare-docs.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/cloudflare-observability.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/confluence.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/deepwiki.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/discord.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/elevenlabs.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/everything.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/exa.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/fetch.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/figma.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/filesystem.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/firecrawl.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/git.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/github.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/gmail.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/google-calendar.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/google-docs.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/google-drive.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/google-sheets.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/hubspot.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/huggingface.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/intercom.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/jira.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/kagi.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/linear.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/memory.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/microsoft-outlook.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/microsoft-teams.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/miro.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/monday.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/mongodb.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/neon.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/netlify.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/notion.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/obsidian.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/okta.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/onedrive.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/ordinal.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/paypal.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/playwright.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/posthog.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/quickbooks.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/redis.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/resend.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/salesforce.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/sentry.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/sequential-thinking.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/sharepoint.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/slack.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/stripe.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/supabase.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/superhuman-mail.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/tavily.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/time.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/trello.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/vanta.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/vercel.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/webflow.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/xero.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog/zoom.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog-index.js +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/catalog.schema.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/icons/salesforce.svg +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/icons/slack.svg +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/integrations/index.js +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/marketplaces/large-codebase.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/marketplaces/openhands-extensions.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/city-weather/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/city-weather/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/city-weather/commands/now.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/references/troubleshooting.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/skills/build-setup/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/skills/build-setup/scripts/install-gnucobol.sh +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/skills/cobol-modernization/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/skills/mainframe-planning/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/skills/mainframe-removal/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/skills/mainframe-removal/references/cics-transformation-examples.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/skills/to-java-migration/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/skills/to-java-migration/references/cobol-to-java-example.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/cobol-modernization/skills/to-java-migration/references/datatype-mappings.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/issue-duplicate-checker/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/issue-duplicate-checker/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/issue-duplicate-checker/action.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/issue-duplicate-checker/scripts/auto_close_duplicate_issues.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/issue-duplicate-checker/scripts/issue_duplicate_check_openhands.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/issue-duplicate-checker/scripts/post_duplicate_notice.cjs +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/issue-duplicate-checker/scripts/remove_duplicate_candidate_label.cjs +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/magic-test/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/magic-test/skills/magic-word/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/migration-scoring/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/migration-scoring/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/migration-scoring/skills/migration-mapping/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/migration-scoring/skills/migration-report/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/migration-scoring/skills/migration-scoring/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/migration-scoring/skills/score-quality/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/migration-scoring/skills/score-quality/references/scoring-criteria.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/migration-scoring/skills/score-style/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/references/criteria.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/agent-readiness-report/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/agent-readiness-report/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/agent-readiness-report/references/criteria.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_agent_instructions.sh +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_build_env.sh +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_feedback_loops.sh +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_policy.sh +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_workflows.sh +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/improve-agent-readiness/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/improve-agent-readiness/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/improve-agent-readiness/references/criteria.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/setup-agents-md/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/setup-agents-md/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/setup-openhands/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/setup-openhands/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/setup-pr-review/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/onboarding/skills/setup-pr-review/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/commands/create.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/commands/openhands-cloud.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/scripts/run.sh +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-api/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-api/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-api/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-api/references/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-api/references/TROUBLESHOOTING.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-api/references/example_prompt.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-api/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-api/scripts/openhands_api.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-api/scripts/openhands_api.ts +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-automation/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-automation/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-automation/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-automation/commands/automation-create.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-automation/references/ab-testing.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-automation/references/custom-automation.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-automation/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-sdk/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-sdk/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/openhands/skills/openhands-sdk/commands/sdk.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/action.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/scripts/agent_script.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/scripts/evaluate_review.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/scripts/prompt.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/code-review/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/code-review/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/code-review/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/code-review/commands/codereview-roasted.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/code-review/commands/codereview.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/code-review/references/risk-evaluation.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/code-review/references/supply-chain-security.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/github-pr-review/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/github-pr-review/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/github-pr-review/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/github-pr-review/commands/github-pr-review.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/skills/github-pr-review/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/workflows/pr-review-by-openhands.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/pr-review/workflows/pr-review-evaluation.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/action.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/scripts/agent_script.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/scripts/evaluate_qa_changes.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/scripts/prompt.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/skills/qa-changes/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/skills/qa-changes/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/skills/qa-changes/commands/qa-changes.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/workflows/qa-changes-by-openhands.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/qa-changes/workflows/qa-changes-evaluation.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/action.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/commands/release-notes.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/scripts/agent_script.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/scripts/generate_release_notes.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/scripts/prompt.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/scripts/validate_release_notes.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/skills/release-notes/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/skills/release-notes/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/skills/release-notes/commands/release-notes.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/release-notes/workflows/release-notes.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/action.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/scripts/scan_and_remediate.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/skills/github/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/skills/github/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/skills/github/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/skills/security/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/skills/security/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/skills/security/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/plugins/vulnerability-remediation/workflows/vulnerability-scan.yml +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/python/openhands_extensions/deprecation.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/python/openhands_extensions/integration_models.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/release-please-config.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/scripts/build-integration-catalog.mjs +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/scripts/build-skills-catalog.mjs +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/scripts/check_deprecations.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/scripts/sync_extensions.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/scripts/sync_openhands_sdk_skill.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/add-javadoc/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/add-javadoc/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/add-javadoc/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/add-javadoc/references/example.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/add-skill/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/add-skill/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/add-skill/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/add-skill/scripts/fetch_skill.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-canvas-environment/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-canvas-environment/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-canvas-environment/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-creator/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-creator/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-creator/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-creator/commands/agent-creator.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-creator/references/fallback.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-memory/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-memory/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-memory/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-memory/commands/remember.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-sdk-builder/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-sdk-builder/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-sdk-builder/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/agent-sdk-builder/commands/agent-builder.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/azure-devops/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/azure-devops/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/azure-devops/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/bitbucket/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/bitbucket/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/bitbucket-cloud/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/bitbucket-cloud/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/bitbucket-cloud/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/bitbucket-data-center/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/bitbucket-data-center/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/bitbucket-data-center/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/code-simplifier/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/code-simplifier/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/code-simplifier/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/code-simplifier/commands/simplify.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/code-simplifier/references/code-quality-review.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/code-simplifier/references/code-reuse-review.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/code-simplifier/references/efficiency-review.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/datadog/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/datadog/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/datadog/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/datadog/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/deno/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/deno/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/deno/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/deno/references/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/discord/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/discord/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/discord/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/discord/__init__.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/discord/references/REFERENCE.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/discord/scripts/__init__.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/discord/scripts/_http.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/discord/scripts/post_webhook.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/discord/scripts/send_message.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/docker/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/docker/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/docker/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/evidence-based-citations/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/evidence-based-citations/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/evidence-based-citations/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/flarglebargle/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/flarglebargle/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/flarglebargle/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/frontend-design/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/frontend-design/LICENSE.txt +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/frontend-design/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/frontend-design/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-actions/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-actions/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-actions/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-pr-reviewer/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-pr-reviewer/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-pr-reviewer/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-pr-reviewer/commands/pr-reviewer-setup.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-pr-reviewer/references/state-schema.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-pr-reviewer/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-pr-reviewer/scripts/main.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-repo-monitor/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-repo-monitor/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-repo-monitor/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-repo-monitor/commands/github-monitor-poll.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-repo-monitor/references/github-api.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-repo-monitor/references/state-schema.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-repo-monitor/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-repo-monitor/scripts/main.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/github-repo-monitor/tests/test_main.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/gitlab/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/gitlab/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/incident-retrospective/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/incident-retrospective/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/incident-retrospective/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/incident-retrospective/commands/incident-retro-setup.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/index.d.ts +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/iterate/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/iterate/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/iterate/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/iterate/commands/babysit.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/iterate/commands/iterate.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/iterate/commands/verify.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/iterate/references/heuristics.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/iterate/references/verification.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/iterate/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/jira-issue-to-pr/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/jira-issue-to-pr/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/jira-issue-to-pr/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/jira-issue-to-pr/references/setup.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/jira-issue-to-pr/scripts/main.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/jupyter/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/jupyter/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/jupyter/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/kubernetes/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/kubernetes/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/kubernetes/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/kubernetes/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/learn-from-code-review/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/learn-from-code-review/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/learn-from-code-review/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/learn-from-code-review/commands/learn-from-reviews.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/linear/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/linear/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/linear/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/linear/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/linear-triage/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/linear-triage/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/linear-triage/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/linear-triage/commands/linear-triage-setup.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/notion/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/notion/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/notion/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/notion/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/npm/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/npm/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/npm/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/pdflatex/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/pdflatex/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/pdflatex/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/plain-english-content/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/plain-english-content/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/plain-english-content/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/prd/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/prd/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/prd/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/prd/commands/prd.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/research-brief/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/research-brief/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/research-brief/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/research-brief/commands/research-brief-setup.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/skill-creator/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/skill-creator/LICENSE.txt +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/skill-creator/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/skill-creator/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/skill-creator/references/output-patterns.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/skill-creator/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/skill-creator/references/workflows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/skill-creator/scripts/init_skill.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/skill-creator/scripts/quick_validate.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-channel-monitor/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-channel-monitor/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-channel-monitor/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-channel-monitor/commands/slack-monitor-poll.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-channel-monitor/references/slack-api.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-channel-monitor/references/state-schema.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-channel-monitor/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-channel-monitor/scripts/main.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-standup-digest/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-standup-digest/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-standup-digest/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/slack-standup-digest/commands/standup-digest-setup.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/spark-version-upgrade/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/spark-version-upgrade/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/spark-version-upgrade/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/ssh/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/ssh/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/ssh/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/ssh/references/windows.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/swift-linux/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/swift-linux/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/swift-linux/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/technical-writing/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/technical-writing/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/technical-writing/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/LICENSE.txt +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/theme-showcase.pdf +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/themes/arctic-frost.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/themes/botanical-garden.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/themes/desert-rose.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/themes/forest-canopy.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/themes/golden-hour.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/themes/midnight-galaxy.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/themes/modern-minimalist.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/themes/ocean-depths.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/themes/sunset-boulevard.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/theme-factory/themes/tech-innovation.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/uv/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/uv/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/uv/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/uv/references/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/vercel/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/vercel/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/skills/vercel/SKILL.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_add_skill_installs_to_agents_dir.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_catalog_schema.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_code_review_risk_evaluation.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_github_pr_review_skill.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_issue_duplicate_checker.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_live_integration_smoke.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_openhands_api_python.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_plugin_manifest.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_pr_review_diff_payload.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_pr_review_feedback.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_pr_review_prompt.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_pr_review_review_context.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_qa_changes.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_qa_changes_evaluation.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_release_notes_generator.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_sdk_loading.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_skill_plugin_loading.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_skills_catalog.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_skills_have_readme.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_slack_channel_monitor.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_sync_extensions.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_version_alignment.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/tests/test_workflow_sync.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/utils/analysis/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/utils/analysis/laminar_signals/README.md +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/utils/analysis/laminar_signals/analyze.py +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/utils/analysis/laminar_signals/templates/default.j2 +0 -0
- {openhands_extensions-0.11.0 → openhands_extensions-0.12.0}/utils/analysis/laminar_signals/templates/pr_review.j2 +0 -0
|
@@ -90,7 +90,8 @@ When editing or adding skills in this repo, follow these rules (and add new skil
|
|
|
90
90
|
- Keep formatting consistent across skills.
|
|
91
91
|
- If you change a skill’s behavior or scope, update its `README.md` (if present) accordingly.
|
|
92
92
|
- If you change top-level documentation, ensure links still resolve.
|
|
93
|
-
- `integrations/catalog/*.json` is the single hand-authored source of truth consumed by `@openhands/extensions`; adding or editing an integration should require changing exactly one JSON file in that directory. Do not reintroduce `integrations/integration-catalog.json`, separate provider files, per-language catalog duplicates, or provider-specific runtime code. Run `npm run build:integrations` after catalog edits to regenerate `integrations/catalog-index.js`, which statically imports each individual JSON file for the JS package. The Python package includes the same individual JSON files via wheel data and reads them directly. 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. JS exposes `listIntegrationCatalog({ mcp, oauth })` / `getIntegrationCatalogEntry`; Python mirrors with `
|
|
93
|
+
- `integrations/catalog/*.json` is the single hand-authored source of truth consumed by `@openhands/extensions`; adding or editing an integration should require changing exactly one JSON file in that directory. Do not reintroduce `integrations/integration-catalog.json`, separate provider files, per-language catalog duplicates, or provider-specific runtime code. Run `npm run build:integrations` after catalog edits to regenerate `integrations/catalog-index.js`, which statically imports each individual JSON file for the JS package. The Python package includes the same individual JSON files via wheel data and reads them directly. 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. JS exposes `listIntegrationCatalog({ mcp, oauth })` / `getIntegrationCatalogEntry`; Python mirrors with `list_integration_catalog_models(mcp=, oauth=)` / `get_integration_catalog_entry_model`, which return validated Pydantic models (the raw-dict accessors were deprecated in 0.10.0 and removed in 0.12.0). The legacy provider-catalog compatibility layer and `managedConnectorMigration` / `legacyScopeBundles` / `canonicalServerUrl` / `errorHints` mechanisms were removed intentionally; providers declare only standard OAuth config as integration data.
|
|
94
|
+
- `automations/catalog/<id>/` follows the same rule, as a directory per automation so an automation can ship the scripts it uploads to the automations service alongside its metadata. `manifest.json` is the single hand-authored file, carrying both the card metadata and an optional nested `setup` block (the extension-owned configuration experience). Every entry is validated against `automations/catalog.schema.json`. Run `npm run build:automations` after catalog edits to regenerate `automations/catalog-index.js`. JS exposes `listAutomationCatalog()` / `getAutomationCatalogEntry(id)` alongside `AUTOMATION_CATALOG`. The governing rule is that a manifest states only what varies between automations, and states it once; anything derivable is absent and the host generates it. Derived, so never written in a manifest: the command that launches the card (read from the `triggers:` frontmatter of the skill named by `skill`, which defaults to `id` and is stated only where the two differ - editing an automation must never require editing a skill), the setup route (`/automations/new/<id>`), the trigger kinds a deployment must support (the keys of `setup.form.triggers`), schedule limits and timezone lists (the `cron` and `timezone` field types), the preflight call, the create request's `name`/`repos`/`trigger` (rebuilt from the entry name, the repo-picker field and the keys and fields under `setup.form.triggers`, where a field is named after the property it fills), the mapping from a rejected payload path back to the input at fault, the review screen, the create endpoint, the post-success navigation, and the analytics stages. `requires.integrations` is keyed by integration id and lives on the entry, not in `setup`, because a card lists its integrations whether or not it ships a setup flow; there is no key anywhere for a credential, because the credential comes with the connection. `setup.form` splits inputs into `triggers` (keyed by trigger kind - what decides when the automation runs) and `args` (everything else), both keyed by field name. `setup` declares a `prompt` (plus a `filter` for an event trigger) when `mode` is `direct`, and a `message` when it is `assisted`. Contract fixtures are test vectors, not catalog data: they live in `tests/fixtures/automations/`, are optional per automation, and are reachable only through the `@openhands/extensions/testing/automations/*.json` subpath - never from the runtime entry point.
|
|
94
95
|
- 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
96
|
- 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
97
|
- 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.
|
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Migration Guide
|
|
2
2
|
|
|
3
|
+
## Python raw-dict catalog accessors removed in 0.12.0
|
|
4
|
+
|
|
5
|
+
`openhands_extensions.list_integration_catalog` and
|
|
6
|
+
`openhands_extensions.get_integration_catalog_entry` were deprecated in 0.10.0
|
|
7
|
+
with `removed_in="0.12.0"` and are removed in 0.12.0, per the two-minor-release
|
|
8
|
+
runway enforced by `scripts/check_deprecations.py`. Replace them with the typed
|
|
9
|
+
accessors, which validate every entry against `IntegrationCatalogEntry`:
|
|
10
|
+
|
|
11
|
+
```diff
|
|
12
|
+
-from openhands_extensions import get_integration_catalog_entry, list_integration_catalog
|
|
13
|
+
+from openhands_extensions import (
|
|
14
|
+
+ get_integration_catalog_entry_model,
|
|
15
|
+
+ list_integration_catalog_models,
|
|
16
|
+
+)
|
|
17
|
+
|
|
18
|
+
-entries = list_integration_catalog(oauth=True)
|
|
19
|
+
-entry = get_integration_catalog_entry("github")
|
|
20
|
+
-entry_id = entry["id"]
|
|
21
|
+
+entries = list_integration_catalog_models(oauth=True)
|
|
22
|
+
+entry = get_integration_catalog_entry_model("github")
|
|
23
|
+
+entry_id = entry.id
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The filter arguments (`mcp=`, `oauth=`) and the `None` returned for an unknown
|
|
27
|
+
id are unchanged; only the element type differs. Callers that genuinely need
|
|
28
|
+
JSON-compatible dictionaries can call `model.model_dump(exclude_none=True)`,
|
|
29
|
+
which reproduces the hand-authored entry exactly, or read the unchanged
|
|
30
|
+
`INTEGRATION_CATALOG_SNAPSHOT`. The JavaScript API is unaffected:
|
|
31
|
+
`listIntegrationCatalog` / `getIntegrationCatalogEntry` keep returning plain
|
|
32
|
+
objects.
|
|
33
|
+
|
|
3
34
|
## MCP catalog to integration catalog
|
|
4
35
|
|
|
5
36
|
This package version is still `0.0.0`, and the MCP catalog was an experimental
|
|
@@ -61,21 +61,23 @@ See [`integrations/README.md`](integrations/README.md), [`automations/README.md`
|
|
|
61
61
|
|
|
62
62
|
The integration catalog is also published as a Python package (`openhands-extensions`) so Python services read the same catalog data as JS consumers. The single source of truth is the hand-authored JSON directory `integrations/catalog/<id>.json`; there is no separate provider file and no aggregate catalog JSON to maintain. Both the JS package (`@openhands/extensions/integrations`) and the Python package read those same per-integration JSON files and expose parallel read functions.
|
|
63
63
|
|
|
64
|
-
Each catalog entry can carry oauth and/or mcp/http `connectionOptions`. `supportsOauth` / `supportsMcp` flags are derived at runtime. Use `listIntegrationCatalog({ mcp, oauth })` (JS) or `
|
|
64
|
+
Each catalog entry can carry oauth and/or mcp/http `connectionOptions`. `supportsOauth` / `supportsMcp` flags are derived at runtime. Use `listIntegrationCatalog({ mcp, oauth })` (JS) or `list_integration_catalog_models(mcp=, oauth=)` (Python) to filter by connector type - for example only integrations that support an oauth connector.
|
|
65
65
|
|
|
66
66
|
```python
|
|
67
67
|
from openhands_extensions import (
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
list_integration_catalog_models, # listIntegrationCatalog({ mcp, oauth })
|
|
69
|
+
get_integration_catalog_entry_model, # getIntegrationCatalogEntry(id)
|
|
70
70
|
INTEGRATION_CATALOG_SNAPSHOT, # { integrations }
|
|
71
71
|
)
|
|
72
72
|
|
|
73
|
-
all_integrations =
|
|
74
|
-
oauth_integrations =
|
|
75
|
-
mcp_integrations =
|
|
76
|
-
sample =
|
|
73
|
+
all_integrations = list_integration_catalog_models()
|
|
74
|
+
oauth_integrations = list_integration_catalog_models(oauth=True) # only entries with an oauth connector
|
|
75
|
+
mcp_integrations = list_integration_catalog_models(mcp=True) # only entries with an mcp connector
|
|
76
|
+
sample = get_integration_catalog_entry_model(all_integrations[0].id)
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
+
The Python functions return validated `IntegrationCatalogEntry` models. The raw-dictionary accessors `list_integration_catalog` / `get_integration_catalog_entry` were deprecated in 0.10.0 and removed in 0.12.0; see [`MIGRATION.md`](MIGRATION.md).
|
|
80
|
+
|
|
79
81
|
Install from git (the hub backend consumes it this way):
|
|
80
82
|
|
|
81
83
|
```bash
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# Automations
|
|
2
|
+
|
|
3
|
+
`catalog/<id>/` is one automation. Its `manifest.json` is the single hand-authored source of truth: the
|
|
4
|
+
card metadata Agent Canvas renders today and, optionally, a nested `setup` block, the extension-owned
|
|
5
|
+
configuration experience for that automation. Anything else an automation ships, such as a script that is
|
|
6
|
+
uploaded to the automations service as a `.tar.gz`, belongs in the same directory.
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
catalog/<id>/manifest.json one automation per directory - card metadata plus an optional `setup` block
|
|
10
|
+
catalog.schema.json the contract, JSON Schema draft 2020-12
|
|
11
|
+
catalog-index.js generated from catalog/ - do not edit by hand
|
|
12
|
+
index.js the stable API for Node.js and bundlers
|
|
13
|
+
index.d.ts the public TypeScript shape
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Adding or changing an automation should require changing exactly one JSON file. Run
|
|
17
|
+
`npm run build:automations` afterwards to regenerate `catalog-index.js`, which statically imports each
|
|
18
|
+
individual manifest for the JS package.
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
import {
|
|
22
|
+
AUTOMATION_CATALOG,
|
|
23
|
+
listAutomationCatalog,
|
|
24
|
+
getAutomationCatalogEntry,
|
|
25
|
+
} from "@openhands/extensions/automations";
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
All three return independent copies.
|
|
29
|
+
|
|
30
|
+
## The governing rule
|
|
31
|
+
|
|
32
|
+
**A manifest states only what varies between automations, and states each of those things once.**
|
|
33
|
+
Anything that can be worked out from another field is absent, and the host generates it. That is what keeps
|
|
34
|
+
two records of the same fact from drifting apart, and it is why the file is as short as it is.
|
|
35
|
+
|
|
36
|
+
| Not declared | Where it comes from |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| The command the card launches | The `triggers:` frontmatter of the skill named by `skill`, which the skills catalog already exposes |
|
|
39
|
+
| The setup route | `/automations/new/<id>` |
|
|
40
|
+
| The integrations the card lists | `requires.integrations`, which every entry carries |
|
|
41
|
+
| The capabilities endpoint | The host queries it for every automation |
|
|
42
|
+
| The trigger kinds a deployment must support | The keys of `setup.form.triggers` |
|
|
43
|
+
| Schedule limits and the timezone list | The `cron` and `timezone` field types |
|
|
44
|
+
| Local validation rules | The `required` flag and `constraints` on each field |
|
|
45
|
+
| The preflight call | `POST /v1/validate` with the entry id, the create endpoint, and the rendered payload |
|
|
46
|
+
| The created automation's name | The entry's `name`, plus the repository that was picked |
|
|
47
|
+
| `repos` in the create request | The repo-picker field, its declared `provider`, and a field named `ref` if there is one |
|
|
48
|
+
| `trigger` in the create request | The key under `form.triggers`, and the fields under it named after trigger properties |
|
|
49
|
+
| Which input a rejected payload path belongs to | Rebuilding that body with each field standing in for its own value |
|
|
50
|
+
| The review screen | The fields and their labels |
|
|
51
|
+
| The create endpoint | `POST /v1/preset/prompt` |
|
|
52
|
+
| Where a success navigates | The created automation, or the started conversation |
|
|
53
|
+
| The analytics stages | The same stages for every automation |
|
|
54
|
+
|
|
55
|
+
`tests/test_automation_setup.py` derives the preflight body and the payload-path mapping from the entry and
|
|
56
|
+
checks them against the recorded fixtures, so these deletions stay honest rather than becoming assumptions.
|
|
57
|
+
|
|
58
|
+
## What an entry carries
|
|
59
|
+
|
|
60
|
+
```jsonc
|
|
61
|
+
{
|
|
62
|
+
"id": "github-pr-reviewer",
|
|
63
|
+
"name": "GitHub Code Review Agent",
|
|
64
|
+
"category": "Code review",
|
|
65
|
+
"description": "...",
|
|
66
|
+
"requires": {
|
|
67
|
+
"integrations": { "github": { "message": "Used to read pull requests and post review comments." } },
|
|
68
|
+
"features": ["repoClone", "presetPrompt"]
|
|
69
|
+
},
|
|
70
|
+
"popularityRank": 100,
|
|
71
|
+
"estimatedSetupMinutes": 4,
|
|
72
|
+
"exampleImplementation": "...",
|
|
73
|
+
"setup": {
|
|
74
|
+
"version": "1.0",
|
|
75
|
+
"mode": "direct",
|
|
76
|
+
"form": {
|
|
77
|
+
"triggers": { "cron": { "schedule": {...}, "timezone": {...} } },
|
|
78
|
+
"args": { "repository": {...}, "triggerLabel": {...}, "reviewTone": {...} }
|
|
79
|
+
},
|
|
80
|
+
"prompt": "Review pull requests labeled '{{form.triggerLabel}}' in {{form.repository}}. ..."
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
`requires` sits on the entry, not inside `setup`, because a card lists the integrations it needs whether or
|
|
86
|
+
not it ships a setup flow. Integrations are keyed by id, and each id must match an entry in
|
|
87
|
+
`integrations/catalog/*.json`. Every one carries a `message` saying what it is for, so an integration is
|
|
88
|
+
never listed with nothing attached. `required` defaults to true; state `false` only for an integration
|
|
89
|
+
setup can proceed without.
|
|
90
|
+
|
|
91
|
+
`skill` names the `skills/` directory that builds this automation today, and defaults to `id`, so only the
|
|
92
|
+
three entries whose names differ from their skill state it. The command that launches that skill is **not**
|
|
93
|
+
repeated here: it lives once, in the skill's own `triggers:` frontmatter, and the skills catalog exposes it.
|
|
94
|
+
That way a skill can rename its trigger without leaving a stale copy behind in this catalog.
|
|
95
|
+
|
|
96
|
+
`setup` is optional. Three of eight entries carry one today. It never repeats `id`, `name`, `category`, or
|
|
97
|
+
`description`. `setup.version` selects how the block is interpreted; a future format ships a new constant.
|
|
98
|
+
|
|
99
|
+
### Triggers and args
|
|
100
|
+
|
|
101
|
+
`form` separates the two things a user is configuring, and both are keyed by field name:
|
|
102
|
+
|
|
103
|
+
- **`form.triggers`** decides *when* the automation runs, keyed by trigger kind (`cron` or `event`).
|
|
104
|
+
`github-pr-reviewer` asks for a schedule and a timezone; `github-repo-monitor` asks which GitHub event to
|
|
105
|
+
answer and which phrase to match.
|
|
106
|
+
- **`form.args`** is everything else: the arguments to the automation itself, such as the repository to
|
|
107
|
+
clone and the tone of the review.
|
|
108
|
+
|
|
109
|
+
An assisted entry declares no triggers, because the trigger is settled during the conversation.
|
|
110
|
+
|
|
111
|
+
### What the form produces
|
|
112
|
+
|
|
113
|
+
- **`mode: "direct"`** declares a `prompt`: what the automation is told to do. The rest of the create
|
|
114
|
+
request restates the form, so it is not written out. An event trigger also declares a `filter`, because
|
|
115
|
+
composing form values into a JMESPath expression is the one part of an event trigger that cannot be read
|
|
116
|
+
off the form.
|
|
117
|
+
- **`mode: "assisted"`** declares a `message`: setup context handed to an agent conversation that finishes
|
|
118
|
+
the job. The command that opens that conversation comes from the skill, so it is not repeated here.
|
|
119
|
+
|
|
120
|
+
A form field is named after the property it fills. `schedule` and `timezone` under `triggers.cron` become
|
|
121
|
+
`trigger.schedule` and `trigger.timezone`; `on` under `triggers.event` becomes `trigger.on`; a field named
|
|
122
|
+
`ref` becomes `repos[].ref`. Any other field under a trigger kind, such as a phrase to match, is an input
|
|
123
|
+
to `filter` rather than a trigger property.
|
|
124
|
+
|
|
125
|
+
### Format constraints
|
|
126
|
+
|
|
127
|
+
A setup block is data that instructs another repo to render copy and build a request, so the schema is the
|
|
128
|
+
trust boundary. It enforces:
|
|
129
|
+
|
|
130
|
+
- **No code.** There is no key that accepts JavaScript, and no free-form value that is executed.
|
|
131
|
+
- **No markup.** Every user-visible copy field rejects HTML. Payload strings do not, because they are never
|
|
132
|
+
rendered - that is what lets an event filter carry expression syntax.
|
|
133
|
+
- **No arbitrary requests.** An entry supplies a request *body*. It does not name a host, a path, or a
|
|
134
|
+
method, so it cannot express a request to anywhere the host did not choose.
|
|
135
|
+
- **No credentials.** There is no key for a credential at all. An automation names the integrations it
|
|
136
|
+
needs; the credential comes from the connection the user already made.
|
|
137
|
+
- **No supplied regex.** `constraints.format` names a host-implemented check from a closed set, so an entry
|
|
138
|
+
cannot hand the host a pathological pattern.
|
|
139
|
+
|
|
140
|
+
Placeholders are namespaced and the schema rejects any other namespace: `{{form.*}}` for what the user
|
|
141
|
+
entered and `{{automation.*}}` for the entry itself. There is deliberately no secrets namespace.
|
|
142
|
+
|
|
143
|
+
### The three archetypes
|
|
144
|
+
|
|
145
|
+
| Entry | Archetype | Trigger | Produces |
|
|
146
|
+
| --- | --- | --- | --- |
|
|
147
|
+
| `github-pr-reviewer` | Direct scheduled | `cron` | a create payload |
|
|
148
|
+
| `github-repo-monitor` | Direct GitHub-event | `event` on `github` with a JMESPath filter | a create payload |
|
|
149
|
+
| `incident-retrospective-drafter` | Assisted conversation | decided during the conversation | a seed message |
|
|
150
|
+
|
|
151
|
+
The assisted archetype has no payload and no preflight, because at the end of its flow no automation exists
|
|
152
|
+
yet. The agent creates it during the conversation, and the service validates it there. That is the defining
|
|
153
|
+
property of the archetype, not an omission.
|
|
154
|
+
|
|
155
|
+
### Two generations in one entry
|
|
156
|
+
|
|
157
|
+
`skill` and `exampleImplementation` describe the **current** path: Agent Canvas launches that skill, and the
|
|
158
|
+
agent builds the automation. `setup` describes the **declarative** path that replaces it.
|
|
159
|
+
|
|
160
|
+
They can differ in more than wording. `github-repo-monitor`'s skill polls GitHub on a cron and states that
|
|
161
|
+
a webhook variant is out of scope, while its `setup` block creates the webhook form the service already
|
|
162
|
+
supports. Both statements are accurate about their own generation. Retiring the skill path for entries that
|
|
163
|
+
ship a `setup` block belongs to whoever promotes this to production.
|
|
164
|
+
|
|
165
|
+
## Contract fixtures
|
|
166
|
+
|
|
167
|
+
The fixtures are independent test vectors, not part of the runtime catalog. They live in
|
|
168
|
+
`tests/fixtures/automations/*.json` and are not required for every automation. Downstream contract tests
|
|
169
|
+
reach them through an explicit testing subpath:
|
|
170
|
+
|
|
171
|
+
```js
|
|
172
|
+
import scenarios from "@openhands/extensions/testing/automations/github-pr-reviewer.json";
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
`tests/fixtures/automations/<automation-id>.json` pairs the values a user types with the exact request that
|
|
176
|
+
must result. That pairing is the contract: form shape and API shape genuinely differ, the create endpoint
|
|
177
|
+
is declared `extra="forbid"`, and a mapping mistake is a 422 discovered only at creation time.
|
|
178
|
+
|
|
179
|
+
Each scenario carries whichever blocks apply: `formValues`, `integrationState`, `localValidation`,
|
|
180
|
+
`preflight`, `create`, `conversation`, `expectedFieldErrors`, `expectedPrerequisiteOutcome`.
|
|
181
|
+
`capabilities.json` holds three deployment shapes so the unsupported paths have coverage too.
|
|
182
|
+
|
|
183
|
+
Beyond the derivation checks, every request body here has been verified against the live Pydantic models in
|
|
184
|
+
`OpenHands/automation`:
|
|
185
|
+
|
|
186
|
+
- each `201` body validates against `CreatePromptAutomationRequest`
|
|
187
|
+
- each `422` body reproduces the error detail the service actually returns, including the `loc` path
|
|
188
|
+
- each response `trigger` matches what `model_dump()` stores, so defaults such as `timezone` are present
|
|
189
|
+
- each event filter compiles, because `EventTrigger` validates it on construction
|
|
190
|
+
|
|
191
|
+
Two findings came out of that check and are baked into the entries:
|
|
192
|
+
|
|
193
|
+
- **`repos[].provider` is required** for short `owner/repo` URLs. Without it the create request is a hard
|
|
194
|
+
422, not a silently dropped field. Recorded as the `short-repo-url-without-provider-is-rejected` scenario.
|
|
195
|
+
- **A trigger phrase containing an apostrophe breaks the event filter**, because it is interpolated into a
|
|
196
|
+
JMESPath string literal. Hence `constraints.format: "safeExpressionLiteral"` on that field, and the
|
|
197
|
+
`quote-in-trigger-phrase-blocked-locally` scenario.
|
|
198
|
+
|
|
199
|
+
## Endpoints the host calls
|
|
200
|
+
|
|
201
|
+
| Endpoint | Status |
|
|
202
|
+
| --- | --- |
|
|
203
|
+
| `POST /v1/preset/prompt` | Exists |
|
|
204
|
+
| `GET /v1/capabilities` | Does not exist. Defining it is OpenHands/automation#262 |
|
|
205
|
+
| `POST /v1/validate` | Does not exist. Defining it is OpenHands/automation#262 |
|
|
206
|
+
|
|
207
|
+
None of these appear in a manifest. They are the host's, which is why settling on different paths changes
|
|
208
|
+
no catalog entry at all.
|
|
209
|
+
|
|
210
|
+
## Deviations from the project reference document
|
|
211
|
+
|
|
212
|
+
The shape sketched in the project reference document is marked as a proposal, and hands several open
|
|
213
|
+
questions to this work. What changed and why:
|
|
214
|
+
|
|
215
|
+
| Proposed | Decision |
|
|
216
|
+
| --- | --- |
|
|
217
|
+
| A separate manifest file per automation | Merged into the catalog entry as `setup`, so there is one hand-authored record per automation and nothing to keep in sync. |
|
|
218
|
+
| `prompt` | Removed. It duplicated the slash command already declared in the skill's `triggers:` frontmatter. The entry names the `skill` instead, defaulting to `id`, and the command is looked up from the skills catalog. |
|
|
219
|
+
| `requiredIntegrationIds` | Removed. It duplicated the integration ids in `requires`, which now sits on the entry so every automation carries them once. |
|
|
220
|
+
| `routes` | Removed. The only route is `/automations/new/<id>`. |
|
|
221
|
+
| `capabilities` | Removed. The discovery call is the same for every automation, and the block's only entry-specific content was a feature list, now `requires.features`. |
|
|
222
|
+
| `capabilities.bindings` | Removed. The `cron` and `timezone` field types tell the host to resolve the deployment's limits on their own. |
|
|
223
|
+
| `requires.secrets` | Removed. An automation that needs GitHub declares the GitHub integration; the credential comes with the connection rather than being asked for twice. |
|
|
224
|
+
| `requires.onUnmet` / `onWarn` | Removed. What to do about an unmet requirement follows from `required`, and the copy follows from the integration's `message`. |
|
|
225
|
+
| `enforcement: "block" \| "warn"` | Replaced by `required`, which defaults to true and is stated only when false. |
|
|
226
|
+
| `reason` / `help` / `message` | Unified on `message`. Three words for one thing. |
|
|
227
|
+
| `form.fields` | Split into `form.triggers` and `form.args`, and both keyed by field name so the name is the key rather than a repeated property. |
|
|
228
|
+
| `validation` | Removed. The preflight call has the same shape for every automation, and the payload-path mapping is recovered by walking `payload`. |
|
|
229
|
+
| `review` | Removed. The confirmation screen is the declared fields and their labels. |
|
|
230
|
+
| `submit` | Reduced to the parts that vary: `prompt` and, for an event trigger, `filter` for direct; `message` for assisted. The action, endpoint, success navigation, and error handling are identical everywhere. |
|
|
231
|
+
| `submit.payload` | Removed. `name`, `repos` and `trigger` all restated the form, so they are rebuilt from it. What is left is the prompt and the event filter. |
|
|
232
|
+
| `analytics` | Removed. The same stages fire for every automation, so they belong in shared host code. |
|
|
233
|
+
| `workflow.steps` | Removed. It restated which keys were present, creating a second source of truth that could contradict the file. |
|
|
234
|
+
| `form.intent: "seed"` | Removed. Derivable from `setup.mode: "assisted"`. |
|
|
235
|
+
| `triggerKindsAnyOf` | Removed. The keys of `form.triggers` are the trigger kinds. |
|
|
236
|
+
| `{{form.filledCount}}` | Removed. It overloaded the `form` namespace with a computed value that names no field. |
|
|
237
|
+
| `submit.message` | Kept as `setup.message`, capped at 2000 characters, so seed messages cannot grow back into the giant runtime prompts that recommended automation cards were already fixed to stop sending. |
|
|
238
|
+
|
|
239
|
+
## Open questions
|
|
240
|
+
|
|
241
|
+
Recorded rather than resolved, because they need an owner outside this contract:
|
|
242
|
+
|
|
243
|
+
- **Localization.** Entries carry literal copy, because the ownership split assigns copy to this repo.
|
|
244
|
+
Agent Canvas ships 15 languages. Shipping i18n keys instead would move the copy back into Canvas, so the
|
|
245
|
+
gap is real and unsolved.
|
|
246
|
+
- **Distribution.** Agent Canvas pins `@openhands/extensions`, so changing an entry still needs a version
|
|
247
|
+
bump and a dependency update. Delivering "change automation UI without a Canvas release" needs runtime
|
|
248
|
+
loading.
|
|
249
|
+
- **Integration credentials at runtime.** Dropping `requires.secrets` assumes a created automation can use
|
|
250
|
+
the credential behind a connected integration. Whether the automations service receives it, and how, is
|
|
251
|
+
not settled here.
|
|
252
|
+
- **Grouped review rows.** The review screen is now one row per field. The hand-written summaries grouped
|
|
253
|
+
related fields onto one line, which reads better; if that matters, it is a host concern, not an entry's.
|
|
254
|
+
- **Assisted-setup completion.** The assisted flow ends at a conversation, so the host cannot emit a
|
|
255
|
+
completion event. Until something reports back, the ratio of direct to assisted setup is not measurable.
|
|
256
|
+
- **Edit and delete routes.** Only the `new` route is modelled here.
|
|
257
|
+
- **Types from the schema.** `index.d.ts` is hand-written and mirrors `catalog.schema.json`. Generating it
|
|
258
|
+
would remove that second source of truth.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "github-pr-reviewer",
|
|
3
|
+
"name": "GitHub Code Review Agent",
|
|
4
|
+
"category": "Code review",
|
|
5
|
+
"description": "Watch for a configurable label on GitHub pull requests, inspect full PR and repository context, and post an AI review comment once per label event.",
|
|
6
|
+
"requires": {
|
|
7
|
+
"integrations": {
|
|
8
|
+
"github": {
|
|
9
|
+
"message": "Used to read pull requests and post review comments."
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"features": [
|
|
13
|
+
"repoClone",
|
|
14
|
+
"presetPrompt"
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
"popularityRank": 100,
|
|
18
|
+
"estimatedSetupMinutes": 4,
|
|
19
|
+
"exampleImplementation": "Trigger: cron polling for open GitHub PRs with a configured label such as openhands-review\nRequired secret: GITHUB_PERSONAL_ACCESS_TOKEN\n\n1. Read repository, trigger label, review tone, and polling schedule from setup.\n2. List open PRs and find the latest matching GitHub labeled issue event for each labeled PR.\n3. Deduplicate on the label event ID so every label application queues exactly one review.\n4. Start an OpenHands conversation that clones the repo, checks out the exact PR head SHA, and inspects PR discussion, review comments, changed files, diff, and surrounding code.\n5. Post an acknowledgement with the conversation link, then post the final AI review comment only if the PR is still open and the head SHA has not changed.",
|
|
20
|
+
"setup": {
|
|
21
|
+
"version": "1.0",
|
|
22
|
+
"mode": "direct",
|
|
23
|
+
"form": {
|
|
24
|
+
"triggers": {
|
|
25
|
+
"cron": {
|
|
26
|
+
"schedule": {
|
|
27
|
+
"type": "cron",
|
|
28
|
+
"label": "Check frequency",
|
|
29
|
+
"help": "How often to look for newly labelled pull requests.",
|
|
30
|
+
"default": "*/15 * * * *",
|
|
31
|
+
"required": true
|
|
32
|
+
},
|
|
33
|
+
"timezone": {
|
|
34
|
+
"type": "timezone",
|
|
35
|
+
"label": "Timezone",
|
|
36
|
+
"help": "Timezone the schedule is interpreted in.",
|
|
37
|
+
"default": "UTC",
|
|
38
|
+
"required": true
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"args": {
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "repo-picker",
|
|
45
|
+
"label": "Repository",
|
|
46
|
+
"help": "The repository whose pull requests will be reviewed.",
|
|
47
|
+
"provider": "github",
|
|
48
|
+
"required": true
|
|
49
|
+
},
|
|
50
|
+
"triggerLabel": {
|
|
51
|
+
"type": "text",
|
|
52
|
+
"label": "Trigger label",
|
|
53
|
+
"help": "Only pull requests carrying this label are reviewed.",
|
|
54
|
+
"default": "openhands-review",
|
|
55
|
+
"required": true,
|
|
56
|
+
"constraints": {
|
|
57
|
+
"minLength": 1,
|
|
58
|
+
"maxLength": 50
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"reviewTone": {
|
|
62
|
+
"type": "select",
|
|
63
|
+
"label": "Review tone",
|
|
64
|
+
"help": "How detailed the review comments should be.",
|
|
65
|
+
"default": "concise",
|
|
66
|
+
"required": true,
|
|
67
|
+
"options": [
|
|
68
|
+
{
|
|
69
|
+
"value": "concise",
|
|
70
|
+
"label": "Concise"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"value": "thorough",
|
|
74
|
+
"label": "Thorough"
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"prompt": "Review pull requests labeled '{{form.triggerLabel}}' in {{form.repository}}. Review tone: {{form.reviewTone}}."
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "github-repo-monitor",
|
|
3
|
+
"name": "GitHub repository monitor",
|
|
4
|
+
"category": "Developer tools",
|
|
5
|
+
"description": "Watch a repository for @OpenHands mentions in issues and PR comments, start a conversation, and post the agent's reply back to GitHub.",
|
|
6
|
+
"requires": {
|
|
7
|
+
"integrations": {
|
|
8
|
+
"github": {
|
|
9
|
+
"message": "Used to read issue and pull request comments and post replies."
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"features": [
|
|
13
|
+
"repoClone",
|
|
14
|
+
"presetPrompt",
|
|
15
|
+
"webhookDelivery"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"popularityRank": 98,
|
|
19
|
+
"estimatedSetupMinutes": 5,
|
|
20
|
+
"exampleImplementation": "Trigger: cron, every minute (configurable)\nRequired secret: GITHUB_PERSONAL_ACCESS_TOKEN\n\n1. Poll GitHub for new issue and PR comments since the last run.\n2. Match comments containing the trigger phrase (case-insensitive, default: @OpenHands).\n3. Post an acknowledgment comment with a link to the new OpenHands conversation.\n4. Forward follow-up replies in the same thread to the running conversation.\n5. Post the agent's final response back to GitHub when the conversation completes.",
|
|
21
|
+
"setup": {
|
|
22
|
+
"version": "1.0",
|
|
23
|
+
"mode": "direct",
|
|
24
|
+
"form": {
|
|
25
|
+
"triggers": {
|
|
26
|
+
"event": {
|
|
27
|
+
"on": {
|
|
28
|
+
"type": "select",
|
|
29
|
+
"label": "Respond to",
|
|
30
|
+
"help": "Which GitHub comment event starts a conversation.",
|
|
31
|
+
"default": "issue_comment.created",
|
|
32
|
+
"required": true,
|
|
33
|
+
"options": [
|
|
34
|
+
{
|
|
35
|
+
"value": "issue_comment.created",
|
|
36
|
+
"label": "Comments on issues and pull requests"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"value": "pull_request_review_comment.created",
|
|
40
|
+
"label": "Pull request review comments only"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
"triggerPhrase": {
|
|
45
|
+
"type": "text",
|
|
46
|
+
"label": "Trigger phrase",
|
|
47
|
+
"help": "Only comments containing this phrase start a conversation. Matched case-insensitively. Quotes and backslashes are not allowed, because the phrase becomes part of the event filter expression.",
|
|
48
|
+
"default": "@openhands",
|
|
49
|
+
"required": true,
|
|
50
|
+
"constraints": {
|
|
51
|
+
"minLength": 2,
|
|
52
|
+
"maxLength": 50,
|
|
53
|
+
"format": "safeExpressionLiteral"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"args": {
|
|
59
|
+
"repository": {
|
|
60
|
+
"type": "repo-picker",
|
|
61
|
+
"label": "Repository",
|
|
62
|
+
"help": "The repository or repositories to watch for mentions.",
|
|
63
|
+
"provider": "github",
|
|
64
|
+
"required": true
|
|
65
|
+
},
|
|
66
|
+
"ref": {
|
|
67
|
+
"type": "text",
|
|
68
|
+
"label": "Base branch",
|
|
69
|
+
"help": "Branch checked out when the agent responds.",
|
|
70
|
+
"default": "main",
|
|
71
|
+
"required": true,
|
|
72
|
+
"constraints": {
|
|
73
|
+
"minLength": 1,
|
|
74
|
+
"maxLength": 255
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"prompt": "A comment in {{form.repository}} mentions '{{form.triggerPhrase}}'. Read the surrounding issue or pull request context from the event payload, then post a helpful reply as a comment on the same thread.",
|
|
80
|
+
"filter": "icontains(comment.body, '{{form.triggerPhrase}}') && glob(repository.full_name, '{{form.repository}}')"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "incident-retrospective-drafter",
|
|
3
|
+
"name": "Incident retrospective drafter",
|
|
4
|
+
"category": "Reliability",
|
|
5
|
+
"description": "Collect incident chatter and issue updates, then draft a timeline and follow-up checklist.",
|
|
6
|
+
"requires": {
|
|
7
|
+
"integrations": {
|
|
8
|
+
"slack": {
|
|
9
|
+
"message": "Reads incident discussion and timestamps."
|
|
10
|
+
},
|
|
11
|
+
"linear": {
|
|
12
|
+
"message": "Reads follow-up tickets, owners, and status."
|
|
13
|
+
},
|
|
14
|
+
"notion": {
|
|
15
|
+
"message": "Publishes the drafted retrospective. Can be connected later during setup.",
|
|
16
|
+
"required": false
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"features": [
|
|
20
|
+
"mcpTools",
|
|
21
|
+
"conversationDispatch"
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
"popularityRank": 78,
|
|
25
|
+
"estimatedSetupMinutes": 8,
|
|
26
|
+
"skill": "incident-retrospective",
|
|
27
|
+
"exampleImplementation": "Trigger: manual, cron, or incident label added\nRequired MCPs: Slack, Linear, Notion\n\n1. Gather incident messages, timestamps, and linked issue references.\n2. Pull Linear follow-up tickets, owners, and status.\n3. TODO: define the incident identifier format and approved Notion template.\n4. Build a timeline, impact summary, root-cause hypotheses, and action items.\n5. Publish a draft retrospective and notify the incident owner.",
|
|
28
|
+
"setup": {
|
|
29
|
+
"version": "1.0",
|
|
30
|
+
"mode": "assisted",
|
|
31
|
+
"form": {
|
|
32
|
+
"note": "These answers start the conversation. Anything left blank is something the agent will ask about.",
|
|
33
|
+
"args": {
|
|
34
|
+
"incidentChannel": {
|
|
35
|
+
"type": "text",
|
|
36
|
+
"label": "Incident channel",
|
|
37
|
+
"help": "The Slack channel where incidents are discussed.",
|
|
38
|
+
"placeholder": "#incidents",
|
|
39
|
+
"required": false,
|
|
40
|
+
"constraints": {
|
|
41
|
+
"maxLength": 100
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"linearTeam": {
|
|
45
|
+
"type": "text",
|
|
46
|
+
"label": "Linear team",
|
|
47
|
+
"help": "The team whose follow-up tickets belong in the retrospective.",
|
|
48
|
+
"required": false,
|
|
49
|
+
"constraints": {
|
|
50
|
+
"maxLength": 100
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"notionDestination": {
|
|
54
|
+
"type": "text",
|
|
55
|
+
"label": "Notion destination",
|
|
56
|
+
"help": "Page or database where drafts should be published. Leave blank to decide during setup.",
|
|
57
|
+
"required": false,
|
|
58
|
+
"constraints": {
|
|
59
|
+
"maxLength": 200
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"triggerPreference": {
|
|
63
|
+
"type": "select",
|
|
64
|
+
"label": "How should it run?",
|
|
65
|
+
"help": "A starting preference only. The agent confirms the exact trigger before creating anything.",
|
|
66
|
+
"default": "undecided",
|
|
67
|
+
"required": false,
|
|
68
|
+
"options": [
|
|
69
|
+
{
|
|
70
|
+
"value": "undecided",
|
|
71
|
+
"label": "Let the agent recommend one"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"value": "scheduled",
|
|
75
|
+
"label": "On a schedule"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"value": "onIncidentLabel",
|
|
79
|
+
"label": "When an incident is labelled"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"value": "manual",
|
|
83
|
+
"label": "Only when I run it"
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"notes": {
|
|
88
|
+
"type": "textarea",
|
|
89
|
+
"label": "Anything else the agent should know?",
|
|
90
|
+
"help": "Incident naming conventions, an existing retro template, who should be notified.",
|
|
91
|
+
"required": false,
|
|
92
|
+
"constraints": {
|
|
93
|
+
"maxLength": 2000
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"message": "The user supplied these starting points. Confirm each one, ask about anything left blank, then create the automation.\n\n- Incident channel: {{form.incidentChannel}}\n- Linear team: {{form.linearTeam}}\n- Notion destination: {{form.notionDestination}}\n- Preferred trigger: {{form.triggerPreference}}\n- Notes: {{form.notes}}\n\nStill undecided and required before creation: the incident identifier format and the approved Notion retrospective template."
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -3,12 +3,17 @@
|
|
|
3
3
|
"name": "Jira issue to GitHub PR",
|
|
4
4
|
"category": "Project management",
|
|
5
5
|
"description": "Watch a Jira Cloud project for issues with a configurable label and automatically open a GitHub pull request for each new issue found. The target GitHub repo is read from the ticket body - no repo parameter required at deploy time.",
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
"requires": {
|
|
7
|
+
"integrations": {
|
|
8
|
+
"jira": {
|
|
9
|
+
"message": "Reads the project for issues carrying the trigger label."
|
|
10
|
+
},
|
|
11
|
+
"github": {
|
|
12
|
+
"message": "Opens a pull request on the repository named in the ticket."
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
},
|
|
10
16
|
"popularityRank": 85,
|
|
11
17
|
"estimatedSetupMinutes": 5,
|
|
12
|
-
"prompt": "Set up a Jira automation to create pull requests",
|
|
13
18
|
"exampleImplementation": "Trigger: cron polling (e.g. every 5 minutes)\nRequired secrets: Jira API token, GitHub personal access token (repo + workflow scope)\n\n1. Collect Jira base URL, email, API token secret name, label to watch, and cron schedule from the user. No GitHub repo is needed at deploy time - each ticket must include the target repo (owner/repo) in its body.\n2. Poll POST /rest/api/3/search/jql on the Jira Cloud instance to find open issues carrying the configured label.\n3. Deduplicate against a KV-store-backed set of already-processed issue keys so re-runs never create duplicate PRs.\n4. For each new issue, start an independent OpenHands agent conversation that extracts the GitHub repo from the ticket body, clones it, creates a branch named after the Jira key, implements or scaffolds the requested change, and opens a pull request.\n5. Immediately after the conversation is created, post a Jira comment on the issue: 'I'm on it: <conversation URL>'.\n6. Persist the processed issue key immediately after dispatching so the next poll skips it."
|
|
14
19
|
}
|