@openhands/extensions 0.29.0 → 0.31.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 (97) hide show
  1. package/.agents/skills/custom-codereview-guide.md +47 -5
  2. package/.claude-plugin/marketplace.json +20 -5
  3. package/.codex-plugin/marketplace.json +20 -5
  4. package/.github/workflows/build-vscode-app.yml +3 -3
  5. package/.github/workflows/check-extensions.yml +1 -1
  6. package/.github/workflows/pr-artifacts.yml +4 -83
  7. package/.github/workflows/tests.yml +14 -1
  8. package/.plugin/marketplace.json +20 -5
  9. package/.release-please-manifest.json +1 -1
  10. package/AGENTS.md +4 -3
  11. package/README.md +6 -5
  12. package/apps/vscode/README.md +8 -6
  13. package/apps/vscode/canvas-extension.json +11 -3
  14. package/apps/vscode/extension.js +60 -12
  15. package/apps/vscode/scripts/package.mjs +20 -74
  16. package/automations/bundle-index.js +10 -8
  17. package/automations/catalog/github-issue-to-pr/manifest.json +1 -1
  18. package/automations/catalog/github-issue-triage/manifest.json +4 -3
  19. package/automations/catalog/github-pr-reviewer/manifest.json +7 -6
  20. package/automations/catalog/gitlab-issue-to-mr/manifest.json +3 -3
  21. package/automations/catalog/jira-issue-to-bitbucket-pr/manifest.json +4 -4
  22. package/automations/catalog/jira-issue-to-gitlab-mr/manifest.json +5 -5
  23. package/automations/catalog/jira-issue-to-pr/manifest.json +1 -1
  24. package/integrations/catalog/atlassian-rovo.json +4 -3
  25. package/integrations/catalog/bitbucket.json +16 -1
  26. package/integrations/catalog/github.json +1 -0
  27. package/integrations/catalog/gitlab.json +1 -1
  28. package/marketplaces/openhands-extensions.json +20 -5
  29. package/package.json +1 -1
  30. package/plugins/pr-review/README.md +1 -0
  31. package/plugins/pr-review/scripts/prompt.py +44 -11
  32. package/plugins/runtime-api-configs/SKILL.md +1 -1
  33. package/plugins/vulnerability-remediation/skills/github/scripts/agent_conversation.py +224 -8
  34. package/pyproject.toml +1 -1
  35. package/python/openhands_extensions/_version.py +1 -1
  36. package/skills/canvas-extension-api/references/backend-safety.md +3 -3
  37. package/skills/canvas-extension-api/references/v1-contract.md +7 -4
  38. package/skills/canvas-extension-api/scripts/validate-extension.mjs +17 -1
  39. package/skills/canvas-extension-api/scripts/validate-extension.test.mjs +49 -0
  40. package/skills/github/scripts/agent_conversation.py +224 -8
  41. package/skills/github-issue-to-pr/scripts/agent_conversation.py +224 -8
  42. package/skills/github-issue-triage/README.md +73 -14
  43. package/skills/github-issue-triage/SKILL.md +26 -46
  44. package/skills/github-issue-triage/scripts/agent_conversation.py +224 -8
  45. package/skills/github-issue-triage/scripts/triage_publication.py +293 -0
  46. package/skills/github-issue-triage/scripts/worker.py +153 -103
  47. package/skills/github-pr-reviewer/README.md +109 -1
  48. package/skills/github-pr-reviewer/SKILL.md +42 -8
  49. package/skills/github-pr-reviewer/references/state-schema.md +8 -0
  50. package/skills/github-pr-reviewer/scripts/agent_conversation.py +224 -8
  51. package/skills/github-pr-reviewer/scripts/main.py +163 -39
  52. package/skills/github-pr-reviewer/scripts/publication.py +193 -0
  53. package/skills/github-pr-reviewer/scripts/worker.py +297 -8
  54. package/skills/github-pr-reviewer/tests/test_main.py +73 -5
  55. package/skills/github-stale-ci-pr-closer/scripts/worker.py +8 -2
  56. package/skills/gitlab-issue-to-mr/README.md +10 -3
  57. package/skills/gitlab-issue-to-mr/SKILL.md +43 -9
  58. package/skills/gitlab-issue-to-mr/references/state-schema.md +4 -0
  59. package/skills/gitlab-issue-to-mr/scripts/main.py +359 -25
  60. package/skills/index.js +18 -8
  61. package/skills/jira-issue-to-pr/.claude-plugin/plugin.json +4 -1
  62. package/skills/jira-issue-to-pr/.codex-plugin/plugin.json +4 -1
  63. package/skills/jira-issue-to-pr/.plugin/plugin.json +4 -1
  64. package/skills/jira-issue-to-pr/README.md +18 -11
  65. package/skills/jira-issue-to-pr/SKILL.md +72 -23
  66. package/skills/jira-issue-to-pr/references/setup.md +43 -12
  67. package/skills/jira-issue-to-pr/scripts/main.py +136 -26
  68. package/skills/slack-channel-monitor/README.md +12 -3
  69. package/skills/slack-channel-monitor/SKILL.md +35 -20
  70. package/skills/slack-channel-monitor/references/windows.md +6 -2
  71. package/skills/slack-channel-monitor/scripts/main.py +189 -12
  72. package/skills/software-factory/.claude-plugin/plugin.json +19 -0
  73. package/skills/software-factory/.codex-plugin/plugin.json +19 -0
  74. package/skills/software-factory/.plugin/plugin.json +19 -0
  75. package/skills/software-factory/README.md +64 -0
  76. package/skills/software-factory/SKILL.md +229 -0
  77. package/skills/software-factory/commands/software-factory.md +8 -0
  78. package/skills/software-factory/scripts/factory.py +630 -0
  79. package/skills/ticket-to-code-change/.claude-plugin/plugin.json +1 -2
  80. package/skills/ticket-to-code-change/.codex-plugin/plugin.json +1 -2
  81. package/skills/ticket-to-code-change/.plugin/plugin.json +1 -2
  82. package/skills/ticket-to-code-change/SKILL.md +5 -3
  83. package/skills/ticket-to-code-change/commands/ticket-to-code-change-setup.md +1 -1
  84. package/tests/fixtures/automations/github-pr-reviewer.json +9 -9
  85. package/tests/test_agent_conversation_dispatch.py +173 -6
  86. package/tests/test_automation_llm_provenance.py +1209 -0
  87. package/tests/test_github_review_publication.py +422 -0
  88. package/tests/test_github_reviewer_delivery.py +174 -21
  89. package/tests/test_github_stale_ci_pr_closer.py +52 -1
  90. package/tests/test_github_triage_delivery.py +411 -238
  91. package/tests/test_gitlab_issue_to_mr.py +284 -0
  92. package/tests/test_jira_issue_to_pr.py +200 -6
  93. package/tests/test_pr_review_prompt_injection.py +353 -0
  94. package/tests/test_slack_channel_monitor.py +32 -1
  95. package/tests/test_software_factory_script.py +231 -0
  96. package/tests/test_vscode_app.py +8 -2
  97. package/tests/vscode-app.test.mjs +8 -2
