@openhands/extensions 0.7.2 → 0.9.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/.release-please-manifest.json +1 -1
- package/README.md +4 -2
- package/automations/catalog/jira-issue-to-pr.json +14 -0
- package/automations/index.js +2 -0
- package/integrations/catalog/atlassian.json +78 -3
- package/integrations/catalog/datadog.json +33 -2
- package/integrations/catalog/notion.json +16 -16
- package/integrations/catalog/superhuman-mail.json +36 -0
- package/integrations/catalog-index.js +45 -43
- package/marketplaces/openhands-extensions.json +19 -0
- package/package.json +1 -1
- package/plugins/cobol-modernization/skills/build-setup/SKILL.md +1 -0
- package/plugins/cobol-modernization/skills/cobol-modernization/SKILL.md +9 -0
- package/plugins/migration-scoring/skills/migration-scoring/SKILL.md +11 -0
- package/plugins/onboarding/skills/agent-readiness-report/SKILL.md +2 -0
- package/plugins/openhands/SKILL.md +7 -0
- package/plugins/release-notes/SKILL.md +9 -0
- package/pyproject.toml +1 -1
- package/python/openhands_extensions/_version.py +1 -1
- package/scripts/build-skills-catalog.mjs +1 -1
- package/skills/add-skill/SKILL.md +2 -0
- package/skills/azure-devops/SKILL.md +12 -1
- package/skills/bitbucket-cloud/SKILL.md +11 -0
- package/skills/code-review/SKILL.md +1 -0
- package/skills/datadog/SKILL.md +3 -1
- package/skills/datadog/references/windows.md +45 -0
- package/skills/discord/SKILL.md +2 -0
- package/skills/docker/SKILL.md +5 -1
- package/skills/github/SKILL.md +3 -1
- package/skills/github/references/windows.md +48 -0
- package/skills/github-pr-review/SKILL.md +1 -0
- package/skills/github-pr-review/references/windows.md +47 -0
- package/skills/github-pr-reviewer/SKILL.md +1 -0
- package/skills/github-pr-reviewer/references/windows.md +61 -0
- package/skills/github-repo-monitor/SKILL.md +1 -0
- package/skills/github-repo-monitor/references/windows.md +61 -0
- package/skills/gitlab/SKILL.md +3 -1
- package/skills/incident-retrospective/SKILL.md +2 -0
- package/skills/index.js +45 -30
- package/skills/iterate/SKILL.md +1 -0
- package/skills/iterate/references/windows.md +41 -0
- package/skills/jira-issue-to-pr/.plugin/plugin.json +19 -0
- package/skills/jira-issue-to-pr/README.md +56 -0
- package/skills/jira-issue-to-pr/SKILL.md +216 -0
- package/skills/jira-issue-to-pr/references/setup.md +170 -0
- package/skills/jira-issue-to-pr/scripts/main.py +341 -0
- package/skills/jupyter/SKILL.md +7 -1
- package/skills/kubernetes/SKILL.md +2 -1
- package/skills/kubernetes/references/windows.md +38 -0
- package/skills/linear/SKILL.md +2 -0
- package/skills/linear/references/windows.md +29 -0
- package/skills/linear-triage/SKILL.md +2 -0
- package/skills/notion/SKILL.md +2 -0
- package/skills/notion/references/windows.md +43 -0
- package/skills/openhands-api/SKILL.md +1 -0
- package/skills/openhands-api/references/windows.md +44 -0
- package/skills/openhands-automation/SKILL.md +1 -0
- package/skills/openhands-automation/references/custom-automation.md +20 -0
- package/skills/openhands-automation/references/windows.md +57 -0
- package/skills/pdflatex/SKILL.md +3 -1
- package/skills/plain-english-content/.plugin/plugin.json +15 -0
- package/skills/plain-english-content/README.md +12 -0
- package/skills/plain-english-content/SKILL.md +78 -0
- package/skills/research-brief/SKILL.md +2 -0
- package/skills/skill-creator/SKILL.md +1 -0
- package/skills/skill-creator/references/windows.md +30 -0
- package/skills/slack-channel-monitor/SKILL.md +1 -0
- package/skills/slack-channel-monitor/references/windows.md +64 -0
- package/skills/slack-standup-digest/SKILL.md +2 -0
- package/skills/spark-version-upgrade/SKILL.md +2 -1
- package/skills/ssh/SKILL.md +2 -1
- package/skills/ssh/references/windows.md +59 -0
- package/skills/swift-linux/SKILL.md +2 -1
- package/skills/vercel/SKILL.md +5 -0
- package/tests/test_catalogs.py +6 -1
package/README.md
CHANGED
|
@@ -87,7 +87,7 @@ The JS and Python versions are kept in lock-step by `release-please` and guarded
|
|
|
87
87
|
## Extensions Catalog
|
|
88
88
|
|
|
89
89
|
<!-- BEGIN AUTO-GENERATED CATALOG -->
|
|
90
|
-
This repository contains **2 marketplace(s)** with **
|
|
90
|
+
This repository contains **2 marketplace(s)** with **62 extensions** (52 skills, 10 plugins).
|
|
91
91
|
|
|
92
92
|
### large-codebase
|
|
93
93
|
|
|
@@ -106,7 +106,7 @@ OpenHands skills for interacting, improving, and refactoring large codebases
|
|
|
106
106
|
|
|
107
107
|
Official skills and plugins for OpenHands — the open-source AI software engineer.
|
|
108
108
|
|
|
109
|
-
**
|
|
109
|
+
**58 extensions** (50 skills, 8 plugins)
|
|
110
110
|
|
|
111
111
|
| Name | Type | Description | Commands |
|
|
112
112
|
|------|------|-------------|----------|
|
|
@@ -137,6 +137,7 @@ Official skills and plugins for OpenHands — the open-source AI software engine
|
|
|
137
137
|
| gitlab | skill | Interact with GitLab repositories, merge requests, and APIs using the GITLAB_TOKEN environment variable. Use when wor... | — |
|
|
138
138
|
| incident-retrospective | skill | Create an automation that drafts incident retrospectives by gathering incident-channel messages from Slack, collectin... | `/incident-retro:setup` |
|
|
139
139
|
| 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` |
|
|
140
|
+
| jira-issue-to-pr | skill | Deploy a cron-based OpenHands automation that watches a Jira Cloud project for issues labeled with a configurable lab... | — |
|
|
140
141
|
| jupyter | skill | Read, modify, execute, and convert Jupyter notebooks programmatically. Use when working with .ipynb files for data sc... | — |
|
|
141
142
|
| kubernetes | skill | Set up and manage local Kubernetes clusters using KIND (Kubernetes IN Docker). Use when testing Kubernetes applicatio... | — |
|
|
142
143
|
| 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` |
|
|
@@ -151,6 +152,7 @@ Official skills and plugins for OpenHands — the open-source AI software engine
|
|
|
151
152
|
| openhands-automation | skill | Create and manage OpenHands automations - scheduled tasks that run in sandboxes. Use the prompt preset to create auto... | `/automation:create` |
|
|
152
153
|
| openhands-sdk | skill | Reference skill for the OpenHands Software Agent SDK - build AI agents with custom tools, LLM configuration, conversa... | `/sdk` |
|
|
153
154
|
| pdflatex | skill | Install and use pdflatex to compile LaTeX documents into PDFs on Linux. Use when generating academic papers, research... | — |
|
|
155
|
+
| plain-english-content | skill | Write and edit clear, accessible prose in a plain English content style: active voice, front-loaded content, sentence... | — |
|
|
154
156
|
| pr-review | plugin | Automated PR code review — analyzes diffs and posts inline review comments via the GitHub API. | — |
|
|
155
157
|
| prd | skill | Generate a Product Requirements Document (PRD) for a new feature through an interactive clarifying-question workflow.... | `/prd` |
|
|
156
158
|
| qa-changes | plugin | Validate pull request changes by actually running the code — setting up the environment, exercising changed behavior,... | — |
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "jira-issue-to-pr",
|
|
3
|
+
"name": "Jira issue to GitHub PR",
|
|
4
|
+
"category": "Project management",
|
|
5
|
+
"description": "Watch a Jira Cloud project for issues with a configurable label and automatically open 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.",
|
|
6
|
+
"requiredIntegrationIds": [
|
|
7
|
+
"jira",
|
|
8
|
+
"github"
|
|
9
|
+
],
|
|
10
|
+
"popularityRank": 85,
|
|
11
|
+
"estimatedSetupMinutes": 5,
|
|
12
|
+
"prompt": "Set up a Jira automation to create pull requests",
|
|
13
|
+
"exampleImplementation": "Trigger: cron polling (e.g. every 5 minutes)\nRequired secrets: Jira API token, GitHub personal access token (repo + workflow scope)\n\n1. Collect Jira base URL, email, API token secret name, label to watch, and cron schedule from the user. No GitHub repo is needed at deploy time - each ticket must include the target repo (owner/repo) in its body.\n2. Poll POST /rest/api/3/search/jql on the Jira Cloud instance to find open issues carrying the configured label.\n3. Deduplicate against a KV-store-backed set of already-processed issue keys so re-runs never create duplicate PRs.\n4. For each new issue, start an independent OpenHands agent conversation that extracts the GitHub repo from the ticket body, clones it, creates a branch named after the Jira key, implements or scaffolds the requested change, and opens a pull request.\n5. Immediately after the conversation is created, post a Jira comment on the issue: 'I'm on it: <conversation URL>'.\n6. Persist the processed issue key immediately after dispatching so the next poll skips it."
|
|
14
|
+
}
|
package/automations/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import slack_channel_monitor from "./catalog/slack-channel-monitor.json" with {
|
|
|
5
5
|
import linear_triage_assistant from "./catalog/linear-triage-assistant.json" with { type: "json" };
|
|
6
6
|
import research_brief_writer from "./catalog/research-brief-writer.json" with { type: "json" };
|
|
7
7
|
import incident_retrospective_drafter from "./catalog/incident-retrospective-drafter.json" with { type: "json" };
|
|
8
|
+
import jira_issue_to_pr from "./catalog/jira-issue-to-pr.json" with { type: "json" };
|
|
8
9
|
|
|
9
10
|
export const AUTOMATION_CATALOG = [
|
|
10
11
|
github_pr_reviewer,
|
|
@@ -14,5 +15,6 @@ export const AUTOMATION_CATALOG = [
|
|
|
14
15
|
linear_triage_assistant,
|
|
15
16
|
research_brief_writer,
|
|
16
17
|
incident_retrospective_drafter,
|
|
18
|
+
jira_issue_to_pr,
|
|
17
19
|
];
|
|
18
20
|
export default AUTOMATION_CATALOG;
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "atlassian",
|
|
3
3
|
"name": "Atlassian (Jira & Confluence)",
|
|
4
|
-
"description": "Search Jira issues and Confluence pages
|
|
5
|
-
"
|
|
4
|
+
"description": "Search Jira issues, manage tickets, and read Confluence pages from your agent.",
|
|
5
|
+
"categories": [
|
|
6
|
+
"Project management",
|
|
7
|
+
"Documentation"
|
|
8
|
+
],
|
|
9
|
+
"appUrl": "https://www.atlassian.com",
|
|
10
|
+
"docsUrl": "https://mcp-atlassian.soomiles.com/docs/installation",
|
|
6
11
|
"iconBg": "#0052CC",
|
|
7
12
|
"logoUrl": "https://cdn.simpleicons.org/atlassian/FFFFFF",
|
|
8
13
|
"keywords": [
|
|
@@ -10,8 +15,11 @@
|
|
|
10
15
|
"confluence",
|
|
11
16
|
"tickets",
|
|
12
17
|
"wiki",
|
|
13
|
-
"issues"
|
|
18
|
+
"issues",
|
|
19
|
+
"sprint"
|
|
14
20
|
],
|
|
21
|
+
"popularityRank": 88,
|
|
22
|
+
"installHint": "Paste your Jira and/or Confluence URL and API token. The mcp-atlassian package runs via uvx - no install needed.",
|
|
15
23
|
"connectionOptions": [
|
|
16
24
|
{
|
|
17
25
|
"id": "oauth",
|
|
@@ -23,6 +31,73 @@
|
|
|
23
31
|
"auth": {
|
|
24
32
|
"strategy": "oauth2"
|
|
25
33
|
}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "api",
|
|
37
|
+
"provider": "mcp",
|
|
38
|
+
"transport": {
|
|
39
|
+
"kind": "stdio",
|
|
40
|
+
"serverName": "mcp-atlassian",
|
|
41
|
+
"command": "uvx",
|
|
42
|
+
"args": [
|
|
43
|
+
"mcp-atlassian"
|
|
44
|
+
],
|
|
45
|
+
"envFields": [
|
|
46
|
+
{
|
|
47
|
+
"key": "JIRA_URL",
|
|
48
|
+
"label": "Jira URL",
|
|
49
|
+
"type": "text",
|
|
50
|
+
"placeholder": "https://your-company.atlassian.net",
|
|
51
|
+
"required": false,
|
|
52
|
+
"helperText": "Your Atlassian Jira base URL. Omit if using Confluence only."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"key": "JIRA_USERNAME",
|
|
56
|
+
"label": "Jira username (email)",
|
|
57
|
+
"type": "text",
|
|
58
|
+
"placeholder": "your.email@company.com",
|
|
59
|
+
"required": false,
|
|
60
|
+
"helperText": "Email address linked to your Atlassian account."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"key": "JIRA_API_TOKEN",
|
|
64
|
+
"label": "Jira API token",
|
|
65
|
+
"type": "password",
|
|
66
|
+
"placeholder": "ATATT...",
|
|
67
|
+
"required": false,
|
|
68
|
+
"helperText": "Atlassian API token for Jira. Required when JIRA_URL is set.",
|
|
69
|
+
"helperLink": "https://id.atlassian.com/manage-profile/security/api-tokens"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"key": "CONFLUENCE_URL",
|
|
73
|
+
"label": "Confluence URL",
|
|
74
|
+
"type": "text",
|
|
75
|
+
"placeholder": "https://your-company.atlassian.net/wiki",
|
|
76
|
+
"required": false,
|
|
77
|
+
"helperText": "Your Atlassian Confluence base URL. Omit if using Jira only."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"key": "CONFLUENCE_USERNAME",
|
|
81
|
+
"label": "Confluence username (email)",
|
|
82
|
+
"type": "text",
|
|
83
|
+
"placeholder": "your.email@company.com",
|
|
84
|
+
"required": false,
|
|
85
|
+
"helperText": "Email address linked to your Atlassian account."
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"key": "CONFLUENCE_API_TOKEN",
|
|
89
|
+
"label": "Confluence API token",
|
|
90
|
+
"type": "password",
|
|
91
|
+
"placeholder": "ATATT...",
|
|
92
|
+
"required": false,
|
|
93
|
+
"helperText": "Atlassian API token for Confluence. Required when CONFLUENCE_URL is set.",
|
|
94
|
+
"helperLink": "https://id.atlassian.com/manage-profile/security/api-tokens"
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
"auth": {
|
|
99
|
+
"strategy": "api_key"
|
|
100
|
+
}
|
|
26
101
|
}
|
|
27
102
|
]
|
|
28
103
|
}
|
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
],
|
|
9
9
|
"appUrl": "https://www.datadoghq.com",
|
|
10
10
|
"docsUrl": "https://docs.datadoghq.com/bits_ai/mcp_server/setup/",
|
|
11
|
-
"notes": "Uses Datadog's official hosted MCP server. The default
|
|
11
|
+
"notes": "Uses Datadog's official hosted MCP server. The MCP endpoint host is site-specific: use https://mcp.<site>.datadoghq.com/v1/mcp for your Datadog site (e.g. mcp.us5.datadoghq.com for US5). The default URL below targets US1 and can be edited in the install dialog.",
|
|
12
12
|
"popularityRank": 35,
|
|
13
|
+
"installHint": "The Datadog MCP URL is site-specific. Edit the URL to https://mcp.<site>.datadoghq.com/v1/mcp for your Datadog site (for example https://mcp.us5.datadoghq.com/v1/mcp for US5, https://mcp.eu.datadoghq.com/v1/mcp for EU). Find your site at Organization Settings → Site in Datadog.",
|
|
13
14
|
"connectionOptions": [
|
|
14
15
|
{
|
|
15
16
|
"id": "oauth",
|
|
@@ -27,7 +28,37 @@
|
|
|
27
28
|
},
|
|
28
29
|
"transport": {
|
|
29
30
|
"kind": "shttp",
|
|
30
|
-
"url": "https://mcp.datadoghq.com/
|
|
31
|
+
"url": "https://mcp.datadoghq.com/v1/mcp"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "api",
|
|
36
|
+
"provider": "mcp",
|
|
37
|
+
"auth": {
|
|
38
|
+
"strategy": "none"
|
|
39
|
+
},
|
|
40
|
+
"transport": {
|
|
41
|
+
"kind": "shttp",
|
|
42
|
+
"url": "https://mcp.datadoghq.com/v1/mcp",
|
|
43
|
+
"urlEditable": true,
|
|
44
|
+
"headerFields": [
|
|
45
|
+
{
|
|
46
|
+
"key": "DD-API-KEY",
|
|
47
|
+
"label": "Datadog API key",
|
|
48
|
+
"type": "password",
|
|
49
|
+
"required": true,
|
|
50
|
+
"placeholder": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
|
|
51
|
+
"helperText": "Created in Datadog under Organization Settings → API Keys. Used to authenticate to the Datadog MCP server. See the [setup docs](https://docs.datadoghq.com/mcp_server/setup/?tab=other#authentication)."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"key": "DD-APPLICATION-KEY",
|
|
55
|
+
"label": "Datadog Application key",
|
|
56
|
+
"type": "password",
|
|
57
|
+
"required": true,
|
|
58
|
+
"placeholder": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
|
|
59
|
+
"helperText": "Created in Datadog under Organization Settings → Application Keys. Grants the MCP server access to your Datadog data. See the [setup docs](https://docs.datadoghq.com/mcp_server/setup/?tab=other#authentication)."
|
|
60
|
+
}
|
|
61
|
+
]
|
|
31
62
|
}
|
|
32
63
|
}
|
|
33
64
|
]
|
|
@@ -10,6 +10,22 @@
|
|
|
10
10
|
"docsUrl": "https://developers.notion.com/docs/mcp",
|
|
11
11
|
"popularityRank": 82,
|
|
12
12
|
"connectionOptions": [
|
|
13
|
+
{
|
|
14
|
+
"id": "oauth",
|
|
15
|
+
"provider": "http",
|
|
16
|
+
"auth": {
|
|
17
|
+
"strategy": "oauth2",
|
|
18
|
+
"oauth": {
|
|
19
|
+
"authorizationUrl": "https://api.notion.com/v1/oauth/authorize",
|
|
20
|
+
"tokenUrl": "https://api.notion.com/v1/oauth/token",
|
|
21
|
+
"scopes": []
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"http": {
|
|
25
|
+
"apiBaseUrl": "https://api.notion.com",
|
|
26
|
+
"openApiUrl": "https://developers.notion.com/openapi.json"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
13
29
|
{
|
|
14
30
|
"id": "api",
|
|
15
31
|
"provider": "mcp",
|
|
@@ -36,22 +52,6 @@
|
|
|
36
52
|
"auth": {
|
|
37
53
|
"strategy": "api_key"
|
|
38
54
|
}
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"id": "oauth",
|
|
42
|
-
"provider": "http",
|
|
43
|
-
"auth": {
|
|
44
|
-
"strategy": "oauth2",
|
|
45
|
-
"oauth": {
|
|
46
|
-
"authorizationUrl": "https://api.notion.com/v1/oauth/authorize",
|
|
47
|
-
"tokenUrl": "https://api.notion.com/v1/oauth/token",
|
|
48
|
-
"scopes": []
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
"http": {
|
|
52
|
-
"apiBaseUrl": "https://api.notion.com",
|
|
53
|
-
"openApiUrl": "https://developers.notion.com/openapi.json"
|
|
54
|
-
}
|
|
55
55
|
}
|
|
56
56
|
],
|
|
57
57
|
"iconBg": "#FFFFFF",
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "superhuman-mail",
|
|
3
|
+
"name": "Superhuman Mail",
|
|
4
|
+
"description": "Search, read, draft, and send email via Superhuman's hosted MCP server.",
|
|
5
|
+
"categories": [
|
|
6
|
+
"Communication",
|
|
7
|
+
"Email"
|
|
8
|
+
],
|
|
9
|
+
"appUrl": "https://superhuman.com",
|
|
10
|
+
"docsUrl": "https://github.com/superhuman/mcp-mail",
|
|
11
|
+
"notes": "OAuth is handled by the Superhuman MCP server itself (mcp-remote). No client credentials required.",
|
|
12
|
+
"connectionOptions": [
|
|
13
|
+
{
|
|
14
|
+
"id": "oauth",
|
|
15
|
+
"provider": "mcp",
|
|
16
|
+
"transport": {
|
|
17
|
+
"kind": "shttp",
|
|
18
|
+
"url": "https://mcp.mail.superhuman.com/mcp"
|
|
19
|
+
},
|
|
20
|
+
"auth": {
|
|
21
|
+
"strategy": "oauth2",
|
|
22
|
+
"oauth": {
|
|
23
|
+
"clientAuthentication": "none"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"iconBg": "#FF5C28",
|
|
29
|
+
"logoUrl": "https://cdn.simpleicons.org/superhuman/FFFFFF",
|
|
30
|
+
"keywords": [
|
|
31
|
+
"email",
|
|
32
|
+
"mail",
|
|
33
|
+
"superhuman",
|
|
34
|
+
"inbox"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
@@ -5,48 +5,48 @@
|
|
|
5
5
|
import entry0 from "./catalog/github.json" with { type: "json" };
|
|
6
6
|
import entry1 from "./catalog/slack.json" with { type: "json" };
|
|
7
7
|
import entry2 from "./catalog/tavily.json" with { type: "json" };
|
|
8
|
-
import entry3 from "./catalog/
|
|
9
|
-
import entry4 from "./catalog/
|
|
10
|
-
import entry5 from "./catalog/
|
|
11
|
-
import entry6 from "./catalog/
|
|
12
|
-
import entry7 from "./catalog/
|
|
13
|
-
import entry8 from "./catalog/
|
|
14
|
-
import entry9 from "./catalog/
|
|
15
|
-
import entry10 from "./catalog/
|
|
16
|
-
import entry11 from "./catalog/
|
|
17
|
-
import entry12 from "./catalog/
|
|
18
|
-
import entry13 from "./catalog/
|
|
19
|
-
import entry14 from "./catalog/
|
|
20
|
-
import entry15 from "./catalog/
|
|
21
|
-
import entry16 from "./catalog/
|
|
22
|
-
import entry17 from "./catalog/
|
|
23
|
-
import entry18 from "./catalog/
|
|
24
|
-
import entry19 from "./catalog/
|
|
25
|
-
import entry20 from "./catalog/
|
|
26
|
-
import entry21 from "./catalog/
|
|
27
|
-
import entry22 from "./catalog/
|
|
28
|
-
import entry23 from "./catalog/
|
|
29
|
-
import entry24 from "./catalog/
|
|
30
|
-
import entry25 from "./catalog/
|
|
31
|
-
import entry26 from "./catalog/
|
|
32
|
-
import entry27 from "./catalog/
|
|
33
|
-
import entry28 from "./catalog/
|
|
34
|
-
import entry29 from "./catalog/microsoft-
|
|
35
|
-
import entry30 from "./catalog/
|
|
36
|
-
import entry31 from "./catalog/
|
|
37
|
-
import entry32 from "./catalog/
|
|
38
|
-
import entry33 from "./catalog/
|
|
39
|
-
import entry34 from "./catalog/
|
|
40
|
-
import entry35 from "./catalog/
|
|
41
|
-
import entry36 from "./catalog/
|
|
42
|
-
import entry37 from "./catalog/
|
|
43
|
-
import entry38 from "./catalog/
|
|
44
|
-
import entry39 from "./catalog/
|
|
45
|
-
import entry40 from "./catalog/google-
|
|
46
|
-
import entry41 from "./catalog/
|
|
47
|
-
import entry42 from "./catalog/
|
|
48
|
-
import entry43 from "./catalog/
|
|
49
|
-
import entry44 from "./catalog/
|
|
8
|
+
import entry3 from "./catalog/atlassian.json" with { type: "json" };
|
|
9
|
+
import entry4 from "./catalog/linear.json" with { type: "json" };
|
|
10
|
+
import entry5 from "./catalog/notion.json" with { type: "json" };
|
|
11
|
+
import entry6 from "./catalog/ordinal.json" with { type: "json" };
|
|
12
|
+
import entry7 from "./catalog/elevenlabs.json" with { type: "json" };
|
|
13
|
+
import entry8 from "./catalog/bitbucket.json" with { type: "json" };
|
|
14
|
+
import entry9 from "./catalog/xero.json" with { type: "json" };
|
|
15
|
+
import entry10 from "./catalog/quickbooks.json" with { type: "json" };
|
|
16
|
+
import entry11 from "./catalog/okta.json" with { type: "json" };
|
|
17
|
+
import entry12 from "./catalog/netlify.json" with { type: "json" };
|
|
18
|
+
import entry13 from "./catalog/vercel.json" with { type: "json" };
|
|
19
|
+
import entry14 from "./catalog/supabase.json" with { type: "json" };
|
|
20
|
+
import entry15 from "./catalog/posthog.json" with { type: "json" };
|
|
21
|
+
import entry16 from "./catalog/sentry.json" with { type: "json" };
|
|
22
|
+
import entry17 from "./catalog/datadog.json" with { type: "json" };
|
|
23
|
+
import entry18 from "./catalog/canva.json" with { type: "json" };
|
|
24
|
+
import entry19 from "./catalog/miro.json" with { type: "json" };
|
|
25
|
+
import entry20 from "./catalog/webflow.json" with { type: "json" };
|
|
26
|
+
import entry21 from "./catalog/zoom.json" with { type: "json" };
|
|
27
|
+
import entry22 from "./catalog/discord.json" with { type: "json" };
|
|
28
|
+
import entry23 from "./catalog/stripe.json" with { type: "json" };
|
|
29
|
+
import entry24 from "./catalog/intercom.json" with { type: "json" };
|
|
30
|
+
import entry25 from "./catalog/hubspot.json" with { type: "json" };
|
|
31
|
+
import entry26 from "./catalog/salesforce.json" with { type: "json" };
|
|
32
|
+
import entry27 from "./catalog/sharepoint.json" with { type: "json" };
|
|
33
|
+
import entry28 from "./catalog/onedrive.json" with { type: "json" };
|
|
34
|
+
import entry29 from "./catalog/microsoft-teams.json" with { type: "json" };
|
|
35
|
+
import entry30 from "./catalog/microsoft-outlook.json" with { type: "json" };
|
|
36
|
+
import entry31 from "./catalog/box.json" with { type: "json" };
|
|
37
|
+
import entry32 from "./catalog/airtable.json" with { type: "json" };
|
|
38
|
+
import entry33 from "./catalog/monday.json" with { type: "json" };
|
|
39
|
+
import entry34 from "./catalog/trello.json" with { type: "json" };
|
|
40
|
+
import entry35 from "./catalog/asana.json" with { type: "json" };
|
|
41
|
+
import entry36 from "./catalog/confluence.json" with { type: "json" };
|
|
42
|
+
import entry37 from "./catalog/jira.json" with { type: "json" };
|
|
43
|
+
import entry38 from "./catalog/google-calendar.json" with { type: "json" };
|
|
44
|
+
import entry39 from "./catalog/gmail.json" with { type: "json" };
|
|
45
|
+
import entry40 from "./catalog/google-sheets.json" with { type: "json" };
|
|
46
|
+
import entry41 from "./catalog/google-drive.json" with { type: "json" };
|
|
47
|
+
import entry42 from "./catalog/figma.json" with { type: "json" };
|
|
48
|
+
import entry43 from "./catalog/google-docs.json" with { type: "json" };
|
|
49
|
+
import entry44 from "./catalog/apify.json" with { type: "json" };
|
|
50
50
|
import entry45 from "./catalog/brave-search.json" with { type: "json" };
|
|
51
51
|
import entry46 from "./catalog/browser-mcp.json" with { type: "json" };
|
|
52
52
|
import entry47 from "./catalog/clickhouse.json" with { type: "json" };
|
|
@@ -73,7 +73,8 @@ import entry67 from "./catalog/playwright.json" with { type: "json" };
|
|
|
73
73
|
import entry68 from "./catalog/redis.json" with { type: "json" };
|
|
74
74
|
import entry69 from "./catalog/resend.json" with { type: "json" };
|
|
75
75
|
import entry70 from "./catalog/sequential-thinking.json" with { type: "json" };
|
|
76
|
-
import entry71 from "./catalog/
|
|
76
|
+
import entry71 from "./catalog/superhuman-mail.json" with { type: "json" };
|
|
77
|
+
import entry72 from "./catalog/time.json" with { type: "json" };
|
|
77
78
|
|
|
78
79
|
export const INTEGRATION_CATALOG_ENTRIES = [
|
|
79
80
|
entry0,
|
|
@@ -148,4 +149,5 @@ export const INTEGRATION_CATALOG_ENTRIES = [
|
|
|
148
149
|
entry69,
|
|
149
150
|
entry70,
|
|
150
151
|
entry71,
|
|
152
|
+
entry72,
|
|
151
153
|
];
|
|
@@ -728,6 +728,25 @@
|
|
|
728
728
|
"cron",
|
|
729
729
|
"automation"
|
|
730
730
|
]
|
|
731
|
+
},
|
|
732
|
+
{
|
|
733
|
+
"name": "plain-english-content",
|
|
734
|
+
"source": "./skills/plain-english-content",
|
|
735
|
+
"description": "Write and edit clear, accessible prose in a plain English content style: active voice, front-loaded content, sentence case, and accessible formatting.",
|
|
736
|
+
"category": "productivity",
|
|
737
|
+
"keywords": [
|
|
738
|
+
"plain-english"
|
|
739
|
+
]
|
|
740
|
+
},
|
|
741
|
+
{
|
|
742
|
+
"name": "jira-issue-to-pr",
|
|
743
|
+
"source": "./skills/jira-issue-to-pr",
|
|
744
|
+
"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.",
|
|
745
|
+
"category": "productivity",
|
|
746
|
+
"keywords": [
|
|
747
|
+
"jira",
|
|
748
|
+
"atlassian"
|
|
749
|
+
]
|
|
731
750
|
}
|
|
732
751
|
]
|
|
733
752
|
}
|
package/package.json
CHANGED
|
@@ -13,6 +13,7 @@ triggers:
|
|
|
13
13
|
Set up a build environment and create test fixtures for validating COBOL-to-Java migrations.
|
|
14
14
|
|
|
15
15
|
To install GnuCOBOL, run: `./scripts/install-gnucobol.sh`
|
|
16
|
+
On Windows, run that shell script from Git Bash/WSL (`bash scripts/install-gnucobol.sh`) or install GnuCOBOL with a Windows package manager and document the chosen command in `build_notes.md`.
|
|
16
17
|
|
|
17
18
|
## Phase 1: Build Setup
|
|
18
19
|
|
|
@@ -37,6 +37,15 @@ export LLM_MODEL="anthropic/claude-3-5-sonnet-20241022"
|
|
|
37
37
|
uv run python -m lc_sdk_examples.cobol_modernization --src-path /path/to/cobol/project
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
PowerShell equivalent for the environment setup:
|
|
41
|
+
|
|
42
|
+
```powershell
|
|
43
|
+
$env:LLM_API_KEY = "your-api-key"
|
|
44
|
+
$env:LLM_MODEL = "anthropic/claude-3-5-sonnet-20241022"
|
|
45
|
+
|
|
46
|
+
uv run python -m lc_sdk_examples.cobol_modernization --src-path C:\path\to\cobol\project
|
|
47
|
+
```
|
|
48
|
+
|
|
40
49
|
## Workflow Phases
|
|
41
50
|
|
|
42
51
|
### Phase 1: Build Setup
|
|
@@ -39,6 +39,17 @@ uv run python -m lc_sdk_examples.migration_scoring \
|
|
|
39
39
|
--rubric-path /path/to/style_rubric.txt
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
+
PowerShell equivalent for the environment setup:
|
|
43
|
+
|
|
44
|
+
```powershell
|
|
45
|
+
$env:LLM_API_KEY = "your-api-key"
|
|
46
|
+
$env:LLM_MODEL = "anthropic/claude-3-5-sonnet-20241022"
|
|
47
|
+
|
|
48
|
+
uv run python -m lc_sdk_examples.migration_scoring `
|
|
49
|
+
--src-path C:\path\to\migration\project `
|
|
50
|
+
--rubric-path C:\path\to\style_rubric.txt
|
|
51
|
+
```
|
|
52
|
+
|
|
42
53
|
## Workflow Phases
|
|
43
54
|
|
|
44
55
|
### Phase 1: Migration Mapping
|
|
@@ -51,6 +51,8 @@ Or scan all five at once:
|
|
|
51
51
|
for s in scripts/scan_*.sh; do bash "$s" /path/to/repo; echo; done
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
On Windows, run these `.sh` helpers from Git Bash or WSL and pass a path that environment can read. Native PowerShell cannot execute the shell scripts directly.
|
|
55
|
+
|
|
54
56
|
**Important**: The scripts are helpers, not scorers. They find files and
|
|
55
57
|
patterns but do not evaluate quality. Many features require judgment that only
|
|
56
58
|
reading the actual files can provide — for example, whether a README includes
|
|
@@ -31,6 +31,12 @@ This plugin provides a unified entry point and the CLI integration script.
|
|
|
31
31
|
command -v openhands &>/dev/null && echo "CLI available" || echo "CLI not found"
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
+
PowerShell check:
|
|
35
|
+
|
|
36
|
+
```powershell
|
|
37
|
+
if (Get-Command openhands -ErrorAction SilentlyContinue) { "CLI available" } else { "CLI not found" }
|
|
38
|
+
```
|
|
39
|
+
|
|
34
40
|
2. **If CLI is available**, use it — it manages auth and API keys automatically.
|
|
35
41
|
3. **If CLI is not available**, check for an API key:
|
|
36
42
|
- Preferred env var: `OPENHANDS_CLOUD_API_KEY`
|
|
@@ -49,6 +55,7 @@ command -v openhands &>/dev/null && echo "CLI available" || echo "CLI not found"
|
|
|
49
55
|
```
|
|
50
56
|
|
|
51
57
|
The script checks for the CLI, installs it if needed, sends the task, and opens the resulting conversation URL.
|
|
58
|
+
On Windows, run this POSIX shell script from Git Bash or WSL (`bash scripts/run.sh "Investigate flaky tests in tests/test_api.py"`) unless a native PowerShell launcher is available.
|
|
52
59
|
|
|
53
60
|
If the script exits with code `2` (`AUTH_REQUIRED`), ask the user to complete authentication in the browser, then re-run.
|
|
54
61
|
|
|
@@ -32,6 +32,15 @@ curl -o .github/workflows/release-notes.yml \
|
|
|
32
32
|
https://raw.githubusercontent.com/OpenHands/extensions/main/plugins/release-notes/workflows/release-notes.yml
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
+
PowerShell equivalent:
|
|
36
|
+
|
|
37
|
+
```powershell
|
|
38
|
+
New-Item -ItemType Directory -Force .github\workflows | Out-Null
|
|
39
|
+
Invoke-WebRequest `
|
|
40
|
+
-Uri https://raw.githubusercontent.com/OpenHands/extensions/main/plugins/release-notes/workflows/release-notes.yml `
|
|
41
|
+
-OutFile .github\workflows\release-notes.yml
|
|
42
|
+
```
|
|
43
|
+
|
|
35
44
|
Configure required secrets (see the README for details).
|
|
36
45
|
|
|
37
46
|
### Manual Invocation
|
package/pyproject.toml
CHANGED
|
@@ -17,7 +17,7 @@ from importlib.metadata import PackageNotFoundError, version
|
|
|
17
17
|
#: Fallback used only when the package is not installed (no dist metadata).
|
|
18
18
|
#: Kept in lock-step with pyproject.toml/package.json by the version test.
|
|
19
19
|
# x-release-please-update-version
|
|
20
|
-
_FALLBACK_VERSION = "0.
|
|
20
|
+
_FALLBACK_VERSION = "0.9.0"
|
|
21
21
|
|
|
22
22
|
try:
|
|
23
23
|
__version__: str = version("openhands-extensions")
|
|
@@ -61,7 +61,7 @@ export function buildCatalog(skillsDir) {
|
|
|
61
61
|
const skillMd = join(dirPath, "SKILL.md");
|
|
62
62
|
if (!existsSync(skillMd)) continue;
|
|
63
63
|
|
|
64
|
-
const raw = readFileSync(skillMd, "utf-8");
|
|
64
|
+
const raw = readFileSync(skillMd, "utf-8").replace(/\r\n?/g, "\n");
|
|
65
65
|
const parts = raw.split("---");
|
|
66
66
|
if (parts.length < 3) {
|
|
67
67
|
console.warn(`Warning: ${skillMd} missing frontmatter sections, skipping`);
|
|
@@ -38,6 +38,8 @@ python3 scripts/fetch_skill.py "https://github.com/OpenHands/extensions/tree/mai
|
|
|
38
38
|
ls /path/to/workspace/.agents/skills/codereview/SKILL.md
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
+
On Windows, use `python` if `python3` is not available and verify with PowerShell, for example: `Test-Path C:\path\to\workspace\.agents\skills\codereview\SKILL.md`.
|
|
42
|
+
|
|
41
43
|
Response: "✅ Added `codereview` to your workspace. The skill is now available."
|
|
42
44
|
|
|
43
45
|
## Notes
|
|
@@ -30,6 +30,8 @@ git remote -v && git branch # to find the current org, repo and branch
|
|
|
30
30
|
git checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
+
On Windows PowerShell, run those `git` commands as separate commands if `&&` is not supported by the installed shell.
|
|
34
|
+
|
|
33
35
|
## Azure DevOps API Usage
|
|
34
36
|
|
|
35
37
|
When working with Azure DevOps API, you need to use Basic authentication with your Personal Access Token (PAT). The username is ignored (empty string), and the password is the PAT.
|
|
@@ -43,8 +45,17 @@ AUTH=$(echo -n ":$AZURE_DEVOPS_TOKEN" | base64)
|
|
|
43
45
|
curl -H "Authorization: Basic $AUTH" -H "Content-Type: application/json" https://dev.azure.com/{organization}/{project}/_apis/git/repositories?api-version=7.1
|
|
44
46
|
```
|
|
45
47
|
|
|
48
|
+
PowerShell equivalent for the PAT header:
|
|
49
|
+
|
|
50
|
+
```powershell
|
|
51
|
+
$auth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$env:AZURE_DEVOPS_TOKEN"))
|
|
52
|
+
Invoke-RestMethod `
|
|
53
|
+
-Headers @{ Authorization = "Basic $auth"; "Content-Type" = "application/json" } `
|
|
54
|
+
-Uri "https://dev.azure.com/{organization}/{project}/_apis/git/repositories?api-version=7.1"
|
|
55
|
+
```
|
|
56
|
+
|
|
46
57
|
Common API endpoints:
|
|
47
58
|
- List repositories: `https://dev.azure.com/{organization}/{project}/_apis/git/repositories?api-version=7.1`
|
|
48
59
|
- Get repository details: `https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}?api-version=7.1`
|
|
49
60
|
- List pull requests: `https://dev.azure.com/{organization}/{project}/_apis/git/pullrequests?api-version=7.1`
|
|
50
|
-
- Create pull request: `https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests?api-version=7.1` (POST)
|
|
61
|
+
- Create pull request: `https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/pullrequests?api-version=7.1` (POST)
|
|
@@ -28,6 +28,15 @@ ENCODED_PASS=$(python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sy
|
|
|
28
28
|
git remote set-url origin "https://${ENCODED_USER}:${ENCODED_PASS}@bitbucket.org/username/repo.git"
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
+
PowerShell equivalent for the remote URL encoding:
|
|
32
|
+
|
|
33
|
+
```powershell
|
|
34
|
+
$parts = $env:BITBUCKET_TOKEN -split ":", 2
|
|
35
|
+
$encodedUser = [Uri]::EscapeDataString($parts[0])
|
|
36
|
+
$encodedPass = [Uri]::EscapeDataString($parts[1])
|
|
37
|
+
git remote set-url origin "https://${encodedUser}:${encodedPass}@bitbucket.org/username/repo.git"
|
|
38
|
+
```
|
|
39
|
+
|
|
31
40
|
Atlassian's Bitbucket Cloud docs recommend avoiding long-lived credentials in the remote URL when possible. Their API token examples use either `https://{bitbucket_username}:{api_token}@...` or `https://x-bitbucket-api-token-auth:{api_token}@...`; OpenHands users should only construct those URLs on demand, with proper URL encoding.
|
|
32
41
|
|
|
33
42
|
Here are some instructions for pushing, but ONLY do this if the user asks you to:
|
|
@@ -44,3 +53,5 @@ Here are some instructions for pushing, but ONLY do this if the user asks you to
|
|
|
44
53
|
git remote -v && git branch # to find the current org, repo and branch
|
|
45
54
|
git checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget
|
|
46
55
|
```
|
|
56
|
+
|
|
57
|
+
On Windows PowerShell, run those `git` commands as separate commands if `&&` is not supported by the installed shell.
|