@openhands/extensions 0.22.1 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/.agents/skills/custom-codereview-guide.md +86 -17
  2. package/.claude-plugin/marketplace.json +14 -0
  3. package/.codex-plugin/marketplace.json +14 -0
  4. package/.github/workflows/check-extensions.yml +6 -6
  5. package/.github/workflows/deprecation-check.yml +1 -1
  6. package/.github/workflows/issue-readiness-check.yml +37 -106
  7. package/.github/workflows/npm-publish.yml +2 -2
  8. package/.github/workflows/pr-description-check.yml +1 -1
  9. package/.github/workflows/pypi-publish.yml +3 -3
  10. package/.github/workflows/tests.yml +2 -2
  11. package/.plugin/marketplace.json +14 -0
  12. package/.release-please-manifest.json +1 -1
  13. package/AGENTS.md +32 -2
  14. package/README.md +4 -3
  15. package/automations/bundle-index.js +12 -11
  16. package/automations/catalog/github-issue-triage/manifest.json +2 -2
  17. package/automations/catalog/github-pr-reviewer/manifest.json +42 -5
  18. package/automations/catalog.schema.json +0 -4
  19. package/integrations/catalog/granola.json +38 -0
  20. package/integrations/catalog-index.js +16 -14
  21. package/marketplaces/openhands-extensions.json +14 -0
  22. package/package.json +1 -1
  23. package/plugins/openhands/skills/openhands-sdk/SKILL.md +3 -1
  24. package/plugins/pr-review/README.md +2 -1
  25. package/plugins/pr-review/scripts/agent_script.py +198 -81
  26. package/plugins/pr-review/scripts/prompt.py +35 -11
  27. package/plugins/pr-review/skills/code-review/SKILL.md +165 -200
  28. package/plugins/pr-review/skills/code-review/commands/codereview-roasted.md +1 -1
  29. package/plugins/pr-review/skills/code-review/commands/codereview.md +1 -1
  30. package/plugins/vulnerability-remediation/skills/github/scripts/agent_conversation.py +8 -3
  31. package/plugins/vulnerability-remediation/skills/github/scripts/github_client.py +4 -0
  32. package/pyproject.toml +2 -2
  33. package/python/openhands_extensions/_version.py +1 -1
  34. package/skills/add-skill/SKILL.md +5 -2
  35. package/skills/canvas-extension-api/.claude-plugin/plugin.json +19 -0
  36. package/skills/canvas-extension-api/.codex-plugin/plugin.json +19 -0
  37. package/skills/canvas-extension-api/.plugin/plugin.json +19 -0
  38. package/skills/canvas-extension-api/README.md +33 -0
  39. package/skills/canvas-extension-api/SKILL.md +254 -0
  40. package/skills/canvas-extension-api/references/acceptance-checklist.md +20 -0
  41. package/skills/canvas-extension-api/references/backend-safety.md +9 -0
  42. package/skills/canvas-extension-api/references/connections.md +126 -0
  43. package/skills/canvas-extension-api/references/packaging-recipes.md +43 -0
  44. package/skills/canvas-extension-api/references/sidecar-pattern.md +49 -0
  45. package/skills/canvas-extension-api/references/testing-and-installation.md +286 -0
  46. package/skills/canvas-extension-api/references/v1-contract.md +250 -0
  47. package/skills/canvas-extension-api/scripts/validate-extension.mjs +92 -0
  48. package/skills/canvas-extension-api/scripts/validate-extension.test.mjs +60 -0
  49. package/skills/code-review/SKILL.md +165 -200
  50. package/skills/code-review/commands/codereview-roasted.md +1 -1
  51. package/skills/code-review/commands/codereview.md +1 -1
  52. package/skills/github/scripts/agent_conversation.py +8 -3
  53. package/skills/github/scripts/github_client.py +4 -0
  54. package/skills/github-agents-md-maintainer/scripts/github_client.py +4 -0
  55. package/skills/github-delivery-watchdog/scripts/github_client.py +4 -0
  56. package/skills/github-issue-to-pr/scripts/agent_conversation.py +8 -3
  57. package/skills/github-issue-to-pr/scripts/github_client.py +4 -0
  58. package/skills/github-issue-triage/.claude-plugin/plugin.json +1 -1
  59. package/skills/github-issue-triage/.codex-plugin/plugin.json +1 -1
  60. package/skills/github-issue-triage/.plugin/plugin.json +1 -1
  61. package/skills/github-issue-triage/README.md +7 -0
  62. package/skills/github-issue-triage/SKILL.md +26 -3
  63. package/skills/github-issue-triage/scripts/agent_conversation.py +8 -3
  64. package/skills/github-issue-triage/scripts/github_client.py +4 -0
  65. package/skills/github-issue-triage/scripts/worker.py +142 -26
  66. package/skills/github-pr-reviewer/README.md +21 -10
  67. package/skills/github-pr-reviewer/SKILL.md +36 -10
  68. package/skills/github-pr-reviewer/commands/pr-reviewer-setup.md +1 -1
  69. package/skills/github-pr-reviewer/scripts/agent_conversation.py +8 -3
  70. package/skills/github-pr-reviewer/scripts/github_client.py +4 -0
  71. package/skills/github-pr-reviewer/scripts/main.py +63 -16
  72. package/skills/github-pr-reviewer/scripts/maintainer_handoff.py +151 -0
  73. package/skills/github-pr-reviewer/scripts/worker.py +218 -21
  74. package/skills/github-pr-reviewer/tests/test_main.py +85 -0
  75. package/skills/github-repo-monitor/scripts/github_client.py +4 -0
  76. package/skills/index.js +16 -8
  77. package/skills/openhands-sdk/SKILL.md +3 -1
  78. package/tests/fixtures/automations/github-pr-reviewer.json +120 -26
  79. package/tests/github_automation_helpers.py +1 -0
  80. package/tests/test_agent_conversation_dispatch.py +19 -4
  81. package/tests/test_automation_setup.py +15 -0
  82. package/tests/test_code_review_risk_evaluation.py +2 -2
  83. package/tests/test_github_reviewer_delivery.py +448 -5
  84. package/tests/test_github_triage_delivery.py +200 -6
  85. package/tests/test_maintainer_handoff.py +198 -0
  86. package/tests/test_pr_review_prompt.py +6 -2
  87. package/tests/test_pr_review_review_context.py +144 -0
  88. package/.github/scripts/check_issue_readiness.py +0 -272
  89. package/.github/scripts/post-readiness-comment.mjs +0 -184
  90. package/tests/test_check_issue_readiness.py +0 -135