@@ -27,7 +27,32 @@ Cross-repository work is acceptable when this PR contains only the
27
27
  extensions-owned portion and relies on public interfaces from the owning
28
28
  repository.
29
29
 
30
- ## Blocking checkpoints
30
+ ## Issue triage
31
+
32
+ Issue readiness means the work is clear enough to start—not that the fix is
33
+ complete. Do not require a PR, passing implementation tests, or before-and-after
34
+ fix evidence. Reconsider readiness when new information leaves scope or expected
35
+ behavior unresolved. Read the issue, linked discussion, applicable `AGENTS.md`,
36
+ and adjacent source before asking questions.
37
+
38
+ For API failures, compare the extension request with the provider's reported or
39
+ supported version, not upstream main. Use dependency pins or deployment evidence.
40
+ Instructions, request arguments, response parsing, and scanner policy belong
41
+ here; use the ownership boundaries above for other failures. State required
42
+ cross-repository changes and their order. An independent upstream defect need
43
+ not block this work. Naming an owner does not authorize edits or duplicate tickets.
44
+
45
+ Define the smallest useful outcome and explicit non-goals. Cover only affected
46
+ entrypoints, environments, and permissions. For scanners, state whether discovery,
47
+ commenting, and dispatch are allowed for ineligible candidates or after a cap.
48
+ Discovery alone does not authorize unsolicited comments.
49
+
50
+ Request visual evidence only when needed; otherwise use logs, minimal
51
+ reproductions, or failing tests. Do not repeat answered questions. Match managed
52
+ criteria to current human decisions and authoritative readiness policy. Report
53
+ conflicts instead of repeatedly adding a label that policy removes.
54
+
55
+ ## Implementation review checkpoints
31
56
 
32
57
  ### Executable instructions and runtime parity
33
58
 
@@ -42,6 +67,16 @@ in a clean environment far enough to exercise the changed behavior. Keep local
42
67
  and cloud behavior identical unless the documentation names and explains a real
43
68
  platform capability difference.
44
69
 
70
+ For provider changes, inspect the supported implementation; mocks and local types
71
+ alone do not establish an API contract. Separate static/helper tests, tests with
72
+ simulated services, and real integration evidence. If the version or runtime is
73
+ unavailable, report that limit, not an assumed defect. For packaging changes,
74
+ check source, shipped bundle, and deployed files separately.
75
+
76
+ For scanners, check eligibility, permissions, caps, retries, unchanged runs, and
77
+ recovery for each action listed under triage. A launch cap does not permit
78
+ unlimited gate comments.
79
+
45
80
  ### Untrusted triggers and credentials
46
81
 
47
82
  Treat repository events, issue and PR comments, chat messages, catalog fields,
@@ -111,10 +146,9 @@ deep change lacks it, weigh the gap by risk:
111
146
  the diff would materially slow or weaken the review.
112
147
  - **LOW** risk: never block on missing design context alone.
