upstream-radar 0.38.0 → 0.40.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/README.md +58 -12
- package/dist/src/cli.js +94 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/dsh-install-observation.d.ts +154 -0
- package/dist/src/dsh-install-observation.d.ts.map +1 -0
- package/dist/src/dsh-install-observation.js +877 -0
- package/dist/src/dsh-install-observation.js.map +1 -0
- package/dist/src/dsh-install-plan.d.ts +28 -0
- package/dist/src/dsh-install-plan.d.ts.map +1 -0
- package/dist/src/dsh-install-plan.js +184 -0
- package/dist/src/dsh-install-plan.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/upstream-alignment.d.ts +4 -0
- package/dist/src/upstream-alignment.d.ts.map +1 -1
- package/dist/src/upstream-alignment.js +30 -2
- package/dist/src/upstream-alignment.js.map +1 -1
- package/dist/src/upstream-observer.d.ts +5 -0
- package/dist/src/upstream-observer.d.ts.map +1 -1
- package/dist/src/upstream-observer.js +75 -16
- package/dist/src/upstream-observer.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/docs/README.zh-CN.md +21 -20
- package/package.json +2 -2
- package/schemas/dsh-install-observation.schema.json +218 -0
package/docs/README.zh-CN.md
CHANGED
|
@@ -58,6 +58,7 @@ npx --yes upstream-radar@latest quickstart
|
|
|
58
58
|
| 从 GitHub Actions 立即扫描 | [一次性扫描 workflow](../examples/github-actions/upstream-scan-minimal.yml) | 输入公开仓库 URL,马上看到结果并下载 JSON,不需要本地安装。 |
|
|
59
59
|
| 审查一个精确的发布物 | `upstream-radar inspect <包名>@<精确版本> --deep` | 查看单个版本的包、依赖、漏洞和 provenance 证据。 |
|
|
60
60
|
| 用两个 DSH 版本检查一个插件 | [可复制的 review workflow](../examples/github-actions/dsh-plugin-review-minimal.yml) | 输入 `package@version` 和两个 DSH 版本,同时得到发布物审计与真实 bundle-load 矩阵,不需要本地 DSH profile 或 LLM。 |
|
|
61
|
+
| 在隔离环境真实安装/加载插件 | [隔离安装 workflow](../.github/workflows/observe-dsh-plugin-install.yml) | 每个插件使用一台新的 GitHub 托管虚拟机和受限容器;先核对发布包声明的 Node 版本,再按精确许可运行依赖构建,并记录进程、联网、文件写入、登记和加载结果;模型密钥不会进入执行环境。 |
|
|
61
62
|
| 发布和维护 DSH 插件 | [插件作者路径](#dsh-插件作者) | 从真实 DSH 脚手架开始,先审查锁定的依赖图,再在用户安装前接入两步 CI 门禁。 |
|
|
62
63
|
| 把变化通知到飞书 | [飞书与 HTTPS 通知](#飞书与-https-通知) | 原生飞书 V2 文本、只从环境读取密钥、持久确认和失败重试。 |
|
|
63
64
|
|
|
@@ -97,7 +98,7 @@ FIRST EPSS estimated exploitation probability: 97.2% (percentile 100.0%)
|
|
|
97
98
|
想立即检查一个真实发布的 DSH 插件,可以在空目录直接运行:
|
|
98
99
|
|
|
99
100
|
```bash
|
|
100
|
-
npx --yes upstream-radar@0.
|
|
101
|
+
npx --yes upstream-radar@0.40.0 inspect dsh-feishu-bot@0.15.8 --deep
|
|
101
102
|
```
|
|
102
103
|
|
|
103
104
|
它会直接输出简短的准入结论、覆盖情况、依赖数量、漏洞数量和下一步,不需要先
|
|
@@ -110,7 +111,7 @@ npx --yes upstream-radar@0.38.0 inspect dsh-feishu-bot@0.15.8 --deep
|
|
|
110
111
|
npm 解析环境中目前无法建立完整依赖图:
|
|
111
112
|
|
|
112
113
|
```bash
|
|
113
|
-
npx --yes upstream-radar@0.
|
|
114
|
+
npx --yes upstream-radar@0.40.0 inspect \
|
|
114
115
|
@sanqi-normal/dsh-webui-market-plugin@0.5.4 \
|
|
115
116
|
--deep --fail-on never
|
|
116
117
|
```
|
|
@@ -335,9 +336,9 @@ npm: dsh-feishu-bot@0.15.8
|
|
|
335
336
|
会继续显示为 `incomplete`,不会被当成已经确认的故障。
|
|
336
337
|
|
|
337
338
|
```bash
|
|
338
|
-
npx --yes upstream-radar@0.
|
|
339
|
+
npx --yes upstream-radar@0.40.0 graph reverse ./plugin-reports \
|
|
339
340
|
--output ./reverse-dependency-index.json
|
|
340
|
-
npx --yes upstream-radar@0.
|
|
341
|
+
npx --yes upstream-radar@0.40.0 observe ./targets.yml \
|
|
341
342
|
--reverse-index ./reverse-dependency-index.json \
|
|
342
343
|
--state ./observations.json --report ./upstream-radar-observer.md
|
|
343
344
|
```
|
|
@@ -375,7 +376,7 @@ Radar 会在三层目录内自动找到它;npm 名称和源码 manifest 不一
|
|
|
375
376
|
想明确选择锁文件时再加 `--lockfile`:
|
|
376
377
|
|
|
377
378
|
```bash
|
|
378
|
-
npx --yes upstream-radar@0.
|
|
379
|
+
npx --yes upstream-radar@0.40.0 observe \
|
|
379
380
|
https://github.com/PlutoKeating/dsh-lark-bot \
|
|
380
381
|
--state ./observations.json --report ./upstream-radar-observer.md
|
|
381
382
|
```
|
|
@@ -398,7 +399,7 @@ workspace 边保留为未解析证据;不会安装或启动 DSH。
|
|
|
398
399
|
会额外指定 `--package`:
|
|
399
400
|
|
|
400
401
|
```bash
|
|
401
|
-
npx --yes upstream-radar@0.
|
|
402
|
+
npx --yes upstream-radar@0.40.0 observe \
|
|
402
403
|
https://github.com/PlutoKeating/dsh-lark-bot \
|
|
403
404
|
--package dsh-feishu-bot \
|
|
404
405
|
--lockfile pnpm-lock.yaml --lockfile-type pnpm \
|
|
@@ -676,7 +677,7 @@ cd my-dsh-plugin
|
|
|
676
677
|
pnpm install --ignore-scripts
|
|
677
678
|
|
|
678
679
|
# 把插件放进 DSH profile 前,先读取精确依赖图。
|
|
679
|
-
pnpm dlx --package=upstream-radar@0.
|
|
680
|
+
pnpm dlx --package=upstream-radar@0.40.0 upstream-radar graph pnpm-lock pnpm-lock.yaml --json
|
|
680
681
|
```
|
|
681
682
|
|
|
682
683
|
这棵图会保留精确的 DSH 包版本,也会把未解析的可选 peer 明确显示出来;它不会加载生成的插件,也不会运行 lifecycle script。审查后,把下面这个完整 workflow 复制到 `.github/workflows/upstream-radar.yml`:
|
|
@@ -698,7 +699,7 @@ jobs:
|
|
|
698
699
|
runs-on: ubuntu-latest
|
|
699
700
|
steps:
|
|
700
701
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
701
|
-
- uses: MicroMilo/upstream-radar@v0.
|
|
702
|
+
- uses: MicroMilo/upstream-radar@v0.40.0
|
|
702
703
|
with:
|
|
703
704
|
fail-on: high
|
|
704
705
|
fail-on-compatibility: breaking
|
|
@@ -709,7 +710,7 @@ Action 会自动识别唯一的 `pnpm-lock.yaml`,检查同一棵精确依赖
|
|
|
709
710
|
也可以直接检查一个真实发布的 DSH 包:
|
|
710
711
|
|
|
711
712
|
```bash
|
|
712
|
-
npx --yes upstream-radar@0.
|
|
713
|
+
npx --yes upstream-radar@0.40.0 inspect dsh-feishu-bot@0.15.8 --deep
|
|
713
714
|
```
|
|
714
715
|
|
|
715
716
|
这次检查的结论是 `REVIEW`:registry 完整性、签名、provenance 和 89 个已解析包都
|
|
@@ -722,7 +723,7 @@ npx --yes upstream-radar@0.38.0 inspect dsh-feishu-bot@0.15.8 --deep
|
|
|
722
723
|
如果不想分别执行 `inspect`、打包和 `probe`,可以用一个命令完成一次 DSH 插件审查:
|
|
723
724
|
|
|
724
725
|
```bash
|
|
725
|
-
pnpm dlx --package=upstream-radar@0.
|
|
726
|
+
pnpm dlx --package=upstream-radar@0.40.0 upstream-radar review dsh-plugin \
|
|
726
727
|
dsh-cloudflare-browser-run@0.1.1 \
|
|
727
728
|
--dsh-version 0.1.0-rc.6,0.1.0-rc.7
|
|
728
729
|
```
|
|
@@ -888,7 +889,7 @@ pnpm run try:dsh
|
|
|
888
889
|
在把项目接入兼容性门禁前,可以先运行离线规则 benchmark:
|
|
889
890
|
|
|
890
891
|
```bash
|
|
891
|
-
pnpm dlx --package=upstream-radar@0.
|
|
892
|
+
pnpm dlx --package=upstream-radar@0.40.0 upstream-radar benchmark compatibility
|
|
892
893
|
```
|
|
893
894
|
|
|
894
895
|
它覆盖六类契约:安全补丁、只需要项目分析的变化、不兼容的 DSH peer、发布者明确声明 breaking、候选传递依赖漏洞,以及候选依赖图不完整。这个命令不会联网、安装包、加载插件或启动 DSH;它验证的是 Radar 的确定性规则以及 `breaking`/`any` 门禁行为,不是运行时兼容性证明。
|
|
@@ -901,7 +902,7 @@ pnpm dlx --package=upstream-radar@0.38.0 upstream-radar benchmark compatibility
|
|
|
901
902
|
# 打包精确版本,并明确不运行它的 lifecycle script。
|
|
902
903
|
npm pack --ignore-scripts dsh-plugin@1.2.3
|
|
903
904
|
|
|
904
|
-
pnpm dlx --package=upstream-radar@0.
|
|
905
|
+
pnpm dlx --package=upstream-radar@0.40.0 upstream-radar probe dsh-load \
|
|
905
906
|
./dsh-plugin-1.2.3.tgz \
|
|
906
907
|
--dsh-version 0.1.0-rc.6
|
|
907
908
|
```
|
|
@@ -927,7 +928,7 @@ pnpm run showcase:dsh-probe
|
|
|
927
928
|
如果要比较多个 DSH 版本,可以使用矩阵入口:
|
|
928
929
|
|
|
929
930
|
```bash
|
|
930
|
-
pnpm dlx --package=upstream-radar@0.
|
|
931
|
+
pnpm dlx --package=upstream-radar@0.40.0 upstream-radar probe dsh-matrix \
|
|
931
932
|
./dsh-plugin-1.2.3.tgz \
|
|
932
933
|
--dsh-version 0.1.0-rc.3 \
|
|
933
934
|
--dsh-version 0.1.0-rc.6 \
|
|
@@ -945,7 +946,7 @@ JSON 结果结构见[矩阵结果 schema](../schemas/dsh-load-matrix.schema.json
|
|
|
945
946
|
```yaml
|
|
946
947
|
steps:
|
|
947
948
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
948
|
-
- uses: MicroMilo/upstream-radar@v0.
|
|
949
|
+
- uses: MicroMilo/upstream-radar@v0.40.0
|
|
949
950
|
with:
|
|
950
951
|
fail-on: high
|
|
951
952
|
# 可选:把确定性的 DSH/插件兼容性破坏也作为 CI 失败条件
|
|
@@ -954,12 +955,12 @@ steps:
|
|
|
954
955
|
threat-intel: true
|
|
955
956
|
```
|
|
956
957
|
|
|
957
|
-
这个 Action 只是 `radar check --frozen --state :memory: --fail-on high --fail-on-compatibility breaking --json` 的薄封装。`--frozen` 是有意的:它只使用配置文件里的依赖图,不会尝试读取 runner 上不存在的本地 DSH profile。`threat-intel` 默认是 `false`,这样普通 CI 门禁不会因为额外查询变重;设置为 `true` 后,Job Summary 和原始 JSON 会包含 CISA KEV 与 FIRST EPSS 的优先级证据。每次运行彼此独立;发现达到阈值的漏洞或选择的兼容性变化时返回 `2`,运行或漏洞源出错时返回 `1`。`breaking` 只拦截有 confirmed/strong 信号的兼容性事件,`any` 会拦截所有活动兼容性事件,默认值是 `never`。除了原始 JSON 日志,Action 还会把经过转义的简短摘要写入 GitHub Job Summary,定时任务失败时可以直接看到受影响的包、准确依赖路径、已经发布的修复版本(如果有)、一行优先级证据和建议的下一步。这个入口不会投递 DSH Agent 任务,也不会修改分支;需要持续监控和项目级分析时,仍使用原生 DSH bundle。建议把 Action 固定到类似 `v0.
|
|
958
|
+
这个 Action 只是 `radar check --frozen --state :memory: --fail-on high --fail-on-compatibility breaking --json` 的薄封装。`--frozen` 是有意的:它只使用配置文件里的依赖图,不会尝试读取 runner 上不存在的本地 DSH profile。`threat-intel` 默认是 `false`,这样普通 CI 门禁不会因为额外查询变重;设置为 `true` 后,Job Summary 和原始 JSON 会包含 CISA KEV 与 FIRST EPSS 的优先级证据。每次运行彼此独立;发现达到阈值的漏洞或选择的兼容性变化时返回 `2`,运行或漏洞源出错时返回 `1`。`breaking` 只拦截有 confirmed/strong 信号的兼容性事件,`any` 会拦截所有活动兼容性事件,默认值是 `never`。除了原始 JSON 日志,Action 还会把经过转义的简短摘要写入 GitHub Job Summary,定时任务失败时可以直接看到受影响的包、准确依赖路径、已经发布的修复版本(如果有)、一行优先级证据和建议的下一步。这个入口不会投递 DSH Agent 任务,也不会修改分支;需要持续监控和项目级分析时,仍使用原生 DSH bundle。建议把 Action 固定到类似 `v0.40.0` 的发布标签,并根据团队策略固定 checkout Action。
|
|
958
959
|
|
|
959
960
|
如果仓库还没有提交 Radar 配置,最短接入方式是省略 `config`、`pnpm-lock` 和 `npm-lock`。checkout 之后,Action 会自动使用唯一存在的 `pnpm-lock.yaml` 或 `package-lock.json`,生成临时的审查清单,再执行同一个 frozen 检查:
|
|
960
961
|
|
|
961
962
|
```yaml
|
|
962
|
-
- uses: MicroMilo/upstream-radar@v0.
|
|
963
|
+
- uses: MicroMilo/upstream-radar@v0.40.0
|
|
963
964
|
with:
|
|
964
965
|
fail-on: high
|
|
965
966
|
```
|
|
@@ -969,7 +970,7 @@ steps:
|
|
|
969
970
|
如果要在插件进入 DSH 前审查精确发布物,可以增加 `inspect-package`:
|
|
970
971
|
|
|
971
972
|
```yaml
|
|
972
|
-
- uses: MicroMilo/upstream-radar@v0.
|
|
973
|
+
- uses: MicroMilo/upstream-radar@v0.40.0
|
|
973
974
|
with:
|
|
974
975
|
inspect-package: dsh-cloudflare-browser-run@0.1.1
|
|
975
976
|
# review 是安全默认值;只有允许覆盖不完整时才使用 block
|
|
@@ -981,7 +982,7 @@ steps:
|
|
|
981
982
|
如果仓库只有 pnpm 锁文件,还没有提交 Radar 配置,可以让 Action 在同一个 job 中生成配置;可直接复制[pnpm workflow 示例](../examples/github-actions/upstream-radar-pnpm.yml):
|
|
982
983
|
|
|
983
984
|
```yaml
|
|
984
|
-
- uses: MicroMilo/upstream-radar@v0.
|
|
985
|
+
- uses: MicroMilo/upstream-radar@v0.40.0
|
|
985
986
|
with:
|
|
986
987
|
pnpm-lock: pnpm-lock.yaml
|
|
987
988
|
fail-on: high
|
|
@@ -995,7 +996,7 @@ npm 项目可以改用 `npm-lock: package-lock.json`;`pnpm-lock` 和 `npm-lock
|
|
|
995
996
|
调用方需要先 checkout 仓库。这个 Action 不会安装项目依赖,也不会执行项目的 lifecycle script;它只读取提交到仓库的依赖图并查询配置中的上游漏洞源。如果需要完全显式的底层命令,等价写法是:
|
|
996
997
|
|
|
997
998
|
```bash
|
|
998
|
-
pnpm dlx --package=upstream-radar@0.
|
|
999
|
+
pnpm dlx --package=upstream-radar@0.40.0 upstream-radar radar check \
|
|
999
1000
|
./upstream-radar.config.json --frozen --state :memory: --fail-on high \
|
|
1000
1001
|
--fail-on-compatibility breaking --json
|
|
1001
1002
|
```
|
|
@@ -1003,7 +1004,7 @@ pnpm dlx --package=upstream-radar@0.38.0 upstream-radar radar check \
|
|
|
1003
1004
|
如果还要检查一个已发布插件能否跨多个 DSH 版本加载,可以增加三个 input:
|
|
1004
1005
|
|
|
1005
1006
|
```yaml
|
|
1006
|
-
- uses: MicroMilo/upstream-radar@v0.
|
|
1007
|
+
- uses: MicroMilo/upstream-radar@v0.40.0
|
|
1007
1008
|
id: radar
|
|
1008
1009
|
with:
|
|
1009
1010
|
config: upstream-radar.config.json
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "upstream-radar",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Always-on dependency
|
|
3
|
+
"version": "0.40.0",
|
|
4
|
+
"description": "Always-on dependency and compatibility monitoring for DeepSeek Harness plugins, including exact paths, upstream changes, and isolated install/load evidence.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"author": "MicroMilo",
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/MicroMilo/upstream-radar/blob/main/schemas/dsh-install-observation.schema.json",
|
|
4
|
+
"title": "Upstream Radar DSH install observation",
|
|
5
|
+
"description": "Bounded process, network and filesystem evidence from installing and loading one exact npm artifact under one exact DSH version in an externally supplied disposable environment.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["schema", "tool", "probe", "scope", "startedAt", "completedAt", "dshVersion", "runtime", "artifact", "stages", "observations", "filesystem", "result", "reason", "boundary"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"schema": { "const": "upstream-radar.dsh-install-observation/v1alpha1" },
|
|
11
|
+
"tool": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"additionalProperties": false,
|
|
14
|
+
"required": ["name", "version"],
|
|
15
|
+
"properties": {
|
|
16
|
+
"name": { "const": "upstream-radar" },
|
|
17
|
+
"version": { "type": "string", "minLength": 1, "maxLength": 256 }
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"probe": { "const": "dsh-install" },
|
|
21
|
+
"scope": { "const": "install-and-load-behavior" },
|
|
22
|
+
"startedAt": { "type": "string", "format": "date-time" },
|
|
23
|
+
"completedAt": { "type": "string", "format": "date-time" },
|
|
24
|
+
"dshVersion": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$" },
|
|
25
|
+
"runtime": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"additionalProperties": false,
|
|
28
|
+
"required": ["platform", "architecture", "nodeVersion", "packageManager"],
|
|
29
|
+
"properties": {
|
|
30
|
+
"platform": { "type": "string", "minLength": 1, "maxLength": 64 },
|
|
31
|
+
"architecture": { "type": "string", "minLength": 1, "maxLength": 64 },
|
|
32
|
+
"nodeVersion": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$" },
|
|
33
|
+
"packageManager": {
|
|
34
|
+
"type": "object",
|
|
35
|
+
"additionalProperties": false,
|
|
36
|
+
"required": ["name"],
|
|
37
|
+
"properties": {
|
|
38
|
+
"name": { "const": "pnpm" },
|
|
39
|
+
"version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$" }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"artifact": { "$ref": "#/$defs/artifact" },
|
|
45
|
+
"stages": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"additionalProperties": false,
|
|
48
|
+
"required": ["runtime", "artifact", "profile", "install", "registration", "load"],
|
|
49
|
+
"properties": {
|
|
50
|
+
"runtime": { "$ref": "#/$defs/stage" },
|
|
51
|
+
"artifact": { "$ref": "#/$defs/stage" },
|
|
52
|
+
"profile": { "$ref": "#/$defs/stage" },
|
|
53
|
+
"install": { "$ref": "#/$defs/stage" },
|
|
54
|
+
"registration": { "$ref": "#/$defs/stage" },
|
|
55
|
+
"load": { "$ref": "#/$defs/stage" }
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"observations": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"additionalProperties": false,
|
|
61
|
+
"required": ["install", "load"],
|
|
62
|
+
"properties": {
|
|
63
|
+
"install": { "$ref": "#/$defs/trace" },
|
|
64
|
+
"load": { "$ref": "#/$defs/trace" }
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"filesystem": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"additionalProperties": false,
|
|
70
|
+
"required": ["install", "load"],
|
|
71
|
+
"properties": {
|
|
72
|
+
"install": { "$ref": "#/$defs/filesystemDiff" },
|
|
73
|
+
"load": { "$ref": "#/$defs/filesystemDiff" }
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"result": { "enum": ["compatible", "runtime-incompatible", "install-failed", "load-failed", "unknown"] },
|
|
77
|
+
"reason": { "type": "string", "maxLength": 4096 },
|
|
78
|
+
"boundary": {
|
|
79
|
+
"type": "object",
|
|
80
|
+
"additionalProperties": false,
|
|
81
|
+
"required": ["isolationProviderClaim", "isolationVerifiedByRadar", "disposableEnvironmentRequired", "lifecycleScriptsEnabledForPluginInstall", "pluginCodeMayExecuteDuringLoad", "inheritedHostSecrets", "approvedDependencyBuilds", "note"],
|
|
82
|
+
"properties": {
|
|
83
|
+
"isolationProviderClaim": { "enum": ["github-actions-hosted-runner", "firecracker", "other"] },
|
|
84
|
+
"isolationVerifiedByRadar": { "const": false },
|
|
85
|
+
"disposableEnvironmentRequired": { "const": true },
|
|
86
|
+
"lifecycleScriptsEnabledForPluginInstall": { "const": true },
|
|
87
|
+
"pluginCodeMayExecuteDuringLoad": { "const": true },
|
|
88
|
+
"inheritedHostSecrets": { "const": false },
|
|
89
|
+
"approvedDependencyBuilds": {
|
|
90
|
+
"type": "array",
|
|
91
|
+
"maxItems": 16,
|
|
92
|
+
"uniqueItems": true,
|
|
93
|
+
"items": { "type": "string", "pattern": "^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$", "maxLength": 214 }
|
|
94
|
+
},
|
|
95
|
+
"note": { "type": "string", "maxLength": 4096 }
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"$defs": {
|
|
100
|
+
"artifact": {
|
|
101
|
+
"type": "object",
|
|
102
|
+
"additionalProperties": false,
|
|
103
|
+
"required": ["spec", "name", "version", "lifecycleScripts"],
|
|
104
|
+
"properties": {
|
|
105
|
+
"spec": { "type": "string", "minLength": 1, "maxLength": 512 },
|
|
106
|
+
"name": { "type": "string", "minLength": 1, "maxLength": 214 },
|
|
107
|
+
"version": { "type": "string", "minLength": 1, "maxLength": 256 },
|
|
108
|
+
"sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
|
109
|
+
"integrity": { "type": "string", "maxLength": 1024 },
|
|
110
|
+
"bytes": { "type": "integer", "minimum": 0, "maximum": 67108864 },
|
|
111
|
+
"bundlePatch": { "type": "string", "minLength": 1, "maxLength": 4096 },
|
|
112
|
+
"nodeEngine": { "type": "string", "minLength": 1, "maxLength": 512 },
|
|
113
|
+
"lifecycleScripts": {
|
|
114
|
+
"type": "array",
|
|
115
|
+
"maxItems": 4,
|
|
116
|
+
"uniqueItems": true,
|
|
117
|
+
"items": { "enum": ["preinstall", "install", "postinstall", "prepare"] }
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"stage": {
|
|
122
|
+
"type": "object",
|
|
123
|
+
"additionalProperties": false,
|
|
124
|
+
"required": ["status"],
|
|
125
|
+
"properties": {
|
|
126
|
+
"status": { "enum": ["passed", "failed", "skipped"] },
|
|
127
|
+
"code": { "type": ["integer", "null"] },
|
|
128
|
+
"detail": { "type": "string", "maxLength": 8192 },
|
|
129
|
+
"timedOut": { "type": "boolean" },
|
|
130
|
+
"outputExceeded": { "type": "boolean" }
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"coverage": {
|
|
134
|
+
"type": "object",
|
|
135
|
+
"additionalProperties": false,
|
|
136
|
+
"required": ["status", "tracer", "traceFiles", "bytes", "lines", "parsedEvents", "otherLines", "tamperResistance"],
|
|
137
|
+
"properties": {
|
|
138
|
+
"status": { "enum": ["captured", "missing", "truncated"] },
|
|
139
|
+
"tracer": { "const": "strace" },
|
|
140
|
+
"traceFiles": { "type": "integer", "minimum": 0 },
|
|
141
|
+
"bytes": { "type": "integer", "minimum": 0, "maximum": 16777216 },
|
|
142
|
+
"lines": { "type": "integer", "minimum": 0, "maximum": 100000 },
|
|
143
|
+
"parsedEvents": { "type": "integer", "minimum": 0 },
|
|
144
|
+
"otherLines": { "type": "integer", "minimum": 0 },
|
|
145
|
+
"tamperResistance": { "const": "best-effort-same-container" }
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
"process": {
|
|
149
|
+
"type": "object",
|
|
150
|
+
"additionalProperties": false,
|
|
151
|
+
"required": ["executable", "arguments", "succeeded", "count"],
|
|
152
|
+
"properties": {
|
|
153
|
+
"executable": { "type": "string", "maxLength": 1024 },
|
|
154
|
+
"arguments": { "type": "array", "maxItems": 16, "items": { "type": "string", "maxLength": 512 } },
|
|
155
|
+
"succeeded": { "type": "boolean" },
|
|
156
|
+
"count": { "type": "integer", "minimum": 1 }
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"network": {
|
|
160
|
+
"type": "object",
|
|
161
|
+
"additionalProperties": false,
|
|
162
|
+
"required": ["operation", "family", "address", "succeeded", "count"],
|
|
163
|
+
"properties": {
|
|
164
|
+
"operation": { "enum": ["connect", "sendto", "sendmsg"] },
|
|
165
|
+
"family": { "type": "string", "maxLength": 64 },
|
|
166
|
+
"address": { "type": "string", "maxLength": 1024 },
|
|
167
|
+
"port": { "type": "integer", "minimum": 0, "maximum": 65535 },
|
|
168
|
+
"succeeded": { "type": "boolean" },
|
|
169
|
+
"count": { "type": "integer", "minimum": 1 }
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
"fileWrite": {
|
|
173
|
+
"type": "object",
|
|
174
|
+
"additionalProperties": false,
|
|
175
|
+
"required": ["operation", "path", "succeeded", "count"],
|
|
176
|
+
"properties": {
|
|
177
|
+
"operation": { "type": "string", "maxLength": 64 },
|
|
178
|
+
"path": { "type": "string", "maxLength": 1024 },
|
|
179
|
+
"sourcePath": { "type": "string", "maxLength": 1024 },
|
|
180
|
+
"succeeded": { "type": "boolean" },
|
|
181
|
+
"count": { "type": "integer", "minimum": 1 }
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
"trace": {
|
|
185
|
+
"type": "object",
|
|
186
|
+
"additionalProperties": false,
|
|
187
|
+
"required": ["coverage", "processes", "network", "fileWrites"],
|
|
188
|
+
"properties": {
|
|
189
|
+
"coverage": { "$ref": "#/$defs/coverage" },
|
|
190
|
+
"processes": { "type": "array", "maxItems": 512, "items": { "$ref": "#/$defs/process" } },
|
|
191
|
+
"network": { "type": "array", "maxItems": 512, "items": { "$ref": "#/$defs/network" } },
|
|
192
|
+
"fileWrites": { "type": "array", "maxItems": 512, "items": { "$ref": "#/$defs/fileWrite" } }
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"filesystemDiff": {
|
|
196
|
+
"type": "object",
|
|
197
|
+
"additionalProperties": false,
|
|
198
|
+
"required": ["created", "modified", "deleted", "totals", "truncated", "snapshotErrors"],
|
|
199
|
+
"properties": {
|
|
200
|
+
"created": { "type": "array", "maxItems": 512, "items": { "type": "string", "maxLength": 4096 } },
|
|
201
|
+
"modified": { "type": "array", "maxItems": 512, "items": { "type": "string", "maxLength": 4096 } },
|
|
202
|
+
"deleted": { "type": "array", "maxItems": 512, "items": { "type": "string", "maxLength": 4096 } },
|
|
203
|
+
"totals": {
|
|
204
|
+
"type": "object",
|
|
205
|
+
"additionalProperties": false,
|
|
206
|
+
"required": ["created", "modified", "deleted"],
|
|
207
|
+
"properties": {
|
|
208
|
+
"created": { "type": "integer", "minimum": 0 },
|
|
209
|
+
"modified": { "type": "integer", "minimum": 0 },
|
|
210
|
+
"deleted": { "type": "integer", "minimum": 0 }
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
"truncated": { "type": "boolean" },
|
|
214
|
+
"snapshotErrors": { "type": "integer", "minimum": 0 }
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|