@@ -1,32 +1,101 @@
1
1
  ---
2
2
  name: custom-codereview-guide
3
- description: Repository-specific code review guidelines for OpenHands/extensions
3
+ description: Repository-specific review guidance for OpenHands/extensions.
4
4
  triggers:
5
5
  - /codereview
6
6
  ---
7
7
 
8
- # Extensions Repo — Code Review Guidelines
8
+ # OpenHands/extensions review guide
9
9
 
10
- ## Repository Boundaries
10
+ Apply this guide with the general code-review skill and `AGENTS.md`. Approve the
11
+ current head when it has no material correctness, security, compatibility, or
12
+ acceptance-criterion defect. Comment only on concrete failures; do not withhold
13
+ approval for optional refactors, tone, style, or speculative improvements.
11
14
 
12
- Review whether a PR belongs in this public extensions registry. Skills, plugins, automations, and integrations belong here; Agent Server behavior and API endpoints belong in [`OpenHands/software-agent-sdk`](https://github.com/OpenHands/software-agent-sdk), typed browser API access belongs in [`OpenHands/typescript-client`](https://github.com/OpenHands/typescript-client), UI belongs in [`OpenHands/OpenHands`](https://github.com/OpenHands/OpenHands), and scheduling/dispatch lifecycle behavior belongs in [`OpenHands/automation`](https://github.com/OpenHands/automation).
15
+ ## Repository scope
13
16
 
14
- If a PR is opened in the wrong repository, explicitly recommend that it may need to be closed and moved to the repository that owns the change rather than merged here. Apply the repository's contribution and review guidance to every PR.
17
+ This repository owns reusable extensions: skills, plugins, and automation
18
+ bundles that use existing public host and runtime interfaces. Out of scope here,
19
+ because another repository owns the contract or machinery:
15
20
 
21
+ - SDK, agent-server, and client contracts — `OpenHands/software-agent-sdk`;
22
+ - generic automation scheduling, state, dispatch, and profile machinery —
23
+ `OpenHands/automation`;
24
+ - Canvas product and UI integration — `OpenHands/OpenHands`.
16
25
 
17
- ## SDK Documentation Placement
26
+ Cross-repository work is acceptable when this PR contains only the
27
+ extensions-owned portion and relies on public interfaces from the owning
28
+ repository.
18
29
 
19
- If a PR adds or modifies OpenHands SDK-specific documentation (API guides, SDK usage examples, SDK feature descriptions), flag it:
30
+ ## Blocking checkpoints
20
31
 
21
- - The canonical source of truth for SDK documentation is <https://docs.openhands.dev/sdk> and its `llms.txt` index.
22
- - The `skills/openhands-sdk/SKILL.md` in this repo is a thin pointer to the docs site. It should NOT contain duplicated SDK content.
23
- - **Push back**: ask the submitter to contribute SDK documentation changes to [OpenHands/docs](https://github.com/OpenHands/docs) instead.
32
+ ### Executable instructions and runtime parity
24
33
 
25
- ## Pre-release Integration Catalog Changes
34
+ Commands, imports, environment variables, endpoints, and setup steps in extension
35
+ content are executable contracts. Verify them against the released packages and
36
+ the actual local and cloud environments that claim support. Do not approve an
37
+ example that relies on an unreleased API, a developer-only dependency, a private
38
+ path, or a variable that the production runtime does not provide.
26
39
 
27
- The `@openhands/extensions/mcps` catalog was experimental and pre-release. If a
28
- PR intentionally replaces it with the broader `integrations` catalog and updates
29
- known downstream consumers in the same coordinated stack, do not require
30
- backward-compatible `mcps` aliases or a deprecation window. Require migration
31
- documentation for consumers, but accept a clean breaking change for this
32
- pre-release surface.
40
+ For a changed skill, plugin, hook, or automation, follow its documented entrypoint
41
+ in a clean environment far enough to exercise the changed behavior. Keep local
42
+ and cloud behavior identical unless the documentation names and explains a real
43
+ platform capability difference.
44
+
45
+ ### Untrusted triggers and credentials
46
+
47
+ Treat repository events, issue and PR comments, chat messages, catalog fields,
48
+ and extension-provided arguments as untrusted. Verify who may trigger the action,
49
+ whose identity it runs as, which repository or organization it can affect, and
50
+ which secrets it receives. A trigger phrase alone is not authorization. Require
51
+ an explicit allowlist, permission check, or repository policy before performing
52
+ mutating or credentialed work.
53
+
54
+ Use only the minimum documented credential set. Never place secret values in
55
+ prompts, logs, generated files, examples, or persisted state.
56
+
57
+ ### Sources of truth and generated artifacts
58
+
59
+ Identify the hand-authored source before reviewing a catalog or generated file.
60
+ A change should update that source once and regenerate every derived artifact
61
+ with the repository's existing sync/build command. Documentation must describe
62
+ the real direction of generation; do not call a generated asset the source of
63
+ truth or claim two runtimes read one asset when they do not.
64
+
65
+ Check the marketplace entry and generated command/catalog coverage required by
66
+ `AGENTS.md`. Do not add a parallel catalog, provider-specific copy, or manual
67
+ compatibility layer when the repository already has a generator or schema.
68
+
69
+ ### Documentation claims
70
+
71
+ Test copy-paste commands and verify named tools, flags, package exports, URLs, and
72
+ installation mechanisms from authoritative sources. A plausible command is not
73
+ evidence. Documentation that teaches the wrong data flow or setup is a material
74
+ finding because agents execute it directly.
75
+
76
+ SDK documentation belongs in `docs.openhands.dev/sdk`; the generated
77
+ `skills/openhands-sdk/SKILL.md` remains a thin synchronized entrypoint. The
78
+ former `@openhands/extensions/mcps` catalog was experimental and pre-release, so
79
+ an explicitly coordinated replacement with the `integrations` catalog needs
80
+ consumer migration documentation but not compatibility aliases or a deprecation
81
+ window.
82
+
83
+ ### Dependencies and supply chain
84
+
85
+ Apply the general seven-day release-recency guard to the exact dependency version,
86
+ regardless of the package's age or popularity. Validate installation with the
87
+ package manager and runtime used by the extension. Temporary git pins and
88
+ unreleased package APIs are blockers for merge unless the PR is an explicit,
89
+ coordinated stack that will replace them before release.
90
+
91
+ ## Evidence and comment discipline
92
+
93
+ Evidence should exercise the extension as users invoke it: run the command, hook,
94
+ plugin, or automation entrypoint and show the relevant result. Static text checks
95
+ alone do not validate executable instructions. Require only the environments and
96
+ paths the change affects.
97
+
98
+ Do not comment on punctuation, preferred prose tone, optional DRY cleanup, or
99
+ hypothetical non-standard configurations without a supported failure mode. Before
100
+ raising a finding, verify that the referenced file and behavior are present in
101
+ the current PR head and have not already been addressed in review history.
@@ -106,6 +106,20 @@
106
106
  "delegation"
107
107
  ]
108
108
  },
