@openhands/extensions 0.19.0 → 0.21.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 (64) hide show
  1. package/.github/workflows/check-extensions.yml +4 -0
  2. package/.github/workflows/pr-artifacts.yml +294 -0
  3. package/.github/workflows/pr-description-check.yml +4 -2
  4. package/.release-please-manifest.json +1 -1
  5. package/AGENTS.md +28 -4
  6. package/README.md +5 -2
  7. package/automations/README.md +52 -36
  8. package/automations/bundle-index.js +13 -3
  9. package/automations/catalog/custom-automation/manifest.json +229 -0
  10. package/automations/catalog/github-agents-md-maintainer/manifest.json +2 -1
  11. package/automations/catalog/github-issue-to-pr/manifest.json +3 -2
  12. package/automations/catalog/github-issue-triage/manifest.json +72 -0
  13. package/automations/catalog/github-pr-reviewer/manifest.json +3 -2
  14. package/automations/catalog/gitlab-issue-to-mr/manifest.json +124 -0
  15. package/automations/catalog/qa-changes/manifest.json +1 -1
  16. package/automations/catalog-index.js +23 -17
  17. package/automations/catalog.schema.json +81 -7
  18. package/automations/index.d.ts +52 -2
  19. package/automations/interface.json +2 -1
  20. package/integrations/catalog/gitlab.json +27 -5
  21. package/integrations/catalog/reportportal.json +76 -0
  22. package/integrations/catalog-index.js +6 -4
  23. package/marketplaces/openhands-extensions.json +36 -0
  24. package/package.json +1 -1
  25. package/pyproject.toml +2 -2
  26. package/python/openhands_extensions/_version.py +1 -1
  27. package/skills/github/scripts/github_client.py +204 -0
  28. package/skills/github-agents-md-maintainer/SKILL.md +7 -1
  29. package/skills/github-agents-md-maintainer/scripts/main.py +4 -40
  30. package/skills/github-issue-to-pr/SKILL.md +8 -1
  31. package/skills/github-issue-to-pr/scripts/main.py +3 -40
  32. package/skills/github-issue-triage/.plugin/plugin.json +9 -0
  33. package/skills/github-issue-triage/README.md +9 -0
  34. package/skills/github-issue-triage/SKILL.md +37 -0
  35. package/skills/github-issue-triage/commands/github-issue-triage.md +8 -0
  36. package/skills/github-issue-triage/scripts/worker.py +123 -0
  37. package/skills/github-pr-reviewer/SKILL.md +8 -1
  38. package/skills/github-pr-reviewer/scripts/main.py +3 -41
  39. package/skills/github-repo-monitor/SKILL.md +7 -1
  40. package/skills/github-repo-monitor/scripts/main.py +4 -46
  41. package/skills/gitlab-issue-to-mr/.plugin/plugin.json +19 -0
  42. package/skills/gitlab-issue-to-mr/README.md +92 -0
  43. package/skills/gitlab-issue-to-mr/SKILL.md +408 -0
  44. package/skills/gitlab-issue-to-mr/commands/issue-to-mr-setup.md +8 -0
  45. package/skills/gitlab-issue-to-mr/references/state-schema.md +140 -0
  46. package/skills/gitlab-issue-to-mr/scripts/main.py +1448 -0
  47. package/skills/index.js +43 -6
  48. package/skills/openhands-automation/README.md +1 -1
  49. package/skills/openhands-automation/SKILL.md +18 -8
  50. package/skills/openhands-enterprise-troubleshooting/.plugin/plugin.json +20 -0
  51. package/skills/openhands-enterprise-troubleshooting/README.md +79 -0
  52. package/skills/openhands-enterprise-troubleshooting/SKILL.md +339 -0
  53. package/skills/openhands-enterprise-troubleshooting/references/diagnostics.md +698 -0
  54. package/skills/openhands-enterprise-troubleshooting/references/support-bundle-analysis.md +570 -0
  55. package/skills/openhands-enterprise-troubleshooting/scripts/bundle_triage.py +532 -0
  56. package/skills/openhands-sdk/SKILL.md +2 -0
  57. package/tests/fixtures/automations/custom-automation.json +398 -0
  58. package/tests/fixtures/automations/github-pr-reviewer.json +9 -9
  59. package/tests/github_automation_helpers.py +25 -0
  60. package/tests/test_automation_setup.py +340 -92
  61. package/tests/test_github_automation_foundation.py +73 -0
  62. package/tests/test_github_skill_installation.py +63 -0
  63. package/tests/test_github_triage_delivery.py +53 -0
  64. package/tests/test_gitlab_issue_to_mr.py +823 -0