113
148
 
114
- Approving a same-repository PR removes its `.pr/` directory. If a temporary
115
- `.pr/` page is the only design explanation, submit a COMMENT review instead of
116
- approving, so the page remains for the human maintainer's decision, unless the
117
- PR description already carries the durable equivalent.
149
+ Temporary `.pr/` artifacts remain available during review and are removed through
150
+ a cleanup PR after merge to `main`. Preserve any design explanation needed beyond
151
+ that cleanup in the PR description or permanent documentation.
118
152
 
119
153
  Design context aids review; it does not excuse correctness, security,
120
154
  architecture, or repository-ownership problems.
@@ -130,3 +164,11 @@ Do not comment on punctuation, preferred prose tone, optional DRY cleanup, or
130
164
  hypothetical non-standard configurations without a supported failure mode. Before
131
165
  raising a finding, verify that the referenced file and behavior are present in
132
166
  the current PR head and have not already been addressed in review history.
167
+
168
+ ## Review verdict
169
+
170
+ Do not approve material code defects or unmet blocking merge/evidence checks.
171
+ Distinguish code defects from missing merge requirements and optional follow-up.
172
+ If GitHub forbids self-approval of a clean PR, use COMMENT and explain why.
173
+ Respect accepted scope and non-goals: block on a pre-existing limitation only if
174
+ this change exposes it.
@@ -92,6 +92,19 @@
92
92
  "openhands"
93
93
  ]
94
94
  },