109
+ {
110
+ "name": "canvas-extension-api",
111
+ "source": "./skills/canvas-extension-api",
112
+ "description": "Build and validate Apps for Agent Canvas using the supported Canvas Extensions API v1 routed-page contract.",
113
+ "category": "agent-authoring",
114
+ "defaultEnabled": true,
115
+ "keywords": [
116
+ "agent-canvas",
117
+ "canvas-app",
118
+ "canvas-extension",
119
+ "register-page",
120
+ "app-development"
121
+ ]
122
+ },
109
123
  {
110
124
  "name": "openhands-sdk",
111
125
  "source": "./skills/openhands-sdk",
@@ -106,6 +106,20 @@
106
106
  "delegation"
107
107
  ]
108
108
  },
109
+ {
110
+ "name": "canvas-extension-api",
111
+ "source": "./skills/canvas-extension-api",
112
+ "description": "Build and validate Apps for Agent Canvas using the supported Canvas Extensions API v1 routed-page contract.",
113
+ "category": "agent-authoring",
114
+ "defaultEnabled": true,
115
+ "keywords": [
116
+ "agent-canvas",
117
+ "canvas-app",
118
+ "canvas-extension",
119
+ "register-page",
120
+ "app-development"
121
+ ]
122
+ },
109
123
  {
110
124
  "name": "openhands-sdk",
111
125
  "source": "./skills/openhands-sdk",
@@ -11,10 +11,10 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
13
  - name: Checkout repository
14
- uses: actions/checkout@v4
14
+ uses: actions/checkout@v7
15
15
 
16
16
  - name: Setup Node.js
17
- uses: actions/setup-node@v4
17
+ uses: actions/setup-node@v7
18
18
  with:
19
19
  node-version: "20"
20
20
 
@@ -44,10 +44,10 @@ jobs:
44
44
  runs-on: ubuntu-latest
45
45
  steps:
46
46
  - name: Checkout repository
47
- uses: actions/checkout@v4
47
+ uses: actions/checkout@v7
48
48
 
49
49
  - name: Setup Python
50
- uses: actions/setup-python@v5
50
+ uses: actions/setup-python@v7
51
51
  with:
52
52
  python-version: "3.12"
53
53
 
@@ -63,10 +63,10 @@ jobs:
63
63
  runs-on: ubuntu-latest
64
64
  steps:
65
65
  - name: Checkout repository
66
- uses: actions/checkout@v4
66
+ uses: actions/checkout@v7
67
67
 
68
68
  - name: Setup Python
69
- uses: actions/setup-python@v5
69
+ uses: actions/setup-python@v7
70
70
  with:
71
71
  python-version: "3.12"
72
72
 
@@ -13,7 +13,7 @@ jobs:
13
13
  runs-on: ubuntu-latest
14
14
  steps:
15
15
  - name: Checkout repository
16
- uses: actions/checkout@v4
16
+ uses: actions/checkout@v7
17
17
 
18
18
  - name: Install uv
19
19
  uses: astral-sh/setup-uv@v7
@@ -1,131 +1,62 @@
1
1
  ---
2
- name: Issue Readiness Check
2
+ name: Ready-for-dev Label Policy
3
3
 
4
- # Manages the `ready-for-dev` label based on type-specific readiness criteria
5
- # tailored to extension contributions (skills, plugins, integrations,
6
- # automations).
7
- #
8
- # Bug reports (label `bug`): the Actual Behavior section must reference a
9
- # reproducible command (`uv run pytest`, `pytest`, `python`, `pip`, `npm run`,
10
- # or `node`), plus an Acceptance Criteria section with at least one checklist
11
- # item.
12
- #
13
- # Enhancements (label `enhancement`): the body must contain Desired Behavior and
14
- # Acceptance Criteria sections, the latter with at least one checklist item.
15
- #
16
- # When criteria are met the label is added (idempotently); when they are not the
17
- # label is removed. A feedback comment is posted (or updated) in three cases:
18
- # 1. The issue is first opened or reopened - always comment so the author
19
- # knows whether their issue is ready or what is missing.
20
- # 2. The label is being added (issue became ready) - comment celebrating it.
21
- # 3. The label is being removed (issue was ready but is no longer) - comment
22
- # explaining what changed.
23
- # Edits that do not change the label state do not produce a new comment. All
24
- # comments are upserted by a hidden marker so there is at most one per issue.
25
- #
26
- # The readiness step uses `--json`, which always exits 0, so a not-ready result
27
- # never aborts the workflow under `set -euo pipefail`; label and comment steps
28
- # run for both outcomes.
4
+ # The issue-triage automation and repository writers may grant ready-for-dev.
5
+ # Labels from any other actor are removed.
29
6
 
30
7
  on:
31
8
  issues:
32
- types: [opened, edited, reopened, labeled, unlabeled]
33
-
34
- permissions:
35
- issues: write
36
- pull-requests: read
37
- contents: read
9
+ types: [labeled, unlabeled]
38
10
 
39
11
  concurrency:
40
- group: issue-readiness-${{ github.event.issue.number }}
12
+ group: ready-for-dev-policy-${{ github.event.issue.number }}
41
13
  cancel-in-progress: false
42
14
 
43
15
  jobs:
44
- check:
45
- if: github.event.issue.state == 'open' && github.event.issue.pull_request == null
16
+ enforce-label-policy:
17
+ name: Enforce ready-for-dev label policy
18
+ if: >-
19
+ github.event.issue.state == 'open'
20
+ && github.event.issue.pull_request == null
21
+ && github.event.label.name == 'ready-for-dev'
46
22
  runs-on: ubuntu-latest
47
23
  timeout-minutes: 5
24
+ permissions:
25
+ issues: write
26
+ outputs:
27
+ refresh-linked-prs: ${{ steps.policy.outputs.refresh-linked-prs }}
48
28
  steps:
49
- - name: Checkout trusted workflow scripts
50
- uses: actions/checkout@v4
51
-
52
- - name: Evaluate issue readiness
53
- id: readiness
54
- env:
55
- GITHUB_EVENT_PATH: ${{ github.event_path }}
56
- run: |
57
- set -euo pipefail
58
- python .github/scripts/check_issue_readiness.py --json > /tmp/result.json
59
- echo "ready=$(jq -r '.ready' /tmp/result.json)" >> "$GITHUB_OUTPUT"
60
- # Write reasons to a file so the comment step can read them
61
- # without shell-escaping multiline text.
62
- jq -r '.reasons[]?' /tmp/result.json > /tmp/reasons.txt || true
63
- echo "reasons_file=/tmp/reasons.txt" >> "$GITHUB_OUTPUT"
64
-
65
- - name: Add ready-for-dev label
66
- if: steps.readiness.outputs.ready == 'true'
29
+ - name: Check label actor
30
+ id: policy
67
31
  env:
68
32
  GH_TOKEN: ${{ github.token }}
33
+ ACTION: ${{ github.event.action }}
34
+ ACTOR: ${{ github.event.sender.login }}
35
+ REPOSITORY: ${{ github.repository }}
36
+ ISSUE_NUMBER: ${{ github.event.issue.number }}
69
37
  run: |
70
38
  set -euo pipefail
71
- # Capture stderr — tolerate "label already present" (exit 0
72
- # from gh) but surface unexpected errors to the step summary.
73
- if ! gh issue edit "${{ github.event.issue.number }}" \
74
- --repo "${{ github.repository }}" \
75
- --add-label "ready-for-dev" 2>/tmp/gh-err.txt; then
76
- echo "::warning::Failed to add ready-for-dev label:" >> "$GITHUB_STEP_SUMMARY"
77
- cat /tmp/gh-err.txt >> "$GITHUB_STEP_SUMMARY"
78
- fi
79
39
 
80
- - name: Remove ready-for-dev label
81
- if: steps.readiness.outputs.ready != 'true' && contains(github.event.issue.labels.*.name, 'ready-for-dev')
82
- env:
83
- GH_TOKEN: ${{ github.token }}
84
- run: |
85
- set -euo pipefail
86
- # Capture stderr — tolerate "label already removed" but
87
- # surface unexpected errors.
88
- if ! gh issue edit "${{ github.event.issue.number }}" \
89
- --repo "${{ github.repository }}" \
90
- --remove-label "ready-for-dev" 2>/tmp/gh-err.txt; then
91
- echo "::warning::Failed to remove ready-for-dev label:" >> "$GITHUB_STEP_SUMMARY"
92
- cat /tmp/gh-err.txt >> "$GITHUB_STEP_SUMMARY"
40
+ if [ "$ACTION" = "unlabeled" ]; then
41
+ echo "refresh-linked-prs=true" >> "$GITHUB_OUTPUT"
42
+ exit 0
93
43
  fi
94
44
 
95
- - name: Post feedback comment
96
- if: >-
97
- github.event.action == 'opened'
98
- || github.event.action == 'reopened'
99
- || (steps.readiness.outputs.ready == 'true' && !contains(github.event.issue.labels.*.name, 'ready-for-dev'))
100
- || (steps.readiness.outputs.ready != 'true' && contains(github.event.issue.labels.*.name, 'ready-for-dev'))
101
- env:
102
- GH_TOKEN: ${{ github.token }}
103
- run: |
104
- set -euo pipefail
105
- if [ "${{ steps.readiness.outputs.ready }}" = "true" ]; then
106
- node .github/scripts/post-readiness-comment.mjs \
107
- --issue-number "${{ github.event.issue.number }}" \
108
- --repo "${{ github.repository }}" \
109
- --ready
110
- else
111
- node .github/scripts/post-readiness-comment.mjs \
112
- --issue-number "${{ github.event.issue.number }}" \
113
- --repo "${{ github.repository }}" \
114
- --reasons-file "${{ steps.readiness.outputs.reasons_file }}"
115
- fi
45
+ permission="$(gh api "repos/$REPOSITORY/collaborators/$ACTOR/permission" --jq .permission 2>/dev/null || true)"
46
+ case "$permission" in
47
+ write|maintain|admin)
48
+ echo "refresh-linked-prs=true" >> "$GITHUB_OUTPUT"
49
+ ;;
50
+ *)
51
+ gh issue edit "$ISSUE_NUMBER" --repo "$REPOSITORY" --remove-label ready-for-dev
52
+ echo "refresh-linked-prs=false" >> "$GITHUB_OUTPUT"
53
+ ;;
54
+ esac
116
55
 