@@ -0,0 +1,229 @@
1
+ {
2
+ "id": "custom-automation",
3
+ "name": "Custom automation",
4
+ "category": "Custom",
5
+ "icon": "sparkles",
6
+ "description": "Create a custom automation from a prompt, plugin-powered prompt, or uploaded script tarball.",
7
+ "requires": {
8
+ "integrations": {
9
+ "github": {
10
+ "message": "Optional. Used when you choose a GitHub repository to clone or trigger from GitHub events.",
11
+ "required": false
12
+ }
13
+ }
14
+ },
15
+ "popularityRank": 99,
16
+ "estimatedSetupMinutes": 5,
17
+ "skill": "openhands-automation",
18
+ "exampleImplementation": "Action: a user-selected prompt, plugin, or uploaded tarball creation path\nTrigger: a user-selected cron schedule or event source and event type\n\n1. Ask whether the automation should run a prompt, run a prompt with plugins, or upload a tarball.\n2. Render only the fields for the selected creation path.\n3. Create prompt automations through /v1/preset/prompt, plugin automations through /v1/preset/plugin, and uploaded tarball automations by uploading to /v1/uploads then creating through /v1.\n4. The selected trigger and common run settings are shared by all creation paths.",
19
+ "setup": {
20
+ "version": "1.0",
21
+ "mode": "direct",
22
+ "form": {
23
+ "note": "Choose whether this custom automation runs a plain prompt, a prompt with plugins, or your own uploaded tarball. Prompt and plugin runs use the LLM; uploaded tarballs are best for deterministic scripts.",
24
+ "triggers": {
25
+ "cron": {
26
+ "schedule": {
27
+ "type": "cron",
28
+ "label": "Schedule",
29
+ "help": "How often this automation should run.",
30
+ "default": "0 9 * * *",
31
+ "required": true
32
+ },
33
+ "timezone": {
34
+ "type": "timezone",
35
+ "label": "Timezone",
36
+ "help": "Timezone used to evaluate the schedule.",
37
+ "default": "UTC",
38
+ "required": true
39
+ }
40
+ },
41
+ "event": {
42
+ "source": {
43
+ "type": "event-source",
44
+ "label": "Event source",
45
+ "help": "Webhook source that starts the automation.",
46
+ "default": "github",
47
+ "required": true
48
+ },
49
+ "on": {
50
+ "type": "event-type",
51
+ "label": "Event type",
52
+ "help": "Event key or wildcard pattern that starts the automation.",
53
+ "placeholder": "issue_comment.created",
54
+ "required": true
55
+ },
56
+ "filter": {
57
+ "type": "textarea",
58
+ "label": "Event filter",
59
+ "help": "Optional JMESPath expression evaluated against the event payload.",
60
+ "placeholder": "glob(repository.full_name, 'OpenHands/*')",
61
+ "required": false,
62
+ "constraints": {
63
+ "maxLength": 2000
64
+ }
65
+ }
66
+ }
67
+ },
68
+ "args": {
69
+ "name": {
70
+ "type": "text",
71
+ "label": "Automation name",
72
+ "help": "Name shown in the automations list.",
73
+ "placeholder": "Daily repository summary",
74
+ "required": true,
75
+ "constraints": {
76
+ "minLength": 1,
77
+ "maxLength": 500
78
+ }
79
+ },
80
+ "model": {
81
+ "type": "llm-profile",
82
+ "label": "LLM profile",
83
+ "help": "Optional model profile used for automation runs. Leave blank to use the active profile.",
84
+ "required": false
85
+ },
86
+ "timeout": {
87
+ "type": "number",
88
+ "label": "Timeout (seconds)",
89
+ "help": "Maximum time a single run may take. Leave blank for the service default.",
90
+ "required": false,
91
+ "constraints": {
92
+ "min": 1,
93
+ "max": 1800
94
+ }
95
+ }
96
+ }
97
+ },
98
+ "actions": {
99
+ "prompt": {
100
+ "label": "Prompt",
101
+ "help": "Run a natural-language prompt with the default OpenHands agent.",
102
+ "features": [
103
+ "presetPrompt"
104
+ ],
105
+ "args": {
106
+ "prompt": {
107
+ "type": "textarea",
108
+ "label": "Prompt",
109
+ "help": "Instructions the agent follows every time the automation runs.",
110
+ "placeholder": "Summarize recent repository activity and post the result to Slack.",
111
+ "required": true,
112
+ "constraints": {
113
+ "minLength": 1,
114
+ "maxLength": 50000
115
+ }
116
+ },
117
+ "repository": {
118
+ "type": "repo-picker",
119
+ "label": "Repository",
120
+ "help": "Optional GitHub repository to clone before each run.",
121
+ "provider": "github",
122
+ "required": false
123
+ },
124
+ "ref": {
125
+ "type": "text",
126
+ "label": "Branch or ref",
127
+ "help": "Branch, tag, or commit to check out when a repository is selected.",
128
+ "placeholder": "main",
129
+ "required": false,
130
+ "constraints": {
131
+ "minLength": 1,
132
+ "maxLength": 255
133
+ }
134
+ }
135
+ },
136
+ "prompt": "{{form.prompt}}"
137
+ },
138
+ "plugin": {
139
+ "label": "Plugin",
140
+ "help": "Run a prompt with one or more OpenHands plugins loaded.",
141
+ "features": [
142
+ "presetPlugin"
143
+ ],
144
+ "args": {
145
+ "plugins": {
146
+ "type": "plugin-sources",
147
+ "label": "Plugins",
148
+ "help": "One or more plugin sources to load. Each source may include an optional ref and repository path.",
149
+ "required": true
150
+ },
151
+ "prompt": {
152
+ "type": "textarea",
153
+ "label": "Prompt",
154
+ "help": "Instructions the agent follows after loading the plugins.",
155
+ "placeholder": "Use the plugin commands to inspect the repository and summarize findings.",
156
+ "required": true,
157
+ "constraints": {
158
+ "minLength": 1,
159
+ "maxLength": 50000
160
+ }
161
+ },
162
+ "repository": {
163
+ "type": "repo-picker",
164
+ "label": "Repository",
165
+ "help": "Optional GitHub repository to clone before each run.",
166
+ "provider": "github",
167
+ "required": false
168
+ },
169
+ "ref": {
170
+ "type": "text",
171
+ "label": "Branch or ref",
172
+ "help": "Branch, tag, or commit to check out when a repository is selected.",
173
+ "placeholder": "main",
174
+ "required": false,
175
+ "constraints": {
176
+ "minLength": 1,
177
+ "maxLength": 255
178
+ }
179
+ }
180
+ },
181
+ "prompt": "{{form.prompt}}",
182
+ "plugins": "{{form.plugins}}"
183
+ },
184
+ "upload": {
185
+ "label": "Upload tarball",
186
+ "help": "Upload a .tar or .tar.gz containing the automation code to run.",
187
+ "features": [
188
+ "customTarball"
189
+ ],
190
+ "args": {
191
+ "tarball": {
192
+ "type": "tarball-upload",
193
+ "label": "Tarball",
194
+ "help": "A .tar or .tar.gz archive containing the automation code. Maximum size is enforced by the automation service.",
195
+ "required": true
196
+ },
197
+ "entrypoint": {
198
+ "type": "text",
199
+ "label": "Entrypoint",
200
+ "help": "Command to run after the tarball is extracted.",
201
+ "default": "python3 main.py",
202
+ "placeholder": "python3 main.py",
203
+ "required": true,
204
+ "constraints": {
205
+ "minLength": 1,
206
+ "maxLength": 500
207
+ }
208
+ },
209
+ "setupScript": {
210
+ "type": "text",
211
+ "label": "Setup script",
212
+ "help": "Optional path inside the tarball to run before the entrypoint.",
213
+ "placeholder": "setup.sh",
214
+ "required": false,
215
+ "constraints": {
216
+ "minLength": 1,
217
+ "maxLength": 255
218
+ }
219
+ }
220
+ },
221
+ "tarballPath": "{{form.tarball}}",
222
+ "entrypoint": "{{form.entrypoint}}",
223
+ "setupScript": "{{form.setupScript}}"
224
+ }
225
+ },
226
+ "filter": "{{form.filter}}",
227
+ "message": "This deployment cannot create custom automations directly. Set it up in this conversation instead: choose prompt, plugin, or uploaded tarball mode; confirm the selected trigger, model profile, timeout, and mode-specific fields; then create the automation."
228
+ }
229
+ }
@@ -88,7 +88,8 @@
88
88
  "entrypoint": "python3 main.py",
