@openhands/extensions 0.6.0 → 0.7.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 (74) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/README.md +8 -6
  3. package/integrations/README.md +8 -2
  4. package/integrations/catalog/airtable.json +0 -24
  5. package/integrations/catalog/asana.json +1 -6
  6. package/integrations/catalog/bitbucket.json +1 -6
  7. package/integrations/catalog/box.json +1 -6
  8. package/integrations/catalog/canva.json +3 -7
  9. package/integrations/catalog/confluence.json +1 -6
  10. package/integrations/catalog/discord.json +1 -6
  11. package/integrations/catalog/figma.json +21 -27
  12. package/integrations/catalog/github.json +0 -9
  13. package/integrations/catalog/gmail.json +1 -6
  14. package/integrations/catalog/google-calendar.json +1 -6
  15. package/integrations/catalog/google-docs.json +1 -6
  16. package/integrations/catalog/google-drive.json +1 -6
  17. package/integrations/catalog/google-sheets.json +1 -6
  18. package/integrations/catalog/intercom.json +1 -6
  19. package/integrations/catalog/jira.json +1 -6
  20. package/integrations/catalog/linear.json +1 -24
  21. package/integrations/catalog/microsoft-outlook.json +1 -6
  22. package/integrations/catalog/microsoft-teams.json +1 -6
  23. package/integrations/catalog/miro.json +14 -10
  24. package/integrations/catalog/monday.json +14 -10
  25. package/integrations/catalog/netlify.json +1 -6
  26. package/integrations/catalog/notion.json +16 -23
  27. package/integrations/catalog/okta.json +1 -6
  28. package/integrations/catalog/onedrive.json +1 -6
  29. package/integrations/catalog/posthog.json +20 -20
  30. package/integrations/catalog/quickbooks.json +70 -22
  31. package/integrations/catalog/salesforce.json +18 -12
  32. package/integrations/catalog/sentry.json +12 -17
  33. package/integrations/catalog/sharepoint.json +1 -6
  34. package/integrations/catalog/stripe.json +15 -20
  35. package/integrations/catalog/supabase.json +16 -21
  36. package/integrations/catalog/trello.json +11 -8
  37. package/integrations/catalog/vercel.json +1 -6
  38. package/integrations/catalog/xero.json +1 -6
  39. package/integrations/catalog/zoom.json +1 -6
  40. package/integrations/catalog-index.js +64 -84
  41. package/integrations/catalog.schema.json +255 -0
  42. package/integrations/index.d.ts +26 -10
  43. package/integrations/index.js +18 -10
  44. package/marketplaces/openhands-extensions.json +26 -1
  45. package/package.json +1 -1
  46. package/plugins/pr-review/scripts/prompt.py +1 -1
  47. package/pyproject.toml +2 -1
  48. package/python/openhands_extensions/_version.py +2 -1
  49. package/skills/agent-canvas-environment/SKILL.md +74 -13
  50. package/skills/bitbucket/README.md +23 -40
  51. package/skills/bitbucket/SKILL.md +43 -31
  52. package/skills/bitbucket-cloud/.plugin/plugin.json +18 -0
  53. package/skills/bitbucket-cloud/README.md +15 -0
  54. package/skills/bitbucket-cloud/SKILL.md +46 -0
  55. package/skills/bitbucket-data-center/.plugin/plugin.json +19 -0
  56. package/skills/bitbucket-data-center/README.md +20 -0
  57. package/skills/bitbucket-data-center/SKILL.md +53 -0
  58. package/skills/code-review/SKILL.md +1 -1
  59. package/skills/code-review/references/supply-chain-security.md +2 -2
  60. package/skills/index.js +17 -5
  61. package/skills/openhands-sdk/SKILL.md +0 -1
  62. package/tests/test_catalog_schema.py +47 -0
  63. package/tests/test_catalogs.py +26 -0
  64. package/tests/test_integration_catalog_in_sync.py +73 -25
  65. package/integrations/catalog/clickup.json +0 -36
  66. package/integrations/catalog/dropbox.json +0 -38
  67. package/integrations/catalog/freshdesk.json +0 -38
  68. package/integrations/catalog/gitlab.json +0 -38
  69. package/integrations/catalog/mailchimp.json +0 -38
  70. package/integrations/catalog/pipedrive.json +0 -39
  71. package/integrations/catalog/plaid.json +0 -31
  72. package/integrations/catalog/servicenow.json +0 -39
  73. package/integrations/catalog/shopify.json +0 -38
  74. package/integrations/catalog/zendesk.json +0 -38
@@ -1,45 +1,57 @@
1
1
  ---
2
2
  name: bitbucket
