openhands-extensions 0.28.0__tar.gz → 0.29.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.
Files changed (679) hide show
  1. openhands_extensions-0.29.0/.release-please-manifest.json +3 -0
  2. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/AGENTS.md +7 -2
  3. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/PKG-INFO +1 -1
  4. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/package.json +1 -1
  5. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-automation/references/custom-automation.md +76 -8
  6. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/pyproject.toml +1 -1
  7. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/python/openhands_extensions/_version.py +1 -1
  8. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/SKILL.md +4 -1
  9. openhands_extensions-0.29.0/skills/canvas-extension-api/references/native-design.md +250 -0
  10. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/index.js +2 -2
  11. openhands_extensions-0.28.0/.release-please-manifest.json +0 -3
  12. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.agents/skills/custom-codereview-guide.md +0 -0
  13. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.claude-plugin/marketplace.json +0 -0
  14. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/dependabot.yml +0 -0
  15. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/pull_request_template.md +0 -0
  16. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/release.yml +0 -0
  17. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/scripts/check_pr_description.py +0 -0
  18. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/scripts/markdown_sections.py +0 -0
  19. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/scripts/refresh_linked_pr_checks.py +0 -0
  20. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/build-vscode-app.yml +0 -0
  21. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/check-extensions.yml +0 -0
  22. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/deprecation-check.yml +0 -0
  23. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/issue-readiness-check.yml +0 -0
  24. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/npm-publish.yml +0 -0
  25. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/pr-artifacts.yml +0 -0
  26. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/pr-description-check.yml +0 -0
  27. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/pr.yml +0 -0
  28. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/pypi-publish.yml +0 -0
  29. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/release.yml +0 -0
  30. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/tests.yml +0 -0
  31. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.github/workflows/vulnerability-scan.yml +0 -0
  32. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/.gitignore +0 -0
  33. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/LICENSE +0 -0
  34. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/MIGRATION.md +0 -0
  35. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/README.md +0 -0
  36. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/analysis_results.md +0 -0
  37. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/apps/README.md +0 -0
  38. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/apps/catalog.json +0 -0
  39. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/apps/index.d.ts +0 -0
  40. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/apps/index.js +0 -0
  41. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/apps/vscode/README.md +0 -0
  42. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/apps/vscode/canvas-extension.json +0 -0
  43. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/apps/vscode/extension.js +0 -0
  44. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/apps/vscode/scripts/package.mjs +0 -0
  45. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/README.md +0 -0
  46. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/bundle-index.js +0 -0
  47. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/custom-automation/manifest.json +0 -0
  48. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/github-agents-md-maintainer/manifest.json +0 -0
  49. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/github-delivery-watchdog/manifest.json +0 -0
  50. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/github-issue-to-pr/manifest.json +0 -0
  51. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/github-issue-triage/manifest.json +0 -0
  52. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/github-pr-reviewer/manifest.json +0 -0
  53. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/github-repo-monitor/manifest.json +0 -0
  54. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/github-stale-ci-pr-closer/manifest.json +0 -0
  55. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/gitlab-issue-to-mr/manifest.json +0 -0
  56. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/incident-retrospective-drafter/manifest.json +0 -0
  57. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/jira-issue-to-bitbucket-pr/manifest.json +0 -0
  58. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/jira-issue-to-gitlab-mr/manifest.json +0 -0
  59. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/jira-issue-to-pr/manifest.json +0 -0
  60. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/linear-issue-to-bitbucket-pr/manifest.json +0 -0
  61. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/linear-issue-to-github-pr/manifest.json +0 -0
  62. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/linear-issue-to-gitlab-mr/manifest.json +0 -0
  63. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/linear-triage-assistant/manifest.json +0 -0
  64. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/news-digest/manifest.json +0 -0
  65. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/qa-changes/manifest.json +0 -0
  66. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/research-brief-writer/manifest.json +0 -0
  67. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/slack-channel-monitor/manifest.json +0 -0
  68. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/slack-github-linear-daily-organization.json +0 -0
  69. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/slack-standup-digest/manifest.json +0 -0
  70. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog/upstream-fork-sync/manifest.json +0 -0
  71. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog-index.js +0 -0
  72. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/catalog.schema.json +0 -0
  73. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/index.d.ts +0 -0
  74. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/index.js +0 -0
  75. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/interface.json +0 -0
  76. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/automations/interface.schema.json +0 -0
  77. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/index.d.ts +0 -0
  78. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/index.js +0 -0
  79. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/README.md +0 -0
  80. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/airtable.json +0 -0
  81. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/apify.json +0 -0
  82. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/asana.json +0 -0
  83. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/atlassian-rovo.json +0 -0
  84. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/atlassian.json +0 -0
  85. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/bitbucket.json +0 -0
  86. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/box.json +0 -0
  87. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/brave-search.json +0 -0
  88. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/browser-mcp.json +0 -0
  89. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/canva.json +0 -0
  90. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/clickhouse.json +0 -0
  91. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/cloudflare-bindings.json +0 -0
  92. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/cloudflare-browser-rendering.json +0 -0
  93. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/cloudflare-builds.json +0 -0
  94. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/cloudflare-docs.json +0 -0
  95. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/cloudflare-observability.json +0 -0
  96. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/confluence.json +0 -0
  97. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/datadog.json +0 -0
  98. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/deepwiki.json +0 -0
  99. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/discord.json +0 -0
  100. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/elevenlabs.json +0 -0
  101. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/everything.json +0 -0
  102. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/exa.json +0 -0
  103. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/fetch.json +0 -0
  104. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/figma.json +0 -0
  105. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/filesystem.json +0 -0
  106. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/firecrawl.json +0 -0
  107. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/git.json +0 -0
  108. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/github.json +0 -0
  109. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/gitlab.json +0 -0
  110. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/gmail.json +0 -0
  111. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/google-calendar.json +0 -0
  112. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/google-docs.json +0 -0
  113. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/google-drive.json +0 -0
  114. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/google-sheets.json +0 -0
  115. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/granola.json +0 -0
  116. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/hubspot.json +0 -0
  117. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/huggingface.json +0 -0
  118. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/intercom.json +0 -0
  119. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/jira.json +0 -0
  120. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/kagi.json +0 -0
  121. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/linear.json +0 -0
  122. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/memory.json +0 -0
  123. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/microsoft-outlook.json +0 -0
  124. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/microsoft-teams.json +0 -0
  125. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/miro.json +0 -0
  126. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/monday.json +0 -0
  127. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/mongodb.json +0 -0
  128. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/neon.json +0 -0
  129. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/netlify.json +0 -0
  130. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/notion.json +0 -0
  131. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/obsidian.json +0 -0
  132. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/okta.json +0 -0
  133. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/onedrive.json +0 -0
  134. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/ordinal.json +0 -0
  135. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/paypal.json +0 -0
  136. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/playwright.json +0 -0
  137. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/posthog.json +0 -0
  138. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/quickbooks.json +0 -0
  139. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/redis.json +0 -0
  140. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/reportportal.json +0 -0
  141. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/resend.json +0 -0
  142. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/salesforce.json +0 -0
  143. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/sentry.json +0 -0
  144. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/sequential-thinking.json +0 -0
  145. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/sharepoint.json +0 -0
  146. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/slack.json +0 -0
  147. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/sonarqube.json +0 -0
  148. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/stripe.json +0 -0
  149. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/supabase.json +0 -0
  150. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/superhuman-mail.json +0 -0
  151. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/tavily.json +0 -0
  152. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/time.json +0 -0
  153. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/trello.json +0 -0
  154. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/vanta.json +0 -0
  155. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/vercel.json +0 -0
  156. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/webflow.json +0 -0
  157. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/xero.json +0 -0
  158. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog/zoom.json +0 -0
  159. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog-index.js +0 -0
  160. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/catalog.schema.json +0 -0
  161. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/icons/salesforce.svg +0 -0
  162. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/icons/slack.svg +0 -0
  163. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/index.d.ts +0 -0
  164. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/integrations/index.js +0 -0
  165. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/marketplaces/large-codebase.json +0 -0
  166. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/marketplaces/openhands-extensions.json +0 -0
  167. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/README.md +0 -0
  168. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/city-weather/.claude-plugin/plugin.json +0 -0
  169. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/city-weather/README.md +0 -0
  170. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/city-weather/commands/now.md +0 -0
  171. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/.claude-plugin/plugin.json +0 -0
  172. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/README.md +0 -0
  173. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/references/troubleshooting.md +0 -0
  174. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/skills/build-setup/SKILL.md +0 -0
  175. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/skills/build-setup/scripts/install-gnucobol.sh +0 -0
  176. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/skills/cobol-modernization/SKILL.md +0 -0
  177. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/skills/mainframe-planning/SKILL.md +0 -0
  178. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/skills/mainframe-removal/SKILL.md +0 -0
  179. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/skills/mainframe-removal/references/cics-transformation-examples.md +0 -0
  180. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/skills/to-java-migration/SKILL.md +0 -0
  181. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/skills/to-java-migration/references/cobol-to-java-example.md +0 -0
  182. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/cobol-modernization/skills/to-java-migration/references/datatype-mappings.md +0 -0
  183. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/issue-duplicate-checker/.claude-plugin/plugin.json +0 -0
  184. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/issue-duplicate-checker/README.md +0 -0
  185. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/issue-duplicate-checker/action.yml +0 -0
  186. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/issue-duplicate-checker/scripts/auto_close_duplicate_issues.py +0 -0
  187. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/issue-duplicate-checker/scripts/issue_duplicate_check_openhands.py +0 -0
  188. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/issue-duplicate-checker/scripts/post_duplicate_notice.cjs +0 -0
  189. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/issue-duplicate-checker/scripts/remove_duplicate_candidate_label.cjs +0 -0
  190. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/magic-test/.claude-plugin/plugin.json +0 -0
  191. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/magic-test/skills/magic-word/SKILL.md +0 -0
  192. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/migration-scoring/.claude-plugin/plugin.json +0 -0
  193. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/migration-scoring/README.md +0 -0
  194. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/migration-scoring/skills/migration-mapping/SKILL.md +0 -0
  195. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/migration-scoring/skills/migration-report/SKILL.md +0 -0
  196. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/migration-scoring/skills/migration-scoring/SKILL.md +0 -0
  197. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/migration-scoring/skills/score-quality/SKILL.md +0 -0
  198. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/migration-scoring/skills/score-quality/references/scoring-criteria.md +0 -0
  199. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/migration-scoring/skills/score-style/SKILL.md +0 -0
  200. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/.claude-plugin/plugin.json +0 -0
  201. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/README.md +0 -0
  202. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/references/criteria.md +0 -0
  203. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/agent-readiness-report/README.md +0 -0
  204. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/agent-readiness-report/SKILL.md +0 -0
  205. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/agent-readiness-report/references/criteria.md +0 -0
  206. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_agent_instructions.sh +0 -0
  207. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_build_env.sh +0 -0
  208. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_feedback_loops.sh +0 -0
  209. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_policy.sh +0 -0
  210. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/agent-readiness-report/scripts/scan_workflows.sh +0 -0
  211. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/improve-agent-readiness/README.md +0 -0
  212. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/improve-agent-readiness/SKILL.md +0 -0
  213. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/improve-agent-readiness/references/criteria.md +0 -0
  214. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/setup-agents-md/README.md +0 -0
  215. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/setup-agents-md/SKILL.md +0 -0
  216. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/setup-openhands/README.md +0 -0
  217. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/setup-openhands/SKILL.md +0 -0
  218. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/setup-pr-review/README.md +0 -0
  219. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/onboarding/skills/setup-pr-review/SKILL.md +0 -0
  220. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/.claude-plugin/plugin.json +0 -0
  221. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/README.md +0 -0
  222. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/SKILL.md +0 -0
  223. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/commands/create.md +0 -0
  224. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/commands/openhands-cloud.md +0 -0
  225. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/scripts/run.sh +0 -0
  226. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-api/.claude-plugin/plugin.json +0 -0
  227. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-api/README.md +0 -0
  228. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-api/SKILL.md +0 -0
  229. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-api/references/README.md +0 -0
  230. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-api/references/TROUBLESHOOTING.md +0 -0
  231. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-api/references/example_prompt.md +0 -0
  232. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-api/references/windows.md +0 -0
  233. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-api/scripts/openhands_api.py +0 -0
  234. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-api/scripts/openhands_api.ts +0 -0
  235. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-automation/.claude-plugin/plugin.json +0 -0
  236. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-automation/README.md +0 -0
  237. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-automation/SKILL.md +0 -0
  238. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-automation/commands/automation-create.md +0 -0
  239. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-automation/references/ab-testing.md +0 -0
  240. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-automation/references/security.md +0 -0
  241. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-automation/references/windows.md +0 -0
  242. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-sdk/.claude-plugin/plugin.json +0 -0
  243. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-sdk/README.md +0 -0
  244. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-sdk/SKILL.md +0 -0
  245. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/openhands/skills/openhands-sdk/commands/sdk.md +0 -0
  246. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/.claude-plugin/plugin.json +0 -0
  247. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/README.md +0 -0
  248. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/action.yml +0 -0
  249. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/scripts/agent_script.py +0 -0
  250. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/scripts/evaluate_review.py +0 -0
  251. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/scripts/prompt.py +0 -0
  252. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/code-review/.claude-plugin/plugin.json +0 -0
  253. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/code-review/README.md +0 -0
  254. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/code-review/SKILL.md +0 -0
  255. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/code-review/commands/codereview-roasted.md +0 -0
  256. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/code-review/commands/codereview.md +0 -0
  257. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/code-review/references/risk-evaluation.md +0 -0
  258. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/code-review/references/supply-chain-security.md +0 -0
  259. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/github-pr-review/.claude-plugin/plugin.json +0 -0
  260. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/github-pr-review/README.md +0 -0
  261. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/github-pr-review/SKILL.md +0 -0
  262. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/github-pr-review/commands/github-pr-review.md +0 -0
  263. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/skills/github-pr-review/references/windows.md +0 -0
  264. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/workflows/pr-review-by-openhands.yml +0 -0
  265. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/pr-review/workflows/pr-review-evaluation.yml +0 -0
  266. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/.claude-plugin/plugin.json +0 -0
  267. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/README.md +0 -0
  268. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/action.yml +0 -0
  269. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/scripts/agent_script.py +0 -0
  270. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/scripts/evaluate_qa_changes.py +0 -0
  271. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/scripts/prompt.py +0 -0
  272. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/skills/qa-changes/README.md +0 -0
  273. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/skills/qa-changes/SKILL.md +0 -0
  274. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/skills/qa-changes/commands/qa-changes.md +0 -0
  275. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/workflows/qa-changes-by-openhands.yml +0 -0
  276. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/qa-changes/workflows/qa-changes-evaluation.yml +0 -0
  277. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/.claude-plugin/plugin.json +0 -0
  278. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/README.md +0 -0
  279. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/SKILL.md +0 -0
  280. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/action.yml +0 -0
  281. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/commands/release-notes.md +0 -0
  282. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/scripts/agent_script.py +0 -0
  283. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/scripts/generate_release_notes.py +0 -0
  284. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/scripts/prompt.py +0 -0
  285. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/scripts/validate_release_notes.py +0 -0
  286. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/skills/release-notes/README.md +0 -0
  287. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/skills/release-notes/SKILL.md +0 -0
  288. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/skills/release-notes/commands/release-notes.md +0 -0
  289. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/release-notes/workflows/release-notes.yml +0 -0
  290. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/runtime-api-configs/.claude-plugin/plugin.json +0 -0
  291. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/runtime-api-configs/README.md +0 -0
  292. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/runtime-api-configs/SKILL.md +0 -0
  293. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/runtime-api-configs/scripts/warm_runtime_configs.py +0 -0
  294. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/runtime-api-configs/tests/test_warm_runtime_configs.py +0 -0
  295. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/.claude-plugin/plugin.json +0 -0
  296. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/README.md +0 -0
  297. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/action.yml +0 -0
  298. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/scripts/scan_and_remediate.py +0 -0
  299. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/skills/github/.claude-plugin/plugin.json +0 -0
  300. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/skills/github/README.md +0 -0
  301. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/skills/github/SKILL.md +0 -0
  302. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/skills/github/references/windows.md +0 -0
  303. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/skills/github/scripts/agent_conversation.py +0 -0
  304. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/skills/github/scripts/github_client.py +0 -0
  305. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/skills/security/.claude-plugin/plugin.json +0 -0
  306. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/skills/security/README.md +0 -0
  307. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/skills/security/SKILL.md +0 -0
  308. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/plugins/vulnerability-remediation/workflows/vulnerability-scan.yml +0 -0
  309. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/python/openhands_extensions/__init__.py +0 -0
  310. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/python/openhands_extensions/deprecation.py +0 -0
  311. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/python/openhands_extensions/integration_models.py +0 -0
  312. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/python/openhands_extensions/integrations.py +0 -0
  313. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/release-please-config.json +0 -0
  314. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/scripts/build-automation-catalog.mjs +0 -0
  315. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/scripts/build-integration-catalog.mjs +0 -0
  316. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/scripts/build-skills-catalog.mjs +0 -0
  317. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/scripts/check_deprecations.py +0 -0
  318. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/scripts/check_plugin_resources.py +0 -0
  319. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/scripts/sync_extensions.py +0 -0
  320. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/scripts/sync_openhands_sdk_skill.py +0 -0
  321. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/README.md +0 -0
  322. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/add-javadoc/.claude-plugin/plugin.json +0 -0
  323. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/add-javadoc/README.md +0 -0
  324. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/add-javadoc/SKILL.md +0 -0
  325. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/add-javadoc/references/example.md +0 -0
  326. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/add-skill/.claude-plugin/plugin.json +0 -0
  327. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/add-skill/README.md +0 -0
  328. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/add-skill/SKILL.md +0 -0
  329. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/add-skill/scripts/fetch_skill.py +0 -0
  330. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-canvas-environment/.claude-plugin/plugin.json +0 -0
  331. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-canvas-environment/README.md +0 -0
  332. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-canvas-environment/SKILL.md +0 -0
  333. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-creator/.claude-plugin/plugin.json +0 -0
  334. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-creator/README.md +0 -0
  335. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-creator/SKILL.md +0 -0
  336. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-creator/commands/agent-creator.md +0 -0
  337. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-creator/references/fallback.md +0 -0
  338. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-memory/.claude-plugin/plugin.json +0 -0
  339. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-memory/README.md +0 -0
  340. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-memory/SKILL.md +0 -0
  341. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-memory/commands/remember.md +0 -0
  342. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-sdk-builder/.claude-plugin/plugin.json +0 -0
  343. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-sdk-builder/README.md +0 -0
  344. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-sdk-builder/SKILL.md +0 -0
  345. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/agent-sdk-builder/commands/agent-builder.md +0 -0
  346. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/azure-devops/.claude-plugin/plugin.json +0 -0
  347. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/azure-devops/README.md +0 -0
  348. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/azure-devops/SKILL.md +0 -0
  349. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/bitbucket/.claude-plugin/plugin.json +0 -0
  350. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/bitbucket/README.md +0 -0
  351. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/bitbucket/SKILL.md +0 -0
  352. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/bitbucket-cloud/.claude-plugin/plugin.json +0 -0
  353. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/bitbucket-cloud/README.md +0 -0
  354. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/bitbucket-cloud/SKILL.md +0 -0
  355. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/bitbucket-data-center/.claude-plugin/plugin.json +0 -0
  356. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/bitbucket-data-center/README.md +0 -0
  357. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/bitbucket-data-center/SKILL.md +0 -0
  358. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/.claude-plugin/plugin.json +0 -0
  359. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/README.md +0 -0
  360. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/references/acceptance-checklist.md +0 -0
  361. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/references/backend-safety.md +0 -0
  362. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/references/connections.md +0 -0
  363. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/references/packaging-recipes.md +0 -0
  364. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/references/sidecar-pattern.md +0 -0
  365. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/references/testing-and-installation.md +0 -0
  366. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/references/v1-contract.md +0 -0
  367. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/scripts/validate-extension.mjs +0 -0
  368. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/canvas-extension-api/scripts/validate-extension.test.mjs +0 -0
  369. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/code-simplifier/.claude-plugin/plugin.json +0 -0
  370. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/code-simplifier/README.md +0 -0
  371. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/code-simplifier/SKILL.md +0 -0
  372. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/code-simplifier/commands/simplify.md +0 -0
  373. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/code-simplifier/references/code-quality-review.md +0 -0
  374. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/code-simplifier/references/code-reuse-review.md +0 -0
  375. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/code-simplifier/references/efficiency-review.md +0 -0
  376. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/datadog/.claude-plugin/plugin.json +0 -0
  377. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/datadog/README.md +0 -0
  378. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/datadog/SKILL.md +0 -0
  379. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/datadog/references/windows.md +0 -0
  380. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/deno/.claude-plugin/plugin.json +0 -0
  381. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/deno/README.md +0 -0
  382. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/deno/SKILL.md +0 -0
  383. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/deno/references/README.md +0 -0
  384. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/discord/.claude-plugin/plugin.json +0 -0
  385. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/discord/README.md +0 -0
  386. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/discord/SKILL.md +0 -0
  387. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/discord/__init__.py +0 -0
  388. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/discord/references/REFERENCE.md +0 -0
  389. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/discord/scripts/__init__.py +0 -0
  390. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/discord/scripts/_http.py +0 -0
  391. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/discord/scripts/post_webhook.py +0 -0
  392. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/discord/scripts/send_message.py +0 -0
  393. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/docker/.claude-plugin/plugin.json +0 -0
  394. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/docker/README.md +0 -0
  395. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/docker/SKILL.md +0 -0
  396. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/evidence-based-citations/.claude-plugin/plugin.json +0 -0
  397. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/evidence-based-citations/README.md +0 -0
  398. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/evidence-based-citations/SKILL.md +0 -0
  399. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/flarglebargle/.claude-plugin/plugin.json +0 -0
  400. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/flarglebargle/README.md +0 -0
  401. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/flarglebargle/SKILL.md +0 -0
  402. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/frontend-design/.claude-plugin/plugin.json +0 -0
  403. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/frontend-design/LICENSE.txt +0 -0
  404. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/frontend-design/README.md +0 -0
  405. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/frontend-design/SKILL.md +0 -0
  406. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-actions/.claude-plugin/plugin.json +0 -0
  407. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-actions/README.md +0 -0
  408. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-actions/SKILL.md +0 -0
  409. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-agents-md-maintainer/.claude-plugin/plugin.json +0 -0
  410. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-agents-md-maintainer/README.md +0 -0
  411. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-agents-md-maintainer/SKILL.md +0 -0
  412. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-agents-md-maintainer/commands/agents-md-setup.md +0 -0
  413. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-agents-md-maintainer/references/state-schema.md +0 -0
  414. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-agents-md-maintainer/scripts/github_client.py +0 -0
  415. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-agents-md-maintainer/scripts/main.py +0 -0
  416. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-delivery-watchdog/.claude-plugin/plugin.json +0 -0
  417. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-delivery-watchdog/README.md +0 -0
  418. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-delivery-watchdog/SKILL.md +0 -0
  419. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-delivery-watchdog/commands/github-delivery-watchdog.md +0 -0
  420. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-delivery-watchdog/scripts/github_client.py +0 -0
  421. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-delivery-watchdog/scripts/worker.py +0 -0
  422. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-to-pr/.claude-plugin/plugin.json +0 -0
  423. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-to-pr/README.md +0 -0
  424. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-to-pr/SKILL.md +0 -0
  425. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-to-pr/commands/issue-to-pr-setup.md +0 -0
  426. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-to-pr/references/state-schema.md +0 -0
  427. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-to-pr/scripts/agent_conversation.py +0 -0
  428. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-to-pr/scripts/github_client.py +0 -0
  429. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-to-pr/scripts/main.py +0 -0
  430. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-to-pr/scripts/worker.py +0 -0
  431. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-triage/.claude-plugin/plugin.json +0 -0
  432. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-triage/README.md +0 -0
  433. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-triage/SKILL.md +0 -0
  434. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-triage/commands/github-issue-triage.md +0 -0
  435. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-triage/scripts/agent_conversation.py +0 -0
  436. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-triage/scripts/github_client.py +0 -0
  437. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-issue-triage/scripts/worker.py +0 -0
  438. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/.claude-plugin/plugin.json +0 -0
  439. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/README.md +0 -0
  440. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/SKILL.md +0 -0
  441. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/commands/pr-reviewer-setup.md +0 -0
  442. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/references/state-schema.md +0 -0
  443. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/references/windows.md +0 -0
  444. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/scripts/agent_conversation.py +0 -0
  445. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/scripts/github_client.py +0 -0
  446. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/scripts/main.py +0 -0
  447. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/scripts/maintainer_handoff.py +0 -0
  448. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/scripts/worker.py +0 -0
  449. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-pr-reviewer/tests/test_main.py +0 -0
  450. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-repo-monitor/.claude-plugin/plugin.json +0 -0
  451. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-repo-monitor/README.md +0 -0
  452. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-repo-monitor/SKILL.md +0 -0
  453. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-repo-monitor/commands/github-monitor-poll.md +0 -0
  454. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-repo-monitor/references/github-api.md +0 -0
  455. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-repo-monitor/references/state-schema.md +0 -0
  456. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-repo-monitor/references/windows.md +0 -0
  457. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-repo-monitor/scripts/github_client.py +0 -0
  458. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-repo-monitor/scripts/main.py +0 -0
  459. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-repo-monitor/tests/test_main.py +0 -0
  460. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-stale-ci-pr-closer/.claude-plugin/plugin.json +0 -0
  461. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-stale-ci-pr-closer/README.md +0 -0
  462. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-stale-ci-pr-closer/SKILL.md +0 -0
  463. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-stale-ci-pr-closer/commands/github-stale-ci-pr-closer.md +0 -0
  464. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-stale-ci-pr-closer/scripts/worker.py +0 -0
  465. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/github-stale-ci-pr-closer/tests/test_worker.py +0 -0
  466. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/gitlab/.claude-plugin/plugin.json +0 -0
  467. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/gitlab/README.md +0 -0
  468. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/gitlab/SKILL.md +0 -0
  469. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/gitlab-issue-to-mr/.claude-plugin/plugin.json +0 -0
  470. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/gitlab-issue-to-mr/README.md +0 -0
  471. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/gitlab-issue-to-mr/SKILL.md +0 -0
  472. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/gitlab-issue-to-mr/commands/issue-to-mr-setup.md +0 -0
  473. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/gitlab-issue-to-mr/references/state-schema.md +0 -0
  474. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/gitlab-issue-to-mr/scripts/main.py +0 -0
  475. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/incident-retrospective/.claude-plugin/plugin.json +0 -0
  476. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/incident-retrospective/README.md +0 -0
  477. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/incident-retrospective/SKILL.md +0 -0
  478. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/incident-retrospective/commands/incident-retro-setup.md +0 -0
  479. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/index.d.ts +0 -0
  480. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/.claude-plugin/plugin.json +0 -0
  481. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/.codex-plugin/plugin.json +0 -0
  482. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/.plugin/plugin.json +0 -0
  483. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/README.md +0 -0
  484. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/SKILL.md +0 -0
  485. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/commands/babysit.md +0 -0
  486. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/commands/iterate.md +0 -0
  487. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/commands/verify.md +0 -0
  488. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/references/heuristics.md +0 -0
  489. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/references/verification.md +0 -0
  490. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/iterate/references/windows.md +0 -0
  491. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/jira-issue-to-pr/.claude-plugin/plugin.json +0 -0
  492. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/jira-issue-to-pr/README.md +0 -0
  493. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/jira-issue-to-pr/SKILL.md +0 -0
  494. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/jira-issue-to-pr/references/setup.md +0 -0
  495. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/jira-issue-to-pr/scripts/main.py +0 -0
  496. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/jira-issue-to-pr/scripts/setup_webhook.py +0 -0
  497. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/jupyter/.claude-plugin/plugin.json +0 -0
  498. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/jupyter/README.md +0 -0
  499. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/jupyter/SKILL.md +0 -0
  500. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/kubernetes/.claude-plugin/plugin.json +0 -0
  501. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/kubernetes/README.md +0 -0
  502. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/kubernetes/SKILL.md +0 -0
  503. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/kubernetes/references/windows.md +0 -0
  504. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/learn-from-code-review/.claude-plugin/plugin.json +0 -0
  505. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/learn-from-code-review/README.md +0 -0
  506. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/learn-from-code-review/SKILL.md +0 -0
  507. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/learn-from-code-review/commands/learn-from-reviews.md +0 -0
  508. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/linear/.claude-plugin/plugin.json +0 -0
  509. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/linear/README.md +0 -0
  510. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/linear/SKILL.md +0 -0
  511. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/linear/references/windows.md +0 -0
  512. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/linear-triage/.claude-plugin/plugin.json +0 -0
  513. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/linear-triage/README.md +0 -0
  514. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/linear-triage/SKILL.md +0 -0
  515. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/linear-triage/commands/linear-triage-setup.md +0 -0
  516. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/news-digest/.claude-plugin/plugin.json +0 -0
  517. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/news-digest/README.md +0 -0
  518. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/news-digest/SKILL.md +0 -0
  519. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/news-digest/commands/news-digest-setup.md +0 -0
  520. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/news-digest/references/state-schema.md +0 -0
  521. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/news-digest/scripts/main.py +0 -0
  522. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/notion/.claude-plugin/plugin.json +0 -0
  523. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/notion/README.md +0 -0
  524. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/notion/SKILL.md +0 -0
  525. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/notion/references/windows.md +0 -0
  526. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/npm/.claude-plugin/plugin.json +0 -0
  527. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/npm/README.md +0 -0
  528. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/npm/SKILL.md +0 -0
  529. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/openhands-enterprise-troubleshooting/.claude-plugin/plugin.json +0 -0
  530. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/openhands-enterprise-troubleshooting/README.md +0 -0
  531. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/openhands-enterprise-troubleshooting/SKILL.md +0 -0
  532. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/openhands-enterprise-troubleshooting/references/diagnostics.md +0 -0
  533. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/openhands-enterprise-troubleshooting/references/support-bundle-analysis.md +0 -0
  534. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/openhands-enterprise-troubleshooting/scripts/bundle_triage.py +0 -0
  535. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/pdflatex/.claude-plugin/plugin.json +0 -0
  536. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/pdflatex/README.md +0 -0
  537. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/pdflatex/SKILL.md +0 -0
  538. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/plain-english-content/.claude-plugin/plugin.json +0 -0
  539. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/plain-english-content/README.md +0 -0
  540. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/plain-english-content/SKILL.md +0 -0
  541. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/prd/.claude-plugin/plugin.json +0 -0
  542. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/prd/README.md +0 -0
  543. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/prd/SKILL.md +0 -0
  544. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/prd/commands/prd.md +0 -0
  545. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/research-brief/.claude-plugin/plugin.json +0 -0
  546. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/research-brief/README.md +0 -0
  547. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/research-brief/SKILL.md +0 -0
  548. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/research-brief/commands/research-brief-setup.md +0 -0
  549. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/simplified-technical-english/.claude-plugin/plugin.json +0 -0
  550. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/simplified-technical-english/README.md +0 -0
  551. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/simplified-technical-english/SKILL.md +0 -0
  552. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/skill-creator/.claude-plugin/plugin.json +0 -0
  553. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/skill-creator/LICENSE.txt +0 -0
  554. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/skill-creator/README.md +0 -0
  555. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/skill-creator/SKILL.md +0 -0
  556. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/skill-creator/references/output-patterns.md +0 -0
  557. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/skill-creator/references/windows.md +0 -0
  558. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/skill-creator/references/workflows.md +0 -0
  559. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/skill-creator/scripts/init_skill.py +0 -0
  560. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/skill-creator/scripts/quick_validate.py +0 -0
  561. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-channel-monitor/.claude-plugin/plugin.json +0 -0
  562. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-channel-monitor/README.md +0 -0
  563. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-channel-monitor/SKILL.md +0 -0
  564. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-channel-monitor/commands/slack-monitor-poll.md +0 -0
  565. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-channel-monitor/references/slack-api.md +0 -0
  566. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-channel-monitor/references/state-schema.md +0 -0
  567. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-channel-monitor/references/windows.md +0 -0
  568. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-channel-monitor/scripts/main.py +0 -0
  569. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-standup-digest/.claude-plugin/plugin.json +0 -0
  570. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-standup-digest/README.md +0 -0
  571. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-standup-digest/SKILL.md +0 -0
  572. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/slack-standup-digest/commands/standup-digest-setup.md +0 -0
  573. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/spark-version-upgrade/.claude-plugin/plugin.json +0 -0
  574. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/spark-version-upgrade/README.md +0 -0
  575. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/spark-version-upgrade/SKILL.md +0 -0
  576. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/ssh/.claude-plugin/plugin.json +0 -0
  577. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/ssh/README.md +0 -0
  578. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/ssh/SKILL.md +0 -0
  579. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/ssh/references/windows.md +0 -0
  580. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/swift-linux/.claude-plugin/plugin.json +0 -0
  581. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/swift-linux/README.md +0 -0
  582. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/swift-linux/SKILL.md +0 -0
  583. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/technical-writing/.claude-plugin/plugin.json +0 -0
  584. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/technical-writing/README.md +0 -0
  585. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/technical-writing/SKILL.md +0 -0
  586. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/.claude-plugin/plugin.json +0 -0
  587. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/LICENSE.txt +0 -0
  588. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/README.md +0 -0
  589. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/SKILL.md +0 -0
  590. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/theme-showcase.pdf +0 -0
  591. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/themes/arctic-frost.md +0 -0
  592. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/themes/botanical-garden.md +0 -0
  593. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/themes/desert-rose.md +0 -0
  594. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/themes/forest-canopy.md +0 -0
  595. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/themes/golden-hour.md +0 -0
  596. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/themes/midnight-galaxy.md +0 -0
  597. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/themes/modern-minimalist.md +0 -0
  598. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/themes/ocean-depths.md +0 -0
  599. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/themes/sunset-boulevard.md +0 -0
  600. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/theme-factory/themes/tech-innovation.md +0 -0
  601. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/ticket-to-code-change/.claude-plugin/plugin.json +0 -0
  602. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/ticket-to-code-change/README.md +0 -0
  603. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/ticket-to-code-change/SKILL.md +0 -0
  604. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/ticket-to-code-change/commands/ticket-to-code-change-setup.md +0 -0
  605. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/upstream-fork-sync/.claude-plugin/plugin.json +0 -0
  606. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/upstream-fork-sync/README.md +0 -0
  607. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/upstream-fork-sync/SKILL.md +0 -0
  608. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/upstream-fork-sync/commands/upstream-fork-sync-setup.md +0 -0
  609. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/use-jev/.claude-plugin/plugin.json +0 -0
  610. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/use-jev/README.md +0 -0
  611. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/use-jev/SKILL.md +0 -0
  612. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/uv/.claude-plugin/plugin.json +0 -0
  613. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/uv/README.md +0 -0
  614. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/uv/SKILL.md +0 -0
  615. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/uv/references/README.md +0 -0
  616. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/vercel/.claude-plugin/plugin.json +0 -0
  617. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/vercel/README.md +0 -0
  618. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/skills/vercel/SKILL.md +0 -0
  619. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/fixtures/automations/capabilities.json +0 -0
  620. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/fixtures/automations/custom-automation.json +0 -0
  621. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/fixtures/automations/github-pr-reviewer.json +0 -0
  622. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/fixtures/automations/github-repo-monitor.json +0 -0
  623. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/fixtures/automations/incident-retrospective-drafter.json +0 -0
  624. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/fixtures/automations/upstream-fork-sync.json +0 -0
  625. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/github_automation_helpers.py +0 -0
  626. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_add_skill_installs_to_agents_dir.py +0 -0
  627. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_agent_conversation_dispatch.py +0 -0
  628. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_apps_catalog.py +0 -0
  629. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_automation_setup.py +0 -0
  630. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_catalog_schema.py +0 -0
  631. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_catalogs.py +0 -0
  632. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_check_pr_description.py +0 -0
  633. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_code_review_risk_evaluation.py +0 -0
  634. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_deprecations.py +0 -0
  635. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_agents_md_maintainer.py +0 -0
  636. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_automation_foundation.py +0 -0
  637. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_developer_delivery.py +0 -0
  638. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_issue_to_pr.py +0 -0
  639. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_pr_review_skill.py +0 -0
  640. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_repo_monitor.py +0 -0
  641. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_reviewer_delivery.py +0 -0
  642. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_skill_installation.py +0 -0
  643. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_stale_ci_pr_closer.py +0 -0
  644. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_triage_delivery.py +0 -0
  645. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_github_watchdog_delivery.py +0 -0
  646. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_gitlab_issue_to_mr.py +0 -0
  647. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_integration_catalog_in_sync.py +0 -0
  648. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_interface_manifest.py +0 -0
  649. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_issue_duplicate_checker.py +0 -0
  650. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_jira_issue_to_pr.py +0 -0
  651. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_jira_setup_webhook.py +0 -0
  652. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_live_integration_smoke.py +0 -0
  653. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_maintainer_handoff.py +0 -0
  654. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_news_digest.py +0 -0
  655. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_openhands_api_python.py +0 -0
  656. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_plugin_manifest.py +0 -0
  657. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_pr_review_diff_payload.py +0 -0
  658. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_pr_review_feedback.py +0 -0
  659. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_pr_review_prompt.py +0 -0
  660. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_pr_review_review_context.py +0 -0
  661. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_qa_changes.py +0 -0
  662. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_qa_changes_evaluation.py +0 -0
  663. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_refresh_linked_pr_checks.py +0 -0
  664. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_release_notes_generator.py +0 -0
  665. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_sdk_loading.py +0 -0
  666. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_skill_plugin_loading.py +0 -0
  667. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_skills_catalog.py +0 -0
  668. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_skills_have_readme.py +0 -0
  669. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_slack_channel_monitor.py +0 -0
  670. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_sync_extensions.py +0 -0
  671. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_version_alignment.py +0 -0
  672. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_vscode_app.py +0 -0
  673. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/test_workflow_sync.py +0 -0
  674. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/tests/vscode-app.test.mjs +0 -0
  675. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/utils/analysis/README.md +0 -0
  676. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/utils/analysis/laminar_signals/README.md +0 -0
  677. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/utils/analysis/laminar_signals/analyze.py +0 -0
  678. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/utils/analysis/laminar_signals/templates/default.j2 +0 -0
  679. {openhands_extensions-0.28.0 → openhands_extensions-0.29.0}/utils/analysis/laminar_signals/templates/pr_review.j2 +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.29.0"