95
+ {
96
+ "name": "software-factory",
97
+ "source": "./skills/software-factory",
98
+ "description": "Set up a GitHub software factory fast: ask only for the repositories and the ticket source (GitHub issues, Jira or Linear), create a working issue-to-PR and PR-review pipeline from catalog automations with defaults, then let the user stop or extend it step by step.",
99
+ "category": "automations",
100
+ "keywords": [
101
+ "onboarding",
102
+ "software-factory",
103
+ "github",
104
+ "automation",
105
+ "pull-request"
106
+ ]
107
+ },
95
108
  {
96
109
  "name": "agent-canvas-environment",
97
110
  "source": "./skills/agent-canvas-environment",
@@ -752,7 +765,7 @@
752
765
  {
753
766
  "name": "gitlab-issue-to-mr",
754
767
  "source": "./skills/gitlab-issue-to-mr",
755
- "description": "Create an automation that implements GitLab issues when a configurable trigger label is applied. Clones the default branch for the agent, then commits, pushes, and opens the merge request itself - the agent is handed no push credential.",
768
+ "description": "Create an automation that implements GitLab issues when a configurable trigger label is applied. Polls the projects deterministically and starts one conversation per label event; on OpenHands Cloud and Enterprise it reaches GitLab through the connected MCP server or integration, with no token to set up.",
756
769
  "category": "automations",
757
770
  "keywords": [
758
771
  "gitlab",
@@ -851,11 +864,14 @@
851
864
  {
852
865
  "name": "jira-issue-to-pr",
853
866
  "source": "./skills/jira-issue-to-pr",
854
- "description": "Deploy a cron-based OpenHands automation that watches a Jira Cloud project for issues labeled with a configurable label (default: create-pr) and spawns an agent conversation to create a GitHub pull request for each new issue found. The target GitHub repo is read from the ticket body - no repo parameter required at deploy time.",
867
+ "description": "Deploy a cron-based OpenHands automation that opens a GitHub pull request, a GitLab merge request or a Bitbucket pull request for each Jira issue carrying a configurable label (default: create-pr). The target repository is read from the ticket body - no repo parameter required at deploy time.",
855
868
  "category": "automations",
856
869
  "keywords": [
857
870
  "jira",
858
- "atlassian"
871
+ "atlassian",
872
+ "github",
873
+ "gitlab",
874
+ "bitbucket"
859
875
  ]
860
876
  },
861
877
  {
@@ -873,10 +889,9 @@
873
889
  {
874
890
  "name": "ticket-to-code-change",
875
891
  "source": "./skills/ticket-to-code-change",
876
- "description": "Set up Jira or Linear ticket-to-code-change automations for GitHub, GitLab, and Bitbucket.",
892
+ "description": "Set up Linear ticket-to-code-change automations for GitHub, GitLab, and Bitbucket.",
877
893
  "category": "automations",
878
894
  "keywords": [
879
- "jira",
880
895
  "linear",
881
896
  "github",
882
897
  "gitlab",
@@ -92,6 +92,19 @@
92
92
  "openhands"
93
93
  ]
94
94
  },
95
+ {
96
+ "name": "software-factory",
97
+ "source": "./skills/software-factory",
98
+ "description": "Set up a GitHub software factory fast: ask only for the repositories and the ticket source (GitHub issues, Jira or Linear), create a working issue-to-PR and PR-review pipeline from catalog automations with defaults, then let the user stop or extend it step by step.",
99
+ "category": "automations",
100
+ "keywords": [
101
+ "onboarding",
102
+ "software-factory",
103
+ "github",
104
+ "automation",
105
+ "pull-request"
106
+ ]
107
+ },
95
108
  {
96
109
  "name": "agent-canvas-environment",
97
110
  "source": "./skills/agent-canvas-environment",
@@ -752,7 +765,7 @@
752
765
  {
753
766
  "name": "gitlab-issue-to-mr",
754
767
  "source": "./skills/gitlab-issue-to-mr",
755
- "description": "Create an automation that implements GitLab issues when a configurable trigger label is applied. Clones the default branch for the agent, then commits, pushes, and opens the merge request itself - the agent is handed no push credential.",
768
+ "description": "Create an automation that implements GitLab issues when a configurable trigger label is applied. Polls the projects deterministically and starts one conversation per label event; on OpenHands Cloud and Enterprise it reaches GitLab through the connected MCP server or integration, with no token to set up.",
756
769
  "category": "automations",
757
770
  "keywords": [
758
771
  "gitlab",
@@ -851,11 +864,14 @@
851
864
  {
852
865
  "name": "jira-issue-to-pr",
853
866
  "source": "./skills/jira-issue-to-pr",
854
- "description": "Deploy a cron-based OpenHands automation that watches a Jira Cloud project for issues labeled with a configurable label (default: create-pr) and spawns an agent conversation to create a GitHub pull request for each new issue found. The target GitHub repo is read from the ticket body - no repo parameter required at deploy time.",
867
+ "description": "Deploy a cron-based OpenHands automation that opens a GitHub pull request, a GitLab merge request or a Bitbucket pull request for each Jira issue carrying a configurable label (default: create-pr). The target repository is read from the ticket body - no repo parameter required at deploy time.",
855
868
  "category": "automations",
856
869
  "keywords": [
857
870
  "jira",
858
- "atlassian"
871
+ "atlassian",
872
+ "github",
873
+ "gitlab",
874
+ "bitbucket"
859
875
  ]
860
876
  },
861
877
  {
@@ -873,10 +889,9 @@
873
889
  {
874
890
  "name": "ticket-to-code-change",
875
891
  "source": "./skills/ticket-to-code-change",
876
- "description": "Set up Jira or Linear ticket-to-code-change automations for GitHub, GitLab, and Bitbucket.",
892
+ "description": "Set up Linear ticket-to-code-change automations for GitHub, GitLab, and Bitbucket.",
877
893
  "category": "automations",
878
894
  "keywords": [
879
- "jira",
880
895
  "linear",
881
896
  "github",
882
897
  "gitlab",
@@ -14,15 +14,15 @@ jobs:
14
14
  - uses: actions/checkout@v7
15
15
  - uses: actions/setup-node@v7
16
16
  with:
17
- node-version: "20"
17
+ node-version: "24"
18
18
  - name: Build installable App package
19
19
  run: node apps/vscode/scripts/package.mjs
20
20
  - name: Validate package files
21
21
  run: |
22
22
  test -f dist/apps/vscode/canvas-extension.json
23
23
  test -f dist/apps/vscode/extension.js
24
- test -f dist/apps/vscode/backend/openvscode-linux-amd64.tar.gz
25
- test -f dist/apps/vscode/backend/openvscode-linux-arm64.tar.gz
24
+ test -f dist/apps/vscode/README.md
25
+ test -z "$(find dist/apps/vscode -type f -name '*.tar.gz' -print -quit)"
26
26
  - uses: actions/upload-artifact@v7
27
27
  with:
28
28
  name: vscode-app-${{ github.sha }}
@@ -16,7 +16,7 @@ jobs:
16
16
  - name: Setup Node.js
17
17
  uses: actions/setup-node@v7
18
18
  with:
19
- node-version: "20"
19
+ node-version: "24"
20
20
 
21
21
  - name: Install Claude Code CLI
22
22
  run: npm install -g @anthropic-ai/claude-code
@@ -6,84 +6,9 @@ on:
6
6
  pull_request_target:
7
7
  types: [opened, synchronize, reopened, closed]
8
8
  branches: [main]
9
- pull_request_review:
10
- types: [submitted]
11
9
 
12
10
  jobs:
13
- # Auto-remove .pr/ directory from same-repository PRs when approved.
14
- cleanup-on-approval:
15
- concurrency:
16
- group: cleanup-pr-artifacts-${{ github.event.pull_request.number }}
17
- cancel-in-progress: false
18
- if: >-
19
- github.event_name == 'pull_request_review' &&
20
- github.event.review.state == 'approved' &&
21
- github.event.pull_request.head.repo.full_name == github.repository
22
- runs-on: ubuntu-latest
23
- permissions:
24
- contents: write
25
- pull-requests: write
26
- steps:
27
- # Use PAT so the push triggers CI workflows that will complete and
28
- # satisfy branch protection. We can't use [skip ci] because GitHub Apps
29
- # can create stuck checks that block merging.
30
- - uses: actions/checkout@v7
31
- with:
32
- ref: ${{ github.event.pull_request.head.ref }}
33
- token: ${{ secrets.OPENHANDS_BOT_GITHUB_PAT_PUBLIC }}
34
-
35
- - name: Remove .pr/ directory
36
- id: remove
37
- run: |
38
- if [ -d ".pr" ]; then
39
- git config user.name "allhands-bot"
40
- git config user.email "allhands-bot@users.noreply.github.com"
41
- git rm -rf .pr/
42
- git commit -m "chore: Remove PR-only artifacts [automated]"
43
- git push || {
44
- echo "::error::Failed to push cleanup commit. Check branch protection rules."
45
- exit 1
46
- }
47
- echo "removed=true" >> "$GITHUB_OUTPUT"
48
- echo "::notice::Removed .pr/ directory"
49
- else
50
- echo "removed=false" >> "$GITHUB_OUTPUT"
51
- echo "::notice::No .pr/ directory to remove"
52
- fi
53
-
54
- - name: Update PR comment after cleanup
55
- if: steps.remove.outputs.removed == 'true'
56
- uses: actions/github-script@v9
57
- with:
58
- script: |
59
- const marker = '<!-- pr-artifacts-notice -->';
60
- const body = `${marker}
61
- ✅ **PR Artifacts Cleaned Up**
62
-
63
- The \`.pr/\` directory has been automatically removed.
64
- `;
65
-
66
- const comments = await github.paginate(
67
- github.rest.issues.listComments,
68
- {
69
- owner: context.repo.owner,
70
- repo: context.repo.repo,
71
- issue_number: context.issue.number,
72
- per_page: 100,
73
- },
74
- );
75
-
76
- const existing = comments.find(c => c.body.includes(marker));
77
- if (existing) {
78
- await github.rest.issues.updateComment({
79
- owner: context.repo.owner,
80
- repo: context.repo.repo,
81
- comment_id: existing.id,
82
- body: body,
83
- });
84
- }
85
-
86
- # Inspect the fork through the API; never check out untrusted code with a write token.
11
+ # Inspect PR artifacts through the API; never check out untrusted code with a write token.
87
12
  check-pr-artifacts:
88
13
  if: >-
89
14
  github.event_name == 'pull_request_target' &&
@@ -144,14 +69,10 @@ jobs:
144
69
  return;
145
70
  }
146
71
 
147
- const isFork = headRepository.full_name !== context.payload.repository.full_name;
148
- const cleanup = isFork
149
- ? 'Because this is a fork PR, the workflow will **open or update a cleanup PR against `main` after merge**.'
150
- : 'The directory will be **automatically removed when the PR is approved**.';
151
72
  const body = `${marker}
152
73
  📁 **PR Artifacts Notice**
153
74
 
154
- This PR contains a \`.pr/\` directory with temporary PR-specific documents. ${cleanup}
75
+ This PR contains a \`.pr/\` directory with temporary PR-specific documents. The directory will be **automatically removed after this PR merges to \`main\`** through a cleanup PR opened or updated by this workflow.
155
76
  `;
156
77
 
157
78
  core.warning('.pr/ directory contains temporary PR-only artifacts');
@@ -171,8 +92,8 @@ jobs:
171
92
  });
172
93
  }
173
94
 
174
- # Fork branches cannot be modified reliably. If artifacts reach the trusted base,
175
- # remove them through a pull request so branch protections remain enforced.
95
+ # Remove artifacts from all merged PRs through the trusted base cleanup path,
96
+ # preserving branch protections and avoiding a cleanup push during review.
176
97
  cleanup-after-merge:
177
98
  concurrency:
178
99
  group: cleanup-pr-artifacts-${{ github.event.pull_request.base.ref }}
@@ -14,6 +14,19 @@ jobs:
14
14
  - name: Checkout repository
15
15
  uses: actions/checkout@v7
16
16
 
17
+ - name: Reject temporary artifacts in release PRs
18
+ if: >-
19
+ github.event_name == 'pull_request' &&
20
+ startsWith(github.head_ref, 'release-please--')
21
+ run: |
22
+ set -euo pipefail
23
+ artifacts="$(git ls-tree -r --name-only HEAD -- .pr)"
24
+ if [ -n "$artifacts" ]; then
25
+ echo "::error::Release PR contains temporary .pr artifacts. Merge the cleanup PR and let release-please update this PR before merging."
26
+ printf '%s\n' "$artifacts"
27
+ exit 1
28
+ fi
29
+
17
30
  - name: Install uv
18
31
  uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
19
32
  with:
@@ -23,7 +36,7 @@ jobs:
23
36
  - name: Setup Node.js
24
37
  uses: actions/setup-node@v7
25
38
  with:
26
- node-version: "20"
39
+ node-version: "24"
27
40
 
28
41
  - name: Run tests
29
42
  run: uv run --group test pytest tests/
@@ -92,6 +92,19 @@
92
92
  "openhands"
93
93
  ]
94
94
  },
95
+ {
96
+ "name": "software-factory",
97
+ "source": "./skills/software-factory",
98
+ "description": "Set up a GitHub software factory fast: ask only for the repositories and the ticket source (GitHub issues, Jira or Linear), create a working issue-to-PR and PR-review pipeline from catalog automations with defaults, then let the user stop or extend it step by step.",
99
+ "category": "automations",
100
+ "keywords": [
101
+ "onboarding",
102
+ "software-factory",
103
+ "github",
104
+ "automation",
105
+ "pull-request"
106
+ ]
107
+ },
95
108
  {
96
109
  "name": "agent-canvas-environment",
97
110
  "source": "./skills/agent-canvas-environment",
@@ -752,7 +765,7 @@
752
765
  {
753
766
  "name": "gitlab-issue-to-mr",
754
767
  "source": "./skills/gitlab-issue-to-mr",
755
- "description": "Create an automation that implements GitLab issues when a configurable trigger label is applied. Clones the default branch for the agent, then commits, pushes, and opens the merge request itself - the agent is handed no push credential.",
768
+ "description": "Create an automation that implements GitLab issues when a configurable trigger label is applied. Polls the projects deterministically and starts one conversation per label event; on OpenHands Cloud and Enterprise it reaches GitLab through the connected MCP server or integration, with no token to set up.",
756
769
  "category": "automations",
757
770
  "keywords": [
758
771
  "gitlab",
@@ -851,11 +864,14 @@
851
864
  {
852
865
  "name": "jira-issue-to-pr",
853
866
  "source": "./skills/jira-issue-to-pr",
854
- "description": "Deploy a cron-based OpenHands automation that watches a Jira Cloud project for issues labeled with a configurable label (default: create-pr) and spawns an agent conversation to create a GitHub pull request for each new issue found. The target GitHub repo is read from the ticket body - no repo parameter required at deploy time.",
867
+ "description": "Deploy a cron-based OpenHands automation that opens a GitHub pull request, a GitLab merge request or a Bitbucket pull request for each Jira issue carrying a configurable label (default: create-pr). The target repository is read from the ticket body - no repo parameter required at deploy time.",
855
868
  "category": "automations",
856
869
  "keywords": [
857
870
  "jira",
858
- "atlassian"
871
+ "atlassian",
872
+ "github",
873
+ "gitlab",
874
+ "bitbucket"
859
875
  ]
860
876
  },
861
877
  {
@@ -873,10 +889,9 @@
873
889
  {
874
890
  "name": "ticket-to-code-change",
875
891
  "source": "./skills/ticket-to-code-change",
876
- "description": "Set up Jira or Linear ticket-to-code-change automations for GitHub, GitLab, and Bitbucket.",
892
+ "description": "Set up Linear ticket-to-code-change automations for GitHub, GitLab, and Bitbucket.",
877
893
  "category": "automations",
878
894
  "keywords": [
879
- "jira",
880
895
  "linear",
881
896
  "github",
882
897
  "gitlab",
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.29.0"
2
+ ".": "0.31.0"
3
3
  }
package/AGENTS.md CHANGED
@@ -146,7 +146,7 @@ When editing or adding skills in this repo, follow these rules (and add new skil
146
146
 
147
147
  ## PR-specific documents (`.pr/`)
148
148
 
149
- When working on a PR that requires design documents, live-test logs, development-only scripts, or other temporary artifacts that should **not** be merged to `main`, store them in a `.pr/` directory at the repository root.
149
+ When working on a PR that requires design documents, live-test logs, development-only scripts, or other temporary artifacts that should be removed after merging to `main`, store them in a `.pr/` directory at the repository root.
150
150
 
151
151
  ```bash
152
152
  mkdir -p .pr
@@ -160,14 +160,15 @@ mkdir -p .pr
160
160
  The `PR Artifacts` workflow (`.github/workflows/pr-artifacts.yml`) owns the lifecycle of this directory:
161
161
 
162
162
  1. **Notification**: When a PR contains `.pr/`, a single comment is posted to the PR conversation alerting reviewers.
163
- 2. **Auto-cleanup on approval**: For same-repository PRs, the directory is automatically removed by a follow-up commit when the PR is approved.
164
- 3. **Post-merge cleanup**: If artifacts reach `main`, including through a fork PR, the workflow opens or updates a cleanup PR against `main`.
163
+ 2. **Post-merge cleanup**: After a same-repository or fork PR merges to `main`, the workflow automatically opens or updates a cleanup PR to remove the directory from `main`.
165
164
 
166
165
  Important notes:
167
166
 
168
167
  - Do not put anything in `.pr/` that needs to be preserved.
169
168
  - The `.pr/` check is informational during development; it posts a notice rather than blocking the PR.
170
169
  - Cleanup PRs follow the normal review and required-check protections for `main`.
170
+ - npm packaging excludes `.pr/` while its cleanup PR is pending, so temporary review artifacts do not ship in releases.
171
+ - Release PRs fail the required `test` check while their committed tree contains `.pr/`. Merge the artifact-cleanup PR and let release-please update the release PR before merging it.
171
172
 
172
173
  ## CI / validation gotchas
173
174
 
package/README.md CHANGED
@@ -100,7 +100,7 @@ The JS and Python versions are kept in lock-step by `release-please` and guarded
100
100
  ## Extensions Catalog
101
101
 
102
102
  <!-- BEGIN AUTO-GENERATED CATALOG -->
103
- This repository contains **2 marketplace(s)** with **77 extensions** (66 skills, 11 plugins).
103
+ This repository contains **2 marketplace(s)** with **78 extensions** (67 skills, 11 plugins).
104
104
 
105
105
  ### large-codebase
106
106
 
@@ -119,7 +119,7 @@ OpenHands skills for interacting, improving, and refactoring large codebases
119
119
 
120
120
  Official skills and plugins for OpenHands — the open-source AI software engineer.
121
121
 
122
- **73 extensions** (64 skills, 9 plugins)
122
+ **74 extensions** (65 skills, 9 plugins)
123
123
 
124
124
  | Name | Type | Description | Commands |
125
125
  |------|------|-------------|----------|
@@ -154,10 +154,10 @@ Official skills and plugins for OpenHands — the open-source AI software engine
154
154
  | github-repo-monitor | skill | Create a cron automation that polls a GitHub repository for issue and PR comments containing a configurable trigger p... | `/github-monitor:poll` |
155
155
  | github-stale-ci-pr-closer | skill | Warn and close abandoned pull requests whose required CI remains failing. | `/github-stale-ci-pr-closer` |
156
156
  | gitlab | skill | Interact with GitLab repositories, merge requests, and APIs using the GITLAB_TOKEN environment variable. Use when wor... | — |
157
- | gitlab-issue-to-mr | skill | Create an automation that implements GitLab issues when a configurable trigger label is applied. Clones the default b... | `/issue-to-mr:setup` |
157
+ | gitlab-issue-to-mr | skill | Create an automation that implements GitLab issues when a configurable trigger label is applied. Polls the projects d... | `/issue-to-mr:setup` |
158
158
  | incident-retrospective | skill | Create an automation that drafts incident retrospectives by gathering incident-channel messages from Slack, collectin... | `/incident-retro:setup` |
159
159
  | iterate | skill | Iterate on a GitHub pull request — drive it through CI, code review, and QA until merge-ready. Monitors state, fixes ... | `/iterate`, `/verify`, `/babysit` |
160
- | jira-issue-to-pr | skill | Deploy a cron-based OpenHands automation that watches a Jira Cloud project for issues labeled with a configurable lab... | — |
160
+ | jira-issue-to-pr | skill | Deploy a cron-based OpenHands automation that opens a GitHub pull request, a GitLab merge request or a Bitbucket pull... | — |
161
161
  | jupyter | skill | Read, modify, execute, and convert Jupyter notebooks programmatically. Use when working with .ipynb files for data sc... | — |
162
162
  | kubernetes | skill | Set up and manage local Kubernetes clusters using KIND (Kubernetes IN Docker). Use when testing Kubernetes applicatio... | — |
163
163
  | learn-from-code-review | skill | Distill code review feedback from GitHub PRs into reusable skills and guidelines. Use when users ask to learn from co... | `/learn-from-reviews` |
@@ -186,11 +186,12 @@ Official skills and plugins for OpenHands — the open-source AI software engine
186
186
  | skill-creator | skill | Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an ex... | — |
187
187
  | slack-channel-monitor | skill | Create a cron automation that polls up to 10 Slack channels every minute and starts an OpenHands conversation when a ... | `/slack-monitor:poll` |
188
188
  | slack-standup-digest | skill | Create an automation that generates an async standup digest from Slack. Searches selected channels for messages since... | `/standup-digest:setup` |
189
+ | software-factory | skill | Set up a GitHub software factory fast: ask only for the repositories and the ticket source (GitHub issues, Jira or Li... | `/software-factory` |
189
190
  | ssh | skill | Establish and manage SSH connections to remote machines, including key generation, configuration, and file transfers.... | — |
190
191
  | swift-linux | skill | Install and configure Swift programming language on Debian Linux for server-side development. Use when building Swift... | — |
191
192
  | technical-writing | skill | Write and revise technical explanations in flowing, direct, conversational prose that stays concise without becoming ... | — |
192
193
  | theme-factory | skill | Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc.... | — |
193
- | ticket-to-code-change | skill | Set up Jira or Linear ticket-to-code-change automations for GitHub, GitLab, and Bitbucket. | `/ticket-to-code-change:setup` |
194
+ | ticket-to-code-change | skill | Set up Linear ticket-to-code-change automations for GitHub, GitLab, and Bitbucket. | `/ticket-to-code-change:setup` |
194
195
  | upstream-fork-sync | skill | Keep a long-lived fork in sync with its upstream. Creates a cron automation that fetches upstream changes, rebases lo... | `/upstream-fork-sync:setup` |
195
196
  | use-jev | skill | Use Jev, a general classifier, for typed choices, scores, and yes/no probabilities in software. | — |
196
197
  | uv | skill | Common project, dependency, and environment operations using uv. | — |
@@ -1,13 +1,15 @@
1
1
  # VS Code App
2
2
 
3
- This App provides a full-height OpenVSCode editor. Before the backend is ready, the App shows backend status, an explicit workspace-folder input, and revision-bound prepare/start/stop/refresh actions. Once ready, the page contains only the editor iframe. The folder is persisted in browser storage and sent as an optional `query.folder` mount parameter; it is a user convenience, not OS sandboxing.
3
+ Install this App in Agent Canvas by opening **Apps → Add App** and entering:
4
4
 
5
- ## Artifact delivery
5
+ ```text
6
+ https://github.com/OpenHands/extensions/tree/main/apps/vscode
7
+ ```
6
8
 
7
- The repository intentionally contains no OpenVSCode binaries. `scripts/package.mjs` downloads the pinned upstream OpenVSCode Server `v1.109.5` Linux amd64 and arm64 archives, verifies their upstream checksums, normalizes the archive layout and metadata, and writes the package-contained archives required by `canvas-extension.json`. The GitHub Actions workflow publishes the resulting `vscode-app-<commit>` artifact; that archive is the installable coordinate for this revision.
9
+ The App provides a full-height OpenVSCode editor. Before the backend is ready, it shows backend status, an optional workspace-folder input, and revision-bound prepare/start/stop/refresh actions. Once ready, the page contains only the editor iframe.
8
10
 
9
- The package is not a release until reviewed and merged. The workflow artifact is a development delivery coordinate, not a published release or a version pin for Agent Server. This App depends on the Canvas consumer change that adds optional `mount({ container, query: { folder } })` support; until that consumer PR lands, setup works but the selected folder is not forwarded to OpenVSCode.
11
+ ## Artifact delivery
10
12
 
11
- The backend uses app-owned data directories for user data and extensions and receives only the manifest allowlisted environment. It does not receive Agent Server credentials. OpenVSCode starts at the existing app-owned `{data_dir}` by default; the optional folder query changes the editor folder only when the Canvas consumer supports it. Folder selection is not OS sandboxing.
13
+ The repository contains no OpenVSCode binaries. During the explicit **Prepare and start** step, Agent Server downloads only the current platform's pinned OpenVSCode Server `v1.109.5` archive from its public GitHub Release, verifies the manifest-pinned SHA-256 digest, safely extracts it into an App-owned content-addressed cache, and starts it with App-owned home, user-data, and extensions directories. It does not send Agent Server or repository credentials to the artifact host.
12
14
 
13
- The real ngrok editor/save/terminal click-through GIF is maintained in the Agent Canvas implementation PR as development-stack evidence. It is not bundled here and is not a release or package test.
15
+ The optional folder is persisted in browser storage and forwarded as the editor folder. It is a user convenience, not OS sandboxing.
@@ -9,10 +9,18 @@
9
9
  "backend": {
10
10
  "schema_version": 1,
11
11
  "artifacts": {
12
- "linux-amd64": {"path": "backend/openvscode-linux-amd64.tar.gz", "sha256": "5ad14274cc5e5ed938ffecf1dd53c0e58272828d8b50cb5da93b6d9e5d2cd9d5"},
13
- "linux-arm64": {"path": "backend/openvscode-linux-arm64.tar.gz", "sha256": "91876160f1b549020204e3909ad42a80d22ef0ebf66a62306cdf60ca5d44524b"}
12
+ "linux-amd64": {
13
+ "url": "https://github.com/gitpod-io/openvscode-server/releases/download/openvscode-server-v1.109.5/openvscode-server-v1.109.5-linux-x64.tar.gz",
14
+ "sha256": "b433bf4f0227321a7014d8460d10a8f958adc0f45aa79bd889e84e65e8f88363",
15
+ "strip_components": 1
16
+ },
17
+ "linux-arm64": {
18
+ "url": "https://github.com/gitpod-io/openvscode-server/releases/download/openvscode-server-v1.109.5/openvscode-server-v1.109.5-linux-arm64.tar.gz",
19
+ "sha256": "36d9c14036489b63de84ebace837fcacf7e60e669a0dc715802c5443684ea4dc",
20
+ "strip_components": 1
21
+ }
14
22
  },
15
- "argv": ["{artifact_dir}/bin/openvscode-bootstrap", "--host", "127.0.0.1", "--port", "{port}", "--without-connection-token", "--accept-server-license-terms", "--telemetry-level", "off", "--user-data-dir", "{data_dir}/user", "--extensions-dir", "{data_dir}/extensions", "--server-base-path", "/app-backends/vscode", "{data_dir}"],
23
+ "argv": ["{artifact_dir}/bin/openvscode-server", "--host", "127.0.0.1", "--port", "{port}", "--without-connection-token", "--accept-server-license-terms", "--telemetry-level", "off", "--user-data-dir", "{data_dir}/user", "--extensions-dir", "{data_dir}/extensions", "--server-base-path", "/app-backends/vscode", "{data_dir}"],
16
24
  "health": {"path": "/", "timeout_seconds": 90, "interval_seconds": 0.5},
17
25
  "inherit_environment": ["PATH", "LANG", "LC_ALL", "TMPDIR"]
18
26
  }