117
- # When the ready-for-dev label is added or removed, re-run the PR
118
- # description check for every open PR that links this issue, so the
119
- # `ready-for-dev` gate does not go stale between PR events. Runs after
120
- # `check` so the label reflects the settled readiness state.
121
56
  refresh-linked-pr-gates:
122
57
  name: Refresh PR gates for linked issues
123
- needs: check
124
- if: >-
125
- github.event.issue.state == 'open'
126
- && github.event.issue.pull_request == null
127
- && (github.event.action == 'labeled' || github.event.action == 'unlabeled')
128
- && github.event.label.name == 'ready-for-dev'
58
+ needs: enforce-label-policy
59
+ if: needs.enforce-label-policy.outputs.refresh-linked-prs == 'true'
129
60
  runs-on: ubuntu-latest
130
61
  timeout-minutes: 10
131
62
  permissions:
@@ -134,7 +65,7 @@ jobs:
134
65
  actions: write
135
66
  steps:
136
67
  - name: Checkout trusted workflow scripts
137
- uses: actions/checkout@v4
68
+ uses: actions/checkout@v7
138
69
 
139
70
  - name: Re-run PR description checks for linked open PRs
140
71
  env:
@@ -31,14 +31,14 @@ jobs:
31
31
 
32
32
  steps:
33
33
  - name: Check out repository
34
- uses: actions/checkout@v6
34
+ uses: actions/checkout@v7
35
35
  with:
36
36
  ref: ${{ inputs.tag || github.ref }}
37
37
 
38
38
  # Trusted publishing requires Node 22.14.0+ and npm 11.5.1+
39
39
  # See: https://docs.npmjs.com/trusted-publishers/
40
40
  - name: Set up Node.js for npm trusted publishing
41
- uses: actions/setup-node@v6
41
+ uses: actions/setup-node@v7
42
42
  with:
43
43
  node-version: '24'
44
44
  registry-url: https://registry.npmjs.org
@@ -29,7 +29,7 @@ jobs:
29
29
  runs-on: ubuntu-latest
30
30
  steps:
31
31
  - name: Checkout trusted workflow scripts
32
- uses: actions/checkout@v4
32
+ uses: actions/checkout@v7
33
33
  with:
34
34
  ref: ${{ github.event.pull_request.base.sha }}
35
35
 
@@ -20,7 +20,7 @@ jobs:
20
20
 
21
21
  steps:
22
22
  - name: Check out repository
23
- uses: actions/checkout@v6
23
+ uses: actions/checkout@v7
24
24
 
25
25
  - name: Extract version
26
26
  id: extract_version