3
+ }
@@ -6,7 +6,7 @@ It contains **shareable skills and plugins** that can be loaded by OpenHands (CL
6
6
 
7
7
  ## Cross-Repository Boundaries
8
8
 
9
- This repository owns the public registry of reusable OpenHands skills, plugins, automations, and integrations. These extensions are consumed by OpenHands applications and SDK-based clients.
9
+ This repository owns the public registry of reusable OpenHands skills, plugins, Agent Canvas Apps, automations, and integrations. These extensions are consumed by OpenHands applications and SDK-based clients.
10
10
 
11
11
  Related repositories have distinct responsibilities:
12
12
 
@@ -49,7 +49,12 @@ Before opening a PR:
49
49
  - `plugins/<plugin-name>/hooks/` — lifecycle hooks (optional)
50
50
  - `plugins/<plugin-name>/scripts/` — utility scripts (optional)
51
51
 
52
- There is no application code here; the primary artifacts are Markdown skill definitions and plugin configurations, which can contain `scripts/`, `hooks/` sub-directories.
52
+ - `apps/` — a catalog of Agent Canvas Apps (beta), **one directory per app**.
53
+ - `apps/<app-name>/canvas-extension.json` — the App manifest (Canvas Extensions API v1)
54
+ - `apps/<app-name>/extension.js` — the browser ESM entrypoint exporting `activate(host)`
55
+ - `apps/catalog.json` — the registry catalog, exposed as `APPS_CATALOG` from `@openhands/extensions/apps`
56
+
57
+ Most content is Markdown skill definitions and plugin configurations; the executable parts are plugin `scripts/` and `hooks/` plus the browser ESM App packages under `apps/`, each of which may ship its own `scripts/` and build sub-directories.
53
58
 
54
59
  ## How client code uses this repo
55
60
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: openhands-extensions
3
- Version: 0.28.0
3
+ Version: 0.29.0
4
4
  Summary: OpenHands extensions, plugins, and skills (Python bindings for the integration catalog)
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openhands/extensions",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "description": "Public OpenHands extension catalogs for skills, plugins, integrations, and automation templates.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -249,6 +249,7 @@ uv pip install -q openhands-sdk openhands-workspace openhands-tools
249
249
  import os
250
250
 
251
251
  from openhands.sdk import Conversation
252
+ from openhands.sdk.automation import automation_conversation_kwargs
252
253
  from openhands.tools.preset.default import get_default_agent
253
254
  from openhands.workspace import OpenHandsCloudWorkspace
254
255
 
@@ -266,13 +267,48 @@ with OpenHandsCloudWorkspace(
266
267
  ) as workspace:
267
268
  llm = workspace.get_llm()
268
269
  agent = get_default_agent(llm=llm, cli_mode=True)
269
- conversation = Conversation(agent=agent, workspace=workspace)
270
+ conversation = Conversation(
271
+ agent=agent,
272
+ workspace=workspace,
273
+ **automation_conversation_kwargs(),
274
+ )
270
275
  conversation.send_message("Your automation prompt here")
271
276
  conversation.run()
272
277
  conversation.close()
273
278
  # OpenHandsCloudWorkspace.__exit__ fires the completion callback here.
274
279
  ```
275
280
 
281
+ ### Link automation conversations to run telemetry
282
+
283
+ When an automation script starts a conversation, preserve the trace context that the automation service injected into the run. This links the conversation span to the triggering webhook, scheduler dispatch, and run record.
284
+
285
+ - SDK conversations: pass `**automation_conversation_kwargs()` into every `Conversation(...)` call.
286
+ - Direct agent-server API calls: merge `automation_observability_headers()` into the headers for each `POST /api/conversations` request.
287
+ - If you add your own conversation tags, pass them through `conversation_tags={...}` instead of replacing the helper output.
288
+
289
+ ```python
290
+ from openhands.sdk import Conversation
291
+ from openhands.sdk.automation import (
292
+ automation_conversation_kwargs,
293
+ automation_observability_headers,
294
+ )
295
+
296
+ conversation = Conversation(
297
+ agent=agent,
298
+ workspace=workspace,
299
+ **automation_conversation_kwargs(),
300
+ )
301
+
302
+ headers = {
303
+ "X-Session-API-Key": api_key,
304
+ **automation_observability_headers(span_name="automation.conversation"),
305
+ }
306
+ # Use these headers when creating a backend conversation directly.
307
+ # httpx.post(f"{agent_url}/api/conversations", headers=headers, json=payload)
308
+ ```
309
+
310
+ The built-in prompt and plugin presets use this helper. Custom scripts should do the same for every new conversation so traces, observability metadata, and automation conversation tags stay attached.
311
+
276
312
  ### Selecting an LLM profile
277
313
 
278
314
  The automation service injects an `AUTOMATION_MODEL` environment variable holding the **LLM profile name** the automation should run with. This is the profile a user selects when editing the automation, or — when none is selected — a snapshot of the user's active profile taken when the automation was created. To honor it on every run, read `AUTOMATION_MODEL` and pass it to `workspace.get_llm(profile_name=...)`:
@@ -299,13 +335,27 @@ Conversations started during a run remain accessible in the OpenHands UI after t
299
335
 
300
336
  ```python
301
337
  # Default: conversation persists after close (users can view/continue it)
302
- conversation = Conversation(agent=agent, workspace=workspace)
338
+ conversation = Conversation(
339
+ agent=agent,
340
+ workspace=workspace,
341
+ **automation_conversation_kwargs(),
342
+ )
303
343
 
304
344
  # Explicitly persist (same as default)
305
- conversation = Conversation(agent=agent, workspace=workspace, delete_on_close=False)
345
+ conversation = Conversation(
346
+ agent=agent,
347
+ workspace=workspace,
348
+ delete_on_close=False,
349
+ **automation_conversation_kwargs(),
350
+ )
306
351
 
307
352
  # Delete conversation resources on close
308
- conversation = Conversation(agent=agent, workspace=workspace, delete_on_close=True)
353
+ conversation = Conversation(
354
+ agent=agent,
355
+ workspace=workspace,
356
+ delete_on_close=True,
357
+ **automation_conversation_kwargs(),
358
+ )
309
359
  ```
310
360
 
311
361
  The agent server itself persists until it times out or is manually deleted; this is managed by the automation service, not by the workspace.
@@ -339,7 +389,11 @@ else:
339
389
  with OpenHandsCloudWorkspace(local_agent_server_mode=True, cloud_api_url=api_url, cloud_api_key=api_key) as workspace:
340
390
  llm = workspace.get_llm()
341
391
  agent = get_default_agent(llm=llm, cli_mode=True)
342
- conversation = Conversation(agent=agent, workspace=workspace)
392
+ conversation = Conversation(
393
+ agent=agent,
394
+ workspace=workspace,
395
+ **automation_conversation_kwargs(),
396
+ )
343
397
  conversation.send_message(f"Investigate these alerts and open GitHub issues: {alerts}")
344
398
  conversation.run()
345
399
  conversation.close()
@@ -358,7 +412,11 @@ from openhands.sdk.conversation.state import ConversationExecutionStatus
358
412
  with OpenHandsCloudWorkspace(local_agent_server_mode=True, cloud_api_url=api_url, cloud_api_key=api_key) as workspace:
359
413
  llm = workspace.get_llm()
360
414
  agent = get_default_agent(llm=llm, cli_mode=True)
361
- conversation = Conversation(agent=agent, workspace=workspace)
415
+ conversation = Conversation(
416
+ agent=agent,
417
+ workspace=workspace,
418
+ **automation_conversation_kwargs(),
419
+ )
362
420
  conversation.send_message("Run a long analysis task")
363
421
  # Conversation is now running asynchronously in the agent server.
364
422
 
@@ -404,7 +462,12 @@ stop_hook = HookConfig(
404
462
  with OpenHandsCloudWorkspace(local_agent_server_mode=True, cloud_api_url=api_url, cloud_api_key=api_key) as workspace:
405
463
  llm = workspace.get_llm()
406
464
  agent = get_default_agent(llm=llm, cli_mode=True)
407
- conversation = Conversation(agent=agent, workspace=workspace, hook_config=stop_hook)
465
+ conversation = Conversation(
466
+ agent=agent,
467
+ workspace=workspace,
468
+ hook_config=stop_hook,
469
+ **automation_conversation_kwargs(),
470
+ )
408
471
  conversation.send_message("Do some long-running work")
409
472
  # Don't call run() — the conversation runs asynchronously.
410
473
  # When the agent stops, the stop hook will fire the callback.
@@ -765,6 +828,7 @@ import os
765
828
  import json
766
829
 
767
830
  from openhands.sdk import Conversation
831
+ from openhands.sdk.automation import automation_conversation_kwargs
768
832
  from openhands.tools.preset.default import get_default_agent
769
833
  from openhands.workspace import OpenHandsCloudWorkspace
770
834
 
@@ -781,7 +845,11 @@ with OpenHandsCloudWorkspace(
781
845
  ) as workspace:
782
846
  llm = workspace.get_llm()
783
847
  agent = get_default_agent(llm=llm, cli_mode=True)
784
- conversation = Conversation(agent=agent, workspace=workspace)
848
+ conversation = Conversation(
849
+ agent=agent,
850
+ workspace=workspace,
851
+ **automation_conversation_kwargs(),
852
+ )
785
853
  conversation.send_message("Generate a weekly status report")
786
854
  conversation.run()
787
855
  conversation.close()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openhands-extensions"
3
- version = "0.28.0"
3
+ version = "0.29.0"
4
4
  description = "OpenHands extensions, plugins, and skills (Python bindings for the integration catalog)"
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
@@ -18,7 +18,7 @@ from importlib.metadata import PackageNotFoundError, version
18
18
  #: Kept in lock-step with pyproject.toml/package.json by the version test.
19
19
  #: release-please only rewrites a semver found on the annotated line itself, so
20
20
  #: the annotation must stay on the assignment; on its own line it is a no-op.
21
- _FALLBACK_VERSION = "0.28.0" # x-release-please-version
21
+ _FALLBACK_VERSION = "0.29.0" # x-release-please-version
22
22
 
23
23
  try:
24
24
  __version__: str = version("openhands-extensions")
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: canvas-extension-api
3
- description: This skill should be used when the user asks to "create an OpenHands App", "scaffold a Canvas App", "build an app with the Canvas Extensions API", "build an Agent Canvas App", "bundle a single-file Canvas App", "build a Sidecar-backed Canvas App", "add onboarding for an App service", "add a custom interface to Agent Canvas", "validate an OpenHands App", or mentions Canvas Apps, Agent Canvas extensions, Blob-importable app bundles, registerPage, app pages, Sidecars, or canvas extension packages.
3
+ description: This skill should be used when the user asks to "create an OpenHands App", "scaffold a Canvas App", "build an app with the Canvas Extensions API", "build an Agent Canvas App", "bundle a single-file Canvas App", "build a Sidecar-backed Canvas App", "add onboarding for an App service", "add a custom interface to Agent Canvas", "validate an OpenHands App", "make a Canvas App look native", "match Agent Canvas styles", "style a canvas extension", "reuse OpenHands design tokens", "add native Tailwind classes to an app", or mentions Canvas Apps, Agent Canvas extensions, Blob-importable app bundles, registerPage, app pages, Sidecars, or canvas extension packages.
4
4
  ---
5
5
 
6
6
  # Canvas Extensions API
@@ -195,6 +195,8 @@ Assume activation, mounting, and disposal may happen repeatedly during hot enabl
195
195
 
196
196
  Render within the supplied `container`; do not replace unrelated Canvas DOM. Scope CSS under an app-specific root class. Prefer Canvas CSS variables with sensible fallbacks rather than copying host implementation classes.
197
197
 
198
+ Read `references/native-design.md` before styling an App page. It covers the core rule (reuse tokens, not host internals), the three implementation paths (dependency-free, Tailwind-bundled, existing CSS), the Tailwind v4 theme mapping to host variables, layout and density conventions, copy-ready component recipes, the raw scoped CSS alternative, and a mount-safe style helper. Treat it as the authoritative design reference for Apps.
199
+
198
200
  Provide:
199
201
 
200
202
  - semantic structure and headings inside the supplied container. Canvas already owns the outer `<main aria-label={page title}>`, so do not add a nested `main` or duplicate page landmark label;
@@ -281,5 +283,6 @@ Summarize:
281
283
  - `references/testing-and-installation.md` - test strategy, manual Canvas workflow, and installation coordinates.
282
284
  - `references/packaging-recipes.md` - one-file Vite, CSS, assets, Workers, and WASM rules.
283
285
  - `references/backend-safety.md` - authenticated requests, command safety, persistence, and prerequisite onboarding.
286
+ - `references/native-design.md` - native Agent Canvas styling: token reuse, Tailwind mapping, layout, component recipes, scoped CSS, and style injection.
284
287
  - `references/acceptance-checklist.md` - automated checks and the local install/enable/reload lifecycle.
285
288
  - `scripts/validate-extension.mjs` - dependency-free static artifact validator for an App package directory.
@@ -0,0 +1,250 @@
1
+ # Native OpenHands App design
2
+
3
+ Build Apps for Agent Canvas that visually belong in the host while remaining a self-contained, safe extension package. Use this reference together with the main `SKILL.md` workflow before changing an App's UI.
4
+
5
+ ## Core rule: reuse tokens, not host internals
6
+
7
+ Treat an App bundle as an independent frontend. Do not import Agent Canvas React components, utility modules, CSS files, font files, Tailwind configuration, aliases, or private DOM classes. The host imports the App as a self-contained Blob ESM module, so those imports will fail or create fragile coupling.
8
+
9
+ Reuse the host's stable CSS custom properties instead. Scope every selector under a unique App root class and provide literal fallbacks so the page stays legible outside a current Canvas build. Tailwind utility names such as `bg-base` or `text-contrast` are **not globally available** to an App: they work only after the App's own Tailwind build maps them to the host variables.
10
+
11
+ Use semantic names (`surface`, `foreground`, `border`, `primary`) rather than copying cool-grey hex values.
12
+
13
+ ## Choose the implementation path
14
+
15
+ Choose the smallest path that matches the App package:
16
+
17
+ | App implementation | Recommended styling approach |
18
+ | --- | --- |
19
+ | Dependency-free JavaScript | Inject one scoped CSS string from the entrypoint. Use host custom properties directly. |
20
+ | React/TypeScript with Tailwind | Add an App-local Tailwind theme mapping to the host variables, then compile every class into the single `extension.js` artifact. |
21
+ | Existing CSS module or CSS-in-JS setup | Define the semantic colors and component recipes in the App's own scoped stylesheet. |
22
+
23
+ Never expect the host Tailwind compiler to scan or compile App source. Never use a CDN Tailwind runtime. Never attach App styles to `:root`, `html`, `body`, or global element selectors.
24
+
25
+ ## Tailwind setup for a bundled App
26
+
27
+ For Tailwind v4, place an App-local mapping in the App stylesheet. This lets the App use Canvas-like classes while preserving portability:
28
+
29
+ ```css
30
+ @import "tailwindcss";
31
+
32
+ @theme inline {
33
+ --color-base: var(--oh-color-base);
34
+ --color-base-secondary: var(--oh-color-base-secondary);
35
+ --color-surface: var(--oh-surface);
36
+ --color-surface-raised: var(--oh-surface-raised);
37
+ --color-foreground: var(--oh-foreground);
38
+ --color-contrast: var(--oh-contrast);
39
+ --color-muted: var(--oh-muted);
40
+ --color-tertiary-alt: var(--oh-text-dim);
41
+ --color-border: var(--oh-border);
42
+ --color-border-subtle: var(--oh-border-subtle);
43
+ --color-focus: var(--oh-focus);
44
+ --color-interactive-hover: var(--oh-interactive-hover);
45
+ --color-primary: var(--oh-color-primary);
46
+ --color-on-primary: var(--oh-accent-foreground);
47
+ --color-danger: var(--oh-danger);
48
+ }
49
+ ```
50
+
51
+ Compile this stylesheet into `extension.js`; do not leave a linked CSS asset. For an App without Tailwind, use the matching raw CSS below instead. Use utility recipes only after adding this mapping.
52
+
53
+ ## Layout and density
54
+
55
+ Let Canvas own the outer page and scrolling region. Do not add a second page shell, `h-screen`, global background, sidebar, or top navigation. Start with `min-h-full`, use `p-4 sm:p-6 lg:p-8`, and constrain dense content with `mx-auto w-full max-w-5xl`. Use `gap-4` for related controls, `gap-6` within sections, and `gap-8` between major sections. Use `rounded-lg` for controls and `rounded-xl` for cards and messages.
56
+
57
+ Avoid gradients, glass effects, oversize headings, floating shadows, dense borders, and hard-coded dark greys. The native visual language is restrained: dark layered surfaces, cool-grey borders, warm primary actions, direct typography, and short transitions.
58
+
59
+ ## Interaction and state checklist
60
+
61
+ - Apply `text-contrast` to headings and key labels; use `text-muted` or `text-tertiary-alt` for supporting copy.
62
+ - Use the primary recipe for one dominant action. Use a bordered secondary action for alternatives. Do not make every button primary.
63
+ - Use a 36px (`h-9`) control height and `rounded-lg` for input, select, and standard button controls.
64
+ - Use `focus-visible` rather than removing outlines. Preserve disabled affordance with `disabled:cursor-not-allowed disabled:opacity-60`.
65
+ - Animate only background, border, box-shadow, opacity, or transforms and include `motion-reduce:transition-none`.
66
+ - Scope icon sizing and color within the App. Do not assume HeroUI, Lucide, or host icon packages exist.
67
+ - Use `textContent`, framework escaping, or safe DOM creation for data from requests. Never inject response text with `innerHTML`.
68
+
69
+ ## Semantic token map
70
+
71
+ | Intent | Host variable | Fallback |
72
+ | --- | --- | --- |
73
+ | Deep page base | `--oh-color-base` | `#0B0E14` |
74
+ | Standard panel | `--oh-color-base-secondary` | `#21252F` |
75
+ | Raised surface | `--oh-surface-raised` | `#2C313F` |
76
+ | Main text | `--oh-contrast` | `#FFFFFF` |
77
+ | Standard text | `--oh-foreground` | `#EEF2F7` |
78
+ | Secondary text | `--oh-muted` | `#A3B0C4` |
79
+ | Muted placeholder text | `--oh-text-dim` | `#7E8A9E` |
80
+ | Standard border | `--oh-border` | `#4B5468` |
81
+ | Subtle divider | `--oh-border-subtle` | `#383F50` |
82
+ | Focus ring | `--oh-focus` | `#FFFFFF` |
83
+ | Primary surface | `--oh-color-primary` | `#C9B974` |
84
+ | Primary text | `--oh-accent-foreground` | `#0B0E14` |
85
+ | Danger | `--oh-danger` | `#E76A5E` |
86
+ | Success | `--oh-success` | `#A5E75E` |
87
+
88
+ ## Copy-ready Tailwind recipes
89
+
90
+ Use these recipes only after mapping the semantic colors in the App-local Tailwind configuration above.
91
+
92
+ ### Content shell
93
+
94
+ ```tsx
95
+ <div className="min-h-full p-4 sm:p-6 lg:p-8 text-foreground">
96
+ <div className="mx-auto flex w-full max-w-5xl flex-col gap-8">...</div>
97
+ </div>
98
+ ```
99
+
100
+ Do not use `h-screen`, `min-h-screen`, a host-like global background, or a nested `<main>`; Canvas supplies the page landmark and scroll context.
101
+
102
+ ### Page heading
103
+
104
+ ```tsx
105
+ <header className="flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between">
106
+ <div className="min-w-0">
107
+ <h1 className="text-xl font-semibold tracking-tight text-contrast">Page title</h1>
108
+ <p className="mt-1 text-sm text-muted">Short supporting description.</p>
109
+ </div>
110
+ </header>
111
+ ```
112
+
113
+ ### Card or section
114
+
115
+ ```tsx
116
+ <section className="rounded-xl border border-border bg-base-secondary p-4 sm:p-6">
117
+ <h2 className="text-base font-medium text-contrast">Section title</h2>
118
+ <p className="mt-1 text-sm text-muted">Explain the section briefly.</p>
119
+ <div className="mt-5 flex flex-col gap-4">...</div>
120
+ </section>
121
+ ```
122
+
123
+ Use `border-border-subtle` for dividers inside an existing card. Avoid default card shadows.
124
+
125
+ ### Controls and buttons
126
+
127
+ ```tsx
128
+ const control =
129
+ "h-9 min-h-9 rounded-lg transition-[background-color,border-color,box-shadow,opacity] duration-75 motion-reduce:transition-none";
130
+
131
+ const field = `${control} w-full min-w-0 border border-border bg-base-secondary px-3 text-sm text-contrast placeholder:text-tertiary-alt focus:border-contrast/40 focus:ring-1 focus:ring-contrast/20 focus:outline-none disabled:cursor-not-allowed disabled:opacity-60`;
132
+
133
+ const primaryButton = `${control} inline-flex w-fit items-center justify-center gap-2 bg-primary px-3 text-sm font-normal text-on-primary hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-30`;
134
+
135
+ const secondaryButton = `${control} inline-flex w-fit items-center justify-center gap-2 border border-border bg-base-secondary px-3 text-sm font-normal text-contrast hover:bg-surface-raised disabled:cursor-not-allowed disabled:opacity-30`;
136
+ ```
137
+
138
+ Use `label` plus `htmlFor`, keep field hints in `text-xs text-muted`, and express validation with `aria-invalid`, a `border-red-500`, and a linked `role="alert"` message using `text-xs text-red-400`.
139
+
140
+ ### Toolbar and responsive grid
141
+
142
+ ```tsx
143
+ <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
144
+ <div className="min-w-0">...</div>
145
+ <div className="flex flex-wrap items-center gap-2">...</div>
146
+ </div>
147
+
148
+ <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">...</div>
149
+ ```
150
+
151
+ ### Informational, error, and empty state
152
+
153
+ ```tsx
154
+ <div className="rounded-xl border border-border bg-base-secondary p-6 text-center">
155
+ <h2 className="text-base font-medium text-contrast">Nothing here yet</h2>
156
+ <p className="mt-2 text-sm text-muted">Describe the next useful action.</p>
157
+ <button className={`${primaryButton} mt-4`}>Create item</button>
158
+ </div>
159
+
160
+ <div role="alert" className="rounded-xl border border-red-500/40 bg-red-500/10 px-4 py-3 text-sm text-red-200">
161
+ The request could not be completed.
162
+ </div>
163
+ ```
164
+
165
+ Use `animate-pulse` with `motion-reduce:animate-none` only for short loading placeholders; reserve space with shapes matching loaded cards or rows.
166
+
167
+ ### Compact tabs
168
+
169
+ ```tsx
170
+ <div role="tablist" aria-label="View options" className="flex w-fit gap-1 rounded-lg border border-border bg-base-secondary p-1">
171
+ <button role="tab" aria-selected="true" className="rounded-md bg-interactive-hover px-3 py-1.5 text-sm text-contrast">Overview</button>
172
+ <button role="tab" aria-selected="false" className="rounded-md px-3 py-1.5 text-sm text-muted hover:bg-surface-raised hover:text-contrast">Activity</button>
173
+ </div>
174
+ ```
175
+
176
+ Implement keyboard tab behavior when tabs change content; use regular buttons for simple filters.
177
+
178
+ ## Raw scoped CSS alternative
179
+
180
+ Use this approach for dependency-free Apps. Apply it only after inserting an App root such as `.acme-dashboard`.
181
+
182
+ ```css
183
+ .acme-dashboard {
184
+ color: var(--oh-foreground, #EEF2F7);
185
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
186
+ }
187
+ .acme-dashboard .card {
188
+ border: 1px solid var(--oh-border, #4B5468);
189
+ border-radius: 12px;
190
+ background: var(--oh-color-base-secondary, #21252F);
191
+ padding: 1.5rem;
192
+ }
193
+ .acme-dashboard .field,
194
+ .acme-dashboard .button {
195
+ min-height: 2.25rem;
196
+ border-radius: 8px;
197
+ transition: background-color 75ms, border-color 75ms, box-shadow 75ms, opacity 75ms;
198
+ }
199
+ .acme-dashboard .field {
200
+ width: 100%; border: 1px solid var(--oh-border, #4B5468);
201
+ background: var(--oh-color-base-secondary, #21252F);
202
+ color: var(--oh-contrast, #FFF); padding: 0 0.75rem;
203
+ }
204
+ .acme-dashboard .field:focus-visible,
205
+ .acme-dashboard .button:focus-visible {
206
+ outline: none; border-color: color-mix(in srgb, var(--oh-contrast, #FFF) 40%, transparent);
207
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--oh-contrast, #FFF) 20%, transparent);
208
+ }
209
+ .acme-dashboard .button--primary {
210
+ border: 0; background: var(--oh-color-primary, #C9B974);
211
+ color: var(--oh-accent-foreground, #0B0E14); padding: 0 0.75rem;
212
+ }
213
+ @media (prefers-reduced-motion: reduce) {
214
+ .acme-dashboard .field, .acme-dashboard .button { transition: none; }
215
+ }
216
+ ```
217
+
218
+ ## Mount-safe injected style helper
219
+
220
+ Use one marker per mounted App root and remove the node during cleanup.
221
+
222
+ ```js
223
+ function installStyles(css, marker) {
224
+ const style = document.createElement("style");
225
+ style.dataset.canvasAppStyle = marker;
226
+ style.textContent = css;
227
+ document.head.append(style);
228
+ return () => style.remove();
229
+ }
230
+
231
+ // During mount:
232
+ const disposeStyles = installStyles(STYLES, "acme-dashboard");
233
+ const root = document.createElement("div");
234
+ root.className = "acme-dashboard";
235
+ container.append(root);
236
+ return () => {
237
+ disposeStyles();
238
+ root.remove();
239
+ };
240
+ ```
241
+
242
+ If more than one page can mount concurrently, ref-count the marker or inject its stylesheet once in `activate` and remove it in the activation disposer.
243
+
244
+ ## Verify before delivery
245
+
246
+ - Confirm extension markup uses a unique root class and no App CSS leaks outside it.
247
+ - Confirm styles survive a real Canvas mount, route remount, disable/re-enable cycle, and host dark surface backgrounds.
248
+ - Confirm `extension.js` has no unresolved CSS import, bare package import, extra CSS chunk, or Node global.
249
+ - Run the Canvas extension static validator plus the App's lint, tests, and build.
250
+ - Report whether the App uses direct host variables or an App-local Tailwind mapping, and list the tested states.
@@ -103,9 +103,9 @@ export const SKILLS_CATALOG = [
103
103
  },
104
104
  {
105
105
  "name": "canvas-extension-api",
106
- "description": "This skill should be used when the user asks to \"create an OpenHands App\", \"scaffold a Canvas App\", \"build an app with the Canvas Extensions API\", \"build an Agent Canvas App\", \"bundle a single-file Canvas App\", \"build a Sidecar-backed Canvas App\", \"add onboarding for an App service\", \"add a custom interface to Agent Canvas\", \"validate an OpenHands App\", or mentions Canvas Apps, Agent Canvas extensions, Blob-importable app bundles, registerPage, app pages, Sidecars, or canvas extension packages.",
106
+ "description": "This skill should be used when the user asks to \"create an OpenHands App\", \"scaffold a Canvas App\", \"build an app with the Canvas Extensions API\", \"build an Agent Canvas App\", \"bundle a single-file Canvas App\", \"build a Sidecar-backed Canvas App\", \"add onboarding for an App service\", \"add a custom interface to Agent Canvas\", \"validate an OpenHands App\", \"make a Canvas App look native\", \"match Agent Canvas styles\", \"style a canvas extension\", \"reuse OpenHands design tokens\", \"add native Tailwind classes to an app\", or mentions Canvas Apps, Agent Canvas extensions, Blob-importable app bundles, registerPage, app pages, Sidecars, or canvas extension packages.",
107
107
  "triggers": [],
108
- "content": "# Canvas Extensions API\n\nBuild and validate OpenHands Apps with the Canvas Extensions API, targeting the currently implemented manifest schema 1 and host API 1 routed-page ABI.\n\nUse the naming layers consistently:\n\n- **OpenHands Apps** - customer-facing category for interfaces people discover, install, enable, and open.\n- **Apps for Agent Canvas** - product phrasing that clarifies where apps run.\n- **Canvas Extensions API** - developer platform used to build apps.\n- **Canvas extension package** - technical artifact containing `canvas-extension.json` and its entrypoint.\n- **OpenHands Extensions** - ecosystem and repository umbrella for apps, skills, plugins, automations, and integrations.\n\nUse current product labels in user-facing instructions: **Apps for Agent Canvas**, **Add app**, **Installed apps**, **App source**, **Enable trusted app**, and **Build an app**. Keep technical identifiers such as `canvas-extension.json`, `/api/canvas-extensions/*`, `host.extension`, and `/extensions/*` unchanged unless the target implementation changes them.\n\nTreat apps as trusted, same-realm browser code owned by the active Agent Server. Keep the categories distinct: apps extend what people can do in Agent Canvas, plugins extend agent runtime capabilities, and skills provide agent instructions and knowledge.\n\n\n## Prefer the proven App authoring loop\n\nTreat an App as one authenticated browser dependency graph that Canvas imports from a Blob URL. Do not build a hosted SPA: the production result must be exactly one self-contained browser ESM entrypoint that exports `activate(host)`. Always ship this UI package even when it uses an optional package-owned managed backend or a manual/deployment-owned Sidecar. Make the App page the guided UI for service setup after the App is opened. Never treat a service as another browser chunk or an automatic extension install hook.\n\nFor a new App, create an independent package in the target repository and implement its own UI, tests, and build tooling. Follow the Vite library-build reference in `references/packaging-recipes.md`; do not copy a shared starter or introduce a repository-wide runtime/workspace unless the target repository explicitly requires it.\n\nKeep all source, scripts, dependencies, tests, and checked-in `extension.js` inside the App package. Implement one declared page with explicit root, nested, and unknown-route behavior. Inject scoped CSS per mount and clean it up with framework roots, requests, listeners, timers, Workers, and object URLs. Build validation must verify `dist/extension.js` before synchronizing it to the App root. Do not synchronize an unverified artifact. Use `CHROME_PATH` when the Chrome executable is elsewhere.\n\nFor an existing App, run the reusable static gate before and after its own checks:\n\n```sh\nnode /path/to/canvas-extension-api/scripts/validate-extension.mjs /path/to/app\nnode /path/to/canvas-extension-api/scripts/validate-extension.mjs /path/to/app --dist --marker <required-feature-marker>\n```\n\nTreat the static validator as a gate, not a replacement for the browser Blob smoke test. Read `references/packaging-recipes.md` before adding CSS, raw assets, dynamic modules, Workers, or WASM. Read `references/backend-safety.md` before any Agent Server integration or persistence. Read `references/sidecar-pattern.md` before designing a separately installed service or its onboarding. Read `references/acceptance-checklist.md` before reporting local Canvas compatibility.\n\n## Establish the target\n\nStart by locating the target directory instead of assuming the current workspace. Inspect repository instructions, existing package management, build tooling, tests, and git status before editing.\n\nMake an early architecture decision: browser-only App, Agent Server-integrated App, package-owned managed-backend App, manual/deployment-owned Sidecar App, or explicitly deployment-specific App. Keep the portable host API 1 surface separate from optional Agent Server/host capabilities and deployment-owned behavior.\n\nUse the package-owned managed-backend path only when the target stack includes the lifecycle contract from [software-agent-sdk PR #5270](https://github.com/OpenHands/software-agent-sdk/pull/5270) at `ac7b322ddf7d2e0e90a3643c5e26d848236af9a3`, the bridge contract from [PR #5272](https://github.com/OpenHands/software-agent-sdk/pull/5272) at `6d9c82973e765cce4843d6a2fb52f634efa64293`, and the host version named in `references/v1-contract.md`. Until a release containing both SDK PRs lands, those exact revisions are the minimum Agent Server implementation. Feature-detect `canvas_app_backend_bridge_v1` and `app_backend_ingress_url` through `GET /server_info`; absence is an actionable unsupported state. Do not convert manual Sidecars into managed backends unless the App owns checksum-pinned artifacts for every supported platform.\n\nClarify only choices that materially affect implementation:\n\n- app purpose and page behavior;\n- target repository and subdirectory;\n- dependency-free JavaScript versus a bundled TypeScript/framework project;\n- Agent Server endpoints or host metadata required;\n- whether to build only, install locally, or prepare publication instructions;\n- for a Sidecar: execution location, owner, connection route, secrets and data, lifecycle actions, and portability across Agent Canvas deployments.\n\nDefault to one app with one routed page when requirements are otherwise clear. Keep the first implementation small and dependency-free unless the requested UI clearly benefits from a framework or the repository already has a bundler.\n\nWhen creating multiple Apps in one repository, give every App an independent package root containing its own `canvas-extension.json`, entrypoint, version, tests, README, and build tooling. Do not introduce a monorepo, shared runtime, or common build foundation unless the target repository explicitly requires one. Keep app manifest names globally distinct within the Agent Server installation.\n\nTreat installation as one app per request. The current Customize -> Apps flow accepts one `source`, optional `ref`, and optional `repo_path`; it does not recursively discover or bulk-install every manifest in a repository. For a remote repository, add each app separately using the same source/ref and its own `repo_path`. For a backend-local source, select each app package directory as the source path.\n\nRead `references/v1-contract.md` before implementing unfamiliar Canvas Extensions API behavior. Read `references/connections.md` before connecting to Agent Server, the Automation service, or WebSocket endpoints. Read `references/sidecar-pattern.md` before proposing a Sidecar bridge, onboarding, or operator action. Read `references/testing-and-installation.md` before installing or testing inside Agent Canvas, especially for a multi-app repository.\n\n## Inspect current upstream behavior\n\nTreat the v1 contract as young and subject to change. Before substantial work, compare the installed or target OpenHands version with the current upstream sources when access is available:\n\n- `specs/canvas-extensions.md`\n- `src/types/canvas-extension.ts`\n- `src/components/features/canvas-extensions/canvas-extensions-runtime.tsx`\n- `src/routes/canvas-extension-page.tsx`\n- `docs/CANVAS_EXTENSIONS_TESTING.md`\n\nDo not invent planned surfaces such as conversation tabs, slots, themes, or visualizer replacement. Implement only contributions supported by the target version. Routed pages are the only implemented contribution in host API 1.\n\n## Create the app package\n\nPlace `canvas-extension.json` at the app package root. Point `entrypoint` to one self-contained browser ESM file inside that root.\n\nUse this minimal manifest shape:\n\n```json\n{\n \"schema_version\": 1,\n \"name\": \"example-dashboard\",\n \"display_name\": \"Example dashboard\",\n \"version\": \"0.1.0\",\n \"description\": \"A backend-specific project dashboard.\",\n \"entrypoint\": \"extension.js\",\n \"contributes\": {\n \"pages\": [\n {\n \"id\": \"dashboard\",\n \"title\": \"Dashboard\",\n \"path\": \"/dashboard\",\n \"nav_label\": \"Dashboard\"\n }\n ]\n }\n}\n```\n\nFor an optional package-owned managed backend, add this top-level sibling of `contributes`:\n\n```json\n\"backend\": {\n \"schema_version\": 1,\n \"artifacts\": {\n \"linux-amd64\": {\n \"path\": \"backend/linux-amd64.tar.gz\",\n \"sha256\": \"<64 lowercase hex characters>\"\n },\n \"linux-arm64\": {\n \"path\": \"backend/linux-arm64.tar.gz\",\n \"sha256\": \"<64 lowercase hex characters>\"\n }\n },\n \"argv\": [\n \"{artifact_dir}/bin/server\",\n \"--host=127.0.0.1\",\n \"--port={port}\",\n \"--data-dir={data_dir}\"\n ],\n \"health\": { \"path\": \"/health\" }\n}\n```\n\nThis declaration is optional. Omit it for browser-only Apps and manual/deployment-owned Sidecars. It never authorizes automatic preparation or startup. The server supports Linux amd64 and arm64 initially, verifies package-contained `.tar.gz` artifacts by SHA-256, and executes the structured argv without a shell. `argv[0]` must remain inside `{artifact_dir}`; allowed placeholders are `{artifact_dir}`, `{data_dir}`, and `{port}`.\n\nFollow these invariants:\n\n- Use lowercase letters, digits, and hyphens for app names and page IDs.\n- Use absolute kebab-case page paths with a leading slash.\n- Keep every manifest path within the app package root.\n- Give each page ID and path a unique value.\n- Register only page IDs declared in the manifest.\n- Keep the entrypoint free of unresolved bare imports and external chunks.\n- Bundle dependencies, CSS, and small assets into the entrypoint when using build tooling.\n\nAdd a concise `README.md` when the app is intended for reuse or publication. Document purpose, build command if any, output entrypoint, installation coordinate, and verification steps. Avoid adding explanatory change-log documents.\n\n## Implement activation and pages\n\nExport an `activate` function from the ESM entrypoint:\n\n```js\nexport function activate(host) {\n if (host.apiVersion !== \"1\") {\n throw new Error(`This app requires host API 1.`);\n }\n\n return host.registerPage(\"dashboard\", ({ container, path, navigate }) => {\n const root = document.createElement(\"section\");\n root.textContent = path ? `Nested route: ${path}` : \"Dashboard\";\n container.append(root);\n\n return () => root.remove();\n });\n}\n```\n\nUse the host contract deliberately:\n\n- Read immutable metadata from `host.extension` and `host.backend`.\n- Call `host.registerPage(id, mount)` during activation.\n- Use the mount callback's `path` as the route remainder below the declared page path.\n- Treat every nested-route navigation as a fresh mount: Canvas disposes the previous mount, clears the container, and invokes the mount callback with the new remainder. DOM and framework state do not persist across route changes; keep intentional cross-route state in the URL, backend, or activation-scoped state and clean it up on deactivation.\n- Use `navigate(absoluteCanvasPath)` for Canvas-aware routing.\n- Use `host.agentServer.request({ path, method, body, headers })` for authenticated calls to the owning Agent Server.\n- Pass only root-relative request paths beginning with one `/`; never pass absolute URLs or `//` paths.\n\nPrefer [`@openhands/typescript-client`](https://github.com/OpenHands/software-agent-sdk/tree/main/clients/typescript) for bundled TypeScript integrations whenever it covers the required Agent Server API and the necessary connection inputs are available. Prefer its typed clients, models, compatibility checks, and WebSocket lifecycle over hand-written transport code. Bundle the client into the self-contained app entrypoint; never leave a bare package import or external runtime chunk.\n\nRespect the host API 1 connection boundary:\n\n- Treat `host.agentServer.request` as the portable Agent Server HTTP path; Canvas selects the active backend and supplies authentication.\n- For a managed-backend view, require the feature-detected host helper documented in `references/v1-contract.md`. The helper owns session creation, validated iframe isolation, retry/new-tab behavior, and revocation; the App never reads the app-scoped cookie or constructs the ingress URL. The ingress must be a separate browser origin from Canvas, and the host must preserve the server-returned sandbox including `allow-same-origin`.\n- Installing, enabling, activating, or mounting an App never prepares or starts a managed backend. Show the resolved revision and declaration, obtain explicit lifecycle consent, and call prepare then start with that exact revision. An update invalidates approval.\n- Do not derive an Agent Server URL from `window.location` or extract session keys from Canvas internals.\n- Do not send Automation service requests through `host.agentServer.request` unless the backend explicitly documents an Agent Server proxy for them. Automation is a separate service with deployment-provided base URL and authentication.\n- Do not open a direct Agent Server WebSocket from a portable v1 app. The host currently exposes neither the owning server origin nor a WebSocket/auth capability. Poll through `host.agentServer.request`, add a backend-owned bridge, or feature-detect a future host subscription API.\n- Use the TypeScript client's Agent Server WebSocket support in trusted standalone or future host-enabled contexts, and stop it during disposal. Do not treat the Agent Server client as an Automation service client.\n\nReturn cleanup from every layer that creates effects:\n\n- Return the unregister function or an activation disposer from `activate`.\n- Return a mount disposer for DOM nodes, timers, listeners, observers, subscriptions, and outstanding state.\n- Make async work disposal-aware so late responses cannot mutate an unmounted page.\n- Remove injected styles when the page unmounts.\n\nAssume activation, mounting, and disposal may happen repeatedly during hot enable/disable, updates, backend switches, reconnects, and route changes.\n\n## Build a production-quality page\n\nRender within the supplied `container`; do not replace unrelated Canvas DOM. Scope CSS under an app-specific root class. Prefer Canvas CSS variables with sensible fallbacks rather than copying host implementation classes.\n\nProvide:\n\n- semantic structure and headings inside the supplied container. Canvas already owns the outer `<main aria-label={page title}>`, so do not add a nested `main` or duplicate page landmark label;\n- keyboard-operable controls and visible focus;\n- responsive behavior for narrow layouts;\n- loading, empty, stale, and error states;\n- reduced-motion handling for animation;\n- text-safe rendering through DOM APIs or escaping rather than untrusted `innerHTML`;\n- clear handling for malformed or partial Agent Server responses.\n\nAvoid global event handlers, prototype changes, global CSS selectors, and ambient state unless unavoidable. Same-realm execution means these effects have full Canvas authority and cleanup is only best-effort.\n\n## Add tests\n\nTest real app code with a DOM environment and a small Canvas Extensions API host test double. Test at minimum:\n\n1. `activate` registers every declared page exactly once.\n2. The mount renders its initial state.\n3. Agent Server requests use the expected root-relative path and method.\n4. Nested navigation disposes the prior mount and remounts with the correct route remainder; test any intentionally preserved state explicitly.\n5. The mount disposer removes DOM and stops effects.\n6. The activation disposer unregisters contributions.\n7. Unsupported host API versions fail clearly when compatibility is checked.\n8. Network and malformed-response errors render safely.\n\nUse the repository's existing test infrastructure. Do not introduce a new framework when adequate tests already exist. For dependency-free fixtures, Vitest with a DOM environment matches the upstream example, but it is not part of the Canvas Extensions API runtime contract.\n\n## Validate the package\n\nRun the bundled validator before reporting completion:\n\n```sh\nnode /path/to/canvas-extension-api/scripts/validate-extension.mjs /path/to/app-package\n```\n\nThen run the target repository's formatter, linter, tests, and build. Inspect the final entrypoint rather than assuming the bundler configuration worked:\n\n- confirm the file exists at the manifest path;\n- confirm it exports `activate`;\n- reject bare imports and dynamic external chunks;\n- confirm CSS and required small assets are bundled or embedded;\n- confirm the output runs as browser ESM without Node globals.\n\nTreat validator warnings as prompts for inspection, not proof of invalidity. The helper uses conservative static checks and cannot replace loading the app bundle in Canvas.\n\n## Install and verify safely\n\nInstall only when requested. Installation and enablement are separate product actions: installation must leave the app disabled, and enabling executes trusted same-realm code. Managed-backend preparation and startup are additional explicit actions tied to the resolved revision; installation, enablement, activation, and ordinary page mounts never execute backend code.\n\nFor a backend-local app, install the path as interpreted on the Agent Server machine. For a Git-hosted app, provide `source`, optional `ref`, and optional `repo_path`. Never assume a frontend-local path exists inside a remote or containerized backend.\n\nFor multiple apps in one repository, produce an install matrix listing app name, manifest directory, source, ref, and `repo_path`. Submit one Add app operation per row. For remote repositories, omit `repo_path` only when the selected app lives at the repository root. For backend-local sources, make `source` the selected app package directory. Do not claim that selecting a repository root installs nested apps.\n\nValidate and test every app package independently, then run shared repository checks once. Report partial failures by app name rather than treating one passing app package as validation of the entire repository.\n\nVerify the lifecycle in Canvas:\n\n1. Install and confirm the inventory entry is disabled.\n2. Review source, revision, manifest metadata, and contributions.\n3. Enable and accept the trusted-code disclosure: “This app runs trusted JavaScript inside Agent Canvas and can make authenticated requests to the active Agent Server. Review its source and revision before enabling it.”\n4. Open the navigation item and exercise root and nested routes.\n5. Disable and confirm navigation and mounted UI disappear.\n6. Re-enable without restarting Canvas.\n7. Switch backend or reconnect when relevant and confirm isolation.\n8. Uninstall only when requested.\n\nDo not enable, uninstall, publish, push, or open a pull request without the user's authorization.\n\n## Report completion\n\nSummarize:\n\n- app location and contributed pages;\n- manifest schema and host API targeted;\n- build output and validation results;\n- tests run and their results;\n- installation status, explicitly stating whether it remains disabled;\n- remaining limitations tied to the current v1 ABI.\n\n## Resources\n\n- `references/v1-contract.md` - exact manifest, host API, lifecycle, routing, trust, and current limitations.\n- `references/connections.md` - Agent Server HTTP, Automation service, WebSocket, and TypeScript client connection guidance.\n- `references/testing-and-installation.md` - test strategy, manual Canvas workflow, and installation coordinates.\n- `references/packaging-recipes.md` - one-file Vite, CSS, assets, Workers, and WASM rules.\n- `references/backend-safety.md` - authenticated requests, command safety, persistence, and prerequisite onboarding.\n- `references/acceptance-checklist.md` - automated checks and the local install/enable/reload lifecycle.\n- `scripts/validate-extension.mjs` - dependency-free static artifact validator for an App package directory.",
108
+ "content": "# Canvas Extensions API\n\nBuild and validate OpenHands Apps with the Canvas Extensions API, targeting the currently implemented manifest schema 1 and host API 1 routed-page ABI.\n\nUse the naming layers consistently:\n\n- **OpenHands Apps** - customer-facing category for interfaces people discover, install, enable, and open.\n- **Apps for Agent Canvas** - product phrasing that clarifies where apps run.\n- **Canvas Extensions API** - developer platform used to build apps.\n- **Canvas extension package** - technical artifact containing `canvas-extension.json` and its entrypoint.\n- **OpenHands Extensions** - ecosystem and repository umbrella for apps, skills, plugins, automations, and integrations.\n\nUse current product labels in user-facing instructions: **Apps for Agent Canvas**, **Add app**, **Installed apps**, **App source**, **Enable trusted app**, and **Build an app**. Keep technical identifiers such as `canvas-extension.json`, `/api/canvas-extensions/*`, `host.extension`, and `/extensions/*` unchanged unless the target implementation changes them.\n\nTreat apps as trusted, same-realm browser code owned by the active Agent Server. Keep the categories distinct: apps extend what people can do in Agent Canvas, plugins extend agent runtime capabilities, and skills provide agent instructions and knowledge.\n\n\n## Prefer the proven App authoring loop\n\nTreat an App as one authenticated browser dependency graph that Canvas imports from a Blob URL. Do not build a hosted SPA: the production result must be exactly one self-contained browser ESM entrypoint that exports `activate(host)`. Always ship this UI package even when it uses an optional package-owned managed backend or a manual/deployment-owned Sidecar. Make the App page the guided UI for service setup after the App is opened. Never treat a service as another browser chunk or an automatic extension install hook.\n\nFor a new App, create an independent package in the target repository and implement its own UI, tests, and build tooling. Follow the Vite library-build reference in `references/packaging-recipes.md`; do not copy a shared starter or introduce a repository-wide runtime/workspace unless the target repository explicitly requires it.\n\nKeep all source, scripts, dependencies, tests, and checked-in `extension.js` inside the App package. Implement one declared page with explicit root, nested, and unknown-route behavior. Inject scoped CSS per mount and clean it up with framework roots, requests, listeners, timers, Workers, and object URLs. Build validation must verify `dist/extension.js` before synchronizing it to the App root. Do not synchronize an unverified artifact. Use `CHROME_PATH` when the Chrome executable is elsewhere.\n\nFor an existing App, run the reusable static gate before and after its own checks:\n\n```sh\nnode /path/to/canvas-extension-api/scripts/validate-extension.mjs /path/to/app\nnode /path/to/canvas-extension-api/scripts/validate-extension.mjs /path/to/app --dist --marker <required-feature-marker>\n```\n\nTreat the static validator as a gate, not a replacement for the browser Blob smoke test. Read `references/packaging-recipes.md` before adding CSS, raw assets, dynamic modules, Workers, or WASM. Read `references/backend-safety.md` before any Agent Server integration or persistence. Read `references/sidecar-pattern.md` before designing a separately installed service or its onboarding. Read `references/acceptance-checklist.md` before reporting local Canvas compatibility.\n\n## Establish the target\n\nStart by locating the target directory instead of assuming the current workspace. Inspect repository instructions, existing package management, build tooling, tests, and git status before editing.\n\nMake an early architecture decision: browser-only App, Agent Server-integrated App, package-owned managed-backend App, manual/deployment-owned Sidecar App, or explicitly deployment-specific App. Keep the portable host API 1 surface separate from optional Agent Server/host capabilities and deployment-owned behavior.\n\nUse the package-owned managed-backend path only when the target stack includes the lifecycle contract from [software-agent-sdk PR #5270](https://github.com/OpenHands/software-agent-sdk/pull/5270) at `ac7b322ddf7d2e0e90a3643c5e26d848236af9a3`, the bridge contract from [PR #5272](https://github.com/OpenHands/software-agent-sdk/pull/5272) at `6d9c82973e765cce4843d6a2fb52f634efa64293`, and the host version named in `references/v1-contract.md`. Until a release containing both SDK PRs lands, those exact revisions are the minimum Agent Server implementation. Feature-detect `canvas_app_backend_bridge_v1` and `app_backend_ingress_url` through `GET /server_info`; absence is an actionable unsupported state. Do not convert manual Sidecars into managed backends unless the App owns checksum-pinned artifacts for every supported platform.\n\nClarify only choices that materially affect implementation:\n\n- app purpose and page behavior;\n- target repository and subdirectory;\n- dependency-free JavaScript versus a bundled TypeScript/framework project;\n- Agent Server endpoints or host metadata required;\n- whether to build only, install locally, or prepare publication instructions;\n- for a Sidecar: execution location, owner, connection route, secrets and data, lifecycle actions, and portability across Agent Canvas deployments.\n\nDefault to one app with one routed page when requirements are otherwise clear. Keep the first implementation small and dependency-free unless the requested UI clearly benefits from a framework or the repository already has a bundler.\n\nWhen creating multiple Apps in one repository, give every App an independent package root containing its own `canvas-extension.json`, entrypoint, version, tests, README, and build tooling. Do not introduce a monorepo, shared runtime, or common build foundation unless the target repository explicitly requires one. Keep app manifest names globally distinct within the Agent Server installation.\n\nTreat installation as one app per request. The current Customize -> Apps flow accepts one `source`, optional `ref`, and optional `repo_path`; it does not recursively discover or bulk-install every manifest in a repository. For a remote repository, add each app separately using the same source/ref and its own `repo_path`. For a backend-local source, select each app package directory as the source path.\n\nRead `references/v1-contract.md` before implementing unfamiliar Canvas Extensions API behavior. Read `references/connections.md` before connecting to Agent Server, the Automation service, or WebSocket endpoints. Read `references/sidecar-pattern.md` before proposing a Sidecar bridge, onboarding, or operator action. Read `references/testing-and-installation.md` before installing or testing inside Agent Canvas, especially for a multi-app repository.\n\n## Inspect current upstream behavior\n\nTreat the v1 contract as young and subject to change. Before substantial work, compare the installed or target OpenHands version with the current upstream sources when access is available:\n\n- `specs/canvas-extensions.md`\n- `src/types/canvas-extension.ts`\n- `src/components/features/canvas-extensions/canvas-extensions-runtime.tsx`\n- `src/routes/canvas-extension-page.tsx`\n- `docs/CANVAS_EXTENSIONS_TESTING.md`\n\nDo not invent planned surfaces such as conversation tabs, slots, themes, or visualizer replacement. Implement only contributions supported by the target version. Routed pages are the only implemented contribution in host API 1.\n\n## Create the app package\n\nPlace `canvas-extension.json` at the app package root. Point `entrypoint` to one self-contained browser ESM file inside that root.\n\nUse this minimal manifest shape:\n\n```json\n{\n \"schema_version\": 1,\n \"name\": \"example-dashboard\",\n \"display_name\": \"Example dashboard\",\n \"version\": \"0.1.0\",\n \"description\": \"A backend-specific project dashboard.\",\n \"entrypoint\": \"extension.js\",\n \"contributes\": {\n \"pages\": [\n {\n \"id\": \"dashboard\",\n \"title\": \"Dashboard\",\n \"path\": \"/dashboard\",\n \"nav_label\": \"Dashboard\"\n }\n ]\n }\n}\n```\n\nFor an optional package-owned managed backend, add this top-level sibling of `contributes`:\n\n```json\n\"backend\": {\n \"schema_version\": 1,\n \"artifacts\": {\n \"linux-amd64\": {\n \"path\": \"backend/linux-amd64.tar.gz\",\n \"sha256\": \"<64 lowercase hex characters>\"\n },\n \"linux-arm64\": {\n \"path\": \"backend/linux-arm64.tar.gz\",\n \"sha256\": \"<64 lowercase hex characters>\"\n }\n },\n \"argv\": [\n \"{artifact_dir}/bin/server\",\n \"--host=127.0.0.1\",\n \"--port={port}\",\n \"--data-dir={data_dir}\"\n ],\n \"health\": { \"path\": \"/health\" }\n}\n```\n\nThis declaration is optional. Omit it for browser-only Apps and manual/deployment-owned Sidecars. It never authorizes automatic preparation or startup. The server supports Linux amd64 and arm64 initially, verifies package-contained `.tar.gz` artifacts by SHA-256, and executes the structured argv without a shell. `argv[0]` must remain inside `{artifact_dir}`; allowed placeholders are `{artifact_dir}`, `{data_dir}`, and `{port}`.\n\nFollow these invariants:\n\n- Use lowercase letters, digits, and hyphens for app names and page IDs.\n- Use absolute kebab-case page paths with a leading slash.\n- Keep every manifest path within the app package root.\n- Give each page ID and path a unique value.\n- Register only page IDs declared in the manifest.\n- Keep the entrypoint free of unresolved bare imports and external chunks.\n- Bundle dependencies, CSS, and small assets into the entrypoint when using build tooling.\n\nAdd a concise `README.md` when the app is intended for reuse or publication. Document purpose, build command if any, output entrypoint, installation coordinate, and verification steps. Avoid adding explanatory change-log documents.\n\n## Implement activation and pages\n\nExport an `activate` function from the ESM entrypoint:\n\n```js\nexport function activate(host) {\n if (host.apiVersion !== \"1\") {\n throw new Error(`This app requires host API 1.`);\n }\n\n return host.registerPage(\"dashboard\", ({ container, path, navigate }) => {\n const root = document.createElement(\"section\");\n root.textContent = path ? `Nested route: ${path}` : \"Dashboard\";\n container.append(root);\n\n return () => root.remove();\n });\n}\n```\n\nUse the host contract deliberately:\n\n- Read immutable metadata from `host.extension` and `host.backend`.\n- Call `host.registerPage(id, mount)` during activation.\n- Use the mount callback's `path` as the route remainder below the declared page path.\n- Treat every nested-route navigation as a fresh mount: Canvas disposes the previous mount, clears the container, and invokes the mount callback with the new remainder. DOM and framework state do not persist across route changes; keep intentional cross-route state in the URL, backend, or activation-scoped state and clean it up on deactivation.\n- Use `navigate(absoluteCanvasPath)` for Canvas-aware routing.\n- Use `host.agentServer.request({ path, method, body, headers })` for authenticated calls to the owning Agent Server.\n- Pass only root-relative request paths beginning with one `/`; never pass absolute URLs or `//` paths.\n\nPrefer [`@openhands/typescript-client`](https://github.com/OpenHands/software-agent-sdk/tree/main/clients/typescript) for bundled TypeScript integrations whenever it covers the required Agent Server API and the necessary connection inputs are available. Prefer its typed clients, models, compatibility checks, and WebSocket lifecycle over hand-written transport code. Bundle the client into the self-contained app entrypoint; never leave a bare package import or external runtime chunk.\n\nRespect the host API 1 connection boundary:\n\n- Treat `host.agentServer.request` as the portable Agent Server HTTP path; Canvas selects the active backend and supplies authentication.\n- For a managed-backend view, require the feature-detected host helper documented in `references/v1-contract.md`. The helper owns session creation, validated iframe isolation, retry/new-tab behavior, and revocation; the App never reads the app-scoped cookie or constructs the ingress URL. The ingress must be a separate browser origin from Canvas, and the host must preserve the server-returned sandbox including `allow-same-origin`.\n- Installing, enabling, activating, or mounting an App never prepares or starts a managed backend. Show the resolved revision and declaration, obtain explicit lifecycle consent, and call prepare then start with that exact revision. An update invalidates approval.\n- Do not derive an Agent Server URL from `window.location` or extract session keys from Canvas internals.\n- Do not send Automation service requests through `host.agentServer.request` unless the backend explicitly documents an Agent Server proxy for them. Automation is a separate service with deployment-provided base URL and authentication.\n- Do not open a direct Agent Server WebSocket from a portable v1 app. The host currently exposes neither the owning server origin nor a WebSocket/auth capability. Poll through `host.agentServer.request`, add a backend-owned bridge, or feature-detect a future host subscription API.\n- Use the TypeScript client's Agent Server WebSocket support in trusted standalone or future host-enabled contexts, and stop it during disposal. Do not treat the Agent Server client as an Automation service client.\n\nReturn cleanup from every layer that creates effects:\n\n- Return the unregister function or an activation disposer from `activate`.\n- Return a mount disposer for DOM nodes, timers, listeners, observers, subscriptions, and outstanding state.\n- Make async work disposal-aware so late responses cannot mutate an unmounted page.\n- Remove injected styles when the page unmounts.\n\nAssume activation, mounting, and disposal may happen repeatedly during hot enable/disable, updates, backend switches, reconnects, and route changes.\n\n## Build a production-quality page\n\nRender within the supplied `container`; do not replace unrelated Canvas DOM. Scope CSS under an app-specific root class. Prefer Canvas CSS variables with sensible fallbacks rather than copying host implementation classes.\n\nRead `references/native-design.md` before styling an App page. It covers the core rule (reuse tokens, not host internals), the three implementation paths (dependency-free, Tailwind-bundled, existing CSS), the Tailwind v4 theme mapping to host variables, layout and density conventions, copy-ready component recipes, the raw scoped CSS alternative, and a mount-safe style helper. Treat it as the authoritative design reference for Apps.\n\nProvide:\n\n- semantic structure and headings inside the supplied container. Canvas already owns the outer `<main aria-label={page title}>`, so do not add a nested `main` or duplicate page landmark label;\n- keyboard-operable controls and visible focus;\n- responsive behavior for narrow layouts;\n- loading, empty, stale, and error states;\n- reduced-motion handling for animation;\n- text-safe rendering through DOM APIs or escaping rather than untrusted `innerHTML`;\n- clear handling for malformed or partial Agent Server responses.\n\nAvoid global event handlers, prototype changes, global CSS selectors, and ambient state unless unavoidable. Same-realm execution means these effects have full Canvas authority and cleanup is only best-effort.\n\n## Add tests\n\nTest real app code with a DOM environment and a small Canvas Extensions API host test double. Test at minimum:\n\n1. `activate` registers every declared page exactly once.\n2. The mount renders its initial state.\n3. Agent Server requests use the expected root-relative path and method.\n4. Nested navigation disposes the prior mount and remounts with the correct route remainder; test any intentionally preserved state explicitly.\n5. The mount disposer removes DOM and stops effects.\n6. The activation disposer unregisters contributions.\n7. Unsupported host API versions fail clearly when compatibility is checked.\n8. Network and malformed-response errors render safely.\n\nUse the repository's existing test infrastructure. Do not introduce a new framework when adequate tests already exist. For dependency-free fixtures, Vitest with a DOM environment matches the upstream example, but it is not part of the Canvas Extensions API runtime contract.\n\n## Validate the package\n\nRun the bundled validator before reporting completion:\n\n```sh\nnode /path/to/canvas-extension-api/scripts/validate-extension.mjs /path/to/app-package\n```\n\nThen run the target repository's formatter, linter, tests, and build. Inspect the final entrypoint rather than assuming the bundler configuration worked:\n\n- confirm the file exists at the manifest path;\n- confirm it exports `activate`;\n- reject bare imports and dynamic external chunks;\n- confirm CSS and required small assets are bundled or embedded;\n- confirm the output runs as browser ESM without Node globals.\n\nTreat validator warnings as prompts for inspection, not proof of invalidity. The helper uses conservative static checks and cannot replace loading the app bundle in Canvas.\n\n## Install and verify safely\n\nInstall only when requested. Installation and enablement are separate product actions: installation must leave the app disabled, and enabling executes trusted same-realm code. Managed-backend preparation and startup are additional explicit actions tied to the resolved revision; installation, enablement, activation, and ordinary page mounts never execute backend code.\n\nFor a backend-local app, install the path as interpreted on the Agent Server machine. For a Git-hosted app, provide `source`, optional `ref`, and optional `repo_path`. Never assume a frontend-local path exists inside a remote or containerized backend.\n\nFor multiple apps in one repository, produce an install matrix listing app name, manifest directory, source, ref, and `repo_path`. Submit one Add app operation per row. For remote repositories, omit `repo_path` only when the selected app lives at the repository root. For backend-local sources, make `source` the selected app package directory. Do not claim that selecting a repository root installs nested apps.\n\nValidate and test every app package independently, then run shared repository checks once. Report partial failures by app name rather than treating one passing app package as validation of the entire repository.\n\nVerify the lifecycle in Canvas:\n\n1. Install and confirm the inventory entry is disabled.\n2. Review source, revision, manifest metadata, and contributions.\n3. Enable and accept the trusted-code disclosure: “This app runs trusted JavaScript inside Agent Canvas and can make authenticated requests to the active Agent Server. Review its source and revision before enabling it.”\n4. Open the navigation item and exercise root and nested routes.\n5. Disable and confirm navigation and mounted UI disappear.\n6. Re-enable without restarting Canvas.\n7. Switch backend or reconnect when relevant and confirm isolation.\n8. Uninstall only when requested.\n\nDo not enable, uninstall, publish, push, or open a pull request without the user's authorization.\n\n## Report completion\n\nSummarize:\n\n- app location and contributed pages;\n- manifest schema and host API targeted;\n- build output and validation results;\n- tests run and their results;\n- installation status, explicitly stating whether it remains disabled;\n- remaining limitations tied to the current v1 ABI.\n\n## Resources\n\n- `references/v1-contract.md` - exact manifest, host API, lifecycle, routing, trust, and current limitations.\n- `references/connections.md` - Agent Server HTTP, Automation service, WebSocket, and TypeScript client connection guidance.\n- `references/testing-and-installation.md` - test strategy, manual Canvas workflow, and installation coordinates.\n- `references/packaging-recipes.md` - one-file Vite, CSS, assets, Workers, and WASM rules.\n- `references/backend-safety.md` - authenticated requests, command safety, persistence, and prerequisite onboarding.\n- `references/native-design.md` - native Agent Canvas styling: token reuse, Tailwind mapping, layout, component recipes, scoped CSS, and style injection.\n- `references/acceptance-checklist.md` - automated checks and the local install/enable/reload lifecycle.\n- `scripts/validate-extension.mjs` - dependency-free static artifact validator for an App package directory.",
109
109
  "category": "agent-authoring",
110
110
  "defaultEnabled": true
111
111
  },
@@ -1,3 +0,0 @@
1
- {
2
- ".": "0.28.0"
3
- }