@vzn/vx 0.0.631 → 0.0.633
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 +21 -18
- package/docs/caching.md +2247 -0
- package/docs/cli.md +3214 -0
- package/docs/execution.md +708 -0
- package/docs/features.md +172 -0
- package/docs/patterns.md +219 -0
- package/docs/schema.md +2137 -0
- package/docs/security.md +209 -0
- package/package.json +14 -5
- package/schemas/cache.json +24 -0
- package/schemas/docs.json +28 -0
- package/schemas/error.json +23 -0
- package/schemas/info.json +147 -0
- package/schemas/init.json +57 -0
- package/schemas/last.json +188 -0
- package/schemas/lock.json +21 -0
- package/schemas/plan.json +88 -0
- package/schemas/show.json +124 -0
- package/schemas/summary.json +133 -0
- package/schemas/why.json +168 -0
- package/skills/vx/SKILL.md +89 -0
- package/src/bin.ts +9 -0
- package/src/cache/archive.ts +153 -51
- package/src/cache/cache.ts +542 -137
- package/src/cache/chained-cache.ts +9 -0
- package/src/cache/inputs.ts +5 -0
- package/src/cache/layer.ts +10 -5
- package/src/cache/layered-cache.ts +4 -0
- package/src/cache/schema.ts +44 -17
- package/src/cache/tar-stream.ts +204 -66
- package/src/cache/zstd.ts +1 -1
- package/src/cli/cache.ts +14 -14
- package/src/cli/docs-corpus.ts +21 -0
- package/src/cli/docs-text.d.ts +5 -0
- package/src/cli/docs.ts +167 -0
- package/src/cli/foreign-flags.ts +1 -1
- package/src/cli/help.ts +42 -7
- package/src/cli/index.ts +25 -11
- package/src/cli/info.ts +38 -9
- package/src/cli/init.ts +131 -24
- package/src/cli/last.ts +54 -3
- package/src/cli/lock.ts +43 -15
- package/src/cli/plan-format.ts +23 -1
- package/src/cli/plugin-commands.ts +3 -0
- package/src/cli/plugin-templates.ts +1 -1
- package/src/cli/run.ts +40 -21
- package/src/cli/show.ts +10 -7
- package/src/cli/upgrade.ts +19 -7
- package/src/cli/watch.ts +7 -2
- package/src/cli/why.ts +14 -40
- package/src/exec/runner.ts +27 -10
- package/src/graph/scheduler.ts +36 -0
- package/src/graph/task-graph.ts +4 -4
- package/src/index.ts +22 -5
- package/src/orchestrator/admission.ts +29 -1
- package/src/orchestrator/affected-tasks.ts +87 -18
- package/src/orchestrator/doctor.ts +14 -1
- package/src/orchestrator/execute-task.ts +149 -64
- package/src/orchestrator/failure-mode.ts +5 -3
- package/src/orchestrator/framed-output.ts +17 -3
- package/src/orchestrator/index.ts +11 -0
- package/src/orchestrator/logger.ts +57 -6
- package/src/orchestrator/metrics.ts +76 -4
- package/src/orchestrator/miss-reason.ts +3 -5
- package/src/orchestrator/miss-save.ts +6 -5
- package/src/orchestrator/options.ts +12 -0
- package/src/orchestrator/output-log.ts +14 -1
- package/src/orchestrator/path-links.ts +79 -0
- package/src/orchestrator/plan.ts +20 -3
- package/src/orchestrator/plugin.ts +7 -0
- package/src/orchestrator/prepare.ts +14 -4
- package/src/orchestrator/projects.ts +2 -2
- package/src/orchestrator/run-artifacts.ts +18 -2
- package/src/orchestrator/run-failures.ts +192 -0
- package/src/orchestrator/run-records.ts +10 -8
- package/src/orchestrator/run.ts +87 -22
- package/src/orchestrator/task-hash.ts +4 -4
- package/src/orchestrator/terminal-signals.ts +16 -0
- package/src/orchestrator/upstream.ts +65 -10
- package/src/util/errors.ts +55 -1
- package/src/util/index.ts +3 -0
- package/src/util/secret-mask.ts +13 -1
- package/src/util/verbs.ts +1 -0
- package/src/workspace/config-schema.ts +10 -8
- package/src/workspace/migration.ts +30 -3
- package/src/workspace/workspace.ts +1 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "vx last --format json",
|
|
4
|
+
"description": "`vx last [RUNID] [--failed]` prints a run; `--list` prints an array of invocations, newest first; `--log <task>` prints that task's output.",
|
|
5
|
+
"oneOf": [
|
|
6
|
+
{
|
|
7
|
+
"type": "object",
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"required": ["invocation", "tasks"],
|
|
10
|
+
"properties": {
|
|
11
|
+
"invocation": { "$ref": "#/$defs/invocation" },
|
|
12
|
+
"tasks": { "type": "array", "items": { "$ref": "#/$defs/task" } }
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
{ "type": "array", "items": { "$ref": "#/$defs/invocation" } },
|
|
16
|
+
{ "$ref": "#/$defs/log" }
|
|
17
|
+
],
|
|
18
|
+
"$defs": {
|
|
19
|
+
"log": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"additionalProperties": false,
|
|
22
|
+
"required": ["runId", "taskId", "status", "source", "output"],
|
|
23
|
+
"properties": {
|
|
24
|
+
"runId": { "type": "string" },
|
|
25
|
+
"taskId": { "type": "string" },
|
|
26
|
+
"status": { "type": "string" },
|
|
27
|
+
"source": {
|
|
28
|
+
"enum": ["failure", "cache", null],
|
|
29
|
+
"description": "the kept failure output, the cache entry's log, or none kept"
|
|
30
|
+
},
|
|
31
|
+
"output": { "type": "string", "description": "plain text; '' when source is null" }
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"invocation": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"additionalProperties": false,
|
|
37
|
+
"required": [
|
|
38
|
+
"runId",
|
|
39
|
+
"command",
|
|
40
|
+
"requestedTasks",
|
|
41
|
+
"cachePolicy",
|
|
42
|
+
"concurrency",
|
|
43
|
+
"flow",
|
|
44
|
+
"startedAt",
|
|
45
|
+
"endedAt",
|
|
46
|
+
"totalDurationMs",
|
|
47
|
+
"taskCount",
|
|
48
|
+
"failedCount",
|
|
49
|
+
"hitCount",
|
|
50
|
+
"hitLocalCount",
|
|
51
|
+
"hitRemoteCount",
|
|
52
|
+
"upToDateCount",
|
|
53
|
+
"restoredLocalCount",
|
|
54
|
+
"restoredRemoteCount",
|
|
55
|
+
"exitOk",
|
|
56
|
+
"commitSha",
|
|
57
|
+
"branch",
|
|
58
|
+
"dirty",
|
|
59
|
+
"ci",
|
|
60
|
+
"ciProvider",
|
|
61
|
+
"host",
|
|
62
|
+
"os",
|
|
63
|
+
"arch",
|
|
64
|
+
"vxVersion",
|
|
65
|
+
"tags"
|
|
66
|
+
],
|
|
67
|
+
"properties": {
|
|
68
|
+
"runId": { "type": "string" },
|
|
69
|
+
"command": { "type": "string" },
|
|
70
|
+
"requestedTasks": { "type": "array", "items": { "type": "string" } },
|
|
71
|
+
"cachePolicy": { "type": "string" },
|
|
72
|
+
"concurrency": { "type": "integer" },
|
|
73
|
+
"flow": { "enum": ["focused", "broad", null] },
|
|
74
|
+
"startedAt": { "type": "integer", "description": "epoch ms" },
|
|
75
|
+
"endedAt": { "type": "integer", "description": "epoch ms" },
|
|
76
|
+
"totalDurationMs": { "type": "number" },
|
|
77
|
+
"taskCount": { "type": "integer" },
|
|
78
|
+
"failedCount": { "type": "integer" },
|
|
79
|
+
"hitCount": { "type": "integer" },
|
|
80
|
+
"hitLocalCount": { "type": "integer" },
|
|
81
|
+
"hitRemoteCount": { "type": "integer" },
|
|
82
|
+
"upToDateCount": {
|
|
83
|
+
"type": "integer",
|
|
84
|
+
"description": "hits that restored nothing: the disk already matched"
|
|
85
|
+
},
|
|
86
|
+
"restoredLocalCount": {
|
|
87
|
+
"type": "integer",
|
|
88
|
+
"description": "hits that restored outputs from the local cache"
|
|
89
|
+
},
|
|
90
|
+
"restoredRemoteCount": {
|
|
91
|
+
"type": "integer",
|
|
92
|
+
"description": "hits that restored outputs from the remote cache"
|
|
93
|
+
},
|
|
94
|
+
"exitOk": { "type": "boolean" },
|
|
95
|
+
"commitSha": { "type": ["string", "null"] },
|
|
96
|
+
"branch": { "type": ["string", "null"] },
|
|
97
|
+
"dirty": { "type": ["boolean", "null"] },
|
|
98
|
+
"ci": { "type": "boolean" },
|
|
99
|
+
"ciProvider": { "type": ["string", "null"] },
|
|
100
|
+
"host": { "type": ["string", "null"] },
|
|
101
|
+
"os": { "type": ["string", "null"] },
|
|
102
|
+
"arch": { "type": ["string", "null"] },
|
|
103
|
+
"vxVersion": { "type": "string" },
|
|
104
|
+
"tags": { "type": "object", "additionalProperties": { "type": "string" } }
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"task": {
|
|
108
|
+
"type": "object",
|
|
109
|
+
"additionalProperties": false,
|
|
110
|
+
"required": [
|
|
111
|
+
"runId",
|
|
112
|
+
"project",
|
|
113
|
+
"task",
|
|
114
|
+
"status",
|
|
115
|
+
"exitCode",
|
|
116
|
+
"durationMs",
|
|
117
|
+
"startedAt",
|
|
118
|
+
"endedAt",
|
|
119
|
+
"cacheHit",
|
|
120
|
+
"restored",
|
|
121
|
+
"cached",
|
|
122
|
+
"hash",
|
|
123
|
+
"cpuMs",
|
|
124
|
+
"peakRssBytes",
|
|
125
|
+
"wallclockStartNs",
|
|
126
|
+
"wallclockEndNs",
|
|
127
|
+
"blockedBy",
|
|
128
|
+
"timedOut",
|
|
129
|
+
"sandboxViolations",
|
|
130
|
+
"notReady",
|
|
131
|
+
"forwarded"
|
|
132
|
+
],
|
|
133
|
+
"properties": {
|
|
134
|
+
"runId": { "type": ["string", "null"] },
|
|
135
|
+
"project": { "type": "string" },
|
|
136
|
+
"task": { "type": "string" },
|
|
137
|
+
"status": { "type": "string" },
|
|
138
|
+
"exitCode": { "type": "integer" },
|
|
139
|
+
"durationMs": { "type": "number" },
|
|
140
|
+
"startedAt": { "type": "integer", "description": "epoch ms" },
|
|
141
|
+
"endedAt": { "type": "integer", "description": "epoch ms" },
|
|
142
|
+
"cacheHit": {
|
|
143
|
+
"type": ["boolean", "null"],
|
|
144
|
+
"description": "true when the task's outputs came from the cache instead of running"
|
|
145
|
+
},
|
|
146
|
+
"restored": {
|
|
147
|
+
"type": ["boolean", "null"],
|
|
148
|
+
"description": "on a hit: true when outputs were restored, false when up-to-date"
|
|
149
|
+
},
|
|
150
|
+
"cached": {
|
|
151
|
+
"type": ["boolean", "null"],
|
|
152
|
+
"description": "whether the task declares a cache (false prints no-cache); not whether this run hit it"
|
|
153
|
+
},
|
|
154
|
+
"hash": { "type": "string" },
|
|
155
|
+
"cpuMs": { "type": ["number", "null"] },
|
|
156
|
+
"peakRssBytes": { "type": ["integer", "null"] },
|
|
157
|
+
"wallclockStartNs": {
|
|
158
|
+
"type": ["string", "null"],
|
|
159
|
+
"description": "decimal nanoseconds from the run's start"
|
|
160
|
+
},
|
|
161
|
+
"wallclockEndNs": { "type": ["string", "null"] },
|
|
162
|
+
"blockedBy": { "type": ["string", "null"] },
|
|
163
|
+
"timedOut": { "type": ["boolean", "null"] },
|
|
164
|
+
"sandboxViolations": { "type": ["integer", "null"] },
|
|
165
|
+
"notReady": { "enum": ["timeout", "exited", "spawn", null] },
|
|
166
|
+
"forwarded": { "type": "boolean" },
|
|
167
|
+
"output": {
|
|
168
|
+
"type": "string",
|
|
169
|
+
"description": "on a failed row: its output, plain text, bounded (first 8 KiB, last 56 KiB), secrets masked; '' when none was recorded"
|
|
170
|
+
},
|
|
171
|
+
"locations": {
|
|
172
|
+
"type": "array",
|
|
173
|
+
"description": "on a failed row: the existing files its output names, in order of first appearance",
|
|
174
|
+
"items": {
|
|
175
|
+
"type": "object",
|
|
176
|
+
"additionalProperties": false,
|
|
177
|
+
"required": ["file"],
|
|
178
|
+
"properties": {
|
|
179
|
+
"file": { "type": "string", "description": "absolute" },
|
|
180
|
+
"line": { "type": "integer" },
|
|
181
|
+
"col": { "type": "integer" }
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "vx lock --check --format json",
|
|
4
|
+
"description": "The lock audit: exit 0 when upToDate, else 1 with each drift in problems.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["upToDate", "audited", "notAudited", "problems"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"upToDate": { "type": "boolean" },
|
|
10
|
+
"audited": { "type": "integer", "description": "projects with a vx.config, each audited" },
|
|
11
|
+
"notAudited": {
|
|
12
|
+
"type": "integer",
|
|
13
|
+
"description": "projects without a vx.config: nothing to freeze, never audited"
|
|
14
|
+
},
|
|
15
|
+
"problems": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"items": { "type": "string" },
|
|
18
|
+
"description": "one line per drift, as the plain audit prints it on stderr; a missing lock is one"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "vx run --dry=json",
|
|
4
|
+
"description": "The task graph a run would execute and what the cache predicts for each task; nothing runs.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["tasks"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"tasks": {
|
|
10
|
+
"type": "array",
|
|
11
|
+
"items": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"additionalProperties": false,
|
|
14
|
+
"required": ["id", "project", "task", "hash", "cacheStatus", "deps"],
|
|
15
|
+
"properties": {
|
|
16
|
+
"id": { "type": "string", "description": "project#task" },
|
|
17
|
+
"project": { "type": "string" },
|
|
18
|
+
"task": { "type": "string" },
|
|
19
|
+
"hash": { "type": "string", "description": "the cache key" },
|
|
20
|
+
"cacheStatus": {
|
|
21
|
+
"enum": ["hit-local", "hit-remote", "miss", "no-cache", "group", "not-started"]
|
|
22
|
+
},
|
|
23
|
+
"deps": { "type": "array", "items": { "type": "string" } },
|
|
24
|
+
"p50Ms": {
|
|
25
|
+
"type": "number",
|
|
26
|
+
"description": "typical executed duration, when history has one"
|
|
27
|
+
},
|
|
28
|
+
"executor": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"description": "where it would run; only when the workspace declares more than one executor"
|
|
31
|
+
},
|
|
32
|
+
"download": {
|
|
33
|
+
"const": "deferred",
|
|
34
|
+
"description": "outputs would stay remote (--download)"
|
|
35
|
+
},
|
|
36
|
+
"description": { "type": "string" },
|
|
37
|
+
"affected": {
|
|
38
|
+
"type": "object",
|
|
39
|
+
"description": "why --affected kept this requested task; absent on a dependency it pulled in",
|
|
40
|
+
"additionalProperties": false,
|
|
41
|
+
"required": ["kind"],
|
|
42
|
+
"properties": {
|
|
43
|
+
"kind": {
|
|
44
|
+
"enum": ["input", "project", "package", "named", "selected"],
|
|
45
|
+
"description": "input: a changed file is a declared input; project: its project changed and the task reads it whole; package: a ^ edge passes a changed package; named: asked as pkg#task; selected: another filter selected its project"
|
|
46
|
+
},
|
|
47
|
+
"file": { "type": "string", "description": "the changed file, workspace-relative" },
|
|
48
|
+
"project": { "type": "string", "description": "the changed package (kind package)" },
|
|
49
|
+
"via": {
|
|
50
|
+
"type": "array",
|
|
51
|
+
"items": { "type": "string" },
|
|
52
|
+
"description": "the dependsOn chain, nearest first, to the task the change reached"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"predicted": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"additionalProperties": false,
|
|
62
|
+
"required": ["wallMs", "workMs", "unknownCount", "criticalPath"],
|
|
63
|
+
"properties": {
|
|
64
|
+
"wallMs": { "type": "number" },
|
|
65
|
+
"workMs": { "type": "number" },
|
|
66
|
+
"unknownCount": {
|
|
67
|
+
"type": "integer",
|
|
68
|
+
"description": "would-run tasks with no history; the times are lower bounds when above 0"
|
|
69
|
+
},
|
|
70
|
+
"criticalPath": {
|
|
71
|
+
"type": "array",
|
|
72
|
+
"description": "the would-run task ids with history along the chain wallMs measures, dependencies first",
|
|
73
|
+
"items": { "type": "string" }
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"downloadDowngrades": {
|
|
78
|
+
"type": "array",
|
|
79
|
+
"description": "producers --download wanted to defer but could not, and why",
|
|
80
|
+
"items": {
|
|
81
|
+
"type": "object",
|
|
82
|
+
"additionalProperties": false,
|
|
83
|
+
"required": ["taskId", "reason"],
|
|
84
|
+
"properties": { "taskId": { "type": "string" }, "reason": { "type": "string" } }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "vx show --format json",
|
|
4
|
+
"description": "`vx show` lists projects; `vx show <project>` prints one project's resolved config; `vx show <project>#<task>` one task's; `vx show <task>` that task in every project declaring it. A secret value is masked.",
|
|
5
|
+
"oneOf": [
|
|
6
|
+
{ "type": "array", "items": { "$ref": "#/$defs/listRow" } },
|
|
7
|
+
{ "$ref": "#/$defs/project" },
|
|
8
|
+
{ "$ref": "#/$defs/task" },
|
|
9
|
+
{ "type": "array", "items": { "$ref": "#/$defs/task" } }
|
|
10
|
+
],
|
|
11
|
+
"$defs": {
|
|
12
|
+
"listRow": {
|
|
13
|
+
"type": "object",
|
|
14
|
+
"additionalProperties": false,
|
|
15
|
+
"required": ["name", "dir", "tags", "tasks"],
|
|
16
|
+
"properties": {
|
|
17
|
+
"name": { "type": "string" },
|
|
18
|
+
"dir": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "relative to the workspace root, POSIX separators"
|
|
21
|
+
},
|
|
22
|
+
"tags": { "$ref": "#/$defs/stringList" },
|
|
23
|
+
"tasks": { "type": "array", "items": { "type": "string" } }
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"project": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"additionalProperties": false,
|
|
29
|
+
"required": ["name", "dir", "config"],
|
|
30
|
+
"properties": {
|
|
31
|
+
"name": { "type": "string" },
|
|
32
|
+
"dir": { "type": "string" },
|
|
33
|
+
"config": {
|
|
34
|
+
"type": ["object", "null"],
|
|
35
|
+
"description": "null when the package has no vx config and no plugin gave it one",
|
|
36
|
+
"additionalProperties": false,
|
|
37
|
+
"properties": {
|
|
38
|
+
"tags": { "$ref": "#/$defs/stringList" },
|
|
39
|
+
"tasks": { "type": "object", "additionalProperties": { "$ref": "#/$defs/taskConfig" } }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"task": {
|
|
45
|
+
"type": "object",
|
|
46
|
+
"additionalProperties": false,
|
|
47
|
+
"required": ["name", "dir", "task", "config"],
|
|
48
|
+
"properties": {
|
|
49
|
+
"name": { "type": "string" },
|
|
50
|
+
"dir": { "type": "string" },
|
|
51
|
+
"task": { "type": "string" },
|
|
52
|
+
"config": { "$ref": "#/$defs/taskConfig" }
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"stringList": { "type": "array", "items": { "type": "string" } },
|
|
56
|
+
"taskConfig": {
|
|
57
|
+
"type": "object",
|
|
58
|
+
"additionalProperties": false,
|
|
59
|
+
"properties": {
|
|
60
|
+
"description": { "type": "string" },
|
|
61
|
+
"dependsOn": { "$ref": "#/$defs/stringList" },
|
|
62
|
+
"exec": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"additionalProperties": false,
|
|
65
|
+
"required": ["command"],
|
|
66
|
+
"properties": {
|
|
67
|
+
"command": { "type": "string" },
|
|
68
|
+
"remote": { "enum": [true, false, "only"] },
|
|
69
|
+
"timeout": { "type": "number", "description": "ms" },
|
|
70
|
+
"retries": { "type": "integer" },
|
|
71
|
+
"env": {
|
|
72
|
+
"type": "object",
|
|
73
|
+
"additionalProperties": false,
|
|
74
|
+
"properties": {
|
|
75
|
+
"passThrough": { "$ref": "#/$defs/stringList" },
|
|
76
|
+
"define": { "type": "object", "additionalProperties": { "type": "string" } },
|
|
77
|
+
"secret": { "$ref": "#/$defs/stringList" }
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"persistent": {
|
|
81
|
+
"type": "object",
|
|
82
|
+
"additionalProperties": false,
|
|
83
|
+
"properties": { "readyWhen": { "type": "string" } }
|
|
84
|
+
},
|
|
85
|
+
"interactive": { "type": "boolean" },
|
|
86
|
+
"sandbox": {
|
|
87
|
+
"type": "object",
|
|
88
|
+
"description": "as declared; its fields are the `exec.sandbox` section of the config schema"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"cache": {
|
|
93
|
+
"type": "object",
|
|
94
|
+
"additionalProperties": false,
|
|
95
|
+
"required": ["inputs", "outputs"],
|
|
96
|
+
"properties": {
|
|
97
|
+
"inputs": {
|
|
98
|
+
"type": "object",
|
|
99
|
+
"additionalProperties": false,
|
|
100
|
+
"required": ["files"],
|
|
101
|
+
"properties": {
|
|
102
|
+
"files": { "$ref": "#/$defs/stringList" },
|
|
103
|
+
"workspaceFiles": { "$ref": "#/$defs/stringList" },
|
|
104
|
+
"env": { "$ref": "#/$defs/stringList" },
|
|
105
|
+
"tasks": { "$ref": "#/$defs/stringList" },
|
|
106
|
+
"runtime": { "$ref": "#/$defs/stringList" },
|
|
107
|
+
"workspaceRuntime": { "$ref": "#/$defs/stringList" }
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"outputs": {
|
|
111
|
+
"type": "object",
|
|
112
|
+
"additionalProperties": false,
|
|
113
|
+
"required": ["files"],
|
|
114
|
+
"properties": {
|
|
115
|
+
"files": { "$ref": "#/$defs/stringList" },
|
|
116
|
+
"workspaceFiles": { "$ref": "#/$defs/stringList" }
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "vx run --summarize",
|
|
4
|
+
"description": "Every task's outcome in one run: <cacheDir>/runs/<runId>.json, or the --summarize=<path> file.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"runId",
|
|
9
|
+
"ok",
|
|
10
|
+
"exitCode",
|
|
11
|
+
"startedAt",
|
|
12
|
+
"endedAt",
|
|
13
|
+
"totalMs",
|
|
14
|
+
"savedMs",
|
|
15
|
+
"tasks",
|
|
16
|
+
"aborted",
|
|
17
|
+
"summary"
|
|
18
|
+
],
|
|
19
|
+
"properties": {
|
|
20
|
+
"runId": { "type": "string" },
|
|
21
|
+
"ok": { "type": "boolean", "description": "the run's verdict: exitCode is 0" },
|
|
22
|
+
"exitCode": { "type": "integer" },
|
|
23
|
+
"startedAt": { "type": "string", "description": "ISO 8601" },
|
|
24
|
+
"endedAt": { "type": "string", "description": "ISO 8601" },
|
|
25
|
+
"totalMs": { "type": "number" },
|
|
26
|
+
"savedMs": {
|
|
27
|
+
"type": "number",
|
|
28
|
+
"description": "what the cache hits skipped: the sum of their storedDurationMs"
|
|
29
|
+
},
|
|
30
|
+
"tasks": {
|
|
31
|
+
"type": "array",
|
|
32
|
+
"description": "every counted task: not a group, not aborted",
|
|
33
|
+
"items": { "$ref": "#/$defs/task" }
|
|
34
|
+
},
|
|
35
|
+
"aborted": {
|
|
36
|
+
"type": "array",
|
|
37
|
+
"description": "tasks a shutdown signal killed; in no bucket and no total",
|
|
38
|
+
"items": { "$ref": "#/$defs/task" }
|
|
39
|
+
},
|
|
40
|
+
"summary": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"additionalProperties": false,
|
|
43
|
+
"required": [
|
|
44
|
+
"successful",
|
|
45
|
+
"failed",
|
|
46
|
+
"skipped",
|
|
47
|
+
"cachedLocal",
|
|
48
|
+
"restoredLocal",
|
|
49
|
+
"restoredRemote",
|
|
50
|
+
"upToDate",
|
|
51
|
+
"cachedRemote",
|
|
52
|
+
"aborted",
|
|
53
|
+
"total"
|
|
54
|
+
],
|
|
55
|
+
"properties": {
|
|
56
|
+
"successful": { "type": "integer" },
|
|
57
|
+
"failed": { "type": "integer" },
|
|
58
|
+
"skipped": { "type": "integer" },
|
|
59
|
+
"cachedLocal": { "type": "integer" },
|
|
60
|
+
"restoredLocal": { "type": "integer" },
|
|
61
|
+
"restoredRemote": { "type": "integer" },
|
|
62
|
+
"upToDate": { "type": "integer" },
|
|
63
|
+
"cachedRemote": { "type": "integer" },
|
|
64
|
+
"aborted": { "type": "integer" },
|
|
65
|
+
"total": { "type": "integer" }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"$defs": {
|
|
70
|
+
"task": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"additionalProperties": false,
|
|
73
|
+
"required": ["id", "project", "task", "status", "exitCode", "durationMs", "hash"],
|
|
74
|
+
"properties": {
|
|
75
|
+
"id": { "type": "string" },
|
|
76
|
+
"project": { "type": "string" },
|
|
77
|
+
"task": { "type": "string" },
|
|
78
|
+
"status": {
|
|
79
|
+
"enum": ["success", "cache-hit", "cache-hit-remote", "failed", "skipped", "aborted"]
|
|
80
|
+
},
|
|
81
|
+
"exitCode": { "type": "integer" },
|
|
82
|
+
"durationMs": { "type": "number" },
|
|
83
|
+
"hash": { "type": ["string", "null"] },
|
|
84
|
+
"restored": {
|
|
85
|
+
"type": "boolean",
|
|
86
|
+
"description": "on a hit only: true when outputs were restored, false when they were already up to date"
|
|
87
|
+
},
|
|
88
|
+
"noCache": {
|
|
89
|
+
"const": true,
|
|
90
|
+
"description": "the task declares no cache block: it could never hit"
|
|
91
|
+
},
|
|
92
|
+
"flaky": {
|
|
93
|
+
"type": "object",
|
|
94
|
+
"description": "this key both passed and failed on record, or the task needed a retry",
|
|
95
|
+
"additionalProperties": false,
|
|
96
|
+
"required": ["passes", "failures", "attempts"],
|
|
97
|
+
"properties": {
|
|
98
|
+
"passes": { "type": "integer" },
|
|
99
|
+
"failures": { "type": "integer" },
|
|
100
|
+
"attempts": { "type": "integer" }
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"cpuMs": { "type": "number" },
|
|
104
|
+
"peakRssBytes": { "type": "integer" },
|
|
105
|
+
"storedDurationMs": {
|
|
106
|
+
"type": "number",
|
|
107
|
+
"description": "a hit: how long the producing execution ran, what the hit skipped"
|
|
108
|
+
},
|
|
109
|
+
"storedCpuMs": {
|
|
110
|
+
"type": "number",
|
|
111
|
+
"description": "a hit: what the producing execution used"
|
|
112
|
+
},
|
|
113
|
+
"storedPeakRssBytes": { "type": "integer" },
|
|
114
|
+
"admissionHeldMs": {
|
|
115
|
+
"type": "number",
|
|
116
|
+
"description": "an admit policy held it with a worker free"
|
|
117
|
+
},
|
|
118
|
+
"blockedBy": {
|
|
119
|
+
"type": "string",
|
|
120
|
+
"description": "a skipped task: the failed task at the root of what blocked it"
|
|
121
|
+
},
|
|
122
|
+
"timedOut": { "const": true },
|
|
123
|
+
"sandboxViolations": { "type": "integer" },
|
|
124
|
+
"notReady": { "enum": ["timeout", "exited", "spawn"] },
|
|
125
|
+
"wallclockStartNs": {
|
|
126
|
+
"type": "string",
|
|
127
|
+
"description": "decimal nanoseconds from the run's start"
|
|
128
|
+
},
|
|
129
|
+
"wallclockEndNs": { "type": "string" }
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|