@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.
- package/.agents/skills/custom-codereview-guide.md +47 -5
- package/.claude-plugin/marketplace.json +20 -5
- package/.codex-plugin/marketplace.json +20 -5
- package/.github/workflows/build-vscode-app.yml +3 -3
- package/.github/workflows/check-extensions.yml +1 -1
- package/.github/workflows/pr-artifacts.yml +4 -83
- package/.github/workflows/tests.yml +14 -1
- package/.plugin/marketplace.json +20 -5
- package/.release-please-manifest.json +1 -1
- package/AGENTS.md +4 -3
- package/README.md +6 -5
- package/apps/vscode/README.md +8 -6
- package/apps/vscode/canvas-extension.json +11 -3
- package/apps/vscode/extension.js +60 -12
- package/apps/vscode/scripts/package.mjs +20 -74
- package/automations/bundle-index.js +10 -8
- package/automations/catalog/github-issue-to-pr/manifest.json +1 -1
- package/automations/catalog/github-issue-triage/manifest.json +4 -3
- package/automations/catalog/github-pr-reviewer/manifest.json +7 -6
- package/automations/catalog/gitlab-issue-to-mr/manifest.json +3 -3
- package/automations/catalog/jira-issue-to-bitbucket-pr/manifest.json +4 -4
- package/automations/catalog/jira-issue-to-gitlab-mr/manifest.json +5 -5
- package/automations/catalog/jira-issue-to-pr/manifest.json +1 -1
- package/integrations/catalog/atlassian-rovo.json +4 -3
- package/integrations/catalog/bitbucket.json +16 -1
- package/integrations/catalog/github.json +1 -0
- package/integrations/catalog/gitlab.json +1 -1
- package/marketplaces/openhands-extensions.json +20 -5
- package/package.json +1 -1
- package/plugins/pr-review/README.md +1 -0
- package/plugins/pr-review/scripts/prompt.py +44 -11
- package/plugins/runtime-api-configs/SKILL.md +1 -1
- package/plugins/vulnerability-remediation/skills/github/scripts/agent_conversation.py +224 -8
- package/pyproject.toml +1 -1
- package/python/openhands_extensions/_version.py +1 -1
- package/skills/canvas-extension-api/references/backend-safety.md +3 -3
- package/skills/canvas-extension-api/references/v1-contract.md +7 -4
- package/skills/canvas-extension-api/scripts/validate-extension.mjs +17 -1
- package/skills/canvas-extension-api/scripts/validate-extension.test.mjs +49 -0
- package/skills/github/scripts/agent_conversation.py +224 -8
- package/skills/github-issue-to-pr/scripts/agent_conversation.py +224 -8
- package/skills/github-issue-triage/README.md +73 -14
- package/skills/github-issue-triage/SKILL.md +26 -46
- package/skills/github-issue-triage/scripts/agent_conversation.py +224 -8
- package/skills/github-issue-triage/scripts/triage_publication.py +293 -0
- package/skills/github-issue-triage/scripts/worker.py +153 -103
- package/skills/github-pr-reviewer/README.md +109 -1
- package/skills/github-pr-reviewer/SKILL.md +42 -8
- package/skills/github-pr-reviewer/references/state-schema.md +8 -0
- package/skills/github-pr-reviewer/scripts/agent_conversation.py +224 -8
- package/skills/github-pr-reviewer/scripts/main.py +163 -39
- package/skills/github-pr-reviewer/scripts/publication.py +193 -0
- package/skills/github-pr-reviewer/scripts/worker.py +297 -8
- package/skills/github-pr-reviewer/tests/test_main.py +73 -5
- package/skills/github-stale-ci-pr-closer/scripts/worker.py +8 -2
- package/skills/gitlab-issue-to-mr/README.md +10 -3
- package/skills/gitlab-issue-to-mr/SKILL.md +43 -9
- package/skills/gitlab-issue-to-mr/references/state-schema.md +4 -0
- package/skills/gitlab-issue-to-mr/scripts/main.py +359 -25
- package/skills/index.js +18 -8
- package/skills/jira-issue-to-pr/.claude-plugin/plugin.json +4 -1
- package/skills/jira-issue-to-pr/.codex-plugin/plugin.json +4 -1
- package/skills/jira-issue-to-pr/.plugin/plugin.json +4 -1
- package/skills/jira-issue-to-pr/README.md +18 -11
- package/skills/jira-issue-to-pr/SKILL.md +72 -23
- package/skills/jira-issue-to-pr/references/setup.md +43 -12
- package/skills/jira-issue-to-pr/scripts/main.py +136 -26
- package/skills/slack-channel-monitor/README.md +12 -3
- package/skills/slack-channel-monitor/SKILL.md +35 -20
- package/skills/slack-channel-monitor/references/windows.md +6 -2
- package/skills/slack-channel-monitor/scripts/main.py +189 -12
- package/skills/software-factory/.claude-plugin/plugin.json +19 -0
- package/skills/software-factory/.codex-plugin/plugin.json +19 -0
- package/skills/software-factory/.plugin/plugin.json +19 -0
- package/skills/software-factory/README.md +64 -0
- package/skills/software-factory/SKILL.md +229 -0
- package/skills/software-factory/commands/software-factory.md +8 -0
- package/skills/software-factory/scripts/factory.py +630 -0
- package/skills/ticket-to-code-change/.claude-plugin/plugin.json +1 -2
- package/skills/ticket-to-code-change/.codex-plugin/plugin.json +1 -2
- package/skills/ticket-to-code-change/.plugin/plugin.json +1 -2
- package/skills/ticket-to-code-change/SKILL.md +5 -3
- package/skills/ticket-to-code-change/commands/ticket-to-code-change-setup.md +1 -1
- package/tests/fixtures/automations/github-pr-reviewer.json +9 -9
- package/tests/test_agent_conversation_dispatch.py +173 -6
- package/tests/test_automation_llm_provenance.py +1209 -0
- package/tests/test_github_review_publication.py +422 -0
- package/tests/test_github_reviewer_delivery.py +174 -21
- package/tests/test_github_stale_ci_pr_closer.py +52 -1
- package/tests/test_github_triage_delivery.py +411 -238
- package/tests/test_gitlab_issue_to_mr.py +284 -0
- package/tests/test_jira_issue_to_pr.py +200 -6
- package/tests/test_pr_review_prompt_injection.py +353 -0
- package/tests/test_slack_channel_monitor.py +32 -1
- package/tests/test_software_factory_script.py +231 -0
- package/tests/test_vscode_app.py +8 -2
- 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
|
-
##
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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: "
|
|
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/
|
|
25
|
-
test -
|
|
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 }}
|
|
@@ -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
|
-
#
|
|
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.
|
|
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
|
-
#
|
|
175
|
-
#
|
|
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: "
|
|
39
|
+
node-version: "24"
|
|
27
40
|
|
|
28
41
|
- name: Run tests
|
|
29
42
|
run: uv run --group test pytest tests/
|
package/.plugin/marketplace.json
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
|
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",
|
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
|
|
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. **
|
|
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 **
|
|
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
|
-
**
|
|
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.
|
|
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
|
|
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
|
|
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. | — |
|
package/apps/vscode/README.md
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
# VS Code App
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Install this App in Agent Canvas by opening **Apps → Add App** and entering:
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
```text
|
|
6
|
+
https://github.com/OpenHands/extensions/tree/main/apps/vscode
|
|
7
|
+
```
|
|
6
8
|
|
|
7
|
-
The
|
|
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
|
-
|
|
11
|
+
## Artifact delivery
|
|
10
12
|
|
|
11
|
-
The
|
|
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
|
|
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": {
|
|
13
|
-
|
|
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-
|
|
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
|
}
|