@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.
- package/.release-please-manifest.json +1 -1
- package/README.md +8 -6
- package/integrations/README.md +8 -2
- package/integrations/catalog/airtable.json +0 -24
- package/integrations/catalog/asana.json +1 -6
- package/integrations/catalog/bitbucket.json +1 -6
- package/integrations/catalog/box.json +1 -6
- package/integrations/catalog/canva.json +3 -7
- package/integrations/catalog/confluence.json +1 -6
- package/integrations/catalog/discord.json +1 -6
- package/integrations/catalog/figma.json +21 -27
- package/integrations/catalog/github.json +0 -9
- package/integrations/catalog/gmail.json +1 -6
- package/integrations/catalog/google-calendar.json +1 -6
- package/integrations/catalog/google-docs.json +1 -6
- package/integrations/catalog/google-drive.json +1 -6
- package/integrations/catalog/google-sheets.json +1 -6
- package/integrations/catalog/intercom.json +1 -6
- package/integrations/catalog/jira.json +1 -6
- package/integrations/catalog/linear.json +1 -24
- package/integrations/catalog/microsoft-outlook.json +1 -6
- package/integrations/catalog/microsoft-teams.json +1 -6
- package/integrations/catalog/miro.json +14 -10
- package/integrations/catalog/monday.json +14 -10
- package/integrations/catalog/netlify.json +1 -6
- package/integrations/catalog/notion.json +16 -23
- package/integrations/catalog/okta.json +1 -6
- package/integrations/catalog/onedrive.json +1 -6
- package/integrations/catalog/posthog.json +20 -20
- package/integrations/catalog/quickbooks.json +70 -22
- package/integrations/catalog/salesforce.json +18 -12
- package/integrations/catalog/sentry.json +12 -17
- package/integrations/catalog/sharepoint.json +1 -6
- package/integrations/catalog/stripe.json +15 -20
- package/integrations/catalog/supabase.json +16 -21
- package/integrations/catalog/trello.json +11 -8
- package/integrations/catalog/vercel.json +1 -6
- package/integrations/catalog/xero.json +1 -6
- package/integrations/catalog/zoom.json +1 -6
- package/integrations/catalog-index.js +64 -84
- package/integrations/catalog.schema.json +255 -0
- package/integrations/index.d.ts +26 -10
- package/integrations/index.js +18 -10
- package/marketplaces/openhands-extensions.json +26 -1
- package/package.json +1 -1
- package/plugins/pr-review/scripts/prompt.py +1 -1
- package/pyproject.toml +2 -1
- package/python/openhands_extensions/_version.py +2 -1
- package/skills/agent-canvas-environment/SKILL.md +74 -13
- package/skills/bitbucket/README.md +23 -40
- package/skills/bitbucket/SKILL.md +43 -31
- package/skills/bitbucket-cloud/.plugin/plugin.json +18 -0
- package/skills/bitbucket-cloud/README.md +15 -0
- package/skills/bitbucket-cloud/SKILL.md +46 -0
- package/skills/bitbucket-data-center/.plugin/plugin.json +19 -0
- package/skills/bitbucket-data-center/README.md +20 -0
- package/skills/bitbucket-data-center/SKILL.md +53 -0
- package/skills/code-review/SKILL.md +1 -1
- package/skills/code-review/references/supply-chain-security.md +2 -2
- package/skills/index.js +17 -5
- package/skills/openhands-sdk/SKILL.md +0 -1
- package/tests/test_catalog_schema.py +47 -0
- package/tests/test_catalogs.py +26 -0
- package/tests/test_integration_catalog_in_sync.py +73 -25
- package/integrations/catalog/clickup.json +0 -36
- package/integrations/catalog/dropbox.json +0 -38
- package/integrations/catalog/freshdesk.json +0 -38
- package/integrations/catalog/gitlab.json +0 -38
- package/integrations/catalog/mailchimp.json +0 -38
- package/integrations/catalog/pipedrive.json +0 -39
- package/integrations/catalog/plaid.json +0 -31
- package/integrations/catalog/servicenow.json +0 -39
- package/integrations/catalog/shopify.json +0 -38
- package/integrations/catalog/zendesk.json +0 -38
|
@@ -1,45 +1,57 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bitbucket
|
|
3
|
-
description:
|
|
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
|
|
10
|
-
|
|
9
|
+
You are working with **Bitbucket**, which ships as two distinct products that behave
|
|
10
|
+
differently:
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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.
|
|
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.
|