3
- description: Interact with Bitbucket repositories and pull requests using the BITBUCKET_TOKEN environment variable. Use when working with code hosted on Bitbucket or managing Bitbucket resources via API.
3
+ description: Bitbucket integration hub. Detects whether the repository is on Bitbucket Cloud or Bitbucket Data Center and directs you to the matching detailed skill (bitbucket-cloud or bitbucket-data-center). Use for any Bitbucket repository or pull request task.
4
4
  triggers:
5
5
  - bitbucket
6
6
  - git
7
7
  ---
8
8
 
9
- You have access to an environment variable, `BITBUCKET_TOKEN`, which allows you to interact with
10
- the Bitbucket API.
9
+ You are working with **Bitbucket**, which ships as two distinct products that behave
10
+ differently:
11
11
 
12
- <IMPORTANT>
13
- You can use `curl` with the `BITBUCKET_TOKEN` to interact with Bitbucket's API.
14
- ALWAYS use the Bitbucket API for operations instead of a web browser.
15
- ALWAYS use the `create_bitbucket_pr` tool to open a pull request
16
- </IMPORTANT>
12
+ - **Bitbucket Cloud** (`bitbucket.org`) — authenticates with the `BITBUCKET_TOKEN`
13
+ environment variable.
14
+ - **Bitbucket Data Center** (self-hosted Bitbucket Server) — authenticates with the
15
+ `BITBUCKET_DATA_CENTER_TOKEN` environment variable.
17
16
 
18
- Only 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.
17
+ They use different REST APIs, repository identifiers, git remote URL formats, and pull
18
+ request tools, so you must first determine which one you are on, then load the matching
19
+ detailed skill for full instructions.
19
20
 
20
- If 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 `@`:
21
+ ## Step 1 — Detect which Bitbucket you are on
22
+
23
+ Check which token environment variable is present. Environment variable names are
24
+ case-sensitive, so look for it case-insensitively:
21
25
 
22
26
  ```bash
23
- BB_USER="${BITBUCKET_TOKEN%%:*}" && \
24
- BB_PASS="${BITBUCKET_TOKEN#*:}" && \
25
- ENCODED_USER=$(python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$BB_USER") && \
26
- ENCODED_PASS=$(python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$BB_PASS") && \
27
- git remote set-url origin "https://${ENCODED_USER}:${ENCODED_PASS}@bitbucket.org/username/repo.git"
27
+ env | grep -i 'bitbucket' || echo "no bitbucket token found"
28
28
  ```
29
29
 