@@ -72,7 +72,7 @@ jobs:
72
72
  run: uv build
73
73
 
74
74
  - name: Upload distributions
75
- uses: actions/upload-artifact@v6
75
+ uses: actions/upload-artifact@v7
76
76
  with:
77
77
  name: python-package-distributions
78
78
  path: dist/
@@ -95,7 +95,7 @@ jobs:
95
95
 
96
96
  steps:
97
97
  - name: Download distributions
98
- uses: actions/download-artifact@v6
98
+ uses: actions/download-artifact@v8
99
99
  with:
100
100
  name: python-package-distributions
101
101
  path: dist/
@@ -12,7 +12,7 @@ jobs:
12
12
  runs-on: ubuntu-latest
13
13
  steps:
14
14
  - name: Checkout repository
15
- uses: actions/checkout@v4
15
+ uses: actions/checkout@v7
16
16
 
17
17
  - name: Install uv
18
18
  uses: astral-sh/setup-uv@v7
@@ -21,7 +21,7 @@ jobs:
21
21
  python-version: "3.12"
22
22
 
23
23
  - name: Setup Node.js
24
- uses: actions/setup-node@v4
24
+ uses: actions/setup-node@v7
25
25
  with:
26
26
  node-version: "20"
27
27
 
@@ -106,6 +106,20 @@
106
106
  "delegation"
107
107
  ]
108
108
  },
109
+ {
110
+ "name": "canvas-extension-api",
111
+ "source": "./skills/canvas-extension-api",
112
+ "description": "Build and validate Apps for Agent Canvas using the supported Canvas Extensions API v1 routed-page contract.",
113
+ "category": "agent-authoring",
114
+ "defaultEnabled": true,
115
+ "keywords": [
116
+ "agent-canvas",
117
+ "canvas-app",
118
+ "canvas-extension",
119
+ "register-page",
120
+ "app-development"
121
+ ]
122
+ },
109
123
  {
110
124
  "name": "openhands-sdk",
111
125
  "source": "./skills/openhands-sdk",
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.22.1"
2
+ ".": "0.24.0"
3
3
  }
package/AGENTS.md CHANGED
@@ -16,6 +16,27 @@ Related repositories have distinct responsibilities:
16
16
 
17
17
  Put reusable skills, plugins, automations, and integrations here; put backend execution behavior and typed API access in the SDK, application UI in Agent Canvas, and scheduling/dispatch lifecycle code in `automation`. If a PR is opened in the wrong repository, explicitly recommend closing and moving it to the owning repository. PRs must follow this repository's applicable contribution and code-review guidance.
18
18
 