89
89
  "timeout": 900,
90
90
  "files": {
91
- "main.py": "skills/github-agents-md-maintainer/scripts/main.py"
91
+ "main.py": "skills/github-agents-md-maintainer/scripts/main.py",
92
+ "github_client.py": "skills/github/scripts/github_client.py"
92
93
  },
93
94
  "config": {
94
95
  "repos": "{{form.repositories}}",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "github-issue-to-pr",
3
- "name": "GitHub Issue to PR Agent",
3
+ "name": "GitHub issue to PR",
4
4
  "category": "Software development",
5
5
  "description": "Watch for a configurable label on GitHub issues, implement the issue in a clone of the default branch, and open a pull request for each label event.",
6
6
  "requires": {
@@ -98,7 +98,8 @@
98
98
  "entrypoint": "python3 main.py",
99
99
  "timeout": 900,
100
100
  "files": {
101
- "main.py": "skills/github-issue-to-pr/scripts/main.py"
101
+ "main.py": "skills/github-issue-to-pr/scripts/main.py",
102
+ "github_client.py": "skills/github/scripts/github_client.py"
102
103
  },
103
104
  "config": {
104
105
  "repos": "{{form.repositories}}",
@@ -0,0 +1,72 @@
1
+ {
2
+ "id": "github-issue-triage",
3
+ "version": "1.0.0",
4
+ "name": "GitHub issue triage",
5
+ "category": "Project management",
6
+ "description": "Prioritize open issues and establish acceptance criteria before marking them ready for development.",
7
+ "requires": {
8
+ "integrations": {},
9
+ "features": [
10
+ "customTarball",
11
+ "agentProfiles"
12
+ ]
13
+ },
14
+ "estimatedSetupMinutes": 3,
15
+ "exampleImplementation": "Select an agent profile with Issues: read and write. Run this workflow independently on a schedule.",
16
+ "setup": {
17
+ "version": "1.0",
18
+ "mode": "direct",
19
+ "form": {
20
+ "triggers": {
21
+ "cron": {
22
+ "schedule": {
23
+ "type": "cron",
24
+ "label": "Check frequency",
25
+ "help": "How often to check repository progress.",
26
+ "default": "*/5 * * * *",
27
+ "required": true
28
+ },
29
+ "timezone": {
30
+ "type": "timezone",
31
+ "label": "Timezone",
32
+ "help": "Timezone for the schedule.",
33
+ "default": "UTC",
34
+ "required": true
35
+ }
36
+ }
37
+ },
38
+ "args": {
39
+ "repositories": {
40
+ "type": "repo-picker",
41
+ "provider": "github",
42
+ "multiple": true,
43
+ "label": "Repositories",
44
+ "help": "Repositories this automation may work on.",
45
+ "required": true
46
+ },
47
+ "githubTokenSecret": {
48
+ "type": "text",
49
+ "label": "GitHub token secret",
50
+ "help": "Name of a saved secret allowed by the selected agent profile. Enter its name, not its value.",
51
+ "default": "GITHUB_PERSONAL_ACCESS_TOKEN",
52
+ "required": true
53
+ }
54
+ }
55
+ },
56
+ "bundle": {
57
+ "version": "1.0.0",
58
+ "entrypoint": "python3 worker.py",
59
+ "timeout": 3000,
60
+ "files": {
61
+ "worker.py": "skills/github-issue-triage/scripts/worker.py",
62
+ "github_client.py": "skills/github/scripts/github_client.py"
63
+ },
64
+ "config": {
65
+ "repos": "{{form.repositories}}",
66
+ "github_token_secret": "{{form.githubTokenSecret}}"
67
+ }
68
+ },
69
+ "message": "Select an agent profile and configure this scheduled automation in the conversation."
70
+ },
71
+ "popularityRank": 80
72
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "github-pr-reviewer",
3
3
  "version": "1.0.0",
4
- "name": "GitHub Code Review Agent",
4
+ "name": "GitHub code review",
5
5
  "category": "Code review",
6
6
  "description": "Watch for a configurable label on GitHub pull requests, inspect full PR and repository context, and post an AI review comment once per label event.",
7
7
  "requires": {
@@ -92,7 +92,8 @@
92
92
  "entrypoint": "python3 main.py",
93
93
  "timeout": 600,
94
94
  "files": {
95
- "main.py": "skills/github-pr-reviewer/scripts/main.py"
95
+ "main.py": "skills/github-pr-reviewer/scripts/main.py",
96
+ "github_client.py": "skills/github/scripts/github_client.py"
96
97
  },
97
98
  "config": {
98
99
  "repos": "{{form.repositories}}",
@@ -0,0 +1,124 @@
1
+ {
2
+ "id": "gitlab-issue-to-mr",
3
+ "name": "GitLab issue to MR",
4
+ "category": "Software development",
5
+ "description": "Watch for a configurable label on GitLab issues, implement the issue in a clone of the default branch, and open a merge request for each label event.",
6
+ "requires": {
7
+ "integrations": {
8
+ "gitlab": {
9
+ "message": "Used to read labelled issues, push the branch, and open the merge request."
10
+ }
11
+ },
12
+ "features": [
13
+ "customTarball"
14
+ ]
15
+ },
16
+ "popularityRank": 88,
17
+ "estimatedSetupMinutes": 4,
18
+ "exampleImplementation": "Trigger: cron polling for open GitLab issues with a configured label such as openhands\nRequired secret: GITLAB_TOKEN, a personal or project access token with the api scope and at least the Developer role\n\n1. Read the projects, trigger label, branch prefix, merge request mode, GitLab API URL, and polling schedule from setup.\n2. Poll each project independently, with its own state, so issue IIDs never collide.\n3. List open labelled issues and find the latest matching GitLab label resource event for each.\n4. Deduplicate on the label event ID so every label application queues exactly one attempt.\n5. Clone the default branch into a directory of its own, create the working branch, and start an OpenHands conversation with that directory as its workspace. The clone carries no credential and the agent is handed no secrets, because the prompt is built from an issue body that anyone can write.\n6. Comment on the issue with the branch and the conversation link.\n7. Once the conversation has stopped, commit whatever the agent left, push the branch, open a merge request titled after the issue and prefixed with Draft:, and comment the link on the issue. An agent that made no changes gets its answer posted instead.\n8. Remove the clone once the conversation has stopped, so nothing accumulates between runs.",
19
+ "impact": {
20
+ "basis": "completed-runs",
21
+ "one": "1 issue sweep completed",
22
+ "other": "{{count}} issue sweeps completed"
23
+ },
24
+ "setup": {
25
+ "version": "1.0",
26
+ "mode": "direct",
27
+ "form": {
28
+ "triggers": {
29
+ "cron": {
30
+ "schedule": {
31
+ "type": "cron",
32
+ "label": "Check frequency",
33
+ "help": "How often to look for newly labelled issues.",
34
+ "default": "*/15 * * * *",
35
+ "required": true
36
+ },
37
+ "timezone": {
38
+ "type": "timezone",
39
+ "label": "Timezone",
40
+ "help": "Timezone the schedule is interpreted in.",
41
+ "default": "UTC",
42
+ "required": true
43
+ }
44
+ }
45
+ },
46
+ "args": {
47
+ "projects": {
48
+ "type": "repo-picker",
49
+ "label": "Projects",
50
+ "help": "The GitLab projects whose labelled issues are implemented. Each is polled independently and keeps its own state, so issue numbers never collide between them.",
51
+ "provider": "gitlab",
52
+ "multiple": true,
53
+ "required": true
54
+ },
55
+ "triggerLabel": {
56
+ "type": "text",
57
+ "label": "Trigger label",
58
+ "help": "Only issues carrying this label are worked on.",
59
+ "default": "openhands",
60
+ "required": true,
61
+ "constraints": {
62
+ "minLength": 1,
63
+ "maxLength": 50
64
+ }
65
+ },
66
+ "branchPrefix": {
67
+ "type": "text",
68
+ "label": "Branch prefix",
69
+ "help": "Branches are named after this prefix and the issue number, such as openhands/issue-42.",
70
+ "default": "openhands/issue",
71
+ "required": true,
72
+ "constraints": {
73
+ "minLength": 1,
74
+ "maxLength": 50
75
+ }
76
+ },
77
+ "mergeRequestMode": {
78
+ "type": "select",
79
+ "label": "Merge request mode",
80
+ "help": "Whether the merge request is opened as a draft or ready for review. GitLab marks a draft by prefixing its title with Draft:.",
81
+ "default": "draft",
82
+ "required": true,
83
+ "options": [
84
+ {
85
+ "value": "draft",
86
+ "label": "Draft"
87
+ },
88
+ {
89
+ "value": "ready",
90
+ "label": "Ready for review"
91
+ }
92
+ ]
93
+ },
94
+ "gitlabApiUrl": {
95
+ "type": "text",
96
+ "label": "GitLab API URL",
97
+ "help": "The API root of the GitLab instance. Change it for a self-managed instance, such as https://gitlab.example.com/api/v4.",
98
+ "default": "https://gitlab.com/api/v4",
99
+ "required": true,
100
+ "constraints": {
101
+ "minLength": 1,
102
+ "maxLength": 200
103
+ }
104
+ }
105
+ }
106
+ },
107
+ "bundle": {
108
+ "version": "1.0.0",
109
+ "entrypoint": "python3 main.py",
110
+ "timeout": 900,
111
+ "files": {
112
+ "main.py": "skills/gitlab-issue-to-mr/scripts/main.py"
113
+ },
114
+ "config": {
115
+ "projects": "{{form.projects}}",
116
+ "trigger_label": "{{form.triggerLabel}}",
117
+ "branch_prefix": "{{form.branchPrefix}}",
118
+ "merge_request_mode": "{{form.mergeRequestMode}}",
119
+ "gitlab_api_url": "{{form.gitlabApiUrl}}"
120
+ }
121
+ },
122
+ "message": "This deployment cannot run the scheduled issue-to-MR automation directly. Set it up in this conversation instead: confirm the GitLab projects to watch, the trigger label, the branch prefix, whether merge requests open as drafts, the GitLab API URL, and the polling schedule, then create the automation."
123
+ }
124
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "qa-changes",
3
- "name": "QA Changes Agent",
3
+ "name": "QA changes",
4
4
  "category": "Code review",
5
5
  "description": "When a pull request is opened for review, run the QA changes methodology — set up the environment, exercise the changed behavior as a real user would, and post the outcome by editing the PR description with a QA Agent section.",
6
6
  "requires": {
@@ -3,23 +3,26 @@
3
3
  // run: npm run build:automations
4
4
 
5
5
  import entry0 from "./catalog/github-pr-reviewer/manifest.json" with { type: "json" };
6
- import entry1 from "./catalog/github-repo-monitor/manifest.json" with { type: "json" };
7
- import entry2 from "./catalog/github-issue-to-pr/manifest.json" with { type: "json" };
8
- import entry3 from "./catalog/slack-standup-digest/manifest.json" with { type: "json" };
9
- import entry4 from "./catalog/slack-channel-monitor/manifest.json" with { type: "json" };
10
- import entry5 from "./catalog/linear-triage-assistant/manifest.json" with { type: "json" };
11
- import entry6 from "./catalog/linear-issue-to-github-pr/manifest.json" with { type: "json" };
12
- import entry7 from "./catalog/linear-issue-to-gitlab-mr/manifest.json" with { type: "json" };
13
- import entry8 from "./catalog/linear-issue-to-bitbucket-pr/manifest.json" with { type: "json" };
14
- import entry9 from "./catalog/jira-issue-to-pr/manifest.json" with { type: "json" };
15
- import entry10 from "./catalog/qa-changes/manifest.json" with { type: "json" };
16
- import entry11 from "./catalog/jira-issue-to-gitlab-mr/manifest.json" with { type: "json" };
17
- import entry12 from "./catalog/research-brief-writer/manifest.json" with { type: "json" };
18
- import entry13 from "./catalog/jira-issue-to-bitbucket-pr/manifest.json" with { type: "json" };
19
- import entry14 from "./catalog/github-agents-md-maintainer/manifest.json" with { type: "json" };
20
- import entry15 from "./catalog/upstream-fork-sync/manifest.json" with { type: "json" };
21
- import entry16 from "./catalog/incident-retrospective-drafter/manifest.json" with { type: "json" };
22
- import entry17 from "./catalog/news-digest/manifest.json" with { type: "json" };
6
+ import entry1 from "./catalog/custom-automation/manifest.json" with { type: "json" };
7
+ import entry2 from "./catalog/github-repo-monitor/manifest.json" with { type: "json" };
8
+ import entry3 from "./catalog/github-issue-to-pr/manifest.json" with { type: "json" };
9
+ import entry4 from "./catalog/slack-standup-digest/manifest.json" with { type: "json" };
10
+ import entry5 from "./catalog/slack-channel-monitor/manifest.json" with { type: "json" };
11
+ import entry6 from "./catalog/linear-triage-assistant/manifest.json" with { type: "json" };
12
+ import entry7 from "./catalog/linear-issue-to-github-pr/manifest.json" with { type: "json" };
13
+ import entry8 from "./catalog/gitlab-issue-to-mr/manifest.json" with { type: "json" };
14
+ import entry9 from "./catalog/linear-issue-to-gitlab-mr/manifest.json" with { type: "json" };
15
+ import entry10 from "./catalog/linear-issue-to-bitbucket-pr/manifest.json" with { type: "json" };
16
+ import entry11 from "./catalog/jira-issue-to-pr/manifest.json" with { type: "json" };
17
+ import entry12 from "./catalog/qa-changes/manifest.json" with { type: "json" };
18
+ import entry13 from "./catalog/jira-issue-to-gitlab-mr/manifest.json" with { type: "json" };
19
+ import entry14 from "./catalog/research-brief-writer/manifest.json" with { type: "json" };
20
+ import entry15 from "./catalog/jira-issue-to-bitbucket-pr/manifest.json" with { type: "json" };
21
+ import entry16 from "./catalog/github-agents-md-maintainer/manifest.json" with { type: "json" };
22
+ import entry17 from "./catalog/github-issue-triage/manifest.json" with { type: "json" };
23
+ import entry18 from "./catalog/upstream-fork-sync/manifest.json" with { type: "json" };
24
+ import entry19 from "./catalog/incident-retrospective-drafter/manifest.json" with { type: "json" };
25
+ import entry20 from "./catalog/news-digest/manifest.json" with { type: "json" };
23
26
 
24
27
  export const AUTOMATION_CATALOG_ENTRIES = [
25
28
  entry0,
@@ -40,4 +43,7 @@ export const AUTOMATION_CATALOG_ENTRIES = [
40
43
  entry15,
41
44
  entry16,
42
45
  entry17,
46
+ entry18,
47
+ entry19,
48
+ entry20,
43
49
  ];