30
- 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.
31
-
32
- Here are some instructions for pushing, but ONLY do this if the user asks you to:
33
- * NEVER push directly to the `main` or `master` branch
34
- * Git config (username and email) is pre-set. Do not modify.
35
- * You may already be on a branch starting with `openhands-workspace`. Create a new branch with a better name before pushing.
36
- * Use the `create_bitbucket_pr` tool to create a pull request, if you haven't already
37
- * 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.
38
- * Use the main branch as the base branch, unless the user requests otherwise
39
- * After opening or updating a pull request, send the user a short message with a link to the pull request.
40
- * Do NOT mark a pull request as ready to review unless the user explicitly says so
41
- * 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:
42
- ```bash
43
- git remote -v && git branch # to find the current org, repo and branch
44
- git checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget
45
- ```
30
+ - If a **`BITBUCKET_DATA_CENTER_TOKEN`** variable is set (in any letter case) → you are on
31
+ **Bitbucket Data Center**.
32
+ - Otherwise, if a **`BITBUCKET_TOKEN`** variable is set → you are on **Bitbucket Cloud**.
33
+ - If neither is set, ask the user how they authenticate to Bitbucket before proceeding.
34
+
35
+ When you reference the token later, use the exact variable name (and letter case) that
36
+ actually exists in the environment.
37
+
38
+ ## Step 2 — Load the detailed skill
39
+
40
+ Once you know the environment, use the `invoke_skill` tool to load the matching skill for
41
+ full instructions on API calls, authenticated git remotes, and opening pull requests:
42
+
43
+ - Bitbucket Cloud → invoke the **`bitbucket-cloud`** skill.
44
+ - Bitbucket Data Center → invoke the **`bitbucket-data-center`** skill.
45
+
46
+ ## Quick reference (fallback)
47
+
48
+ If you are unable to load the detailed skill, these are the essentials. Always use the
49
+ Bitbucket API (not a web browser) and always use the listed PR tool to open a pull request.
50
+
51
+ | | Bitbucket Cloud | Bitbucket Data Center |
52
+ |---|---|---|
53
+ | Token env var | `BITBUCKET_TOKEN` | `BITBUCKET_DATA_CENTER_TOKEN` |
54
+ | Host | `bitbucket.org` | self-hosted domain |
55
+ | REST API base | `https://api.bitbucket.org/2.0` | `https://<host>/rest/api/1.0` |
56
+ | Repository identifier | `workspace/repo_slug` | `PROJECT/repo_slug` (project key) |
57
+ | Pull request tool | `create_bitbucket_pr` | `create_bitbucket_data_center_pr` |
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "bitbucket-cloud",
3
+ "version": "1.0.0",
4
+ "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.",
5
+ "author": {
6
+ "name": "OpenHands",
7
+ "email": "contact@all-hands.dev"
8
+ },
9
+ "homepage": "https://github.com/OpenHands/extensions",
10
+ "repository": "https://github.com/OpenHands/extensions",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "bitbucket",
14
+ "bitbucket-cloud",
15
+ "git",
16
+ "pull-request"
17
+ ]
18
+ }
@@ -0,0 +1,15 @@
1
+ # Bitbucket Cloud
2
+
3
+ Bitbucket Cloud (`bitbucket.org`) specifics — `BITBUCKET_TOKEN` auth, REST API v2,
4
+ `workspace/repo_slug` repositories, and the `create_bitbucket_pr` tool.
5
+
6
+ ## Triggers
7
+
8
+ This skill has no auto-injection triggers. It is **invoke-only**: it is loaded on demand
9
+ via the `invoke_skill` tool, normally by the [`bitbucket`](../bitbucket/) hub skill after
10
+ it detects a Bitbucket Cloud environment (i.e. `BITBUCKET_TOKEN` is set).
11
+
12
+ ## Details
13
+
14
+ See [`SKILL.md`](SKILL.md) for the full content, including authenticated git remote
15
+ construction and pull request instructions.
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: bitbucket-cloud
3
+ 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.
4
+ ---
5
+
6
+ You are working with **Bitbucket Cloud** (`bitbucket.org`). You have access to an
7
+ environment variable, `BITBUCKET_TOKEN`, which allows you to interact with the Bitbucket
8
+ Cloud API.
9
+
10
+ - REST API base URL: `https://api.bitbucket.org/2.0`
11
+ - Repository identifier format: `workspace/repo_slug`
12
+
13
+ <IMPORTANT>
14
+ You can use `curl` with the `BITBUCKET_TOKEN` to interact with Bitbucket's API.
15
+ ALWAYS use the Bitbucket API for operations instead of a web browser.
16
+ ALWAYS use the `create_bitbucket_pr` tool to open a pull request
17
+ </IMPORTANT>
18
+
19
+ Only 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.
20
+
21
+ If 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 `@`:
22
+
23
+ ```bash
24
+ BB_USER="${BITBUCKET_TOKEN%%:*}" && \
25
+ BB_PASS="${BITBUCKET_TOKEN#*:}" && \
26
+ ENCODED_USER=$(python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$BB_USER") && \
27
+ ENCODED_PASS=$(python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$BB_PASS") && \
28
+ git remote set-url origin "https://${ENCODED_USER}:${ENCODED_PASS}@bitbucket.org/username/repo.git"
29
+ ```
30
+
31
+ 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
+
33
+ Here are some instructions for pushing, but ONLY do this if the user asks you to:
34
+ * NEVER push directly to the `main` or `master` branch
35
+ * Git config (username and email) is pre-set. Do not modify.
36
+ * You may already be on a branch starting with `openhands-workspace`. Create a new branch with a better name before pushing.
37
+ * Use the `create_bitbucket_pr` tool to create a pull request, if you haven't already
38
+ * 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.
39
+ * Use the main branch as the base branch, unless the user requests otherwise
40
+ * After opening or updating a pull request, send the user a short message with a link to the pull request.
41
+ * Do NOT mark a pull request as ready to review unless the user explicitly says so
42
+ * 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:
43
+ ```bash
44
+ git remote -v && git branch # to find the current org, repo and branch
45
+ git checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget
46
+ ```
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "bitbucket-data-center",
3
+ "version": "1.0.0",
4
+ "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.",
5
+ "author": {
6
+ "name": "OpenHands",
7
+ "email": "contact@all-hands.dev"
8
+ },
9
+ "homepage": "https://github.com/OpenHands/extensions",
10
+ "repository": "https://github.com/OpenHands/extensions",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "bitbucket",
14
+ "bitbucket-data-center",
15
+ "bitbucket-server",
16
+ "git",
17
+ "pull-request"
18
+ ]
19
+ }
@@ -0,0 +1,20 @@
1
+ # Bitbucket Data Center
2
+
3
+ Bitbucket Data Center (self-hosted Bitbucket Server) specifics — `BITBUCKET_DATA_CENTER_TOKEN`
4
+ auth, REST API 1.0, `PROJECT/repo_slug` repositories, `scm/` git remotes, and the
5
+ `create_bitbucket_data_center_pr` tool.
6
+
7
+ ## Triggers
8
+
9
+ This skill has no auto-injection triggers. It is **invoke-only**: it is loaded on demand
10
+ via the `invoke_skill` tool, normally by the [`bitbucket`](../bitbucket/) hub skill after
11
+ it detects a Bitbucket Data Center environment (i.e. `BITBUCKET_DATA_CENTER_TOKEN` is set).
12
+
13
+ ## Details
14
+
15
+ See [`SKILL.md`](SKILL.md) for the full content, including authenticated `scm/` git remote
16
+ construction and pull request instructions. Note the key differences from Bitbucket Cloud:
17
+ the REST API is version `1.0` under `https://{domain}/rest/api/1.0`, repositories are
18
+ addressed as `PROJECT/repo_slug` (project key), git remotes use the
19
+ `scm/{project}/{repo}.git` path, and pull requests are opened with
20
+ `create_bitbucket_data_center_pr`.
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: bitbucket-data-center
3
+ 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.
4
+ ---
5
+
6
+ You are working with **Bitbucket Data Center** (self-hosted Bitbucket Server). You have
7
+ access to an environment variable, `BITBUCKET_DATA_CENTER_TOKEN`, which contains a basic
8
+ auth token in the format `username:your-token` that allows you to interact with the git
9
+ repository and the REST API.
10
+
11
+ > Environment variable names are case-sensitive. If `BITBUCKET_DATA_CENTER_TOKEN` is not
12
+ > present, use whichever case variant actually exists (for example
13
+ > `bitbucket_data_center_token`). Run `env | grep -i 'bitbucket_data_center'` to find it.
14
+
15
+ - REST API base URL: `https://{domain}/rest/api/1.0`
16
+ - Repository identifier format: `PROJECT/repo_slug` (project key, slash, repo slug)
17
+
18
+ You can use this token to interact with the Bitbucket Data Center REST API:
19
+ ```bash
20
+ curl -u "${BITBUCKET_DATA_CENTER_TOKEN}" https://{domain}/rest/api/1.0/...
21
+ ```
22
+
23
+ <IMPORTANT>
24
+ ALWAYS use the Bitbucket Data Center API for operations instead of a web browser.
25
+ ALWAYS use the `create_bitbucket_data_center_pr` tool to open a pull request
26
+ </IMPORTANT>
27
+
28
+ If you encounter authentication issues when pushing to Bitbucket Data Center (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://${BITBUCKET_DATA_CENTER_TOKEN}@{domain}/scm/{project_lower}/{repo}.git`
29
+
30
+ The token is a `username:token` pair, so if the username or token contains characters that are reserved in URLs (such as `@`), split on the first `:` and URL-encode each part before embedding it in a remote:
31
+
32
+ ```bash
33
+ BB_USER="${BITBUCKET_DATA_CENTER_TOKEN%%:*}" && \
34
+ BB_PASS="${BITBUCKET_DATA_CENTER_TOKEN#*:}" && \
35
+ ENCODED_USER=$(python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$BB_USER") && \
36
+ ENCODED_PASS=$(python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$BB_PASS") && \
37
+ git remote set-url origin "https://${ENCODED_USER}:${ENCODED_PASS}@{domain}/scm/{project_lower}/{repo}.git"
38
+ ```
39
+
40
+ Here are some instructions for pushing, but ONLY do this if the user asks you to:
41
+ * NEVER push directly to the `main` or `master` branch
42
+ * Git config (username and email) is pre-set. Do not modify.
43
+ * You may already be on a branch starting with `openhands-workspace`. Create a new branch with a better name before pushing.
44
+ * Use the `create_bitbucket_data_center_pr` tool to create a pull request, if you haven't already
45
+ * 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.
46
+ * Use the main branch as the base branch, unless the user requests otherwise
47
+ * After opening or updating a pull request, send the user a short message with a link to the pull request.
48
+ * Do NOT mark a pull request as ready to review unless the user explicitly says so
49
+ * 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:
50
+ ```bash
51
+ git remote -v && git branch # to find the current org, repo and branch
52
+ git checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget
53
+ ```
@@ -115,7 +115,7 @@ Require:
115
115
  8. **Dependency Changes**
116
116
  If dependency lock changes have downgraded a dependency, comment pointing that out to make sure it was intentional.
117
117
 
118
- When a PR adds a new dependency or bumps an existing one, review the upstream release for supply chain risk. If any target version was published less than 7 days ago, do **NOT** approve the PR yet — leave a blocking review comment and wait until the version is at least 7 days old. Read `references/supply-chain-security.md` for the full verification checklist including risk-based scrutiny tiers, concrete commands for checking release provenance, and escalation guidance.
118
+ When a PR adds a new dependency or bumps an existing one, review the upstream release for supply chain risk. If any target version was published less than 7 days ago, do **NOT** approve the PR yet — leave a blocking review comment and wait until the version is at least 7 days old. First-party packages maintained by the same organization as the reviewed repository are intentionally excluded from the 7-day waiting rule, but still scrutinize them for supply-chain risk using the checklist. Read `references/supply-chain-security.md` for the full verification checklist including risk-based scrutiny tiers, concrete commands for checking release provenance, and escalation guidance.
119
119
 
120
120
  9. **Risk and Safety Evaluation**
121
121
  Read `references/risk-evaluation.md` for the full risk evaluation framework including risk levels (🟢 Low / 🟡 Medium / 🔴 High), risk factors, escalation guidance, and repo-specific risk rules.
@@ -7,7 +7,7 @@ When a PR adds a new dependency or bumps an existing one, review the upstream re
7
7
  Release recency is the primary risk signal - even widely-used, established packages can be compromised (e.g., LiteLLM was a popular package with high download counts when it was hijacked). Check when the target version was published before choosing a tier.
8
8
 
9
9
  **Apply full scrutiny** (all checks below) when:
10
- - The target version was published less than 7 days ago - regardless of package popularity or age. For PyPI: visit `https://pypi.org/project/<package>/<version>/` and check the "Released" date. For npm: run `npm view <package>@<version> time`. Recent releases have not had time for community vetting, and this is exactly the window supply chain attackers exploit. Do **NOT** approve the PR while the target version is still younger than 7 days; wait until it ages out, then complete the rest of the checklist.
10
+ - The target version was published less than 7 days ago - regardless of package popularity or age, except first-party packages maintained by the same organization as the reviewed repository. First-party packages are intentionally excluded from the 7-day waiting rule: do not block solely on freshness, but still scrutinize them for supply-chain risk using this checklist. For PyPI: visit `https://pypi.org/project/<package>/<version>/` and check the "Released" date. For npm: run `npm view <package>@<version> time`. Recent releases have not had time for community vetting, and this is exactly the window supply chain attackers exploit.
11
11
  - Adding a dependency not previously used in this project
12
12
  - Upgrading a package that was first published less than 6 months ago (check oldest version at `https://pypi.org/project/<package>/#history` or `npm view <package> time | head -3`) or has low weekly downloads (for PyPI: check `https://pypistats.org/packages/<package>` for weekly downloads; for npm: see weekly downloads on the package page at `https://www.npmjs.com/package/<package>`; use <10k on PyPI / <1k on npm as thresholds)
13
13
  - The dependency includes native code, install hooks, or system-level access
@@ -28,4 +28,4 @@ Release recency is the primary risk signal - even widely-used, established packa
28
28
 
29
29
  ## Escalation Guidance
30
30
 
31
- Escalate to 🔴 High Risk if any high-severity signal is present: yanked/retracted versions, source-to-package divergence, or new install-time behavior (post-install scripts, `.pth` files). For medium-severity signals (brand-new release with no adoption signal, missing release notes), escalate only when combined with other signals from this checklist (medium or high severity) or when the package is under full scrutiny. If a dependency is under full scrutiny solely because the target version is newer than 7 days, do **NOT** approve until it is at least 7 days old; after that, re-evaluate it using the rest of this checklist. For dependencies under standard scrutiny, brand-new publication alone is not sufficient to escalate - established packages with frequent release cycles routinely publish new versions.
31
+ Escalate to 🔴 High Risk if any high-severity signal is present: yanked/retracted versions, source-to-package divergence, or new install-time behavior (post-install scripts, `.pth` files). For medium-severity signals (brand-new release with no adoption signal, missing release notes), escalate only when combined with other signals from this checklist (medium or high severity) or when the package is under full scrutiny. If a dependency is under full scrutiny solely because the target version is newer than 7 days, do **NOT** approve until it is at least 7 days old unless it is first-party; after that, re-evaluate it using the rest of this checklist. For first-party packages, do not block solely on freshness, but still document the supply-chain risk review. For dependencies under standard scrutiny, brand-new publication alone is not sufficient to escalate - established packages with frequent release cycles routinely publish new versions.