19
+ ## Review-Facing Extension Checklist
20
+
21
+ Before opening a PR:
22
+
23
+ - Keep a content change focused on one skill, plugin, automation bundle, or
24
+ integration. Put shared product runtime behavior in the repository that owns
25
+ it instead of copying machinery into extension content.
26
+ - Treat every command, import, environment variable, endpoint, setup step, and
27
+ package name as an executable contract. Test the documented entrypoint with
28
+ released packages in each local or cloud environment the extension claims to
29
+ support; do not rely on developer-only variables or private paths.
30
+ - For event-, comment-, or message-triggered work, define who may trigger it,
31
+ whose identity executes it, what scope it may mutate, and which minimal secrets
32
+ it receives. A trigger phrase is not authorization.
33
+ - Edit the hand-authored source once and regenerate derived catalogs, commands,
34
+ indexes, and package assets with the existing sync/build command. Document the
35
+ true generation direction and do not introduce a parallel source of truth.
36
+ - Verify copy-paste commands and factual documentation claims against the actual
37
+ tool or authoritative source. Extension instructions are executed by agents,
38
+ so incorrect setup or data-flow documentation is a functional defect.
39
+
19
40
  ## What this repo contains
20
41
 
21
42
  - `skills/` — a catalog of skills, **one directory per skill**.
