openhands-extensions 0.24.0__tar.gz → 0.26.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.24.0 → openhands_extensions-0.26.0}/.github/pull_request_template.md +17 -2
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/scripts/check_pr_description.py +64 -5
- openhands_extensions-0.26.0/.github/scripts/markdown_sections.py +95 -0
- openhands_extensions-0.26.0/.github/workflows/build-vscode-app.yml +30 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/workflows/check-extensions.yml +3 -0
- openhands_extensions-0.26.0/.github/workflows/tests.yml +57 -0
- openhands_extensions-0.26.0/.release-please-manifest.json +3 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/AGENTS.md +3 -2
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/PKG-INFO +1 -1
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/README.md +10 -3
- openhands_extensions-0.26.0/apps/README.md +20 -0
- openhands_extensions-0.26.0/apps/catalog.json +10 -0
- openhands_extensions-0.26.0/apps/index.d.ts +11 -0
- openhands_extensions-0.26.0/apps/index.js +5 -0
- openhands_extensions-0.26.0/apps/vscode/README.md +13 -0
- openhands_extensions-0.26.0/apps/vscode/canvas-extension.json +19 -0
- openhands_extensions-0.26.0/apps/vscode/extension.js +114 -0
- openhands_extensions-0.26.0/apps/vscode/scripts/package.mjs +84 -0
- openhands_extensions-0.26.0/automations/bundle-index.js +42 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/github-agents-md-maintainer/manifest.json +1 -1
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/github-pr-reviewer/manifest.json +19 -8
- openhands_extensions-0.26.0/automations/catalog/github-stale-ci-pr-closer/manifest.json +71 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/gitlab-issue-to-mr/manifest.json +1 -1
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/news-digest/manifest.json +2 -2
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog-index.js +2 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/index.d.ts +2 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/index.js +1 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/marketplaces/openhands-extensions.json +30 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/package.json +9 -1
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-api/README.md +1 -1
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-api/SKILL.md +3 -3
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-api/scripts/openhands_api.py +13 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-automation/SKILL.md +66 -4
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-automation/references/custom-automation.md +21 -7
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-sdk/SKILL.md +1 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/github-pr-review/SKILL.md +12 -2
- openhands_extensions-0.26.0/plugins/runtime-api-configs/.claude-plugin/plugin.json +20 -0
- openhands_extensions-0.26.0/plugins/runtime-api-configs/README.md +59 -0
- openhands_extensions-0.26.0/plugins/runtime-api-configs/SKILL.md +240 -0
- openhands_extensions-0.26.0/plugins/runtime-api-configs/scripts/warm_runtime_configs.py +331 -0
- openhands_extensions-0.26.0/plugins/runtime-api-configs/tests/test_warm_runtime_configs.py +338 -0
- openhands_extensions-0.26.0/plugins/vulnerability-remediation/skills/github/scripts/agent_conversation.py +335 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/skills/github/scripts/github_client.py +183 -15
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/pyproject.toml +1 -1
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/python/openhands_extensions/_version.py +1 -1
- openhands_extensions-0.26.0/scripts/check_plugin_resources.py +116 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/scripts/sync_extensions.py +32 -5
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/canvas-extension-api/SKILL.md +34 -3
- openhands_extensions-0.26.0/skills/canvas-extension-api/references/backend-safety.md +23 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/canvas-extension-api/references/connections.md +24 -0
- openhands_extensions-0.26.0/skills/canvas-extension-api/references/sidecar-pattern.md +88 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/canvas-extension-api/references/v1-contract.md +53 -3
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/canvas-extension-api/scripts/validate-extension.mjs +52 -0
- openhands_extensions-0.26.0/skills/canvas-extension-api/scripts/validate-extension.test.mjs +251 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-agents-md-maintainer/README.md +7 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-agents-md-maintainer/SKILL.md +13 -6
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-agents-md-maintainer/scripts/main.py +199 -29
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-to-pr/scripts/worker.py +10 -1
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/README.md +36 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/SKILL.md +147 -4
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/scripts/main.py +17 -1
- openhands_extensions-0.26.0/skills/github-pr-reviewer/scripts/worker.py +1076 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-repo-monitor/scripts/main.py +32 -1
- openhands_extensions-0.26.0/skills/github-stale-ci-pr-closer/.claude-plugin/plugin.json +9 -0
- openhands_extensions-0.26.0/skills/github-stale-ci-pr-closer/README.md +9 -0
- openhands_extensions-0.26.0/skills/github-stale-ci-pr-closer/SKILL.md +24 -0
- openhands_extensions-0.26.0/skills/github-stale-ci-pr-closer/commands/github-stale-ci-pr-closer.md +8 -0
- openhands_extensions-0.26.0/skills/github-stale-ci-pr-closer/scripts/worker.py +508 -0
- openhands_extensions-0.26.0/skills/github-stale-ci-pr-closer/tests/test_worker.py +353 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/gitlab-issue-to-mr/README.md +12 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/gitlab-issue-to-mr/SKILL.md +13 -6
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/gitlab-issue-to-mr/scripts/main.py +217 -42
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/incident-retrospective/SKILL.md +5 -5
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/index.js +34 -16
- openhands_extensions-0.26.0/skills/iterate/.codex-plugin/plugin.json +13 -0
- openhands_extensions-0.26.0/skills/iterate/.plugin/plugin.json +13 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/jira-issue-to-pr/README.md +12 -4
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/jira-issue-to-pr/SKILL.md +129 -18
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/jira-issue-to-pr/references/setup.md +8 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/jira-issue-to-pr/scripts/main.py +181 -54
- openhands_extensions-0.26.0/skills/jira-issue-to-pr/scripts/setup_webhook.py +290 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/linear-triage/SKILL.md +5 -5
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/news-digest/README.md +6 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/news-digest/SKILL.md +19 -9
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/news-digest/commands/news-digest-setup.md +1 -1
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/news-digest/scripts/main.py +133 -15
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/research-brief/SKILL.md +5 -5
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-standup-digest/SKILL.md +5 -5
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/ticket-to-code-change/SKILL.md +6 -3
- openhands_extensions-0.26.0/skills/use-jev/.claude-plugin/plugin.json +8 -0
- openhands_extensions-0.26.0/skills/use-jev/README.md +1 -0
- openhands_extensions-0.26.0/skills/use-jev/SKILL.md +66 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/fixtures/automations/github-pr-reviewer.json +39 -24
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_agent_conversation_dispatch.py +212 -0
- openhands_extensions-0.26.0/tests/test_apps_catalog.py +26 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_automation_setup.py +44 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_check_pr_description.py +89 -6
- openhands_extensions-0.26.0/tests/test_github_automation_foundation.py +231 -0
- openhands_extensions-0.26.0/tests/test_github_repo_monitor.py +107 -0
- openhands_extensions-0.26.0/tests/test_github_reviewer_delivery.py +2794 -0
- openhands_extensions-0.26.0/tests/test_github_stale_ci_pr_closer.py +56 -0
- openhands_extensions-0.26.0/tests/test_jira_issue_to_pr.py +312 -0
- openhands_extensions-0.26.0/tests/test_jira_setup_webhook.py +309 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_openhands_api_python.py +37 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_skill_plugin_loading.py +25 -15
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_sync_extensions.py +102 -0
- openhands_extensions-0.26.0/tests/test_vscode_app.py +33 -0
- openhands_extensions-0.26.0/tests/vscode-app.test.mjs +43 -0
- openhands_extensions-0.24.0/.github/workflows/tests.yml +0 -31
- openhands_extensions-0.24.0/.release-please-manifest.json +0 -3
- openhands_extensions-0.24.0/automations/bundle-index.js +0 -38
- openhands_extensions-0.24.0/plugins/vulnerability-remediation/skills/github/scripts/agent_conversation.py +0 -155
- openhands_extensions-0.24.0/skills/canvas-extension-api/references/backend-safety.md +0 -9
- openhands_extensions-0.24.0/skills/canvas-extension-api/references/sidecar-pattern.md +0 -49
- openhands_extensions-0.24.0/skills/canvas-extension-api/scripts/validate-extension.test.mjs +0 -60
- openhands_extensions-0.24.0/skills/github-pr-reviewer/scripts/worker.py +0 -291
- openhands_extensions-0.24.0/tests/test_github_automation_foundation.py +0 -73
- openhands_extensions-0.24.0/tests/test_github_reviewer_delivery.py +0 -553
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.agents/skills/custom-codereview-guide.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.claude-plugin/marketplace.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/dependabot.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/release.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/scripts/refresh_linked_pr_checks.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/workflows/deprecation-check.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/workflows/issue-readiness-check.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/workflows/npm-publish.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/workflows/pr-artifacts.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/workflows/pr-description-check.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/workflows/pr.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/workflows/pypi-publish.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/workflows/release.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/workflows/vulnerability-scan.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.gitignore +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/LICENSE +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/MIGRATION.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/analysis_results.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/custom-automation/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/github-delivery-watchdog/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/github-issue-to-pr/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/github-issue-triage/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/github-repo-monitor/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/incident-retrospective-drafter/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/jira-issue-to-bitbucket-pr/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/jira-issue-to-gitlab-mr/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/jira-issue-to-pr/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/linear-issue-to-bitbucket-pr/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/linear-issue-to-github-pr/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/linear-issue-to-gitlab-mr/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/linear-triage-assistant/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/qa-changes/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/research-brief-writer/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/slack-channel-monitor/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/slack-github-linear-daily-organization.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/slack-standup-digest/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog/upstream-fork-sync/manifest.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/catalog.schema.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/index.d.ts +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/index.js +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/interface.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/automations/interface.schema.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/airtable.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/apify.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/asana.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/atlassian-rovo.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/atlassian.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/bitbucket.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/box.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/brave-search.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/browser-mcp.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/canva.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/clickhouse.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/cloudflare-bindings.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/cloudflare-browser-rendering.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/cloudflare-builds.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/cloudflare-docs.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/cloudflare-observability.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/confluence.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/datadog.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/deepwiki.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/discord.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/elevenlabs.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/everything.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/exa.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/fetch.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/figma.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/filesystem.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/firecrawl.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/git.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/github.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/gitlab.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/gmail.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/google-calendar.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/google-docs.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/google-drive.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/google-sheets.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/granola.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/hubspot.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/huggingface.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/intercom.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/jira.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/kagi.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/linear.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/memory.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/microsoft-outlook.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/microsoft-teams.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/miro.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/monday.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/mongodb.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/neon.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/netlify.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/notion.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/obsidian.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/okta.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/onedrive.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/ordinal.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/paypal.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/playwright.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/posthog.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/quickbooks.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/redis.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/reportportal.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/resend.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/salesforce.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/sentry.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/sequential-thinking.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/sharepoint.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/slack.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/sonarqube.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/stripe.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/supabase.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/superhuman-mail.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/tavily.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/time.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/trello.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/vanta.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/vercel.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/webflow.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/xero.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog/zoom.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog-index.js +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/catalog.schema.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/icons/salesforce.svg +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/icons/slack.svg +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/index.d.ts +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/integrations/index.js +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/marketplaces/large-codebase.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/city-weather/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/city-weather/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/city-weather/commands/now.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/references/troubleshooting.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/skills/build-setup/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/skills/build-setup/scripts/install-gnucobol.sh +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/skills/cobol-modernization/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/skills/mainframe-planning/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/skills/mainframe-removal/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/skills/mainframe-removal/references/cics-transformation-examples.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/skills/to-java-migration/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/skills/to-java-migration/references/cobol-to-java-example.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/cobol-modernization/skills/to-java-migration/references/datatype-mappings.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/issue-duplicate-checker/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/issue-duplicate-checker/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/issue-duplicate-checker/action.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/issue-duplicate-checker/scripts/auto_close_duplicate_issues.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/issue-duplicate-checker/scripts/issue_duplicate_check_openhands.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/issue-duplicate-checker/scripts/post_duplicate_notice.cjs +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/issue-duplicate-checker/scripts/remove_duplicate_candidate_label.cjs +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/magic-test/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/magic-test/skills/magic-word/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/migration-scoring/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/migration-scoring/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/migration-scoring/skills/migration-mapping/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/migration-scoring/skills/migration-report/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/migration-scoring/skills/migration-scoring/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/migration-scoring/skills/score-quality/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/migration-scoring/skills/score-quality/references/scoring-criteria.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/migration-scoring/skills/score-style/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/references/criteria.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/agent-readiness-report/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/agent-readiness-report/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/agent-readiness-report/references/criteria.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_agent_instructions.sh +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_build_env.sh +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_feedback_loops.sh +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_policy.sh +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_workflows.sh +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/improve-agent-readiness/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/improve-agent-readiness/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/improve-agent-readiness/references/criteria.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/setup-agents-md/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/setup-agents-md/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/setup-openhands/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/setup-openhands/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/setup-pr-review/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/onboarding/skills/setup-pr-review/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/commands/create.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/commands/openhands-cloud.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/scripts/run.sh +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-api/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-api/references/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-api/references/TROUBLESHOOTING.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-api/references/example_prompt.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-api/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-api/scripts/openhands_api.ts +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-automation/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-automation/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-automation/commands/automation-create.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-automation/references/ab-testing.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-automation/references/security.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-automation/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-sdk/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-sdk/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/openhands/skills/openhands-sdk/commands/sdk.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/action.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/scripts/agent_script.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/scripts/evaluate_review.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/scripts/prompt.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/code-review/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/code-review/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/code-review/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/code-review/commands/codereview-roasted.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/code-review/commands/codereview.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/code-review/references/risk-evaluation.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/code-review/references/supply-chain-security.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/github-pr-review/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/github-pr-review/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/github-pr-review/commands/github-pr-review.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/skills/github-pr-review/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/workflows/pr-review-by-openhands.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/pr-review/workflows/pr-review-evaluation.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/action.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/scripts/agent_script.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/scripts/evaluate_qa_changes.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/scripts/prompt.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/skills/qa-changes/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/skills/qa-changes/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/skills/qa-changes/commands/qa-changes.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/workflows/qa-changes-by-openhands.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/qa-changes/workflows/qa-changes-evaluation.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/action.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/commands/release-notes.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/scripts/agent_script.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/scripts/generate_release_notes.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/scripts/prompt.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/scripts/validate_release_notes.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/skills/release-notes/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/skills/release-notes/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/skills/release-notes/commands/release-notes.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/release-notes/workflows/release-notes.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/action.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/scripts/scan_and_remediate.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/skills/github/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/skills/github/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/skills/github/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/skills/github/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/skills/security/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/skills/security/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/skills/security/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/plugins/vulnerability-remediation/workflows/vulnerability-scan.yml +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/python/openhands_extensions/__init__.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/python/openhands_extensions/deprecation.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/python/openhands_extensions/integration_models.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/python/openhands_extensions/integrations.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/release-please-config.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/scripts/build-automation-catalog.mjs +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/scripts/build-integration-catalog.mjs +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/scripts/build-skills-catalog.mjs +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/scripts/check_deprecations.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/scripts/sync_openhands_sdk_skill.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/add-javadoc/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/add-javadoc/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/add-javadoc/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/add-javadoc/references/example.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/add-skill/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/add-skill/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/add-skill/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/add-skill/scripts/fetch_skill.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-canvas-environment/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-canvas-environment/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-canvas-environment/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-creator/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-creator/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-creator/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-creator/commands/agent-creator.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-creator/references/fallback.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-memory/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-memory/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-memory/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-memory/commands/remember.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-sdk-builder/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-sdk-builder/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-sdk-builder/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/agent-sdk-builder/commands/agent-builder.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/azure-devops/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/azure-devops/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/azure-devops/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/bitbucket/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/bitbucket/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/bitbucket/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/bitbucket-cloud/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/bitbucket-cloud/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/bitbucket-cloud/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/bitbucket-data-center/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/bitbucket-data-center/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/bitbucket-data-center/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/canvas-extension-api/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/canvas-extension-api/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/canvas-extension-api/references/acceptance-checklist.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/canvas-extension-api/references/packaging-recipes.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/canvas-extension-api/references/testing-and-installation.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/code-simplifier/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/code-simplifier/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/code-simplifier/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/code-simplifier/commands/simplify.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/code-simplifier/references/code-quality-review.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/code-simplifier/references/code-reuse-review.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/code-simplifier/references/efficiency-review.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/datadog/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/datadog/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/datadog/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/datadog/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/deno/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/deno/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/deno/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/deno/references/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/discord/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/discord/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/discord/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/discord/__init__.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/discord/references/REFERENCE.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/discord/scripts/__init__.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/discord/scripts/_http.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/discord/scripts/post_webhook.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/discord/scripts/send_message.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/docker/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/docker/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/docker/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/evidence-based-citations/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/evidence-based-citations/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/evidence-based-citations/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/flarglebargle/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/flarglebargle/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/flarglebargle/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/frontend-design/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/frontend-design/LICENSE.txt +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/frontend-design/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/frontend-design/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-actions/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-actions/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-actions/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-agents-md-maintainer/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-agents-md-maintainer/commands/agents-md-setup.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-agents-md-maintainer/references/state-schema.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-agents-md-maintainer/scripts/github_client.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-delivery-watchdog/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-delivery-watchdog/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-delivery-watchdog/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-delivery-watchdog/commands/github-delivery-watchdog.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-delivery-watchdog/scripts/github_client.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-delivery-watchdog/scripts/worker.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-to-pr/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-to-pr/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-to-pr/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-to-pr/commands/issue-to-pr-setup.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-to-pr/references/state-schema.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-to-pr/scripts/agent_conversation.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-to-pr/scripts/github_client.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-to-pr/scripts/main.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-triage/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-triage/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-triage/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-triage/commands/github-issue-triage.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-triage/scripts/agent_conversation.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-triage/scripts/github_client.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-issue-triage/scripts/worker.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/commands/pr-reviewer-setup.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/references/state-schema.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/scripts/agent_conversation.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/scripts/github_client.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/scripts/maintainer_handoff.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-pr-reviewer/tests/test_main.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-repo-monitor/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-repo-monitor/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-repo-monitor/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-repo-monitor/commands/github-monitor-poll.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-repo-monitor/references/github-api.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-repo-monitor/references/state-schema.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-repo-monitor/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-repo-monitor/scripts/github_client.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/github-repo-monitor/tests/test_main.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/gitlab/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/gitlab/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/gitlab/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/gitlab-issue-to-mr/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/gitlab-issue-to-mr/commands/issue-to-mr-setup.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/gitlab-issue-to-mr/references/state-schema.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/incident-retrospective/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/incident-retrospective/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/incident-retrospective/commands/incident-retro-setup.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/index.d.ts +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/iterate/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/iterate/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/iterate/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/iterate/commands/babysit.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/iterate/commands/iterate.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/iterate/commands/verify.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/iterate/references/heuristics.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/iterate/references/verification.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/iterate/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/jira-issue-to-pr/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/jupyter/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/jupyter/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/jupyter/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/kubernetes/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/kubernetes/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/kubernetes/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/kubernetes/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/learn-from-code-review/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/learn-from-code-review/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/learn-from-code-review/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/learn-from-code-review/commands/learn-from-reviews.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/linear/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/linear/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/linear/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/linear/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/linear-triage/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/linear-triage/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/linear-triage/commands/linear-triage-setup.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/news-digest/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/news-digest/references/state-schema.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/notion/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/notion/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/notion/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/notion/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/npm/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/npm/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/npm/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/openhands-enterprise-troubleshooting/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/openhands-enterprise-troubleshooting/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/openhands-enterprise-troubleshooting/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/openhands-enterprise-troubleshooting/references/diagnostics.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/openhands-enterprise-troubleshooting/references/support-bundle-analysis.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/openhands-enterprise-troubleshooting/scripts/bundle_triage.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/pdflatex/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/pdflatex/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/pdflatex/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/plain-english-content/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/plain-english-content/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/plain-english-content/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/prd/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/prd/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/prd/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/prd/commands/prd.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/research-brief/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/research-brief/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/research-brief/commands/research-brief-setup.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/skill-creator/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/skill-creator/LICENSE.txt +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/skill-creator/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/skill-creator/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/skill-creator/references/output-patterns.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/skill-creator/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/skill-creator/references/workflows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/skill-creator/scripts/init_skill.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/skill-creator/scripts/quick_validate.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-channel-monitor/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-channel-monitor/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-channel-monitor/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-channel-monitor/commands/slack-monitor-poll.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-channel-monitor/references/slack-api.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-channel-monitor/references/state-schema.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-channel-monitor/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-channel-monitor/scripts/main.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-standup-digest/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-standup-digest/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/slack-standup-digest/commands/standup-digest-setup.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/spark-version-upgrade/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/spark-version-upgrade/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/spark-version-upgrade/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/ssh/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/ssh/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/ssh/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/ssh/references/windows.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/swift-linux/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/swift-linux/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/swift-linux/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/technical-writing/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/technical-writing/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/technical-writing/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/LICENSE.txt +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/theme-showcase.pdf +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/themes/arctic-frost.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/themes/botanical-garden.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/themes/desert-rose.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/themes/forest-canopy.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/themes/golden-hour.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/themes/midnight-galaxy.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/themes/modern-minimalist.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/themes/ocean-depths.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/themes/sunset-boulevard.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/theme-factory/themes/tech-innovation.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/ticket-to-code-change/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/ticket-to-code-change/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/ticket-to-code-change/commands/ticket-to-code-change-setup.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/upstream-fork-sync/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/upstream-fork-sync/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/upstream-fork-sync/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/upstream-fork-sync/commands/upstream-fork-sync-setup.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/uv/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/uv/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/uv/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/uv/references/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/vercel/.claude-plugin/plugin.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/vercel/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/skills/vercel/SKILL.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/fixtures/automations/capabilities.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/fixtures/automations/custom-automation.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/fixtures/automations/github-repo-monitor.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/fixtures/automations/incident-retrospective-drafter.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/fixtures/automations/upstream-fork-sync.json +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/github_automation_helpers.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_add_skill_installs_to_agents_dir.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_catalog_schema.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_catalogs.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_code_review_risk_evaluation.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_deprecations.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_github_agents_md_maintainer.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_github_developer_delivery.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_github_issue_to_pr.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_github_pr_review_skill.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_github_skill_installation.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_github_triage_delivery.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_github_watchdog_delivery.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_gitlab_issue_to_mr.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_integration_catalog_in_sync.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_interface_manifest.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_issue_duplicate_checker.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_live_integration_smoke.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_maintainer_handoff.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_news_digest.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_plugin_manifest.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_pr_review_diff_payload.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_pr_review_feedback.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_pr_review_prompt.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_pr_review_review_context.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_qa_changes.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_qa_changes_evaluation.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_refresh_linked_pr_checks.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_release_notes_generator.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_sdk_loading.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_skills_catalog.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_skills_have_readme.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_slack_channel_monitor.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_version_alignment.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/tests/test_workflow_sync.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/utils/analysis/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/utils/analysis/laminar_signals/README.md +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/utils/analysis/laminar_signals/analyze.py +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/utils/analysis/laminar_signals/templates/default.j2 +0 -0
- {openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/utils/analysis/laminar_signals/templates/pr_review.j2 +0 -0
{openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/pull_request_template.md
RENAMED
|
@@ -1,11 +1,26 @@
|
|
|
1
1
|
<!-- Keep this PR as draft until it is ready for review. -->
|
|
2
2
|
|
|
3
|
-
<!-- AI/LLM agents:
|
|
3
|
+
<!-- AI/LLM agents:
|
|
4
|
+
Do not edit the HUMAN section.
|
|
5
|
+
-->
|
|
6
|
+
|
|
7
|
+
HUMAN:
|
|
4
8
|
|
|
5
|
-
|
|
9
|
+
<!--
|
|
10
|
+
Human author: please replace this comment with a short note (at least 20 visible
|
|
11
|
+
characters) before marking ready for review.
|
|
12
|
+
AI agents: you must not edit this section.
|
|
13
|
+
-->
|
|
6
14
|
|
|
7
15
|
---
|
|
8
16
|
|
|
17
|
+
AGENT:
|
|
18
|
+
<!-- AI/LLM agents:
|
|
19
|
+
In the AGENT section and the template fields below, provide evidence that the
|
|
20
|
+
code runs properly end-to-end. Just running unit tests is NOT sufficient. Explain
|
|
21
|
+
exactly what command you ran and include logs, screenshots, or reproduction notes.
|
|
22
|
+
-->
|
|
23
|
+
|
|
9
24
|
## Why
|
|
10
25
|
|
|
11
26
|
<!-- Describe problem, motivation, etc.-->
|
{openhands_extensions-0.24.0 → openhands_extensions-0.26.0}/.github/scripts/check_pr_description.py
RENAMED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
"""Validate a pull request description against the repository PR template.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Three gates:
|
|
4
4
|
|
|
5
|
-
1.
|
|
5
|
+
1. Human/agent authorship: the first visible line must be `HUMAN:`, it must be
|
|
6
|
+
followed by a short human-written note before the `AGENT:` marker, and the
|
|
7
|
+
`AGENT:` marker itself must remain. This keeps the human attestation
|
|
8
|
+
distinguishable from agent-authored content.
|
|
9
|
+
|
|
10
|
+
2. Template sections: the `## Why`, `## Summary`, and `## How to Test`
|
|
6
11
|
sections from `.github/pull_request_template.md` must be present and
|
|
7
12
|
filled in.
|
|
8
13
|
|
|
9
|
-
|
|
14
|
+
3. Linked-issue readiness: every issue linked via a closing keyword
|
|
10
15
|
(`Fixes #123`, `Closes #123`, `Resolves #123`) or referenced in the
|
|
11
16
|
`## Issue Number` section must exist and, unless it predates the
|
|
12
17
|
`ready-for-dev` rollout, carry the `ready-for-dev` label. This blocks
|
|
@@ -30,12 +35,25 @@ import urllib.error
|
|
|
30
35
|
import urllib.request
|
|
31
36
|
from pathlib import Path
|
|
32
37
|
|
|
38
|
+
# `markdown_sections` is a sibling in this directory, which is not on sys.path
|
|
39
|
+
# when the module is imported from a file location (the loader-based tests).
|
|
40
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
41
|
+
|
|
42
|
+
from markdown_sections import find_headings, without_fenced_code_blocks
|
|
43
|
+
|
|
33
44
|
|
|
45
|
+
# Reject placeholders while allowing a concise human-written sentence.
|
|
46
|
+
MIN_HUMAN_NOTE_CHARS = 20
|
|
34
47
|
# These are the only PR-template sections that must remain and contain content.
|
|
35
48
|
REQUIRED_TEMPLATE_FIELDS: tuple[str, ...] = ("Why", "Summary", "How to Test")
|
|
36
49
|
|
|
37
50
|
HTML_COMMENT_RE = re.compile(r"<!--[\s\S]*?-->")
|
|
38
|
-
HEADING_RE = re.compile(r"(?m)
|
|
51
|
+
HEADING_RE = re.compile(r"(?m)^##[ \t]+(.+?)[ \t]*$")
|
|
52
|
+
# `\r?$` rather than `\s*$`: these run against masked text too, and there is no
|
|
53
|
+
# capture group here to absorb the `\r` of a CRLF body, so it is matched
|
|
54
|
+
# explicitly.
|
|
55
|
+
HUMAN_HEADING_RE = re.compile(r"(?im)^[ \t]*HUMAN:[ \t]*\r?$")
|
|
56
|
+
AGENT_HEADING_RE = re.compile(r"(?im)^[ \t]*AGENT:[ \t]*\r?$")
|
|
39
57
|
ISSUE_REF_RE = re.compile(r"(?i)\b(?:fix|clos|resolv)(?:e?(?:s|d)?|ing)?\s+#(\d+)")
|
|
40
58
|
BARE_ISSUE_REF_RE = re.compile(r"(?<!\w)#(\d+)")
|
|
41
59
|
READY_FOR_DEV_LABEL = "ready-for-dev"
|
|
@@ -59,8 +77,36 @@ def visible_text(text: str) -> str:
|
|
|
59
77
|
return "\n".join(lines).strip()
|
|
60
78
|
|
|
61
79
|
|
|
80
|
+
def first_visible_line(text: str) -> str:
|
|
81
|
+
for line in HTML_COMMENT_RE.sub("", text).splitlines():
|
|
82
|
+
stripped = line.strip()
|
|
83
|
+
if stripped:
|
|
84
|
+
return stripped
|
|
85
|
+
return ""
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def extract_human_note(body: str) -> str:
|
|
89
|
+
"""Return human-written text in the required location before `AGENT:`.
|
|
90
|
+
|
|
91
|
+
The markers are located outside fenced code blocks so that quoting the
|
|
92
|
+
template does not stand in for filling it out. Offsets are preserved by the
|
|
93
|
+
masking, so the note itself is still read from the original body.
|
|
94
|
+
"""
|
|
95
|
+
outside_fences = without_fenced_code_blocks(body)
|
|
96
|
+
|
|
97
|
+
human_match = HUMAN_HEADING_RE.search(outside_fences)
|
|
98
|
+
if human_match is None:
|
|
99
|
+
return ""
|
|
100
|
+
|
|
101
|
+
agent_match = AGENT_HEADING_RE.search(outside_fences, human_match.end())
|
|
102
|
+
if agent_match is None:
|
|
103
|
+
return ""
|
|
104
|
+
|
|
105
|
+
return visible_text(body[human_match.end() : agent_match.start()])
|
|
106
|
+
|
|
107
|
+
|
|
62
108
|
def extract_sections(body: str) -> dict[str, str]:
|
|
63
|
-
matches =
|
|
109
|
+
matches = find_headings(body, HEADING_RE)
|
|
64
110
|
sections: dict[str, str] = {}
|
|
65
111
|
for index, match in enumerate(matches):
|
|
66
112
|
start = match.end()
|
|
@@ -153,6 +199,19 @@ def validate_linked_issue_ready(
|
|
|
153
199
|
def validate_pr_body(body: str) -> list[str]:
|
|
154
200
|
errors: list[str] = []
|
|
155
201
|
|
|
202
|
+
if first_visible_line(body) != "HUMAN:":
|
|
203
|
+
errors.append("The first visible line of the PR description must be `HUMAN:`.")
|
|
204
|
+
|
|
205
|
+
human_note = extract_human_note(body)
|
|
206
|
+
if len(human_note) < MIN_HUMAN_NOTE_CHARS:
|
|
207
|
+
errors.append(
|
|
208
|
+
f"Add a short human-written note (at least {MIN_HUMAN_NOTE_CHARS} "
|
|
209
|
+
"characters) between `HUMAN:` and `AGENT:`."
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
if AGENT_HEADING_RE.search(without_fenced_code_blocks(body)) is None:
|
|
213
|
+
errors.append("Keep the `AGENT:` marker from the PR template.")
|
|
214
|
+
|
|
156
215
|
sections = extract_sections(body)
|
|
157
216
|
for section in REQUIRED_TEMPLATE_FIELDS:
|
|
158
217
|
if section not in sections:
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""Helpers for parsing Markdown sections in GitHub issue and PR bodies."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# CommonMark allows an opening fence to carry leading indentation, and inside a
|
|
8
|
+
# list item that indentation is measured from the list's content column rather
|
|
9
|
+
# than the left margin. Rather than parse lists, accept any indentation on the
|
|
10
|
+
# opening fence and bound the closing fence relative to it (below).
|
|
11
|
+
FENCE_LINE_RE = re.compile(
|
|
12
|
+
r"^(?P<indent>[ ]*)(?P<marker>`{3,}|~{3,})(?P<rest>[^\r\n]*)"
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
# CommonMark lets a closing fence sit up to three spaces further in than the
|
|
16
|
+
# fence it closes; beyond that it is content, not a terminator.
|
|
17
|
+
MAX_CLOSING_INDENT_OFFSET = 3
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _mask_line(line: str) -> str:
|
|
21
|
+
"""Replace line content while preserving offsets and line endings."""
|
|
22
|
+
return "".join(char if char in "\r\n" else " " for char in line)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass(frozen=True)
|
|
26
|
+
class _Fence:
|
|
27
|
+
"""The marker used to open a fenced Markdown code block."""
|
|
28
|
+
|
|
29
|
+
char: str
|
|
30
|
+
length: int
|
|
31
|
+
indent: int
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
def opened_by(cls, line: str) -> "_Fence | None":
|
|
35
|
+
"""Return the fence opened by ``line``, if any."""
|
|
36
|
+
match = FENCE_LINE_RE.match(line)
|
|
37
|
+
if match is None:
|
|
38
|
+
return None
|
|
39
|
+
marker = match.group("marker")
|
|
40
|
+
return cls(
|
|
41
|
+
char=marker[0],
|
|
42
|
+
length=len(marker),
|
|
43
|
+
indent=len(match.group("indent")),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
def closed_by(self, line: str) -> bool:
|
|
47
|
+
"""Return whether ``line`` closes this fence."""
|
|
48
|
+
match = FENCE_LINE_RE.match(line)
|
|
49
|
+
if match is None:
|
|
50
|
+
return False
|
|
51
|
+
marker = match.group("marker")
|
|
52
|
+
return (
|
|
53
|
+
marker[0] == self.char
|
|
54
|
+
and len(marker) >= self.length
|
|
55
|
+
and len(match.group("indent")) <= self.indent + MAX_CLOSING_INDENT_OFFSET
|
|
56
|
+
and not match.group("rest").strip()
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def without_fenced_code_blocks(body: str) -> str:
|
|
61
|
+
"""Mask fenced code blocks without changing character offsets.
|
|
62
|
+
|
|
63
|
+
A fence that is never closed is left untouched. CommonMark would run it to
|
|
64
|
+
the end of the document, but these parsers gate contributions: one stray
|
|
65
|
+
marker in a pasted log would hide every heading after it and reject a report
|
|
66
|
+
whose sections are plainly there. Masking only balanced fences keeps the
|
|
67
|
+
failure on the side of accepting.
|
|
68
|
+
"""
|
|
69
|
+
masked_lines: list[str] = []
|
|
70
|
+
fenced_lines: list[str] = []
|
|
71
|
+
fence: _Fence | None = None
|
|
72
|
+
|
|
73
|
+
for line in body.splitlines(keepends=True):
|
|
74
|
+
if fence is None:
|
|
75
|
+
fence = _Fence.opened_by(line)
|
|
76
|
+
if fence is None:
|
|
77
|
+
masked_lines.append(line)
|
|
78
|
+
else:
|
|
79
|
+
fenced_lines.append(line)
|
|
80
|
+
else:
|
|
81
|
+
fenced_lines.append(line)
|
|
82
|
+
if fence.closed_by(line):
|
|
83
|
+
masked_lines.extend(_mask_line(text) for text in fenced_lines)
|
|
84
|
+
fenced_lines.clear()
|
|
85
|
+
fence = None
|
|
86
|
+
|
|
87
|
+
# Whatever is left belongs to an unclosed fence, so it stays as written.
|
|
88
|
+
masked_lines.extend(fenced_lines)
|
|
89
|
+
|
|
90
|
+
return "".join(masked_lines)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def find_headings(body: str, heading_re: re.Pattern[str]) -> list[re.Match[str]]:
|
|
94
|
+
"""Return heading matches outside fenced code blocks."""
|
|
95
|
+
return list(heading_re.finditer(without_fenced_code_blocks(body)))
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: Build VS Code App
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
push:
|
|
6
|
+
paths:
|
|
7
|
+
- apps/vscode/**
|
|
8
|
+
- .github/workflows/build-vscode-app.yml
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
package:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: actions/setup-node@v4
|
|
16
|
+
with:
|
|
17
|
+
node-version: "20"
|
|
18
|
+
- name: Build installable App package
|
|
19
|
+
run: node apps/vscode/scripts/package.mjs
|
|
20
|
+
- name: Validate package files
|
|
21
|
+
run: |
|
|
22
|
+
test -f dist/apps/vscode/canvas-extension.json
|
|
23
|
+
test -f dist/apps/vscode/extension.js
|
|
24
|
+
test -f dist/apps/vscode/backend/openvscode-linux-amd64.tar.gz
|
|
25
|
+
test -f dist/apps/vscode/backend/openvscode-linux-arm64.tar.gz
|
|
26
|
+
- uses: actions/upload-artifact@v4
|
|
27
|
+
with:
|
|
28
|
+
name: vscode-app-${{ github.sha }}
|
|
29
|
+
path: dist/apps/vscode
|
|
30
|
+
if-no-files-found: error
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
# NOTE: pull_request (not pull_request_target) so checks run against the PR head.
|
|
4
|
+
on:
|
|
5
|
+
pull_request:
|
|
6
|
+
branches: ["*"]
|
|
7
|
+
push:
|
|
8
|
+
branches: ["main", "master"]
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
test:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- name: Checkout repository
|
|
15
|
+
uses: actions/checkout@v7
|
|
16
|
+
|
|
17
|
+
- name: Install uv
|
|
18
|
+
uses: astral-sh/setup-uv@v7
|
|
19
|
+
with:
|
|
20
|
+
enable-cache: true
|
|
21
|
+
python-version: "3.12"
|
|
22
|
+
|
|
23
|
+
- name: Setup Node.js
|
|
24
|
+
uses: actions/setup-node@v7
|
|
25
|
+
with:
|
|
26
|
+
node-version: "20"
|
|
27
|
+
|
|
28
|
+
- name: Run tests
|
|
29
|
+
run: uv run --group test pytest tests/
|
|
30
|
+
env:
|
|
31
|
+
PYTHONPATH: ${{ github.workspace }}
|
|
32
|
+
|
|
33
|
+
# Plugins under plugins/<name>/tests are self-contained (stdlib-only unit
|
|
34
|
+
# tests that import the plugin's own scripts via importlib). Run them in
|
|
35
|
+
# a separate step so a plugin failure is attributed to the plugin, not
|
|
36
|
+
# the root suite. shopt -s nullglob leaves the array empty when no
|
|
37
|
+
# plugin ships tests, so this step is a no-op in that case.
|
|
38
|
+
#
|
|
39
|
+
# PYTHONDONTWRITEBYTECODE=1 keeps __pycache__/*.pyc from being written
|
|
40
|
+
# next to the plugin's scripts/ directory, which would otherwise leak
|
|
41
|
+
# into the agent-visible SkillResources manifest the next time the
|
|
42
|
+
# plugin is loaded via openhands.sdk.skills. See
|
|
43
|
+
# scripts/check_plugin_resources.py for the matching CI guard.
|
|
44
|
+
- name: Run plugin tests
|
|
45
|
+
shell: bash
|
|
46
|
+
env:
|
|
47
|
+
PYTHONDONTWRITEBYTECODE: "1"
|
|
48
|
+
run: |
|
|
49
|
+
shopt -s nullglob
|
|
50
|
+
plugin_tests=(plugins/*/tests)
|
|
51
|
+
if [ ${#plugin_tests[@]} -eq 0 ]; then
|
|
52
|
+
echo "No plugin tests found; skipping."
|
|
53
|
+
exit 0
|
|
54
|
+
fi
|
|
55
|
+
echo "Discovered plugin test dirs:"
|
|
56
|
+
printf ' %s\n' "${plugin_tests[@]}"
|
|
57
|
+
uv run --group test pytest "${plugin_tests[@]}"
|
|
@@ -44,7 +44,8 @@ Before opening a PR:
|
|
|
44
44
|
- `skills/<skill-name>/README.md` — optional extra docs/examples for humans
|
|
45
45
|
|
|
46
46
|
- `plugins/` — a catalog of plugins with executable code components.
|
|
47
|
-
- `plugins/<plugin-name
|
|
47
|
+
- `plugins/<plugin-name>/.plugin/plugin.json` — the plugin manifest (the canonical location; `.claude-plugin` and `.codex-plugin` are vendor symlinks to `.plugin`)
|
|
48
|
+
- `plugins/<plugin-name>/SKILL.md` — the plugin definition (optional; present only on plugins that are also loadable as a skill)
|
|
48
49
|
- `plugins/<plugin-name>/hooks/` — lifecycle hooks (optional)
|
|
49
50
|
- `plugins/<plugin-name>/scripts/` — utility scripts (optional)
|
|
50
51
|
|
|
@@ -165,7 +166,7 @@ Important notes:
|
|
|
165
166
|
|
|
166
167
|
## CI / validation gotchas
|
|
167
168
|
|
|
168
|
-
- The test suite expects **every directory under `skills/`** to be listed in a marketplace. If you add a new skill (or rebase onto a main branch that added skills), update the appropriate marketplace file or CI will fail with `Skills
|
|
169
|
+
- The test suite expects **every directory under `skills/`** to be listed in a marketplace. If you add a new skill (or rebase onto a main branch that added skills), update the appropriate marketplace file or CI will fail with `Skills not in any marketplace: [...]` (`test_marketplace_includes_all_skills` in `tests/test_sdk_loading.py`). The `coverage` task in `scripts/sync_extensions.py` checks the same mapping for both `skills/` and `plugins/`, but reports gaps as a non-blocking warning instead of failing.
|
|
169
170
|
- `scripts/sync_extensions.py` keeps generated artifacts in sync: Claude Code command files, README catalog section, coverage checks, and vendor symlinks. Run `python scripts/sync_extensions.py --check` (or just push — CI runs it) to verify everything is consistent. Run without `--check` to auto-fix. The "Quick Start" section in `README.md` (OpenHands SDK, Claude Code, and Codex setup instructions) is **manually maintained** above the auto-generated catalog markers and is intentionally not generated by the sync script.
|
|
170
171
|
- The sync script uses PyYAML to parse SKILL.md frontmatter. If you add a skill with a slash trigger (e.g., `triggers: ["/mycommand"]`), the script auto-generates `commands/mycommand.md`. **Note:** Slash triggers in SKILL.md frontmatter are deprecated — prefer adding a `commands/command-name.md` file to the plugin's `commands/` directory instead. Keyword triggers (non-slash) remain the recommended way to activate skills by topic.
|
|
171
172
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# OpenHands Extensions
|
|
2
2
|
|
|
3
3
|
This repository is the **public extensions registry** for [OpenHands](https://github.com/OpenHands/OpenHands).
|
|
4
|
-
It contains reusable, shareable skills and
|
|
4
|
+
It contains reusable, shareable skills, plugins, and Agent Canvas Apps that customize agent behavior and interfaces.
|
|
5
5
|
|
|
6
6
|
- Skills overview docs: https://docs.openhands.dev/overview/skills
|
|
7
7
|
- SDK skill guide: https://docs.openhands.dev/sdk/guides/skill
|
|
@@ -36,6 +36,10 @@ They live under `plugins/`, **one directory per plugin**:
|
|
|
36
36
|
|
|
37
37
|
Browse available plugins in [`plugins/`](plugins/).
|
|
38
38
|
|
|
39
|
+
### Apps
|
|
40
|
+
|
|
41
|
+
Apps are installable interfaces that bring dashboards, internal tools, and workflows directly into Agent Canvas without requiring a fork. They are powered by the beta Canvas Extensions API. Browse [`apps/`](apps/) and read its package conventions before contributing. Enabling an App executes trusted JavaScript in the Agent Canvas browser context and permits authenticated requests to the active Agent Server, so review its source and resolved revision first. Apps are distinct from skills and plugins: they provide Canvas interfaces rather than agent instructions or capabilities.
|
|
42
|
+
|
|
39
43
|
### NPM Package
|
|
40
44
|
|
|
41
45
|
This repository also publishes catalog data through the `@openhands/extensions` package. It requires Node.js 18.20.0 or newer because the catalog entry points import JSON modules with import attributes.
|
|
@@ -96,7 +100,7 @@ The JS and Python versions are kept in lock-step by `release-please` and guarded
|
|
|
96
100
|
## Extensions Catalog
|
|
97
101
|
|
|
98
102
|
<!-- BEGIN AUTO-GENERATED CATALOG -->
|
|
99
|
-
This repository contains **2 marketplace(s)** with **
|
|
103
|
+
This repository contains **2 marketplace(s)** with **76 extensions** (65 skills, 11 plugins).
|
|
100
104
|
|
|
101
105
|
### large-codebase
|
|
102
106
|
|
|
@@ -115,7 +119,7 @@ OpenHands skills for interacting, improving, and refactoring large codebases
|
|
|
115
119
|
|
|
116
120
|
Official skills and plugins for OpenHands — the open-source AI software engineer.
|
|
117
121
|
|
|
118
|
-
**
|
|
122
|
+
**72 extensions** (63 skills, 9 plugins)
|
|
119
123
|
|
|
120
124
|
| Name | Type | Description | Commands |
|
|
121
125
|
|------|------|-------------|----------|
|
|
@@ -148,6 +152,7 @@ Official skills and plugins for OpenHands — the open-source AI software engine
|
|
|
148
152
|
| github-pr-review | skill | Post structured PR reviews to GitHub with inline comments/suggestions in a single API call. | `/github-pr-review` |
|
|
149
153
|
| github-pr-reviewer | skill | Create an automation that reviews GitHub pull requests when they are opened or updated. Inspects the diff, changed fi... | `/pr-reviewer:setup` |
|
|
150
154
|
| github-repo-monitor | skill | Create a cron automation that polls a GitHub repository for issue and PR comments containing a configurable trigger p... | `/github-monitor:poll` |
|
|
155
|
+
| github-stale-ci-pr-closer | skill | Warn and close abandoned pull requests whose required CI remains failing. | `/github-stale-ci-pr-closer` |
|
|
151
156
|
| gitlab | skill | Interact with GitLab repositories, merge requests, and APIs using the GITLAB_TOKEN environment variable. Use when wor... | — |
|
|
152
157
|
| gitlab-issue-to-mr | skill | Create an automation that implements GitLab issues when a configurable trigger label is applied. Clones the default b... | `/issue-to-mr:setup` |
|
|
153
158
|
| incident-retrospective | skill | Create an automation that drafts incident retrospectives by gathering incident-channel messages from Slack, collectin... | `/incident-retro:setup` |
|
|
@@ -175,6 +180,7 @@ Official skills and plugins for OpenHands — the open-source AI software engine
|
|
|
175
180
|
| qa-changes | plugin | Validate pull request changes by actually running the code — setting up the environment, exercising changed behavior,... | — |
|
|
176
181
|
| release-notes | plugin | Generate consistent, well-structured release notes from git history. Produces categorized changelog with breaking cha... | `/release-notes` |
|
|
177
182
|
| research-brief | skill | Create a recurring automation that researches a topic using Tavily web search and publishes a structured brief to Not... | `/research-brief:setup` |
|
|
183
|
+
| runtime-api-configs | plugin | Manage warm sandbox pools on OpenHands Enterprise from a Python CLI: list, template, save, and delete warm runtime co... | — |
|
|
178
184
|
| security | skill | Security best practices for secure coding, authentication, authorization, and data protection. Use when developing fe... | — |
|
|
179
185
|
| skill-creator | skill | Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an ex... | — |
|
|
180
186
|
| slack-channel-monitor | skill | Create a cron automation that polls up to 10 Slack channels every minute and starts an OpenHands conversation when a ... | `/slack-monitor:poll` |
|
|
@@ -185,6 +191,7 @@ Official skills and plugins for OpenHands — the open-source AI software engine
|
|
|
185
191
|
| theme-factory | skill | Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc.... | — |
|
|
186
192
|
| ticket-to-code-change | skill | Set up Jira or Linear ticket-to-code-change automations for GitHub, GitLab, and Bitbucket. | `/ticket-to-code-change:setup` |
|
|
187
193
|
| upstream-fork-sync | skill | Keep a long-lived fork in sync with its upstream. Creates a cron automation that fetches upstream changes, rebases lo... | `/upstream-fork-sync:setup` |
|
|
194
|
+
| use-jev | skill | Use Jev, a general classifier, for typed choices, scores, and yes/no probabilities in software. | — |
|
|
188
195
|
| uv | skill | Common project, dependency, and environment operations using uv. | — |
|
|
189
196
|
| vercel | skill | Deploy and manage applications on Vercel, including preview deployments and deployment protection. | — |
|
|
190
197
|
| vulnerability-remediation | plugin | Automated security vulnerability scanning and AI-powered remediation. Scans repositories, skips when no issues found,... | — |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Agent Canvas Apps
|
|
2
|
+
|
|
3
|
+
Apps are installable interfaces that bring dashboards, internal tools, and workflows directly into Agent Canvas without requiring a fork. They are powered by the Canvas Extensions API, which is currently beta.
|
|
4
|
+
|
|
5
|
+
## Package convention
|
|
6
|
+
|
|
7
|
+
Each App occupies one directory under `apps/` and is a self-contained Canvas Extension package:
|
|
8
|
+
|
|
9
|
+
- `canvas-extension.json` declares the package, its routed pages, and an optional package-owned managed backend, following the manifest schema 1 documented in `skills/canvas-extension-api/references/v1-contract.md`. An App that needs a service either declares that managed `backend` or ships a manual/deployment-owned Sidecar, per `skills/canvas-extension-api/references/sidecar-pattern.md`.
|
|
10
|
+
- The manifest's `entrypoint` is a browser ESM module that exports `activate(host)`.
|
|
11
|
+
- App-specific documentation and assets may live beside the manifest and entrypoint.
|
|
12
|
+
- Build output must remain self-contained: browser entrypoints must not import package dependencies at runtime.
|
|
13
|
+
|
|
14
|
+
The registry catalog is `apps/catalog.json`, exposed to JavaScript consumers as `APPS_CATALOG` from `@openhands/extensions/apps`. Add one catalog entry when adding an App; keep its `source` and `manifest` paths relative to this repository.
|
|
15
|
+
|
|
16
|
+
## Trust and installation
|
|
17
|
+
|
|
18
|
+
Enabling an App executes its trusted JavaScript in the Agent Canvas browser context. An App can make authenticated requests to the active Agent Server through the host API. Review the source, manifest, and resolved revision before enabling an App. Apps are not skills or plugins: an App provides a Canvas interface, a skill provides agent instructions, and a plugin provides agent capabilities and configuration.
|
|
19
|
+
|
|
20
|
+
The host currently supports routed custom pages through the beta Canvas Extensions API. Follow the API documentation and validate packages with the repository's Canvas App validator before submitting a pull request.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# VS Code App
|
|
2
|
+
|
|
3
|
+
This App provides a full-height OpenVSCode editor. Before the backend is ready, the App shows backend status, an explicit workspace-folder input, and revision-bound prepare/start/stop/refresh actions. Once ready, the page contains only the editor iframe. The folder is persisted in browser storage and sent as an optional `query.folder` mount parameter; it is a user convenience, not OS sandboxing.
|
|
4
|
+
|
|
5
|
+
## Artifact delivery
|
|
6
|
+
|
|
7
|
+
The repository intentionally contains no OpenVSCode binaries. `scripts/package.mjs` downloads the pinned upstream OpenVSCode Server `v1.109.5` Linux amd64 and arm64 archives, verifies their upstream checksums, normalizes the archive layout and metadata, and writes the package-contained archives required by `canvas-extension.json`. The GitHub Actions workflow publishes the resulting `vscode-app-<commit>` artifact; that archive is the installable coordinate for this revision.
|
|
8
|
+
|
|
9
|
+
The package is not a release until reviewed and merged. The workflow artifact is a development delivery coordinate, not a published release or a version pin for Agent Server. This App depends on the Canvas consumer change that adds optional `mount({ container, query: { folder } })` support; until that consumer PR lands, setup works but the selected folder is not forwarded to OpenVSCode.
|
|
10
|
+
|
|
11
|
+
The backend uses app-owned data directories for user data and extensions and receives only the manifest allowlisted environment. It does not receive Agent Server credentials. OpenVSCode starts at the existing app-owned `{data_dir}` by default; the optional folder query changes the editor folder only when the Canvas consumer supports it. Folder selection is not OS sandboxing.
|
|
12
|
+
|
|
13
|
+
The real ngrok editor/save/terminal click-through GIF is maintained in the Agent Canvas implementation PR as development-stack evidence. It is not bundled here and is not a release or package test.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 1,
|
|
3
|
+
"name": "vscode",
|
|
4
|
+
"display_name": "VS Code",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"description": "A managed OpenVSCode editor for the selected Agent Canvas workspace.",
|
|
7
|
+
"entrypoint": "extension.js",
|
|
8
|
+
"contributes": {"pages": [{"id": "editor", "title": "VS Code", "path": "/editor"}]},
|
|
9
|
+
"backend": {
|
|
10
|
+
"schema_version": 1,
|
|
11
|
+
"artifacts": {
|
|
12
|
+
"linux-amd64": {"path": "backend/openvscode-linux-amd64.tar.gz", "sha256": "5ad14274cc5e5ed938ffecf1dd53c0e58272828d8b50cb5da93b6d9e5d2cd9d5"},
|
|
13
|
+
"linux-arm64": {"path": "backend/openvscode-linux-arm64.tar.gz", "sha256": "91876160f1b549020204e3909ad42a80d22ef0ebf66a62306cdf60ca5d44524b"}
|
|
14
|
+
},
|
|
15
|
+
"argv": ["{artifact_dir}/bin/openvscode-bootstrap", "--host", "127.0.0.1", "--port", "{port}", "--without-connection-token", "--accept-server-license-terms", "--telemetry-level", "off", "--user-data-dir", "{data_dir}/user", "--extensions-dir", "{data_dir}/extensions", "--server-base-path", "/app-backends/vscode", "{data_dir}"],
|
|
16
|
+
"health": {"path": "/", "timeout_seconds": 90, "interval_seconds": 0.5},
|
|
17
|
+
"inherit_environment": ["PATH", "LANG", "LC_ALL", "TMPDIR"]
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
const BACKEND = "/api/canvas-extensions/installed/vscode/backend";
|
|
2
|
+
const FOLDER_KEY_PREFIX = "openhands.apps.vscode.folder";
|
|
3
|
+
|
|
4
|
+
function folderKey(host) {
|
|
5
|
+
return `${FOLDER_KEY_PREFIX}:${host.backend.id}:${host.backend.orgId || "local"}:${host.extension.name}`;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function button(label, onClick) {
|
|
9
|
+
const element = document.createElement("button");
|
|
10
|
+
element.type = "button";
|
|
11
|
+
element.textContent = label;
|
|
12
|
+
element.addEventListener("click", onClick);
|
|
13
|
+
return element;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function activate(host) {
|
|
17
|
+
return host.registerPage("editor", async ({ container }) => {
|
|
18
|
+
container.style.minHeight = "100vh";
|
|
19
|
+
const shell = document.createElement("div");
|
|
20
|
+
shell.style.cssText = "height:100vh;min-height:100vh;width:100%;display:flex;flex-direction:column";
|
|
21
|
+
container.replaceChildren(shell);
|
|
22
|
+
|
|
23
|
+
if (!host.appBackendView) {
|
|
24
|
+
const error = document.createElement("p");
|
|
25
|
+
error.setAttribute("role", "alert");
|
|
26
|
+
error.textContent = "VS Code is unavailable because this Agent Server does not support managed App backends.";
|
|
27
|
+
shell.append(error);
|
|
28
|
+
return () => container.replaceChildren();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
let disposed = false;
|
|
32
|
+
let mounted;
|
|
33
|
+
const storageKey = folderKey(host);
|
|
34
|
+
const request = (method, path = BACKEND, body) => host.agentServer.request({ method, path, ...(body ? { body } : {}) });
|
|
35
|
+
const cleanup = () => {
|
|
36
|
+
disposed = true;
|
|
37
|
+
mounted?.();
|
|
38
|
+
mounted = undefined;
|
|
39
|
+
container.replaceChildren();
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const render = (status) => {
|
|
43
|
+
if (disposed) return;
|
|
44
|
+
shell.replaceChildren();
|
|
45
|
+
if (status.state === "ready") {
|
|
46
|
+
const editor = document.createElement("div");
|
|
47
|
+
editor.style.cssText = "flex:1;min-height:100vh;width:100%;overflow:hidden";
|
|
48
|
+
shell.append(editor);
|
|
49
|
+
const folder = localStorage.getItem(storageKey)?.trim();
|
|
50
|
+
mounted = host.appBackendView.mount({
|
|
51
|
+
container: editor,
|
|
52
|
+
...(folder ? { query: { folder } } : {}),
|
|
53
|
+
});
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const panel = document.createElement("section");
|
|
58
|
+
panel.setAttribute("aria-live", "polite");
|
|
59
|
+
const heading = document.createElement("h2");
|
|
60
|
+
heading.textContent = "VS Code setup";
|
|
61
|
+
const detail = document.createElement("p");
|
|
62
|
+
detail.textContent = status.detail || `Backend status: ${status.state}.`;
|
|
63
|
+
panel.append(heading, detail);
|
|
64
|
+
const folder = document.createElement("input");
|
|
65
|
+
folder.type = "text";
|
|
66
|
+
folder.placeholder = "Workspace folder path (optional)";
|
|
67
|
+
folder.value = localStorage.getItem(storageKey) || "";
|
|
68
|
+
folder.setAttribute("aria-label", "Workspace folder path");
|
|
69
|
+
panel.append(folder);
|
|
70
|
+
const actions = document.createElement("p");
|
|
71
|
+
if (status.state === "missing" || status.state === "stopped" || status.state === "unhealthy") {
|
|
72
|
+
actions.append(button("Prepare and start", async () => {
|
|
73
|
+
const selectedFolder = folder.value.trim();
|
|
74
|
+
if (selectedFolder) localStorage.setItem(storageKey, selectedFolder);
|
|
75
|
+
else localStorage.removeItem(storageKey);
|
|
76
|
+
actions.replaceChildren(document.createTextNode("Preparing..."));
|
|
77
|
+
try {
|
|
78
|
+
let approval = status;
|
|
79
|
+
if (!approval.revision) approval = await request("GET");
|
|
80
|
+
if (!approval.revision) throw new Error("The backend did not report an immutable revision.");
|
|
81
|
+
try {
|
|
82
|
+
await request("POST", `${BACKEND}/prepare`, { revision: approval.revision });
|
|
83
|
+
} catch (error) {
|
|
84
|
+
if (error?.status !== 409) throw error;
|
|
85
|
+
approval = await request("GET");
|
|
86
|
+
if (!approval.revision) throw error;
|
|
87
|
+
await request("POST", `${BACKEND}/prepare`, { revision: approval.revision });
|
|
88
|
+
}
|
|
89
|
+
await request("POST", `${BACKEND}/start`, { revision: approval.revision });
|
|
90
|
+
render(await request("GET"));
|
|
91
|
+
} catch (error) {
|
|
92
|
+
detail.textContent = `Setup failed: ${error.message}`;
|
|
93
|
+
actions.replaceChildren(button("Prepare and start", () => render(status)));
|
|
94
|
+
}
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
if (status.state === "ready" || status.state === "starting") {
|
|
98
|
+
actions.append(button("Stop", async () => render(await request("POST", `${BACKEND}/stop`))));
|
|
99
|
+
}
|
|
100
|
+
actions.append(button("Refresh", async () => render(await request("GET"))));
|
|
101
|
+
panel.append(actions);
|
|
102
|
+
shell.append(panel);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
try { render(await request("GET")); }
|
|
106
|
+
catch (error) {
|
|
107
|
+
const failure = document.createElement("p");
|
|
108
|
+
failure.setAttribute("role", "alert");
|
|
109
|
+
failure.textContent = `Unable to read VS Code backend status: ${error.message}`;
|
|
110
|
+
shell.replaceChildren(failure);
|
|
111
|
+
}
|
|
112
|
+
return cleanup;
|
|
113
|
+
});
|
|
114
|
+
}
|