@openhands/agent-canvas 1.2.0 → 1.2.1
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/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/{active-backend-context-DRFevVIj.js → active-backend-context-u2tdYRgH.js} +1 -1
- package/build/assets/{add-backend-modal-DzuB9zlG.js → add-backend-modal-DIEyAkA4.js} +1 -1
- package/build/assets/{agent-profiles-settings-BfAwTshW.js → agent-profiles-settings-BovdV4N8.js} +1 -1
- package/build/assets/{agent-server-conversation-service.api-DfH2k6Sx.js → agent-server-conversation-service.api-BP73yONA.js} +1 -1
- package/build/assets/agent-settings-FGL3Yvkp.js +1 -0
- package/build/assets/{agent-settings-DjVlKgaP.js → agent-settings-Ofbh6UTD.js} +1 -1
- package/build/assets/{api-key-entry-screen-O8gS-fnF.js → api-key-entry-screen-CZIdRmUJ.js} +1 -1
- package/build/assets/{app-settings-SlZvaXlk.js → app-settings-BHJ9nKti.js} +1 -1
- package/build/assets/{automation-detail-CwsNJ9AM.js → automation-detail-DwYGzLkp.js} +1 -1
- package/build/assets/{automations-list-B9cPtugh.js → automations-list-CuAfJmMW.js} +1 -1
- package/build/assets/{backend-form-modal-D2EDGVAc.js → backend-form-modal-BiaOB2C4.js} +1 -1
- package/build/assets/{backend-synced-settings-badge-6OCwIuLY.js → backend-synced-settings-badge-Bs3FSXsS.js} +1 -1
- package/build/assets/{color-themes-Dd1sO5U6.js → color-themes-DPBzNtVg.js} +3 -3
- package/build/assets/{condenser-settings-BhxvlfoY.js → condenser-settings-D_5vY4m3.js} +1 -1
- package/build/assets/conversation-DnVC6vRV.js +1 -0
- package/build/assets/conversation-panel-ZEz-z3az.js +1 -0
- package/build/assets/{conversation-service.api-Ch9kR9aE.js → conversation-service.api-CqZcHr1c.js} +1 -1
- package/build/assets/{conversation-B8prFAZF.js → conversation-xkBS3AHC.js} +3 -3
- package/build/assets/{edit-automation-modal-BoibW8cd.js → edit-automation-modal-B6U96gVV.js} +1 -1
- package/build/assets/{entry.client-BgWj9jL_.js → entry.client-Dy--3GeA.js} +1 -1
- package/build/assets/{extensions-hub-MtC8lK3A.js → extensions-hub-CksKNpP9.js} +1 -1
- package/build/assets/{extensions-navigation-BtV14oQL.js → extensions-navigation-Di9rJ-b5.js} +1 -1
- package/build/assets/{files-tab-DHqtsKLy.js → files-tab-61Vaihc6.js} +1 -1
- package/build/assets/{git-provider-icon-CGU7_KiU.js → git-provider-icon-aQRcUVI-.js} +1 -1
- package/build/assets/{home-BgjWP_UN.js → home-5gOtUe-n.js} +1 -1
- package/build/assets/{install-server-modal-J_eQ6lhG.js → install-server-modal-BRab9inF.js} +1 -1
- package/build/assets/{launch-DamfAY5L.js → launch-1TJRKkkX.js} +1 -1
- package/build/assets/{lesson-plan-HD886V64.js → lesson-plan-BtrZUCuj.js} +1 -1
- package/build/assets/{llm-not-configured-banner-DTrLsVr_.js → llm-not-configured-banner-BrU5uHto.js} +1 -1
- package/build/assets/{llm-settings-BgSFkbHC.js → llm-settings-BpdU51Jo.js} +1 -1
- package/build/assets/llm-settings-DsInf6yD.js +1 -0
- package/build/assets/{manage-backends-modal-BUzj5_Lq.js → manage-backends-modal-BREySP-J.js} +1 -1
- package/build/assets/{manifest-4d6a1552.js → manifest-a5bb7568.js} +1 -1
- package/build/assets/{mcp-DvqJYDbz.js → mcp-XXf8k6mb.js} +1 -1
- package/build/assets/{messages-C4KEFkPk.js → messages-D2oZb47Z.js} +1 -1
- package/build/assets/{onboarding-gGIqoxvA.js → onboarding-D32kiGME.js} +1 -1
- package/build/assets/{onboarding-modal-CGHPoMp7.js → onboarding-modal-C084vkv7.js} +1 -1
- package/build/assets/{option-service.api-Dz7Eomnx.js → option-service.api-Cl5VLGyw.js} +1 -1
- package/build/assets/{path-utils-CBaRYg35.js → path-utils-BeOmjIcE.js} +1 -1
- package/build/assets/{planner-tab-G4j36bJk.js → planner-tab-AZMjJx31.js} +1 -1
- package/build/assets/{providers-CPoq0VXm.js → providers-vX9jk9Vy.js} +1 -1
- package/build/assets/recommended-automations-launcher-Bk8tQ-Cn.js +58 -0
- package/build/assets/{root-layout-CvxdHJ6j.js → root-layout-CoWw4kpz.js} +2 -2
- package/build/assets/{root-S6CfVoNm.js → root-tuEPDx-i.js} +2 -2
- package/build/assets/{schema-field-DwUzlw6b.js → schema-field-nvq_Juo2.js} +1 -1
- package/build/assets/{sdk-section-page-BUXONTx6.js → sdk-section-page-CgT70FaZ.js} +1 -1
- package/build/assets/{secrets-settings-ZxyfRBgx.js → secrets-settings-BCxk9p9s.js} +1 -1
- package/build/assets/{settings-Bx6vn-g8.js → settings-CedTdtb5.js} +1 -1
- package/build/assets/{settings-index-D4SM26d5.js → settings-index-Cct3PJSP.js} +1 -1
- package/build/assets/{settings-modal-BoC8oMlg.js → settings-modal-DwLybV_O.js} +1 -1
- package/build/assets/{shared-conversation-DMiaQFsj.js → shared-conversation-DnDwfLgg.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-CaV3tQFF.js → sidebar-mobile-menu-toggle-B8k3qu84.js} +1 -1
- package/build/assets/{skills-plugins-D2WkrXkr.js → skills-plugins-B68ay6Pu.js} +1 -1
- package/build/assets/{skills-settings-CZGVOp_t.js → skills-settings-A6sUy0T7.js} +1 -1
- package/build/assets/{terminal-B0aL_iDZ.js → terminal-BmT0_gIH.js} +1 -1
- package/build/assets/{use-acp-credential-form-rzaqkJ1n.js → use-acp-credential-form-Bs6s0DTU.js} +1 -1
- package/build/assets/{use-activate-agent-profile-DY0txItX.js → use-activate-agent-profile-CKtTToSx.js} +1 -1
- package/build/assets/{use-active-agent-profile-Cp5AFONR.js → use-active-agent-profile-CWLPpOtK.js} +1 -1
- package/build/assets/{use-active-conversation-DvcFBqFe.js → use-active-conversation-DI5S5M1w.js} +1 -1
- package/build/assets/{use-agent-profiles-DnH16_Vm.js → use-agent-profiles-DPcaYLpm.js} +1 -1
- package/build/assets/{use-agent-state-BvRcEzY4.js → use-agent-state-Buh3bQDh.js} +1 -1
- package/build/assets/{use-backends-health-e-Ull4wz.js → use-backends-health-CxkvJy2N.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-OIhplvQ0.js → use-can-manage-org-profiles-DeX2Mfje.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-ekU7UXDT.js → use-cloud-current-user-id-D_PQGfmT.js} +1 -1
- package/build/assets/{use-config-Dwf5gla-.js → use-config-ur0RbjCP.js} +1 -1
- package/build/assets/{use-create-conversation-CvAXfA3T.js → use-create-conversation-D9OWYcte.js} +1 -1
- package/build/assets/{use-create-secret-BKeXCo__.js → use-create-secret-CVFSlhlR.js} +1 -1
- package/build/assets/{use-handle-plan-click-cAXS-Hft.js → use-handle-plan-click-Dug8egQl.js} +1 -1
- package/build/assets/{use-llm-profiles-BcLibtGb.js → use-llm-profiles-DjackuP1.js} +1 -1
- package/build/assets/use-runtime-is-ready-Diiq65Q-.js +1 -0
- package/build/assets/{use-save-agent-profile-DFjxHhNx.js → use-save-agent-profile-aKKLqDJM.js} +1 -1
- package/build/assets/{use-save-settings-5xPYpSQM.js → use-save-settings-CChDyjOB.js} +1 -1
- package/build/assets/{use-settings-B07msZ2Z.js → use-settings-dX4fKUPF.js} +1 -1
- package/build/assets/{use-settings-nav-items-CswsOEyw.js → use-settings-nav-items-D6pHnvxg.js} +1 -1
- package/build/assets/{use-skills-Aoaoq_ei.js → use-skills-Dqo-pDDx.js} +1 -1
- package/build/assets/{use-tracking-CqODdfO4.js → use-tracking-GtXCHmTv.js} +1 -1
- package/build/assets/{use-user-conversation-BPHQ-dm-.js → use-user-conversation-6uOXFP95.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-DJHl5b-B.js → vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-rV6d1Iv_.js} +267 -27
- package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-CXyYYvYh.js +1 -0
- package/build/assets/{verification-settings-DZQ-JvKH.js → verification-settings-D_zsNB_c.js} +1 -1
- package/build/index.html +4 -4
- package/config/defaults.json +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.js +70 -3
- package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +27 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/superhuman-mail.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/superhuman-mail.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/superhuman-mail.js +33 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/superhuman-mail.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +48 -46
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +267 -27
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +36 -30
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +2 -2
- package/dist/package.js.map +1 -1
- package/dist/themes/color-themes.cjs +3 -3
- package/dist/themes/color-themes.cjs.map +1 -1
- package/dist/themes/color-themes.d.ts +13 -2
- package/dist/themes/color-themes.js +2 -2
- package/dist/themes/color-themes.js.map +1 -1
- package/package.json +2 -2
- package/build/assets/agent-settings-CMMms-0q.js +0 -1
- package/build/assets/conversation-DGVDwGn8.js +0 -1
- package/build/assets/conversation-panel-C7DC4Cxx.js +0 -1
- package/build/assets/llm-settings-Bkc8C5Bi.js +0 -1
- package/build/assets/recommended-automations-launcher-CXaEK1rW.js +0 -50
- package/build/assets/use-runtime-is-ready-CBFe69Ew.js +0 -1
- package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-L2sdihTY.js +0 -1
|
@@ -56,6 +56,8 @@ python3 scripts/fetch_skill.py "https://github.com/OpenHands/extensions/tree/mai
|
|
|
56
56
|
ls /path/to/workspace/.agents/skills/codereview/SKILL.md
|
|
57
57
|
\`\`\`
|
|
58
58
|
|
|
59
|
+
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\`.
|
|
60
|
+
|
|
59
61
|
Response: "✅ Added \`codereview\` to your workspace. The skill is now available."
|
|
60
62
|
|
|
61
63
|
## Notes
|
|
@@ -500,6 +502,8 @@ git remote -v && git branch # to find the current org, repo and branch
|
|
|
500
502
|
git checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget
|
|
501
503
|
\`\`\`
|
|
502
504
|
|
|
505
|
+
On Windows PowerShell, run those \`git\` commands as separate commands if \`&&\` is not supported by the installed shell.
|
|
506
|
+
|
|
503
507
|
## Azure DevOps API Usage
|
|
504
508
|
|
|
505
509
|
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.
|
|
@@ -513,6 +517,15 @@ AUTH=$(echo -n ":$AZURE_DEVOPS_TOKEN" | base64)
|
|
|
513
517
|
curl -H "Authorization: Basic $AUTH" -H "Content-Type: application/json" https://dev.azure.com/{organization}/{project}/_apis/git/repositories?api-version=7.1
|
|
514
518
|
\`\`\`
|
|
515
519
|
|
|
520
|
+
PowerShell equivalent for the PAT header:
|
|
521
|
+
|
|
522
|
+
\`\`\`powershell
|
|
523
|
+
$auth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$env:AZURE_DEVOPS_TOKEN"))
|
|
524
|
+
Invoke-RestMethod \`
|
|
525
|
+
-Headers @{ Authorization = "Basic $auth"; "Content-Type" = "application/json" } \`
|
|
526
|
+
-Uri "https://dev.azure.com/{organization}/{project}/_apis/git/repositories?api-version=7.1"
|
|
527
|
+
\`\`\`
|
|
528
|
+
|
|
516
529
|
Common API endpoints:
|
|
517
530
|
- List repositories: \`https://dev.azure.com/{organization}/{project}/_apis/git/repositories?api-version=7.1\`
|
|
518
531
|
- Get repository details: \`https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}?api-version=7.1\`
|
|
@@ -565,7 +578,7 @@ Bitbucket API (not a web browser) and always use the listed PR tool to open a pu
|
|
|
565
578
|
| Host | \`bitbucket.org\` | self-hosted domain |
|
|
566
579
|
| REST API base | \`https://api.bitbucket.org/2.0\` | \`https://<host>/rest/api/1.0\` |
|
|
567
580
|
| Repository identifier | \`workspace/repo_slug\` | \`PROJECT/repo_slug\` (project key) |
|
|
568
|
-
| Pull request tool | \`create_bitbucket_pr\` | \`create_bitbucket_data_center_pr\` |`},{name:`bitbucket-cloud`,description:`Bitbucket Cloud (bitbucket.org) specifics — authenticate with BITBUCKET_TOKEN, use the REST API v2, workspace/repo_slug repositories, and the create_bitbucket_pr tool. Loaded on demand by the bitbucket skill once a Cloud environment is detected.`,triggers:[],content:'You are working with **Bitbucket Cloud** (`bitbucket.org`). You have access to an\nenvironment variable, `BITBUCKET_TOKEN`, which allows you to interact with the Bitbucket\nCloud API.\n\n- REST API base URL: `https://api.bitbucket.org/2.0`\n- Repository identifier format: `workspace/repo_slug`\n\n<IMPORTANT>\nYou can use `curl` with the `BITBUCKET_TOKEN` to interact with Bitbucket\'s API.\nALWAYS use the Bitbucket API for operations instead of a web browser.\nALWAYS use the `create_bitbucket_pr` tool to open a pull request\n</IMPORTANT>\n\nOnly rewrite the Bitbucket remote if a push actually fails with authentication errors and the user has asked you to push. Do not proactively rewrite `origin`. OpenHands OSS commonly stores `BITBUCKET_TOKEN` in the same unencoded `user:token` form used by commands such as `curl --user "$BITBUCKET_TOKEN" ...`, so keep it in that form unless you truly need to embed it in a Git remote URL.\n\nIf you need a non-interactive HTTPS remote URL, split `BITBUCKET_TOKEN` on the first `:` and URL-encode each part before calling `git remote set-url`. This avoids breaking usernames or emails that contain reserved URL characters such as `@`:\n\n```bash\nBB_USER="${BITBUCKET_TOKEN%%:*}" && \\\nBB_PASS="${BITBUCKET_TOKEN#*:}" && \\\nENCODED_USER=$(python3 -c \'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))\' "$BB_USER") && \\\nENCODED_PASS=$(python3 -c \'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))\' "$BB_PASS") && \\\ngit remote set-url origin "https://${ENCODED_USER}:${ENCODED_PASS}@bitbucket.org/username/repo.git"\n```\n\nAtlassian\'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.\n\nHere are some instructions for pushing, but ONLY do this if the user asks you to:\n* NEVER push directly to the `main` or `master` branch\n* Git config (username and email) is pre-set. Do not modify.\n* You may already be on a branch starting with `openhands-workspace`. Create a new branch with a better name before pushing.\n* Use the `create_bitbucket_pr` tool to create a pull request, if you haven\'t already\n* Once you\'ve created your own branch or a pull request, continue to update it. Do NOT create a new one unless you are explicitly asked to. Update the PR title and description as necessary, but don\'t change the branch name.\n* Use the main branch as the base branch, unless the user requests otherwise\n* After opening or updating a pull request, send the user a short message with a link to the pull request.\n* Do NOT mark a pull request as ready to review unless the user explicitly says so\n* Do all of the above in as few steps as possible. E.g. you could push changes with one step by running the following bash commands:\n```bash\ngit remote -v && git branch # to find the current org, repo and branch\ngit checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget\n
|
|
581
|
+
| Pull request tool | \`create_bitbucket_pr\` | \`create_bitbucket_data_center_pr\` |`},{name:`bitbucket-cloud`,description:`Bitbucket Cloud (bitbucket.org) specifics — authenticate with BITBUCKET_TOKEN, use the REST API v2, workspace/repo_slug repositories, and the create_bitbucket_pr tool. Loaded on demand by the bitbucket skill once a Cloud environment is detected.`,triggers:[],content:'You are working with **Bitbucket Cloud** (`bitbucket.org`). You have access to an\nenvironment variable, `BITBUCKET_TOKEN`, which allows you to interact with the Bitbucket\nCloud API.\n\n- REST API base URL: `https://api.bitbucket.org/2.0`\n- Repository identifier format: `workspace/repo_slug`\n\n<IMPORTANT>\nYou can use `curl` with the `BITBUCKET_TOKEN` to interact with Bitbucket\'s API.\nALWAYS use the Bitbucket API for operations instead of a web browser.\nALWAYS use the `create_bitbucket_pr` tool to open a pull request\n</IMPORTANT>\n\nOnly rewrite the Bitbucket remote if a push actually fails with authentication errors and the user has asked you to push. Do not proactively rewrite `origin`. OpenHands OSS commonly stores `BITBUCKET_TOKEN` in the same unencoded `user:token` form used by commands such as `curl --user "$BITBUCKET_TOKEN" ...`, so keep it in that form unless you truly need to embed it in a Git remote URL.\n\nIf you need a non-interactive HTTPS remote URL, split `BITBUCKET_TOKEN` on the first `:` and URL-encode each part before calling `git remote set-url`. This avoids breaking usernames or emails that contain reserved URL characters such as `@`:\n\n```bash\nBB_USER="${BITBUCKET_TOKEN%%:*}" && \\\nBB_PASS="${BITBUCKET_TOKEN#*:}" && \\\nENCODED_USER=$(python3 -c \'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))\' "$BB_USER") && \\\nENCODED_PASS=$(python3 -c \'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))\' "$BB_PASS") && \\\ngit remote set-url origin "https://${ENCODED_USER}:${ENCODED_PASS}@bitbucket.org/username/repo.git"\n```\n\nPowerShell equivalent for the remote URL encoding:\n\n```powershell\n$parts = $env:BITBUCKET_TOKEN -split ":", 2\n$encodedUser = [Uri]::EscapeDataString($parts[0])\n$encodedPass = [Uri]::EscapeDataString($parts[1])\ngit remote set-url origin "https://${encodedUser}:${encodedPass}@bitbucket.org/username/repo.git"\n```\n\nAtlassian\'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.\n\nHere are some instructions for pushing, but ONLY do this if the user asks you to:\n* NEVER push directly to the `main` or `master` branch\n* Git config (username and email) is pre-set. Do not modify.\n* You may already be on a branch starting with `openhands-workspace`. Create a new branch with a better name before pushing.\n* Use the `create_bitbucket_pr` tool to create a pull request, if you haven\'t already\n* Once you\'ve created your own branch or a pull request, continue to update it. Do NOT create a new one unless you are explicitly asked to. Update the PR title and description as necessary, but don\'t change the branch name.\n* Use the main branch as the base branch, unless the user requests otherwise\n* After opening or updating a pull request, send the user a short message with a link to the pull request.\n* Do NOT mark a pull request as ready to review unless the user explicitly says so\n* Do all of the above in as few steps as possible. E.g. you could push changes with one step by running the following bash commands:\n```bash\ngit remote -v && git branch # to find the current org, repo and branch\ngit checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget\n```\n\nOn Windows PowerShell, run those `git` commands as separate commands if `&&` is not supported by the installed shell.'},{name:`bitbucket-data-center`,description:`Bitbucket Data Center (self-hosted Bitbucket Server) specifics — authenticate with BITBUCKET_DATA_CENTER_TOKEN, use the REST API 1.0, PROJECT/repo_slug repositories, scm/ git remotes, and the create_bitbucket_data_center_pr tool. Loaded on demand by the bitbucket skill once a Data Center environment is detected.`,triggers:[],content:`You are working with **Bitbucket Data Center** (self-hosted Bitbucket Server). You have
|
|
569
582
|
access to an environment variable, \`BITBUCKET_DATA_CENTER_TOKEN\`, which contains a basic
|
|
570
583
|
auth token in the format \`username:your-token\` that allows you to interact with the git
|
|
571
584
|
repository and the REST API.
|
|
@@ -641,6 +654,7 @@ The prompt includes a **Files Changed** manifest listing every file in the PR, f
|
|
|
641
654
|
3. Only after both checks come up empty should you flag something as missing. Even then, prefer "I could not locate X" over "X is missing" — the file may be in a path you haven't searched.
|
|
642
655
|
|
|
643
656
|
Before posting an **inline review comment that names a specific line number**, verify the line maps to what you think it does (\`sed -n 'X,Yp' <file>\` or \`view\`). Line numbers derived by counting \`+\`/\`-\`/context lines from a \`@@\` hunk header are not reliable; ground them against the file.
|
|
657
|
+
On Windows PowerShell, use \`Get-Content\`, \`Select-String\`, or \`(Get-Content <file>)[($start - 1)..($end - 1)]\` for the same file and line checks.
|
|
644
658
|
|
|
645
659
|
CODE REVIEW SCENARIOS:
|
|
646
660
|
|
|
@@ -896,6 +910,8 @@ When a review aspect has no findings, include it with an explicit "no issues fou
|
|
|
896
910
|
- **\`references/code-quality-review.md\`** - Detailed criteria for naming, complexity, error handling, and project standards compliance
|
|
897
911
|
- **\`references/efficiency-review.md\`** - Detailed criteria for algorithmic complexity, unnecessary work, resource usage, and I/O patterns`},{name:`datadog`,description:`Query and analyze Datadog logs, metrics, APM traces, and monitors using the Datadog API. Use when debugging production issues, monitoring application performance, or investigating alerts.`,triggers:[`datadog`],content:`# Datadog
|
|
898
912
|
|
|
913
|
+
Windows PowerShell equivalents for the Datadog \`curl\`, environment-variable, timestamp, and JSON formatting snippets are in \`references/windows.md\`.
|
|
914
|
+
|
|
899
915
|
<IMPORTANT>
|
|
900
916
|
Before performing any Datadog operations, first check if the required environment variables are set:
|
|
901
917
|
|
|
@@ -1108,6 +1124,8 @@ Use this skill when implementing or automating Discord integrations.
|
|
|
1108
1124
|
|
|
1109
1125
|
## Quick recipes
|
|
1110
1126
|
|
|
1127
|
+
The shell snippets below use POSIX-style environment variables and line continuations. On Windows PowerShell, use \`curl.exe\` for the shown flags and \`$env:DISCORD_WEBHOOK_URL\` / \`$env:DISCORD_BOT_TOKEN\` for environment variables, or translate the request to \`Invoke-RestMethod\`.
|
|
1128
|
+
|
|
1111
1129
|
### Post a message via an incoming webhook (recommended)
|
|
1112
1130
|
|
|
1113
1131
|
Discord requires at least one of \`content\`, \`embeds\`, \`components\`, \`file\`, or \`poll\`.
|
|
@@ -1179,13 +1197,17 @@ sudo dockerd > /tmp/docker.log 2>&1 &
|
|
|
1179
1197
|
sleep 5
|
|
1180
1198
|
\`\`\`
|
|
1181
1199
|
|
|
1200
|
+
On Windows, start Docker Desktop or the Docker service instead of running \`sudo dockerd\`; then run Docker commands from PowerShell without \`sudo\`.
|
|
1201
|
+
|
|
1182
1202
|
## Verifying Docker Installation
|
|
1183
1203
|
|
|
1184
1204
|
To verify Docker is working correctly, run the hello-world container:
|
|
1185
1205
|
|
|
1186
1206
|
\`\`\`bash
|
|
1187
1207
|
sudo docker run hello-world
|
|
1188
|
-
|
|
1208
|
+
\`\`\`
|
|
1209
|
+
|
|
1210
|
+
PowerShell equivalent after Docker Desktop is running: \`docker run hello-world\`.`},{name:`evidence-based-citations`,description:`Back factual claims and field values with official, verifiable sources. Use when the user asks to fill fields, answer questions, or make claims that must be supported by an exact quote and an official link.`,triggers:[`evidence-based`,`cite source`,`cite sources`,`official source`,`official link`,`official links`,`official docs`,`official documentation`,`verifiable source`],content:`The user wants every field value or factual claim you produce in the current response to be backed by an official, verifiable source. Apply this skill to the response that triggered it; do not assume it stays active for the rest of the conversation unless the user clearly asks for it to.
|
|
1189
1211
|
|
|
1190
1212
|
## Output format
|
|
1191
1213
|
|
|
@@ -1277,6 +1299,8 @@ Examples:
|
|
|
1277
1299
|
- \`gh pr checks 200 --watch --interval 10\` to check until completed.
|
|
1278
1300
|
</IMPORTANT>
|
|
1279
1301
|
|
|
1302
|
+
Windows PowerShell equivalents for the multi-line shell snippets below are in \`references/windows.md\`.
|
|
1303
|
+
|
|
1280
1304
|
If you encounter authentication issues when pushing to GitHub (such as password prompts or permission errors), the old token may have expired. In such case, update the remote URL to include the current token: \`git remote set-url origin https://\${GITHUB_TOKEN}@github.com/username/repo.git\`
|
|
1281
1305
|
|
|
1282
1306
|
Here are some instructions for pushing, but ONLY do this if the user asks you to:
|
|
@@ -1396,6 +1420,7 @@ See [README.md](README.md) for the full debugging workflow, \`gh\` commands, and
|
|
|
1396
1420
|
4. **Artifacts for job-to-job data** - Files don't persist between jobs without \`upload-artifact\`/\`download-artifact\``},{name:`github-pr-review`,description:`Post PR review comments using the GitHub API with inline comments, suggestions, and priority labels.`,triggers:[`/github-pr-review`],content:`# GitHub PR Review
|
|
1397
1421
|
|
|
1398
1422
|
Post structured code review feedback using the GitHub API with inline comments on specific lines.
|
|
1423
|
+
Windows PowerShell equivalents for JSON file creation, temp paths, line lookup, and fallback \`curl\` are in \`references/windows.md\`.
|
|
1399
1424
|
|
|
1400
1425
|
## Key Rule: One API Call
|
|
1401
1426
|
|
|
@@ -1576,6 +1601,7 @@ curl -X POST \\
|
|
|
1576
1601
|
Create a cron automation that watches a GitHub repository for pull requests
|
|
1577
1602
|
with a review trigger label, starts an OpenHands review conversation once per
|
|
1578
1603
|
label event, and posts the AI review as a GitHub comment.
|
|
1604
|
+
Windows PowerShell equivalents for the setup, packaging, upload, and API-check shell snippets are in \`references/windows.md\`.
|
|
1579
1605
|
|
|
1580
1606
|
The automation script is deterministic: PR discovery, label-event tracking,
|
|
1581
1607
|
state persistence, stale-result suppression, and GitHub comment posting are
|
|
@@ -1814,6 +1840,7 @@ Each cron run executes \`main.py\`, which:
|
|
|
1814
1840
|
|
|
1815
1841
|
Create a cron automation that polls a single GitHub repository on a
|
|
1816
1842
|
configurable schedule (default: every minute).
|
|
1843
|
+
Windows PowerShell equivalents for the setup, packaging, upload, and API-check shell snippets are in \`references/windows.md\`.
|
|
1817
1844
|
|
|
1818
1845
|
When a comment on an issue or PR contains the **trigger phrase**
|
|
1819
1846
|
(default: \`@OpenHands\`) it:
|
|
@@ -2111,30 +2138,7 @@ Each cron run executes \`main.py\`, which:
|
|
|
2111
2138
|
| Comments posted but no conversation created | Agent server URL wrong | Check \`OPENHANDS_URL\` secret and \`AGENT_SERVER_URL\` env var |
|
|
2112
2139
|
| Same comment processed twice | \`processed_comment_ids\` cleared | State file was deleted; harmless but duplicate comment may appear |
|
|
2113
2140
|
| Summary never posted | Conversation stuck in \`running\` | Open the conversation in the OpenHands UI; agent may need input |
|
|
2114
|
-
| No events detected after first run | \`last_poll\` in the future | Delete the state file to reset; it will be recreated on next run |`},{name:`gitlab`,description:`Interact with GitLab repositories, merge requests, and APIs using the GITLAB_TOKEN environment variable. Use when working with code hosted on GitLab or managing GitLab resources.`,triggers:[`gitlab`,`git`],content
|
|
2115
|
-
the GitLab API.
|
|
2116
|
-
|
|
2117
|
-
<IMPORTANT>
|
|
2118
|
-
You can use \`curl\` with the \`GITLAB_TOKEN\` to interact with GitLab's API.
|
|
2119
|
-
ALWAYS use the GitLab API for operations instead of a web browser.
|
|
2120
|
-
ALWAYS use the \`create_mr\` tool to open a merge request
|
|
2121
|
-
</IMPORTANT>
|
|
2122
|
-
|
|
2123
|
-
If you encounter authentication issues when pushing to GitLab (such as password prompts or permission errors), the old token may have expired. In such case, update the remote URL to include the current token: \`git remote set-url origin https://oauth2:\${GITLAB_TOKEN}@gitlab.com/username/repo.git\`
|
|
2124
|
-
|
|
2125
|
-
Here are some instructions for pushing, but ONLY do this if the user asks you to:
|
|
2126
|
-
* NEVER push directly to the \`main\` or \`master\` branch
|
|
2127
|
-
* Git config (username and email) is pre-set. Do not modify.
|
|
2128
|
-
* You may already be on a branch starting with \`openhands-workspace\`. Create a new branch with a better name before pushing.
|
|
2129
|
-
* Use the \`create_mr\` tool to create a merge request, if you haven't already
|
|
2130
|
-
* Once you've created your own branch or a merge request, continue to update it. Do NOT create a new one unless you are explicitly asked to. Update the PR title and description as necessary, but don't change the branch name.
|
|
2131
|
-
* Use the main branch as the base branch, unless the user requests otherwise
|
|
2132
|
-
* After opening or updating a merge request, send the user a short message with a link to the merge request.
|
|
2133
|
-
* Do all of the above in as few steps as possible. E.g. you could push changes with one step by running the following bash commands:
|
|
2134
|
-
\`\`\`bash
|
|
2135
|
-
git remote -v && git branch # to find the current org, repo and branch
|
|
2136
|
-
git checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget
|
|
2137
|
-
\`\`\``},{name:`incident-retrospective`,description:`Create an automation that drafts incident retrospectives. Gathers incident-channel messages from Slack, collects linked tickets and follow-ups from Linear, and publishes a retrospective draft to Notion with a timeline, impact summary, root-cause hypotheses, and action items.`,triggers:[`/incident-retro:setup`],content:`# Incident Retrospective Drafter Automation
|
|
2141
|
+
| No events detected after first run | \`last_poll\` in the future | Delete the state file to reset; it will be recreated on next run |`},{name:`gitlab`,description:`Interact with GitLab repositories, merge requests, and APIs using the GITLAB_TOKEN environment variable. Use when working with code hosted on GitLab or managing GitLab resources.`,triggers:[`gitlab`,`git`],content:"You have access to an environment variable, `GITLAB_TOKEN`, which allows you to interact with\nthe GitLab API.\n\n<IMPORTANT>\nYou can use `curl` with the `GITLAB_TOKEN` to interact with GitLab's API.\nALWAYS use the GitLab API for operations instead of a web browser.\nALWAYS use the `create_mr` tool to open a merge request\n</IMPORTANT>\n\nIf you encounter authentication issues when pushing to GitLab (such as password prompts or permission errors), the old token may have expired. In such case, update the remote URL to include the current token: `git remote set-url origin https://oauth2:${GITLAB_TOKEN}@gitlab.com/username/repo.git`\n\nHere are some instructions for pushing, but ONLY do this if the user asks you to:\n* NEVER push directly to the `main` or `master` branch\n* Git config (username and email) is pre-set. Do not modify.\n* You may already be on a branch starting with `openhands-workspace`. Create a new branch with a better name before pushing.\n* Use the `create_mr` tool to create a merge request, if you haven't already\n* Once you've created your own branch or a merge request, continue to update it. Do NOT create a new one unless you are explicitly asked to. Update the PR title and description as necessary, but don't change the branch name.\n* Use the main branch as the base branch, unless the user requests otherwise\n* After opening or updating a merge request, send the user a short message with a link to the merge request.\n* Do all of the above in as few steps as possible. E.g. you could push changes with one step by running the following bash commands:\n```bash\ngit remote -v && git branch # to find the current org, repo and branch\ngit checkout -b create-widget && git add . && git commit -m \"Create widget\" && git push -u origin create-widget\n```\n\nOn Windows PowerShell, use `$env:GITLAB_TOKEN` in remote URLs and run the `git` commands as separate commands if `&&` is not supported by the installed shell."},{name:`incident-retrospective`,description:`Create an automation that drafts incident retrospectives. Gathers incident-channel messages from Slack, collects linked tickets and follow-ups from Linear, and publishes a retrospective draft to Notion with a timeline, impact summary, root-cause hypotheses, and action items.`,triggers:[`/incident-retro:setup`],content:`# Incident Retrospective Drafter Automation
|
|
2138
2142
|
|
|
2139
2143
|
Set up an automation that drafts incident retrospectives by pulling data from
|
|
2140
2144
|
Slack, Linear, and Notion.
|
|
@@ -2210,6 +2214,8 @@ curl -s -X POST "\${OPENHANDS_HOST}/api/automation/v1/preset/prompt" \\
|
|
|
2210
2214
|
}'
|
|
2211
2215
|
\`\`\`
|
|
2212
2216
|
|
|
2217
|
+
PowerShell note: use \`curl.exe\` for this exact flag syntax, and replace \`\${OPENHANDS_HOST}\` / \`$OPENHANDS_AUTOMATION_API_KEY\` with \`$env:OPENHANDS_HOST\` / \`$env:OPENHANDS_AUTOMATION_API_KEY\` if running it natively.
|
|
2218
|
+
|
|
2213
2219
|
### Step 5 — Confirm
|
|
2214
2220
|
|
|
2215
2221
|
Tell the user:
|
|
@@ -2230,6 +2236,7 @@ No scripts — you are the orchestration loop. Uses only standard \`gh\` CLI
|
|
|
2230
2236
|
commands that work on any GitHub repo.
|
|
2231
2237
|
|
|
2232
2238
|
Requires: \`gh\` CLI authenticated with repo access, a PR branch.
|
|
2239
|
+
Windows PowerShell equivalents for Bash-only assignment, redirection, and quoting patterns in this skill are in \`references/windows.md\`.
|
|
2233
2240
|
|
|
2234
2241
|
## Discover what the repo has
|
|
2235
2242
|
|
|
@@ -2605,7 +2612,209 @@ Final summary should include:
|
|
|
2605
2612
|
## References
|
|
2606
2613
|
|
|
2607
2614
|
- Verification stack (layers, signals, retriggering): \`references/verification.md\`
|
|
2608
|
-
- CI/review heuristics and decision tree: \`references/heuristics.md\``},{name:`
|
|
2615
|
+
- CI/review heuristics and decision tree: \`references/heuristics.md\``},{name:`jira-issue-to-pr`,description:`This skill should be used when the user asks to "set up a Jira automation to create pull requests", "poll Jira for create-pr issues", "automatically create GitHub PRs from Jira tickets", "deploy a Jira issue-to-PR automation", "create a Jira to GitHub PR workflow", or mentions automating GitHub PR creation from a Jira label. Deploys 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 repository is read from the body of the Jira ticket - no repo parameter is required at deploy time.`,triggers:[],content:`# Jira → GitHub PR Automation
|
|
2616
|
+
|
|
2617
|
+
Deploys a cron automation that polls a Jira Cloud instance for open issues carrying a
|
|
2618
|
+
configurable label and, for each new issue, starts an OpenHands agent conversation that
|
|
2619
|
+
clones the GitHub repository specified in the ticket body, creates a branch, implements
|
|
2620
|
+
or placeholders the requested change, and opens a pull request. Once the conversation
|
|
2621
|
+
starts, it also posts a comment on the Jira ticket: "I'm on it: <conversation URL>".
|
|
2622
|
+
|
|
2623
|
+
## How It Works
|
|
2624
|
+
|
|
2625
|
+
1. **Poll** - every N minutes, \`POST /rest/api/3/search/jql\` on the Jira Cloud instance
|
|
2626
|
+
to find open issues with the configured label.
|
|
2627
|
+
2. **Deduplicate** - on the very first run the script records a \`first_run_at\` baseline
|
|
2628
|
+
timestamp in the KV store; any issue whose \`updated\` timestamp predates that baseline
|
|
2629
|
+
is skipped (no backfill blast on first deploy). Using \`updated\` rather than \`created\`
|
|
2630
|
+
means an old issue that has its label added after the automation is deployed will still
|
|
2631
|
+
be picked up. Subsequent runs filter by both \`first_run_at\` and a KV-backed set of
|
|
2632
|
+
already-processed issue keys. A \`max_new_per_run\` cap (default 5) limits conversations
|
|
2633
|
+
started per cron firing as additional defense-in-depth.
|
|
2634
|
+
3. **Dispatch** - for each new issue, call \`POST /api/conversations\` on the agent server
|
|
2635
|
+
to start an independent agent conversation with a PR-creation prompt. The prompt
|
|
2636
|
+
instructs the agent to extract the target GitHub repository (\`owner/repo\`) from the
|
|
2637
|
+
ticket body.
|
|
2638
|
+
4. **Comment** - immediately after the conversation is created, post a Jira comment on the
|
|
2639
|
+
issue: \`I'm on it: <conversation URL>\`.
|
|
2640
|
+
5. **Persist** - record the processed issue key so re-runs never duplicate work.
|
|
2641
|
+
|
|
2642
|
+
The polling run is lightweight (stdlib only, no SDK install); LLM costs are incurred only
|
|
2643
|
+
when new issues are actually found.
|
|
2644
|
+
|
|
2645
|
+
## Prerequisites
|
|
2646
|
+
|
|
2647
|
+
Before deploying, ensure the following are in place:
|
|
2648
|
+
|
|
2649
|
+
| Requirement | Details |
|
|
2650
|
+
|---|---|
|
|
2651
|
+
| **Jira API token** | Stored as an OpenHands secret (see [Jira API token setup](#jira-api-token)) |
|
|
2652
|
+
| **GitHub token** | Must be stored as an OpenHands secret with \`repo\` + \`workflow\` scope so the spawned conversation can push branches and open PRs |
|
|
2653
|
+
| **Jira label** | The label to watch for (default: \`create-pr\`) must exist in the Jira project |
|
|
2654
|
+
| **GitHub repo** | The target repository must exist and the GitHub token must have write access |
|
|
2655
|
+
|
|
2656
|
+
## Deploying the Automation
|
|
2657
|
+
|
|
2658
|
+
### Step 1 - Collect parameters
|
|
2659
|
+
|
|
2660
|
+
Gather the following from the user before proceeding:
|
|
2661
|
+
|
|
2662
|
+
| Parameter | Example | Notes |
|
|
2663
|
+
|---|---|---|
|
|
2664
|
+
| \`jira_base_url\` | \`https://acme.atlassian.net\` | No trailing slash |
|
|
2665
|
+
| \`jira_email\` | \`alice@acme.com\` | Atlassian account email for Basic auth |
|
|
2666
|
+
| \`jira_token_secret\` | \`JIRA_CLOUD_KEY\` | Name of the OpenHands secret holding the API token |
|
|
2667
|
+
| \`jira_label\` | \`create-pr\` | Label to watch for (optional, defaults to \`create-pr\`) |
|
|
2668
|
+
| \`max_new_per_run\` | \`5\` | Max conversations dispatched per cron firing (optional, defaults to \`5\`) |
|
|
2669
|
+
| \`cron_schedule\` | \`*/5 * * * *\` | Polling frequency in cron syntax |
|
|
2670
|
+
|
|
2671
|
+
> **Note**: The GitHub repository is not configured here. Each Jira ticket body must include
|
|
2672
|
+
> a reference to the target GitHub repo in \`owner/repo\` format (e.g. \`acme-org/backend\`).
|
|
2673
|
+
> The spawned agent extracts it from the ticket text.
|
|
2674
|
+
|
|
2675
|
+
### Step 2 - Create config.json
|
|
2676
|
+
|
|
2677
|
+
Create \`config.json\` next to \`scripts/main.py\` when packaging:
|
|
2678
|
+
|
|
2679
|
+
\`\`\`json
|
|
2680
|
+
{
|
|
2681
|
+
"jira_base_url": "https://acme.atlassian.net",
|
|
2682
|
+
"jira_email": "alice@acme.com",
|
|
2683
|
+
"jira_token_secret": "JIRA_CLOUD_KEY",
|
|
2684
|
+
"jira_label": "create-pr",
|
|
2685
|
+
"max_new_per_run": 5
|
|
2686
|
+
}
|
|
2687
|
+
\`\`\`
|
|
2688
|
+
|
|
2689
|
+
### Step 3 - Package the tarball
|
|
2690
|
+
|
|
2691
|
+
Copy \`scripts/main.py\` from this skill and package it with the \`config.json\`:
|
|
2692
|
+
|
|
2693
|
+
\`\`\`bash
|
|
2694
|
+
WORK=$(mktemp -d)
|
|
2695
|
+
cp <skill-dir>/scripts/main.py "$WORK/main.py"
|
|
2696
|
+
# write config.json into $WORK/config.json (see Step 2)
|
|
2697
|
+
tar -czf /tmp/jira-issue-to-pr.tar.gz -C "$WORK" .
|
|
2698
|
+
python3 -m py_compile "$WORK/main.py" # validate syntax before uploading
|
|
2699
|
+
\`\`\`
|
|
2700
|
+
|
|
2701
|
+
### Step 4 - Upload the tarball
|
|
2702
|
+
|
|
2703
|
+
\`\`\`bash
|
|
2704
|
+
TARBALL_PATH=$(curl -s -X POST \\
|
|
2705
|
+
"http://localhost:8000/api/automation/v1/uploads?name=jira-issue-to-pr" \\
|
|
2706
|
+
-H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \\
|
|
2707
|
+
-H "Content-Type: application/gzip" \\
|
|
2708
|
+
--data-binary @/tmp/jira-issue-to-pr.tar.gz \\
|
|
2709
|
+
| python3 -c "import sys,json; print(json.load(sys.stdin)['tarball_path'])")
|
|
2710
|
+
\`\`\`
|
|
2711
|
+
|
|
2712
|
+
### Step 5 - Create the automation
|
|
2713
|
+
|
|
2714
|
+
\`\`\`bash
|
|
2715
|
+
curl -s -X POST "http://localhost:8000/api/automation/v1" \\
|
|
2716
|
+
-H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \\
|
|
2717
|
+
-H "Content-Type: application/json" \\
|
|
2718
|
+
-d "{
|
|
2719
|
+
\\"name\\": \\"Jira issue-to-PR Poller\\",
|
|
2720
|
+
\\"trigger\\": {
|
|
2721
|
+
\\"type\\": \\"cron\\",
|
|
2722
|
+
\\"schedule\\": \\"*/5 * * * *\\",
|
|
2723
|
+
\\"timezone\\": \\"UTC\\"
|
|
2724
|
+
},
|
|
2725
|
+
\\"tarball_path\\": \\"$TARBALL_PATH\\",
|
|
2726
|
+
\\"entrypoint\\": \\"python3 main.py\\",
|
|
2727
|
+
\\"timeout\\": 540
|
|
2728
|
+
}" | python3 -m json.tool
|
|
2729
|
+
\`\`\`
|
|
2730
|
+
|
|
2731
|
+
Save the returned \`id\` - use it for updates and monitoring.
|
|
2732
|
+
|
|
2733
|
+
### Step 6 - Verify with a test dispatch
|
|
2734
|
+
|
|
2735
|
+
\`\`\`bash
|
|
2736
|
+
curl -s -X POST \\
|
|
2737
|
+
"http://localhost:8000/api/automation/v1/<AUTOMATION_ID>/dispatch" \\
|
|
2738
|
+
-H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" | python3 -m json.tool
|
|
2739
|
+
|
|
2740
|
+
# After ~30 seconds, check the run status:
|
|
2741
|
+
curl -s "http://localhost:8000/api/automation/v1/<AUTOMATION_ID>/runs?limit=1" \\
|
|
2742
|
+
-H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \\
|
|
2743
|
+
| python3 -c "import sys,json; r=json.load(sys.stdin)['runs'][0]; print(r['status'], r.get('error_detail'))"
|
|
2744
|
+
\`\`\`
|
|
2745
|
+
|
|
2746
|
+
## Updating an Existing Deployment
|
|
2747
|
+
|
|
2748
|
+
To change configuration or update the script:
|
|
2749
|
+
|
|
2750
|
+
1. Edit \`config.json\` with new values.
|
|
2751
|
+
2. Repackage and upload a new tarball (Steps 3-4 above).
|
|
2752
|
+
3. PATCH the existing automation with the new \`tarball_path\`:
|
|
2753
|
+
|
|
2754
|
+
\`\`\`bash
|
|
2755
|
+
curl -s -X PATCH \\
|
|
2756
|
+
"http://localhost:8000/api/automation/v1/<AUTOMATION_ID>" \\
|
|
2757
|
+
-H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \\
|
|
2758
|
+
-H "Content-Type: application/json" \\
|
|
2759
|
+
-d "{\\"tarball_path\\": \\"<NEW_TARBALL_PATH>\\"}"
|
|
2760
|
+
\`\`\`
|
|
2761
|
+
|
|
2762
|
+
## Resetting Processed State
|
|
2763
|
+
|
|
2764
|
+
To reprocess issues that were already handled (e.g., after testing), clear the KV store:
|
|
2765
|
+
|
|
2766
|
+
\`\`\`bash
|
|
2767
|
+
curl -s -X DELETE \\
|
|
2768
|
+
"http://localhost:8000/api/automation/v1/<KV_BASE>/v1/kv/state" \\
|
|
2769
|
+
-H "Authorization: Bearer $AUTOMATION_KV_TOKEN"
|
|
2770
|
+
\`\`\`
|
|
2771
|
+
|
|
2772
|
+
Or delete and recreate the automation to start with a clean state.
|
|
2773
|
+
|
|
2774
|
+
## Script Reference
|
|
2775
|
+
|
|
2776
|
+
The automation script lives at \`scripts/main.py\`. Key behaviors:
|
|
2777
|
+
|
|
2778
|
+
- **No SDK dependencies** - pure Python stdlib; no \`setup.sh\` or \`uv\` install needed.
|
|
2779
|
+
- **Config file** - reads all parameters from \`config.json\` co-located with the script.
|
|
2780
|
+
- **First-run baseline** - on the very first execution the script writes \`first_run_at\` (UTC timestamp) into the KV store and exits without dispatching; issues whose \`updated\` timestamp predates that baseline are skipped on all subsequent runs. Using \`updated\` (not \`created\`) means an old issue that has its label applied after deployment is correctly treated as new.
|
|
2781
|
+
- **Per-run cap** - \`max_new_per_run\` (default 5) limits how many conversations are started per cron firing; any remaining new issues are dispatched on the next run.
|
|
2782
|
+
- **KV store** - persists \`{"processed_keys": [...], "first_run_at": "..."}\` between runs; falls back to a local file in dev environments where \`AUTOMATION_KV_TOKEN\` is absent.
|
|
2783
|
+
- **Jira API** - uses \`POST /rest/api/3/search/jql\` (the current non-deprecated endpoint).
|
|
2784
|
+
- **Conversation dispatch** - calls \`POST /api/conversations\` on the agent server with the current user's LLM/agent settings forwarded to the new conversation.
|
|
2785
|
+
- **Error transparency** - captures Jira HTTP response bodies in error messages for fast diagnosis.
|
|
2786
|
+
|
|
2787
|
+
## Known Limitations
|
|
2788
|
+
|
|
2789
|
+
### Pre-existing issues updated after deployment
|
|
2790
|
+
|
|
2791
|
+
The deduplication filter compares each issue's \`fields.updated\` timestamp against
|
|
2792
|
+
\`first_run_at\`. \`updated\` is Jira's last-modified timestamp for the issue as a whole —
|
|
2793
|
+
it advances whenever **any** field changes (comments, priority, description, status, etc.),
|
|
2794
|
+
not only when the \`create-pr\` label is applied.
|
|
2795
|
+
|
|
2796
|
+
This means a pre-existing issue that already carried the label at deployment time can
|
|
2797
|
+
slip through the filter if it is later updated for an unrelated reason (e.g. someone adds
|
|
2798
|
+
a comment), because its \`updated\` timestamp will have advanced past \`first_run_at\` while
|
|
2799
|
+
its key is not yet in \`processed_keys\`.
|
|
2800
|
+
|
|
2801
|
+
**Workaround:** The only fully reliable way to detect exactly when a label was applied
|
|
2802
|
+
is the Jira changelog API (\`GET /rest/api/3/issue/{key}/changelog\`), which requires an
|
|
2803
|
+
extra HTTP call per issue. To avoid that overhead, keep the automation's scope narrow:
|
|
2804
|
+
use a label that is exclusively added as a PR-creation signal and is not already present
|
|
2805
|
+
on issues at the time of deployment.
|
|
2806
|
+
|
|
2807
|
+
Once an issue is successfully dispatched its key is written to \`processed_keys\` in the
|
|
2808
|
+
KV store and is **permanently skipped on every future run** — regardless of subsequent
|
|
2809
|
+
label changes, comments, or any other updates to the issue. The only way to re-trigger a
|
|
2810
|
+
previously processed issue is to manually clear the KV store or delete and recreate the
|
|
2811
|
+
automation. This means the risk window described above is finite: as soon as the
|
|
2812
|
+
automation processes a pre-existing issue (even accidentally), it will never dispatch
|
|
2813
|
+
that issue again.
|
|
2814
|
+
|
|
2815
|
+
## Additional Resources
|
|
2816
|
+
|
|
2817
|
+
- **\`references/setup.md\`** - Jira API token creation, GitHub token scopes, cron schedule reference, and troubleshooting guide.`},{name:`jupyter`,description:`Read, modify, execute, and convert Jupyter notebooks programmatically. Use when working with .ipynb files for data science workflows, including editing cells, clearing outputs, or converting to other formats.`,triggers:[`ipynb`,`jupyter`],content:`# Jupyter Notebook Guide
|
|
2609
2818
|
|
|
2610
2819
|
Notebooks are JSON files. Cells are in \`nb['cells']\`, each has \`source\` (list of strings) and \`cell_type\` ('code', 'markdown', or 'raw').
|
|
2611
2820
|
|
|
@@ -2632,6 +2841,12 @@ jupyter nbconvert --to markdown notebook.ipynb # Convert to Markdown
|
|
|
2632
2841
|
grep -n "search_term" notebook.ipynb
|
|
2633
2842
|
\`\`\`
|
|
2634
2843
|
|
|
2844
|
+
PowerShell equivalent:
|
|
2845
|
+
|
|
2846
|
+
\`\`\`powershell
|
|
2847
|
+
Select-String -Path notebook.ipynb -Pattern "search_term"
|
|
2848
|
+
\`\`\`
|
|
2849
|
+
|
|
2635
2850
|
## Cell Structure
|
|
2636
2851
|
\`\`\`python
|
|
2637
2852
|
# Code cell
|
|
@@ -2653,6 +2868,7 @@ for cell in nb['cells']:
|
|
|
2653
2868
|
KIND (Kubernetes IN Docker) is a tool for running local Kubernetes clusters using Docker containers as nodes. It's designed for testing Kubernetes applications locally.
|
|
2654
2869
|
|
|
2655
2870
|
IMPORTANT: Before you proceed with installation, make sure you have docker installed locally.
|
|
2871
|
+
Windows PowerShell equivalents for installing KIND and kubectl are in \`references/windows.md\`.
|
|
2656
2872
|
|
|
2657
2873
|
### Installation
|
|
2658
2874
|
|
|
@@ -2862,6 +3078,8 @@ Handle these common edge cases gracefully:
|
|
|
2862
3078
|
For posting structured code reviews, see the \`github-pr-review\` skill.
|
|
2863
3079
|
For creating new skills, see the \`skill-creator\` skill.`},{name:`linear`,description:`Interact with Linear project management - query issues, update status, create tickets, and manage workflows using the Linear GraphQL API. Use when working with Linear tickets, sprints, or project tracking.`,triggers:[`linear`,`ticket`,`issue tracking`],content:`# Linear
|
|
2864
3080
|
|
|
3081
|
+
Windows PowerShell equivalents for the repeated Linear GraphQL \`curl\` and environment-variable snippets are in \`references/windows.md\`.
|
|
3082
|
+
|
|
2865
3083
|
<IMPORTANT>
|
|
2866
3084
|
Before performing any Linear operations, check if the required environment variable is set:
|
|
2867
3085
|
|
|
@@ -3134,6 +3352,8 @@ curl -s -X POST "\${OPENHANDS_HOST}/api/automation/v1/preset/prompt" \\
|
|
|
3134
3352
|
}'
|
|
3135
3353
|
\`\`\`
|
|
3136
3354
|
|
|
3355
|
+
PowerShell note: use \`curl.exe\` for this exact flag syntax, and replace \`\${OPENHANDS_HOST}\` / \`$OPENHANDS_AUTOMATION_API_KEY\` with \`$env:OPENHANDS_HOST\` / \`$env:OPENHANDS_AUTOMATION_API_KEY\` if running it natively.
|
|
3356
|
+
|
|
3137
3357
|
### Step 5 — Confirm
|
|
3138
3358
|
|
|
3139
3359
|
Tell the user:
|
|
@@ -3144,6 +3364,8 @@ Tell the user:
|
|
|
3144
3364
|
> - Mode: \`{auto-apply or suggest}\`
|
|
3145
3365
|
> - Trigger: \`{trigger description}\``},{name:`notion`,description:`Create, search, and update Notion pages/databases using the Notion API. Use for documenting work, generating runbooks, and automating knowledge base updates.`,triggers:[`notion`],content:`# Notion
|
|
3146
3366
|
|
|
3367
|
+
Windows PowerShell equivalents for the repeated Notion REST \`curl\`, environment-variable, and JSON-body snippets are in \`references/windows.md\`.
|
|
3368
|
+
|
|
3147
3369
|
<IMPORTANT>
|
|
3148
3370
|
If authenticated Notion MCP tools are available in the environment, use them first. MCP tools do not require passing \`NOTION_INTEGRATION_KEY\` as a tool argument; authentication is handled by the configured MCP integration.
|
|
3149
3371
|
|
|
@@ -3245,6 +3467,7 @@ curl -s -X PATCH "https://api.notion.com/v1/blocks/\${PAGE_ID}/children" \\
|
|
|
3245
3467
|
- Create a page: https://developers.notion.com/reference/post-page
|
|
3246
3468
|
- Append block children: https://developers.notion.com/reference/patch-block-children`},{name:`npm`,description:`Handle npm package installation in non-interactive environments by piping confirmations. Use when installing Node.js packages that require user confirmation prompts.`,triggers:[`npm`],content:`When using npm to install packages, you will not be able to use an interactive shell, and it may be hard to confirm your actions.
|
|
3247
3469
|
As an alternative, you can pipe in the output of the unix "yes" command to confirm your actions.`},{name:`openhands-api`,description:`Reference skill for the OpenHands Cloud REST API (V1) and agent-server APIs, including how to start additional cloud or local backend conversations for fresh-context or delegated work.`,triggers:[`openhands-api`,`openhands-api-v1`,`openhands-cloud`,`openhands-cloud-api-v1`,`oh-api-v1`,`oh-cloud-api-v1`],content:`This skill documents the **OpenHands Cloud API** (V1), commonly used **agent-server APIs**, and small, easy-to-copy clients.
|
|
3470
|
+
Windows PowerShell equivalents for the shell examples in this skill are in \`references/windows.md\`.
|
|
3248
3471
|
|
|
3249
3472
|
It is intentionally focused on common OpenHands API workflows:
|
|
3250
3473
|
|
|
@@ -3702,6 +3925,7 @@ This skill is aligned against the current OpenHands API docs and implementation:
|
|
|
3702
3925
|
- \`OpenHands/OpenHands/openhands/app_server/app_conversation/app_conversation_models.py\``},{name:`openhands-automation`,description:`This skill should be used when the user asks to "create an automation", "schedule a task", "set up a cron job", "webhook integration", "event-triggered automation", or mentions automations, scheduled tasks, cron scheduling, or webhook events in OpenHands Cloud.`,triggers:[`automation`,`automations`,`scheduled task`,`cron job`,`cron schedule`,`webhook`,`webhooks`,`event trigger`,`github event`,`pull request automation`,`issue automation`,`/automation:create`],content:`# OpenHands Automations
|
|
3703
3926
|
|
|
3704
3927
|
Create and manage automations that run inside an OpenHands agent server — triggered by cron schedules or webhook events (GitHub, custom services).
|
|
3928
|
+
Windows PowerShell equivalents for the automation API \`curl\` examples and shell-variable conventions are in \`references/windows.md\`.
|
|
3705
3929
|
|
|
3706
3930
|
## Automation Creation Process
|
|
3707
3931
|
The agent must follow these steps when creating an automation:
|
|
@@ -4786,6 +5010,8 @@ Source: [\`examples/\`](https://github.com/OpenHands/software-agent-sdk/tree/mai
|
|
|
4786
5010
|
apt-get install texlive-latex-base
|
|
4787
5011
|
\`\`\`
|
|
4788
5012
|
|
|
5013
|
+
On Windows, install MiKTeX or TeX Live with the native installer or a package manager such as \`winget\`. The \`apt-get\` commands only work in Linux or WSL.
|
|
5014
|
+
|
|
4789
5015
|
* Also install the recommended and extra fonts to avoid running into errors, when trying to use pdflatex on latex files with more fonts.
|
|
4790
5016
|
|
|
4791
5017
|
\`\`\`
|
|
@@ -5403,6 +5629,8 @@ curl -s -X POST "\${OPENHANDS_HOST}/api/automation/v1/preset/prompt" \\
|
|
|
5403
5629
|
}'
|
|
5404
5630
|
\`\`\`
|
|
5405
5631
|
|
|
5632
|
+
PowerShell note: use \`curl.exe\` for this exact flag syntax, and replace \`\${OPENHANDS_HOST}\` / \`$OPENHANDS_AUTOMATION_API_KEY\` with \`$env:OPENHANDS_HOST\` / \`$env:OPENHANDS_AUTOMATION_API_KEY\` if running it natively.
|
|
5633
|
+
|
|
5406
5634
|
### Step 5 — Confirm
|
|
5407
5635
|
|
|
5408
5636
|
Tell the user:
|
|
@@ -5436,6 +5664,7 @@ You should always complete the task requested. If there are security concerns pl
|
|
|
5436
5664
|
- Use secure error reporting mechanisms`},{name:`skill-creator`,description:`This skill should be used when the user wants to "create a skill", "write a new skill", "improve skill description", "organize skill content", or needs guidance on skill structure, progressive disclosure, or skill development best practices.`,triggers:[],content:`# Skill Creator
|
|
5437
5665
|
|
|
5438
5666
|
This skill provides guidance for creating effective skills.
|
|
5667
|
+
Windows PowerShell equivalents for the Unix shell commands used in examples are in \`references/windows.md\`.
|
|
5439
5668
|
|
|
5440
5669
|
## About Skills
|
|
5441
5670
|
|
|
@@ -5975,6 +6204,7 @@ To create a skill:
|
|
|
5975
6204
|
Focus on strong trigger descriptions, progressive disclosure, and imperative writing style for effective skills that load when needed and provide targeted guidance.`},{name:`slack-channel-monitor`,description:`This skill should be used when the user asks to "monitor a Slack channel", "watch Slack for messages", "create a Slack bot that responds to mentions", "set up an OpenHands Slack integration", "trigger OpenHands from Slack", "respond to @openhands in Slack", or "poll Slack channels for a trigger phrase". Guides the user through creating a cron automation that watches up to 10 Slack channels and starts an OpenHands conversation whenever a configurable trigger phrase is detected.`,triggers:[`/slack-monitor:poll`],content:`# Slack Channel Monitor
|
|
5976
6205
|
|
|
5977
6206
|
Create a cron automation that polls up to 10 Slack channels every minute.
|
|
6207
|
+
Windows PowerShell equivalents for the setup, packaging, upload, and API-check shell snippets are in \`references/windows.md\`.
|
|
5978
6208
|
When a message containing the **trigger phrase** (default: \`@openhands\`) is
|
|
5979
6209
|
detected it:
|
|
5980
6210
|
|
|
@@ -6332,6 +6562,8 @@ curl -s -X POST "\${OPENHANDS_HOST}/api/automation/v1/preset/prompt" \\
|
|
|
6332
6562
|
}'
|
|
6333
6563
|
\`\`\`
|
|
6334
6564
|
|
|
6565
|
+
PowerShell note: use \`curl.exe\` for this exact flag syntax, and replace \`\${OPENHANDS_HOST}\` / \`$OPENHANDS_AUTOMATION_API_KEY\` with \`$env:OPENHANDS_HOST\` / \`$env:OPENHANDS_AUTOMATION_API_KEY\` if running it natively.
|
|
6566
|
+
|
|
6335
6567
|
### Step 5 — Confirm
|
|
6336
6568
|
|
|
6337
6569
|
Tell the user:
|
|
@@ -6372,6 +6604,7 @@ https://spark.apache.org/docs/latest/migration-guide.html
|
|
|
6372
6604
|
- [ ] Identify target Spark version
|
|
6373
6605
|
- [ ] Search for deprecated APIs: \`grep -rn 'import org.apache.spark' --include='*.scala' --include='*.java' --include='*.py'\`
|
|
6374
6606
|
- [ ] List all Spark config properties: \`grep -rn 'spark\\.' --include='*.conf' --include='*.properties' --include='*.scala' --include='*.java' --include='*.py' | grep -v 'test'\`
|
|
6607
|
+
- [ ] On Windows PowerShell, use \`Get-ChildItem -Recurse -Include *.scala,*.java,*.py | Select-String 'import org.apache.spark'\` and adjust the extensions/pattern for config searches.
|
|
6375
6608
|
- [ ] Check for custom \`SparkSession\` or \`SparkContext\` extensions
|
|
6376
6609
|
- [ ] Identify connector dependencies (Hive, Kafka, Cassandra, Delta, Iceberg)
|
|
6377
6610
|
- [ ] Document findings in \`spark_upgrade_impact.md\`
|
|
@@ -6561,6 +6794,7 @@ Spark SQL behavior changes between versions can silently alter query results.
|
|
|
6561
6794
|
✓ Upgrade impact documented in \`spark_upgrade_impact.md\``,license:`MIT`,compatibility:`Requires Java 8+/11+/17+, Scala 2.12/2.13, Maven/Gradle/SBT, Apache Spark`},{name:`ssh`,description:`Establish and manage SSH connections to remote machines, including key generation, configuration, and file transfers. Use when connecting to remote servers, executing remote commands, or transferring files via SCP.`,triggers:[`ssh`,`remote server`,`remote machine`,`remote host`,`remote connection`,`secure shell`,`ssh keys`],content:`# SSH Skill
|
|
6562
6795
|
|
|
6563
6796
|
This skill provides capabilities for establishing and managing SSH connections to remote machines.
|
|
6797
|
+
Windows PowerShell equivalents for SSH config creation, key paths, ssh-agent, and permissions are in \`references/windows.md\`.
|
|
6564
6798
|
|
|
6565
6799
|
## Capabilities
|
|
6566
6800
|
|
|
@@ -6684,6 +6918,7 @@ chmod 700 ~/.ssh
|
|
|
6684
6918
|
This document provides instructions for installing Swift on Debian 12 (Bookworm).
|
|
6685
6919
|
|
|
6686
6920
|
> This setup is intended for non-UI development tasks on Swift on Linux.
|
|
6921
|
+
> On Windows, run these Debian commands inside WSL2 or a Linux container. For native Windows Swift, use the Windows toolchain from Swift.org instead.
|
|
6687
6922
|
|
|
6688
6923
|
## Prerequisites
|
|
6689
6924
|
|
|
@@ -6921,6 +7156,11 @@ To allow agents and automated systems to access protected deployments, users nee
|
|
|
6921
7156
|
\`\`\`bash
|
|
6922
7157
|
curl -H "x-vercel-protection-bypass: <secret>" https://your-preview-url.vercel.app
|
|
6923
7158
|
\`\`\`
|
|
7159
|
+
|
|
7160
|
+
PowerShell equivalent:
|
|
7161
|
+
\`\`\`powershell
|
|
7162
|
+
Invoke-WebRequest -Headers @{ "x-vercel-protection-bypass" = "<secret>" } -Uri https://your-preview-url.vercel.app
|
|
7163
|
+
\`\`\`
|
|
6924
7164
|
|
|
6925
7165
|
**As a Query Parameter:**
|
|
6926
7166
|
\`\`\`
|