@@ -110,7 +131,7 @@ When editing or adding skills in this repo, follow these rules (and add new skil
110
131
  - Agent-driven plugins (for example `plugins/pr-review` and `plugins/release-notes`) use `uv run --with openhands-sdk --with openhands-tools ...` and require an `LLM_API_KEY` in addition to `GITHUB_TOKEN`.
111
132
  - For OpenHands Cloud API guidance, automations, and CLI integration, use `plugins/openhands`. It is the canonical unified OpenHands plugin covering the V1 Cloud API, Automations API, and CLI. The individual skills (`skills/openhands-api`, `skills/openhands-automation`) are also available standalone.
112
133
  - When reviewing or editing `skills/openhands-sdk`, validate copy-paste imports against the released packages with `uv run --with openhands-tools --with openhands-workspace --with openhands-agent-server python ...`. In the current released workspace package, the exported remote workspace classes are `APIRemoteWorkspace` / `OpenHandsCloudWorkspace`; `RemoteAPIWorkspace` is not available.
113
- - For agent-driven plugin scripts, prefer `from openhands.sdk.plugin import PluginSource` and pass `plugins=[PluginSource(source=...)]` into `Conversation`. In the current released SDK (`openhands-sdk` 1.18.x), `Plugin` is not exported from `openhands.sdk.plugin`, so direct `Plugin.load(...)` imports can break CI.
134
+ - For agent-driven plugin scripts, prefer `from openhands.sdk.plugin import PluginSource` and pass `plugins=[PluginSource(source=...)]` into `Conversation`. The current released SDK (`openhands-sdk` 1.49.x) exports both `PluginSource` and `Plugin` from `openhands.sdk.plugin`, so `Plugin.load(...)` imports also work (used by `tests/test_skill_plugin_loading.py`).
114
135
  - `plugins/qa-changes/action.yml` now has a preflight guard for fork PRs in `pull_request` context: if the PR comes from a fork and `LLM_API_KEY` is unavailable (normal for forks), the action exits successfully with a clear skip notice instead of failing.
115
136
  - `skills/bitbucket` should not tell agents to rewrite remotes proactively. In OpenHands, `BITBUCKET_TOKEN` is commonly kept in unencoded `user:token` form for API calls like `curl --user "$BITBUCKET_TOKEN" ...`; only split and URL-encode it when constructing a non-interactive HTTPS Git remote URL.
116
137
 
@@ -148,7 +169,16 @@ Important notes:
148
169
  - `scripts/sync_extensions.py` keeps generated artifacts in sync: Claude Code command files, README catalog section, coverage checks, and vendor symlinks. Run `python scripts/sync_extensions.py --check` (or just push — CI runs it) to verify everything is consistent. Run without `--check` to auto-fix. The "Quick Start" section in `README.md` (OpenHands SDK, Claude Code, and Codex setup instructions) is **manually maintained** above the auto-generated catalog markers and is intentionally not generated by the sync script.
149
170
  - The sync script uses PyYAML to parse SKILL.md frontmatter. If you add a skill with a slash trigger (e.g., `triggers: ["/mycommand"]`), the script auto-generates `commands/mycommand.md`. **Note:** Slash triggers in SKILL.md frontmatter are deprecated — prefer adding a `commands/command-name.md` file to the plugin's `commands/` directory instead. Keyword triggers (non-slash) remain the recommended way to activate skills by topic.
150
171
 
151
- - The `ready-for-dev` gates live in `.github/workflows/issue-readiness-check.yml` and `.github/workflows/pr-description-check.yml`, backed by `.github/scripts/check_issue_readiness.py`, `check_pr_description.py`, `refresh_linked_pr_checks.py`, and `post-readiness-comment.mjs`. Issues labeled `bug` or `enhancement` must meet type-specific readiness criteria (reproducible command plus Acceptance Criteria checklist for bugs; Desired Behavior plus Acceptance Criteria checklist for enhancements) to receive the `ready-for-dev` label. Non-draft PRs must keep the `## Why`, `## Summary`, and `## How to Test` template sections filled, and any issue linked via a closing keyword or the `## Issue Number` section must carry `ready-for-dev` unless it predates the 2026-08-25 rollout. Label transitions on an issue re-run the PR Description Check for linked open PRs. Tests live in `tests/test_check_issue_readiness.py`, `tests/test_check_pr_description.py`, and `tests/test_refresh_linked_pr_checks.py`.
172
+ - The GitHub issue-triage automation and repository writers may grant
173
+ `ready-for-dev`.
174
+ `.github/workflows/issue-readiness-check.yml` removes a newly applied label
175
+ unless a user with `write`, `maintain`, or `admin` permission applied it. An
176
+ `unlabeled` event then lets triage reassess the issue.
177
+ `.github/workflows/pr-description-check.yml` still requires linked issues to
178
+ be ready, and label transitions refresh that check through
179
+ `.github/scripts/refresh_linked_pr_checks.py`. Tests for the PR gates live in
180
+ `tests/test_check_pr_description.py` and
181
+ `tests/test_refresh_linked_pr_checks.py`.
152
182
 
153
183
  ## OpenHands SDK documentation policy
154
184
 
package/README.md CHANGED
@@ -9,7 +9,7 @@ It contains reusable, shareable skills and plugins that customize agent behavior
9
9
 
10
10
  ## Repository boundaries
11
11
 
12
- `OpenHands/extensions` is the public registry for reusable skills, plugins, automations, and integrations. [`OpenHands/software-agent-sdk`](https://github.com/OpenHands/software-agent-sdk) owns Agent Server execution and the canonical API, [`OpenHands/typescript-client`](https://github.com/OpenHands/typescript-client) owns typed browser access to that API, [`OpenHands/OpenHands`](https://github.com/OpenHands/OpenHands) owns Agent Canvas UI, and [`OpenHands/automation`](https://github.com/OpenHands/automation) owns scheduling, webhooks, run history, dispatch, and sandbox lifecycle orchestration.
12
+ `OpenHands/extensions` is the public registry for reusable skills, plugins, automations, and integrations. [`OpenHands/software-agent-sdk`](https://github.com/OpenHands/software-agent-sdk) owns Agent Server execution, the canonical API, and typed browser access to it under `clients/typescript/`, [`OpenHands/OpenHands`](https://github.com/OpenHands/OpenHands) owns Agent Canvas UI, and [`OpenHands/automation`](https://github.com/OpenHands/automation) owns scheduling, webhooks, run history, dispatch, and sandbox lifecycle orchestration.
13
13
 
14
14
  Put reusable extension artifacts here rather than in application repositories. If a PR is opened in the wrong repository, close and move it to the repository that owns the change.
15
15
 
@@ -96,7 +96,7 @@ The JS and Python versions are kept in lock-step by `release-please` and guarded
96
96
  ## Extensions Catalog
97
97
 
98
98
  <!-- BEGIN AUTO-GENERATED CATALOG -->
99
- This repository contains **2 marketplace(s)** with **72 extensions** (62 skills, 10 plugins).
99
+ This repository contains **2 marketplace(s)** with **73 extensions** (63 skills, 10 plugins).
100
100
 
101
101
  ### large-codebase
102
102
 
@@ -115,7 +115,7 @@ OpenHands skills for interacting, improving, and refactoring large codebases
115
115
 
116
116
  Official skills and plugins for OpenHands — the open-source AI software engineer.
117
117
 
118
- **68 extensions** (60 skills, 8 plugins)
118
+ **69 extensions** (61 skills, 8 plugins)
119
119
 
120
120
  | Name | Type | Description | Commands |
121
121
  |------|------|-------------|----------|
@@ -128,6 +128,7 @@ Official skills and plugins for OpenHands — the open-source AI software engine
128
128
  | bitbucket | skill | Bitbucket integration hub. Detects whether the repository is on Bitbucket Cloud or Bitbucket Data Center and directs ... | — |
129
129
  | bitbucket-cloud | skill | Bitbucket Cloud (bitbucket.org) specifics — authenticate with BITBUCKET_TOKEN, use the REST API v2, workspace/repo_sl... | — |
130
130
  | bitbucket-data-center | skill | Bitbucket Data Center (self-hosted Bitbucket Server) specifics — authenticate with BITBUCKET_DATA_CENTER_TOKEN, use t... | — |
131
+ | canvas-extension-api | skill | Build and validate Apps for Agent Canvas using the supported Canvas Extensions API v1 routed-page contract. | — |
131
132
  | city-weather | plugin | Get current weather, time, and precipitation forecast for any city using the free Open-Meteo API. Provides slash comm... | — |
132
133
  | code-review | skill | Rigorous code review focusing on data structures, simplicity, security, pragmatism, and risk/safety evaluation. Provi... | `/codereview`, `/codereview-roasted` |
133
134
  | code-simplifier | skill | Simplifies and refines code across three dimensions - code reuse, code quality, and efficiency - while preserving all... | `/simplify` |