@vzn/vx 0.0.645 → 0.0.648
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 +39 -50
- package/launcher.cjs +9 -2
- package/launcher.sh +2 -2
- package/package.json +5 -5
- package/schemas/cache.json +5 -5
- package/schemas/error.json +1 -1
- package/schemas/info.json +16 -2
- package/schemas/last.json +127 -5
- package/schemas/plan.json +28 -2
- package/schemas/show.json +10 -1
- package/skills/vx/SKILL.md +19 -3
- package/src/bin.ts +54 -13
- package/src/cache/archive.ts +324 -23
- package/src/cache/cache.ts +330 -65
- package/src/cache/git-inputs.ts +274 -97
- package/src/cache/index.ts +7 -2
- package/src/cache/inputs.ts +515 -83
- package/src/cache/key-fold.ts +15 -6
- package/src/cache/layer.ts +74 -11
- package/src/cache/layered-cache.ts +154 -59
- package/src/cache/linked-inputs.ts +1 -1
- package/src/cache/output-index.ts +44 -14
- package/src/cache/plugin-cache.ts +49 -23
- package/src/cache/remote-hits.ts +72 -0
- package/src/cache/remote-lane.ts +100 -15
- package/src/cache/run-history.ts +77 -23
- package/src/cache/run-store.ts +11 -10
- package/src/cache/schema.ts +42 -6
- package/src/cache/tar-stream.ts +5 -0
- package/src/cache/umask.ts +1 -2
- package/src/cli/cache.ts +58 -27
- package/src/cli/completions.ts +12 -5
- package/src/cli/core-alias.ts +5 -2
- package/src/cli/docs.ts +42 -16
- package/src/cli/help.ts +62 -25
- package/src/cli/index.ts +79 -45
- package/src/cli/info.ts +12 -6
- package/src/cli/init.ts +222 -34
- package/src/cli/last.ts +443 -47
- package/src/cli/lock.ts +197 -52
- package/src/cli/plan-format.ts +91 -49
- package/src/cli/plugin-commands.ts +160 -11
- package/src/cli/plugin-templates.ts +13 -13
- package/src/cli/registry.ts +209 -0
- package/src/cli/run.ts +111 -41
- package/src/cli/select.ts +148 -49
- package/src/cli/show.ts +59 -16
- package/src/cli/task-verb.ts +16 -6
- package/src/cli/upgrade.ts +155 -54
- package/src/cli/watch-cycle.ts +10 -5
- package/src/cli/watch-filter.ts +71 -3
- package/src/cli/watch-fs.ts +22 -6
- package/src/cli/watch-judge.ts +48 -6
- package/src/cli/watch.ts +163 -42
- package/src/cli/why.ts +211 -73
- package/src/cli/workspace-config.ts +54 -15
- package/src/config.ts +13 -1
- package/src/exec/env.ts +7 -2
- package/src/exec/executor.ts +262 -15
- package/src/exec/index.ts +8 -2
- package/src/exec/kill-tree.ts +15 -0
- package/src/exec/local-executor.ts +1 -1
- package/src/exec/proc-sample.ts +70 -6
- package/src/exec/runner.ts +256 -53
- package/src/exec/sandbox-binds.ts +7 -3
- package/src/exec/sandbox-paths.ts +1 -1
- package/src/exec/sandbox-runtime.ts +222 -28
- package/src/exec/sandbox-violations.ts +52 -20
- package/src/graph/critical-path.ts +79 -0
- package/src/graph/default-build.ts +19 -0
- package/src/graph/definition.ts +38 -0
- package/src/graph/folds.ts +38 -5
- package/src/graph/index.ts +4 -1
- package/src/graph/priorities.ts +74 -8
- package/src/graph/scheduler.ts +326 -65
- package/src/graph/task-graph.ts +228 -35
- package/src/handoff.ts +97 -9
- package/src/history/failure-mode.ts +6 -3
- package/src/history/history.ts +268 -50
- package/src/history/index.ts +2 -0
- package/src/history/metrics.ts +142 -45
- package/src/index.ts +42 -10
- package/src/orchestrator/admission.ts +10 -6
- package/src/orchestrator/affected-tasks.ts +11 -6
- package/src/orchestrator/deferred-outputs.ts +2 -0
- package/src/orchestrator/doctor.ts +134 -42
- package/src/orchestrator/execute-args.ts +6 -0
- package/src/orchestrator/execute-task.ts +155 -42
- package/src/orchestrator/fingerprint-watch.ts +1 -1
- package/src/orchestrator/graph-memo.ts +140 -0
- package/src/orchestrator/graph-stage.ts +18 -1
- package/src/orchestrator/held-servers.ts +86 -0
- package/src/orchestrator/hit-restore.ts +227 -122
- package/src/orchestrator/index.ts +20 -3
- package/src/orchestrator/local-floor.ts +198 -0
- package/src/orchestrator/local-shortcircuit.ts +51 -8
- package/src/orchestrator/lockfile-claim.ts +96 -16
- package/src/orchestrator/miss-save.ts +52 -12
- package/src/orchestrator/options.ts +8 -6
- package/src/orchestrator/output-host.ts +43 -14
- package/src/orchestrator/output-log.ts +90 -10
- package/src/orchestrator/persistent-task.ts +97 -28
- package/src/orchestrator/persistent.ts +16 -4
- package/src/orchestrator/placement.ts +257 -14
- package/src/orchestrator/plan.ts +64 -7
- package/src/orchestrator/plugin-host.ts +230 -40
- package/src/orchestrator/plugin.ts +150 -37
- package/src/orchestrator/prepare.ts +178 -32
- package/src/orchestrator/projects.ts +65 -40
- package/src/orchestrator/remote-prefetch.ts +119 -25
- package/src/orchestrator/run-artifacts.ts +95 -32
- package/src/orchestrator/run-context.ts +39 -41
- package/src/orchestrator/run-failures.ts +65 -23
- package/src/orchestrator/run-id.ts +6 -3
- package/src/orchestrator/run-keys.ts +300 -0
- package/src/orchestrator/run-live.ts +294 -0
- package/src/orchestrator/run-lock.ts +13 -7
- package/src/orchestrator/run-records.ts +35 -23
- package/src/orchestrator/run-report.ts +3 -3
- package/src/orchestrator/run-steps.ts +58 -22
- package/src/orchestrator/run-stop.ts +22 -5
- package/src/orchestrator/run.ts +409 -79
- package/src/orchestrator/sandbox-fix.ts +7 -5
- package/src/orchestrator/sandbox-request.ts +78 -22
- package/src/orchestrator/shell-verdict.ts +5 -5
- package/src/orchestrator/signals.ts +26 -1
- package/src/orchestrator/stable-keys.ts +92 -8
- package/src/orchestrator/steps.ts +2 -2
- package/src/orchestrator/task-artifacts.ts +206 -0
- package/src/orchestrator/task-hash.ts +89 -14
- package/src/orchestrator/task-log-buffer.ts +72 -36
- package/src/orchestrator/task-process.ts +22 -0
- package/src/orchestrator/telemetry-host.ts +24 -3
- package/src/orchestrator/telemetry.ts +113 -38
- package/src/orchestrator/upstream.ts +15 -0
- package/src/report/events.ts +32 -13
- package/src/report/forecast.ts +36 -35
- package/src/report/framed-output.ts +173 -46
- package/src/report/index.ts +1 -0
- package/src/report/logger.ts +217 -186
- package/src/report/path-links.ts +12 -4
- package/src/report/plain-output.ts +13 -5
- package/src/report/status-line.ts +94 -46
- package/src/report/summary.ts +174 -38
- package/src/report/terminal-signals.ts +13 -2
- package/src/settings.ts +14 -6
- package/src/util/bun-version.ts +4 -1
- package/src/util/colors.ts +20 -3
- package/src/util/config-frame.ts +41 -4
- package/src/{graph → util}/dependency-spec.ts +22 -13
- package/src/util/edit-distance.ts +13 -1
- package/src/util/env-flag.ts +9 -0
- package/src/util/errors.ts +59 -3
- package/src/util/essential-env.ts +57 -0
- package/src/util/git-ignored.ts +1 -1
- package/src/util/hash.ts +35 -0
- package/src/util/hide-env.ts +45 -5
- package/src/util/index.ts +22 -5
- package/src/util/num.ts +8 -0
- package/src/util/paths.ts +121 -21
- package/src/util/report.ts +6 -1
- package/src/util/secret-mask.ts +62 -1
- package/src/util/secrets.ts +7 -2
- package/src/util/size.ts +11 -3
- package/src/util/tail.ts +6 -1
- package/src/util/timing.ts +13 -1
- package/src/util/ui.ts +65 -4
- package/src/util/which.ts +1 -1
- package/src/util/write-file.ts +67 -0
- package/src/workspace/affected.ts +710 -107
- package/src/workspace/bracket-literal.ts +84 -0
- package/src/workspace/canonical-dir.ts +37 -0
- package/src/workspace/config-bytecode.ts +282 -0
- package/src/workspace/config-eval.ts +29 -8
- package/src/workspace/config-imports.ts +199 -58
- package/src/workspace/config-schema.ts +242 -39
- package/src/workspace/filter.ts +37 -8
- package/src/workspace/index.ts +11 -2
- package/src/workspace/json-data.ts +3 -4
- package/src/workspace/lockfile.ts +57 -8
- package/src/workspace/migration.ts +72 -49
- package/src/workspace/package-graph.ts +5 -4
- package/src/workspace/project-loader.ts +314 -47
- package/src/workspace/repo-id.ts +1 -1
- package/src/workspace/workspace.ts +176 -33
- package/src/cli/foreign-flags.ts +0 -727
package/README.md
CHANGED
|
@@ -23,37 +23,19 @@ Task orchestration with a cache you can trust, on a core you can extend.
|
|
|
23
23
|
Each task is one shell command with declared inputs and outputs; vx runs
|
|
24
24
|
them in dependency order and replays results from a content-addressed cache.
|
|
25
25
|
|
|
26
|
-
## Install
|
|
27
|
-
|
|
28
|
-
```sh
|
|
29
|
-
npm install -D @vzn/vx # or: pnpm add -D -w · yarn add -D (-W on Yarn 1) · bun add -d
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
A prebuilt binary for Linux (glibc, not Alpine's musl) and macOS, x64 and arm64; no Bun needed. The
|
|
33
|
-
[release](https://github.com/vznjs/vx/releases) binary needs no Node either.
|
|
34
|
-
Windows: run vx inside WSL2.
|
|
35
|
-
|
|
36
26
|
## Quick start
|
|
37
27
|
|
|
38
28
|
In a git repo:
|
|
39
29
|
|
|
40
30
|
```sh
|
|
41
|
-
|
|
42
|
-
vx run build --all # builds in dependency order and stores the results
|
|
43
|
-
vx run build --all # nothing changed: every task up-to-date
|
|
31
|
+
bunx @vzn/vx init # installs vx, writes an empty root vx.config.ts and the lockfile plugin
|
|
44
32
|
```
|
|
45
33
|
|
|
46
|
-
|
|
47
|
-
|
|
34
|
+
A prebuilt binary for Linux (glibc, not Alpine's musl) and macOS, x64 and
|
|
35
|
+
arm64. Windows: run vx inside WSL2.
|
|
48
36
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
`init` prints what it wrote and anything left to decide (a `TODO`). A miss you did not expect?
|
|
52
|
-
`npx @vzn/vx why <task>` names the input that moved.
|
|
53
|
-
|
|
54
|
-
### Without Turbo or Nx
|
|
55
|
-
|
|
56
|
-
`init` writes one task per package script, uncached. Cache one by saying what it reads and writes:
|
|
37
|
+
A task runs its tool directly, never through a package script. Cache one by
|
|
38
|
+
saying what it reads and writes:
|
|
57
39
|
|
|
58
40
|
```ts
|
|
59
41
|
// packages/app/vx.config.ts
|
|
@@ -74,10 +56,10 @@ export default defineProject({
|
|
|
74
56
|
```
|
|
75
57
|
|
|
76
58
|
```sh
|
|
77
|
-
|
|
78
|
-
|
|
59
|
+
vx run build --all # builds, in dependency order; stores the results
|
|
60
|
+
vx run build --all # nothing changed: up-to-date, in milliseconds
|
|
79
61
|
rm -rf packages/*/dist
|
|
80
|
-
|
|
62
|
+
vx run build --all # restored from the cache, not rebuilt
|
|
81
63
|
```
|
|
82
64
|
|
|
83
65
|
<img src="https://vznjs.github.io/vx/demo.svg" width="760" alt="vx run ci --all on examples/basic: cold, three tasks run; again, three up-to-date.">
|
|
@@ -86,7 +68,7 @@ npx @vzn/vx run build --all # restored from the cache, not rebuilt
|
|
|
86
68
|
|
|
87
69
|
`init` also writes `.vx/projects.lock.json`, every project's config as it evaluated.
|
|
88
70
|
Commit it. Every run reads its configs from the lock, so run
|
|
89
|
-
`
|
|
71
|
+
`vx lock` and commit the lock again after you:
|
|
90
72
|
|
|
91
73
|
- edit any `vx.config.ts` or `.vx/workspace.ts`,
|
|
92
74
|
- update dependencies or plugins,
|
|
@@ -97,12 +79,11 @@ stale lock before any task runs.
|
|
|
97
79
|
|
|
98
80
|
Starters: [`examples/basic`](examples/basic), and
|
|
99
81
|
[`examples/ci`](examples/ci) with a GitHub Actions workflow; CI runs both
|
|
100
|
-
on every commit. The [CI guide](https://vznjs.github.io/vx/
|
|
82
|
+
on every commit. The [CI guide](https://vznjs.github.io/vx/docs/ci/)
|
|
101
83
|
explains the workflow.
|
|
102
84
|
More: [Quickstart](https://vznjs.github.io/vx/quickstart/) ·
|
|
103
|
-
[Configure](https://vznjs.github.io/vx/
|
|
104
|
-
[CLI](packages/vx/docs/cli.md) · [every config field](packages/vx/docs/schema.md)
|
|
105
|
-
[playground](https://vznjs.github.io/vx/playground/) (the planner, in your browser).
|
|
85
|
+
[Configure](https://vznjs.github.io/vx/docs/workspace/) ·
|
|
86
|
+
[CLI](packages/vx/docs/cli.md) · [every config field](packages/vx/docs/schema.md).
|
|
106
87
|
|
|
107
88
|
## A foundation you own
|
|
108
89
|
|
|
@@ -120,21 +101,29 @@ More: [Quickstart](https://vznjs.github.io/vx/quickstart/) ·
|
|
|
120
101
|
|
|
121
102
|
What vx can do, not what it is limited to. Declared in `.vx/workspace.ts`; without any, vx runs and caches locally.
|
|
122
103
|
|
|
123
|
-
| Package
|
|
124
|
-
|
|
|
125
|
-
| [`@vzn/vx-migrate`](packages/vx-migrate)
|
|
126
|
-
| [`@vzn/vx-reapi`](packages/vx-reapi)
|
|
127
|
-
| [`@vzn/vx-lockfile`](packages/vx-lockfile)
|
|
128
|
-
| [`@vzn/vx-otel`](packages/vx-otel)
|
|
129
|
-
| [`@vzn/vx-ci`](packages/vx-ci)
|
|
130
|
-
| [`@vzn/vx-
|
|
131
|
-
|
|
132
|
-
|
|
104
|
+
| Package | What it adds |
|
|
105
|
+
| ------------------------------------------------------ | ----------------------------------------------------------------------------- |
|
|
106
|
+
| [`@vzn/vx-migrate`](packages/vx-migrate) | Migrate from Turbo or Nx: write native configs, keep its remote cache |
|
|
107
|
+
| [`@vzn/vx-reapi`](packages/vx-reapi) | Remote cache and remote execution over Bazel's REAPI (NativeLink, BuildBuddy) |
|
|
108
|
+
| [`@vzn/vx-lockfile`](packages/vx-lockfile) | Key each project on its own lockfile slice: pnpm, bun, npm, yarn |
|
|
109
|
+
| [`@vzn/vx-otel`](packages/vx-otel) | OpenTelemetry traces, metrics and logs, no SDK |
|
|
110
|
+
| [`@vzn/vx-ci`](packages/vx-ci) | GitHub Actions job summary |
|
|
111
|
+
| [`@vzn/vx-history`](packages/vx-history) | Schedule by the critical path learned from past runs |
|
|
112
|
+
| [`@vzn/vx-cache`](packages/vx-cache) | Remote cache for CI jobs, on a vx cache server |
|
|
113
|
+
| [`@vzn/vx-cache-server`](packages/vx-cache-server) | The cache server you host: Bun or Docker with S3, or Workers with R2 |
|
|
114
|
+
| [`@vzn/vx-history-server`](packages/vx-history-server) | The task timings server `vxHistory()` reads: Bun, Docker or Workers |
|
|
115
|
+
| [`@vzn/vx-devtools`](packages/vx-devtools) | Code the servers and plugins share: the CI OIDC token check |
|
|
116
|
+
| [`@vzn/vx-dte`](packages/vx-dte) | Spread one run over workers your own CI starts |
|
|
117
|
+
| [`@vzn/vx-dte-server`](packages/vx-dte-server) | The relay `dte()` meets its workers at: Workers, Bun or Docker |
|
|
118
|
+
|
|
119
|
+
Hosting the three servers: [servers docs](https://vznjs.github.io/vx/docs/servers/).
|
|
120
|
+
|
|
121
|
+
Write your own: [plugin guide](https://vznjs.github.io/vx/docs/writing-plugins/) ·
|
|
133
122
|
[architecture](packages/vx/docs/architecture.md).
|
|
134
123
|
|
|
135
124
|
## Coming from Turbo or Nx
|
|
136
125
|
|
|
137
|
-
Beside `turbo.json` or `nx.json`, `
|
|
126
|
+
Beside `turbo.json` or `nx.json`, `bunx @vzn/vx init` runs `@vzn/vx-migrate`:
|
|
138
127
|
it writes a `vx.config.ts` per package from `turbo.json` or the Nx graph,
|
|
139
128
|
and you keep those and delete the old config. `vx init --keep` writes only
|
|
140
129
|
a `.vx/workspace.ts` that maps the old config instead, and its lock: a temporary start,
|
|
@@ -163,19 +152,19 @@ Every gap, and when another tool is the better pick:
|
|
|
163
152
|
- **No source-file reads to hash:** on a clean tree, keys come from git's index; each project's `package.json` and the lockfile are still read.
|
|
164
153
|
- **One pass:** one git walk per run; each stat and lookup happens once.
|
|
165
154
|
|
|
166
|
-
<!-- bench:start — generated by
|
|
155
|
+
<!-- bench:start — generated by private/vx-bench/update-site.ts from results.json; do not hand-edit -->
|
|
167
156
|
|
|
168
|
-
| Time added over the ideal run, 1,601 projects, 9,603 tasks | vx | Turborepo
|
|
169
|
-
| ---------------------------------------------------------- | ---------- |
|
|
170
|
-
| Nothing changed | **
|
|
171
|
-
| Nothing changed, outputs restored | **1.
|
|
172
|
-
| Cold build | **
|
|
173
|
-
| Cold build: CPU the runner burns |
|
|
157
|
+
| Time added over the ideal run, 1,601 projects, 9,603 tasks | vx | Turborepo | Nx | Vite Task |
|
|
158
|
+
| ---------------------------------------------------------- | ---------- | ---------- | ---------- | --------- |
|
|
159
|
+
| Nothing changed | **799 ms** | 927 ms | 24.15 s | 12.07 s |
|
|
160
|
+
| Nothing changed, outputs restored | **1.28 s** | 2.01 s | 24.45 s | 11.86 s |
|
|
161
|
+
| Cold build | **7.57 s** | 9.63 s | 3 min 6 s | 9.01 s |
|
|
162
|
+
| Cold build: CPU the runner burns | 36.64 s | 1 min 12 s | 5 min 34 s | 25.32 s |
|
|
174
163
|
|
|
175
164
|
Time each tool adds over the ideal run; lower is better.
|
|
176
165
|
|
|
177
166
|
Benchmark workload: a synthetic monorepo of 1,601 projects and 9,603 tasks in 30 dependency levels, five core libraries a quarter of the projects use; build 300 ms, test and typecheck 150 ms, lint 75 ms, publish 30 ms; real repos with uneven task times will differ.
|
|
178
|
-
Run 2026-10-
|
|
167
|
+
Run 2026-10-25 on linux x64, 4 cores: vx at commit 9abdfb52c, Turborepo 2.11.10, Nx 24.0.1, Vite Task (vite-plus) 1.4.0.
|
|
179
168
|
|
|
180
169
|
Same graph, commands and concurrency: [how it is measured](https://vznjs.github.io/vx/benchmarks/).
|
|
181
170
|
|
package/launcher.cjs
CHANGED
|
@@ -102,8 +102,15 @@ function run(cmd, cmdArgs) {
|
|
|
102
102
|
process.stderr.write(`${base}: failed to launch (${err.message})\n`)
|
|
103
103
|
process.exit(1)
|
|
104
104
|
})
|
|
105
|
-
// Mirror the child's exit
|
|
105
|
+
// Mirror the child's exit. A stop signal vx died of is mirrored by dying
|
|
106
|
+
// of it: a shell running vx in a script stops on Ctrl-C only when its
|
|
107
|
+
// child died of SIGINT, and an exit 130 ran the script's next line. The
|
|
108
|
+
// POSIX 128+signo code is the rest, and the fallback should it not land.
|
|
106
109
|
child.on('exit', (code, signal) => {
|
|
110
|
+
if (signal === 'SIGINT' || signal === 'SIGTERM' || signal === 'SIGHUP') {
|
|
111
|
+
process.removeAllListeners(signal)
|
|
112
|
+
process.kill(process.pid, signal)
|
|
113
|
+
}
|
|
107
114
|
process.exit(signal ? 128 + (osConstants.signals[signal] ?? 1) : (code ?? 0))
|
|
108
115
|
})
|
|
109
116
|
}
|
|
@@ -133,7 +140,7 @@ if (bin !== undefined) {
|
|
|
133
140
|
`${base}: no prebuilt binary for ${key}${noGlibc ? ' without glibc (musl)' : ''}.\n` +
|
|
134
141
|
` Supported platforms: ${supported}.\n` +
|
|
135
142
|
` If your platform should be supported, reinstall so npm fetches the\n` +
|
|
136
|
-
` matching ${name}-${key} optionalDependency, or install Bun (>=1.4) to\n` +
|
|
143
|
+
` matching ${name}-${key} optionalDependency, or install Bun (>=1.4.4) to\n` +
|
|
137
144
|
` run ${base} from source.\n`,
|
|
138
145
|
)
|
|
139
146
|
process.exit(1)
|
package/launcher.sh
CHANGED
|
@@ -29,14 +29,14 @@ base=${here##*/}
|
|
|
29
29
|
scope=${here%/*}
|
|
30
30
|
scope=${scope##*/}
|
|
31
31
|
|
|
32
|
-
# A global vx hands off to the project's own (
|
|
32
|
+
# A global vx hands off to the project's own (2026-10-13): the
|
|
33
33
|
# workspace root's node_modules/<scope>/<name>, through its .bin entry. The
|
|
34
34
|
# root is the first directory holding a .vx/workspace.* from the working
|
|
35
35
|
# directory up to the git top-level (handoff.ts workspaceFile, the same
|
|
36
36
|
# rule). One hop (VX_HANDED_OFF, which also names this launcher), never to
|
|
37
37
|
# this package itself (`-ef`: same inode, so a pnpm symlink counts as
|
|
38
38
|
# itself). Shell tests and builtins only, no fork per level. `vx upgrade -g`
|
|
39
|
-
# moves only this global vx, so it never hands off (
|
|
39
|
+
# moves only this global vx, so it never hands off (2026-10-16).
|
|
40
40
|
stay=
|
|
41
41
|
if [ "${1-}" = upgrade ]; then
|
|
42
42
|
for a in "$@"; do
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vzn/vx",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.648",
|
|
4
4
|
"description": "Task orchestration you own: correct, sandboxed, extensible, with a content-addressed build cache.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
"node": ">=18"
|
|
22
22
|
},
|
|
23
23
|
"optionalDependencies": {
|
|
24
|
-
"@vzn/vx-linux-x64": "0.0.
|
|
25
|
-
"@vzn/vx-linux-arm64": "0.0.
|
|
26
|
-
"@vzn/vx-darwin-x64": "0.0.
|
|
27
|
-
"@vzn/vx-darwin-arm64": "0.0.
|
|
24
|
+
"@vzn/vx-linux-x64": "0.0.648",
|
|
25
|
+
"@vzn/vx-linux-arm64": "0.0.648",
|
|
26
|
+
"@vzn/vx-darwin-x64": "0.0.648",
|
|
27
|
+
"@vzn/vx-darwin-arm64": "0.0.648"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@anthropic-ai/sandbox-runtime": "^0.0.76"
|
package/schemas/cache.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"title": "vx cache clean --format json",
|
|
4
|
-
"description": "With a bound (prune): what the policy evicted and the orphan sweep reaped. With no bound (clear): the directories it deleted. With
|
|
4
|
+
"description": "With a bound (prune): what the policy evicted and the orphan sweep reaped. With no bound (clear): the directories it deleted. With dry, what they would.",
|
|
5
5
|
"oneOf": [{ "$ref": "#/$defs/prune" }, { "$ref": "#/$defs/clear" }],
|
|
6
6
|
"$defs": {
|
|
7
7
|
"prune": {
|
|
8
8
|
"type": "object",
|
|
9
9
|
"additionalProperties": false,
|
|
10
|
-
"required": ["
|
|
10
|
+
"required": ["dry", "evicted", "bytesFreed", "orphans", "orphanBytes"],
|
|
11
11
|
"properties": {
|
|
12
|
-
"
|
|
12
|
+
"dry": { "type": "boolean" },
|
|
13
13
|
"evicted": {
|
|
14
14
|
"type": "integer",
|
|
15
15
|
"description": "index entries evicted by the age / size policy"
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
"clear": {
|
|
29
29
|
"type": "object",
|
|
30
30
|
"additionalProperties": false,
|
|
31
|
-
"required": ["
|
|
31
|
+
"required": ["dry", "cleared", "bytesFreed"],
|
|
32
32
|
"properties": {
|
|
33
|
-
"
|
|
33
|
+
"dry": { "type": "boolean" },
|
|
34
34
|
"cleared": {
|
|
35
35
|
"type": "array",
|
|
36
36
|
"items": { "type": "string" },
|
package/schemas/error.json
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"properties": {
|
|
15
15
|
"code": {
|
|
16
16
|
"type": "string",
|
|
17
|
-
"description": "Stable; branch on it. VX_E_USAGE, VX_E_UNKNOWN_COMMAND, VX_E_UNKNOWN_TASK, VX_E_UNKNOWN_PROJECT, VX_E_NO_HISTORY, VX_E_AMBIGUOUS, VX_E_CONFIG, VX_E_CYCLE, VX_E_NO_WORKSPACE, VX_E_CACHE_VERSION, VX_E_REFUSED, VX_E_FS, VX_E_FDS, VX_E_INTERNAL."
|
|
17
|
+
"description": "Stable; branch on it. VX_E_USAGE, VX_E_UNKNOWN_COMMAND, VX_E_UNKNOWN_TASK, VX_E_UNKNOWN_PROJECT, VX_E_NO_HISTORY, VX_E_AMBIGUOUS, VX_E_CONFIG, VX_E_CYCLE, VX_E_LOCK, VX_E_NO_WORKSPACE, VX_E_CACHE_VERSION, VX_E_REFUSED, VX_E_FS, VX_E_FDS, VX_E_AFFECTED_BASE, VX_E_NO_GIT, VX_E_GIT, VX_E_NETWORK, VX_E_DEPENDS_ON, VX_E_OUTPUT_OVERLAP, VX_E_INPUT_IS_OUTPUT, VX_E_DEPENDENCY_RULE, VX_E_NESTED_INPUT, VX_E_INTERNAL. A plugin may name its own."
|
|
18
18
|
},
|
|
19
19
|
"message": { "type": "string", "description": "The refusal in prose; may change." },
|
|
20
20
|
"docs": {
|
package/schemas/info.json
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"schemaVersion",
|
|
26
26
|
"cacheEntries",
|
|
27
27
|
"cacheBytes",
|
|
28
|
+
"cacheIndexError",
|
|
28
29
|
"settings",
|
|
29
30
|
"orphans",
|
|
30
31
|
"runs24h",
|
|
@@ -32,6 +33,7 @@
|
|
|
32
33
|
"restored24h",
|
|
33
34
|
"flakyTasks",
|
|
34
35
|
"lockfile",
|
|
36
|
+
"lockError",
|
|
35
37
|
"sandbox"
|
|
36
38
|
],
|
|
37
39
|
"properties": {
|
|
@@ -68,7 +70,7 @@
|
|
|
68
70
|
"required": ["count", "source", "cores", "cpuQuota"],
|
|
69
71
|
"properties": {
|
|
70
72
|
"count": { "type": "integer" },
|
|
71
|
-
"source": { "enum": ["workspace", "cgroup", "cores"] },
|
|
73
|
+
"source": { "enum": ["env", "workspace", "cgroup", "cores"] },
|
|
72
74
|
"cores": { "type": "integer" },
|
|
73
75
|
"cpuQuota": { "type": ["number", "null"] }
|
|
74
76
|
}
|
|
@@ -91,6 +93,10 @@
|
|
|
91
93
|
"schemaVersion": { "type": "string" },
|
|
92
94
|
"cacheEntries": { "type": "integer" },
|
|
93
95
|
"cacheBytes": { "type": "integer" },
|
|
96
|
+
"cacheIndexError": {
|
|
97
|
+
"type": ["string", "null"],
|
|
98
|
+
"description": "Why the cache index cannot be read, with the fix; null when it reads. While set, the counts it holds read 0."
|
|
99
|
+
},
|
|
94
100
|
"settings": {
|
|
95
101
|
"type": "object",
|
|
96
102
|
"description": "every setting (docs/schema.md § Settings) by path, as a run with no flags takes it: its variable as written, else .vx/workspace's value, else null with source default",
|
|
@@ -100,7 +106,11 @@
|
|
|
100
106
|
"required": ["value", "source"],
|
|
101
107
|
"properties": {
|
|
102
108
|
"value": { "type": ["string", "number", "boolean", "null"] },
|
|
103
|
-
"source": { "enum": ["env", "workspace", "default"] }
|
|
109
|
+
"source": { "enum": ["env", "workspace", "default"] },
|
|
110
|
+
"refused": {
|
|
111
|
+
"type": "string",
|
|
112
|
+
"description": "why a run refuses the variable's value; absent when a run takes it"
|
|
113
|
+
}
|
|
104
114
|
}
|
|
105
115
|
}
|
|
106
116
|
},
|
|
@@ -133,6 +143,10 @@
|
|
|
133
143
|
}
|
|
134
144
|
},
|
|
135
145
|
"lockfile": { "type": "boolean" },
|
|
146
|
+
"lockError": {
|
|
147
|
+
"type": ["string", "null"],
|
|
148
|
+
"description": "Why a run refuses the lock that is there (run `vx lock`); null when a run reads it or there is none."
|
|
149
|
+
},
|
|
136
150
|
"sandbox": {
|
|
137
151
|
"type": "object",
|
|
138
152
|
"additionalProperties": false,
|
package/schemas/last.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
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; `--stats` prints per-task history numbers.",
|
|
4
|
+
"description": "`vx last [RUNID] [--failed]` prints a run; `--list` prints an array of invocations, newest first; `--log <task>` prints that task's output; `--stats` prints per-task history numbers; `--sql` prints the rows a read-only query over the history selects; `--live` prints the run in progress (with `--follow`, its events after, one per line).",
|
|
5
5
|
"oneOf": [
|
|
6
6
|
{
|
|
7
7
|
"type": "object",
|
|
@@ -9,14 +9,88 @@
|
|
|
9
9
|
"required": ["invocation", "tasks"],
|
|
10
10
|
"properties": {
|
|
11
11
|
"invocation": { "$ref": "#/$defs/invocation" },
|
|
12
|
-
"tasks": { "type": "array", "items": { "$ref": "#/$defs/task" } }
|
|
12
|
+
"tasks": { "type": "array", "items": { "$ref": "#/$defs/task" } },
|
|
13
|
+
"warnings": {
|
|
14
|
+
"type": "array",
|
|
15
|
+
"description": "what the run warned of, plain text; absent when it warned of nothing",
|
|
16
|
+
"items": { "type": "string" }
|
|
17
|
+
},
|
|
18
|
+
"steps": {
|
|
19
|
+
"type": "array",
|
|
20
|
+
"description": "vx's own steps the run did not wait on (vx:prefetch); absent when it had none or they are no longer kept",
|
|
21
|
+
"items": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"additionalProperties": false,
|
|
24
|
+
"required": ["id", "durationMs", "ok"],
|
|
25
|
+
"properties": {
|
|
26
|
+
"id": { "type": "string" },
|
|
27
|
+
"durationMs": { "type": "number" },
|
|
28
|
+
"ok": { "type": "boolean" }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
13
32
|
}
|
|
14
33
|
},
|
|
15
34
|
{ "type": "array", "items": { "$ref": "#/$defs/invocation" } },
|
|
16
35
|
{ "$ref": "#/$defs/log" },
|
|
17
|
-
{ "$ref": "#/$defs/stats" }
|
|
36
|
+
{ "$ref": "#/$defs/stats" },
|
|
37
|
+
{ "$ref": "#/$defs/rows" },
|
|
38
|
+
{ "$ref": "#/$defs/live" }
|
|
18
39
|
],
|
|
19
40
|
"$defs": {
|
|
41
|
+
"live": {
|
|
42
|
+
"type": "object",
|
|
43
|
+
"additionalProperties": false,
|
|
44
|
+
"required": ["live", "tasks", "warnings"],
|
|
45
|
+
"properties": {
|
|
46
|
+
"live": {
|
|
47
|
+
"type": "object",
|
|
48
|
+
"additionalProperties": false,
|
|
49
|
+
"required": ["runId", "command", "pid", "startedAt", "elapsedMs"],
|
|
50
|
+
"properties": {
|
|
51
|
+
"runId": { "type": "string" },
|
|
52
|
+
"command": { "type": "string" },
|
|
53
|
+
"pid": { "type": "integer" },
|
|
54
|
+
"startedAt": { "type": "integer", "description": "epoch ms" },
|
|
55
|
+
"elapsedMs": { "type": "integer" }
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"tasks": {
|
|
59
|
+
"type": "array",
|
|
60
|
+
"description": "`--live`: running first, then ended, then waiting; groups left out",
|
|
61
|
+
"items": {
|
|
62
|
+
"type": "object",
|
|
63
|
+
"additionalProperties": false,
|
|
64
|
+
"required": ["taskId", "status", "startedAt", "durationMs"],
|
|
65
|
+
"properties": {
|
|
66
|
+
"taskId": { "type": "string" },
|
|
67
|
+
"status": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"description": "running, waiting, or the status it ended with"
|
|
70
|
+
},
|
|
71
|
+
"startedAt": { "type": ["integer", "null"] },
|
|
72
|
+
"durationMs": { "type": ["number", "null"] }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"warnings": { "type": "array", "items": { "type": "string" } }
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"rows": {
|
|
80
|
+
"type": "object",
|
|
81
|
+
"additionalProperties": false,
|
|
82
|
+
"required": ["rows"],
|
|
83
|
+
"properties": {
|
|
84
|
+
"rows": {
|
|
85
|
+
"type": "array",
|
|
86
|
+
"description": "`--sql`: one object per row, keyed by the query's column names",
|
|
87
|
+
"items": {
|
|
88
|
+
"type": "object",
|
|
89
|
+
"additionalProperties": { "type": ["string", "number", "null"] }
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
},
|
|
20
94
|
"stats": {
|
|
21
95
|
"type": "object",
|
|
22
96
|
"additionalProperties": false,
|
|
@@ -166,6 +240,9 @@
|
|
|
166
240
|
"hash",
|
|
167
241
|
"cpuMs",
|
|
168
242
|
"peakRssBytes",
|
|
243
|
+
"peakCores",
|
|
244
|
+
"avgRssBytes",
|
|
245
|
+
"placement",
|
|
169
246
|
"wallclockStartNs",
|
|
170
247
|
"wallclockEndNs",
|
|
171
248
|
"blockedBy",
|
|
@@ -173,14 +250,18 @@
|
|
|
173
250
|
"sandboxViolations",
|
|
174
251
|
"notReady",
|
|
175
252
|
"remoteError",
|
|
176
|
-
"forwarded"
|
|
253
|
+
"forwarded",
|
|
254
|
+
"attempts"
|
|
177
255
|
],
|
|
178
256
|
"properties": {
|
|
179
257
|
"runId": { "type": ["string", "null"] },
|
|
180
258
|
"project": { "type": "string" },
|
|
181
259
|
"task": { "type": "string" },
|
|
182
260
|
"status": { "type": "string" },
|
|
183
|
-
"exitCode": {
|
|
261
|
+
"exitCode": {
|
|
262
|
+
"type": "integer",
|
|
263
|
+
"description": "a skipped task records 0 when an exec.platforms skip is its root, 1 behind a failure or fail-fast"
|
|
264
|
+
},
|
|
184
265
|
"durationMs": { "type": "number" },
|
|
185
266
|
"startedAt": { "type": "integer", "description": "epoch ms" },
|
|
186
267
|
"endedAt": { "type": "integer", "description": "epoch ms" },
|
|
@@ -199,6 +280,18 @@
|
|
|
199
280
|
"hash": { "type": "string" },
|
|
200
281
|
"cpuMs": { "type": ["number", "null"] },
|
|
201
282
|
"peakRssBytes": { "type": ["integer", "null"] },
|
|
283
|
+
"peakCores": {
|
|
284
|
+
"type": ["number", "null"],
|
|
285
|
+
"description": "most cores one sampling interval burned; null when nothing sampled"
|
|
286
|
+
},
|
|
287
|
+
"avgRssBytes": {
|
|
288
|
+
"type": ["integer", "null"],
|
|
289
|
+
"description": "mean resident memory over the samples; null when nothing sampled"
|
|
290
|
+
},
|
|
291
|
+
"placement": {
|
|
292
|
+
"type": ["string", "null"],
|
|
293
|
+
"description": "where an executor ran it (small#1); null when here"
|
|
294
|
+
},
|
|
202
295
|
"wallclockStartNs": {
|
|
203
296
|
"type": ["string", "null"],
|
|
204
297
|
"description": "decimal nanoseconds from the run's start"
|
|
@@ -213,6 +306,14 @@
|
|
|
213
306
|
"description": "each failed remote read or write of the key, `; `-joined"
|
|
214
307
|
},
|
|
215
308
|
"forwarded": { "type": "boolean" },
|
|
309
|
+
"inputMoved": {
|
|
310
|
+
"type": "string",
|
|
311
|
+
"description": "on a row failed by inputStability.severity 'error': the input that changed during the run"
|
|
312
|
+
},
|
|
313
|
+
"attempts": {
|
|
314
|
+
"type": ["integer", "null"],
|
|
315
|
+
"description": "the attempts a retried task took (more than one); null when it ran once"
|
|
316
|
+
},
|
|
216
317
|
"output": {
|
|
217
318
|
"type": "string",
|
|
218
319
|
"description": "on a failed row: its output, plain text, bounded (first 8 KiB, last 56 KiB), secrets masked; '' when none was recorded"
|
|
@@ -231,6 +332,27 @@
|
|
|
231
332
|
}
|
|
232
333
|
}
|
|
233
334
|
},
|
|
335
|
+
"sandboxFix": {
|
|
336
|
+
"type": "object",
|
|
337
|
+
"description": "on a sandboxed failed row: the exec.sandbox.allow entries that would have granted its denials",
|
|
338
|
+
"additionalProperties": false,
|
|
339
|
+
"properties": {
|
|
340
|
+
"read": { "type": "array", "items": { "type": "string" } },
|
|
341
|
+
"write": { "type": "array", "items": { "type": "string" } },
|
|
342
|
+
"network": { "type": "array", "items": { "type": "string" } },
|
|
343
|
+
"systemInfo": { "type": "array", "items": { "type": "string" } },
|
|
344
|
+
"withheld": {
|
|
345
|
+
"type": "array",
|
|
346
|
+
"description": "credential paths it denied and left out of the grants",
|
|
347
|
+
"items": { "type": "string" }
|
|
348
|
+
},
|
|
349
|
+
"inputs": {
|
|
350
|
+
"type": "array",
|
|
351
|
+
"description": "a cached task's reads of its project no inputs.files glob matches",
|
|
352
|
+
"items": { "type": "string" }
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
},
|
|
234
356
|
"fixedIn": {
|
|
235
357
|
"type": "string",
|
|
236
358
|
"description": "on a failed row: the first later run where this task passed (ran or hit); absent while it has not"
|
package/schemas/plan.json
CHANGED
|
@@ -20,9 +20,21 @@
|
|
|
20
20
|
"id": { "type": "string", "description": "project#task" },
|
|
21
21
|
"project": { "type": "string" },
|
|
22
22
|
"task": { "type": "string" },
|
|
23
|
-
"hash": {
|
|
23
|
+
"hash": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "the cache key; empty when the run derives none"
|
|
26
|
+
},
|
|
24
27
|
"cacheStatus": {
|
|
25
|
-
"enum": [
|
|
28
|
+
"enum": [
|
|
29
|
+
"hit-local",
|
|
30
|
+
"hit-remote",
|
|
31
|
+
"miss",
|
|
32
|
+
"no-cache",
|
|
33
|
+
"group",
|
|
34
|
+
"not-started",
|
|
35
|
+
"skipped"
|
|
36
|
+
],
|
|
37
|
+
"description": "skipped: exec.platforms leave this machine out, or a task it depends on is skipped; the run skips it too"
|
|
26
38
|
},
|
|
27
39
|
"deps": { "type": "array", "items": { "type": "string" } },
|
|
28
40
|
"p50Ms": {
|
|
@@ -38,6 +50,20 @@
|
|
|
38
50
|
"description": "outputs would stay remote (--cache-download)"
|
|
39
51
|
},
|
|
40
52
|
"description": { "type": "string" },
|
|
53
|
+
"otherPlatform": {
|
|
54
|
+
"type": "object",
|
|
55
|
+
"description": "a skipped task's own exec.platforms, and this machine's",
|
|
56
|
+
"additionalProperties": false,
|
|
57
|
+
"required": ["needs", "host"],
|
|
58
|
+
"properties": {
|
|
59
|
+
"needs": { "type": "array", "items": { "type": "string" } },
|
|
60
|
+
"host": { "type": "string" }
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"blockedBy": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"description": "a skipped task's root: the task off this machine's platforms it depends on"
|
|
66
|
+
},
|
|
41
67
|
"affected": {
|
|
42
68
|
"type": "object",
|
|
43
69
|
"description": "why --affected kept this requested task; absent on a dependency it pulled in",
|
package/schemas/show.json
CHANGED
|
@@ -6,7 +6,12 @@
|
|
|
6
6
|
{ "type": "array", "items": { "$ref": "#/$defs/listRow" } },
|
|
7
7
|
{ "$ref": "#/$defs/project" },
|
|
8
8
|
{ "$ref": "#/$defs/task" },
|
|
9
|
-
{
|
|
9
|
+
{
|
|
10
|
+
"type": "array",
|
|
11
|
+
"minItems": 1,
|
|
12
|
+
"description": "`vx show <task>`; when no project in scope declares it, `[]`, which the list branch holds",
|
|
13
|
+
"items": { "$ref": "#/$defs/task" }
|
|
14
|
+
}
|
|
10
15
|
],
|
|
11
16
|
"$defs": {
|
|
12
17
|
"listRow": {
|
|
@@ -84,6 +89,10 @@
|
|
|
84
89
|
"properties": { "readyWhen": { "type": "string" } }
|
|
85
90
|
},
|
|
86
91
|
"interactive": { "type": "boolean" },
|
|
92
|
+
"platforms": {
|
|
93
|
+
"type": "array",
|
|
94
|
+
"items": { "enum": ["linux-x64", "linux-arm64", "darwin-x64", "darwin-arm64"] }
|
|
95
|
+
},
|
|
87
96
|
"sandbox": {
|
|
88
97
|
"type": "object",
|
|
89
98
|
"description": "as declared; its fields are the `exec.sandbox` section of the config schema"
|
package/skills/vx/SKILL.md
CHANGED
|
@@ -53,6 +53,13 @@ does not):
|
|
|
53
53
|
is one of its inputs), `project`, `package`, `named` or `selected`, and
|
|
54
54
|
`via` is the `dependsOn` chain that carried the change.
|
|
55
55
|
|
|
56
|
+
## While a run is in progress
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
vx last --live --format json # what runs, what ended, what waits, warnings so far
|
|
60
|
+
vx last --live --follow --format json # then each event (output included), one per line, until the run ends
|
|
61
|
+
```
|
|
62
|
+
|
|
56
63
|
## When a task fails
|
|
57
64
|
|
|
58
65
|
```sh
|
|
@@ -60,6 +67,7 @@ vx last --failed --format json # the last failed run; a failed row has output
|
|
|
60
67
|
vx last --log app#build # one task's output: a failure's, or its cached log
|
|
61
68
|
```
|
|
62
69
|
|
|
70
|
+
`warnings` holds what the run warned of (absent when nothing).
|
|
63
71
|
A failed row's `output` is the task's output as plain text (secrets masked)
|
|
64
72
|
and `locations` the files it names as `{ file, line?, col? }`. Read those
|
|
65
73
|
files, fix, and re-run the same command: cached tasks that passed replay from the cache.
|
|
@@ -77,12 +85,20 @@ vx last --stats --format json # per task: p50 (the live estimate's),
|
|
|
77
85
|
vx last --stats --branch main --format json # p50 from main's timings
|
|
78
86
|
vx last --stats app#build --format json # one task; a task name covers every project
|
|
79
87
|
vx last --list --format json # recent runs, newest first
|
|
88
|
+
vx last --sql "SELECT name, sql FROM sqlite_schema" --format json # the history's tables
|
|
80
89
|
```
|
|
81
90
|
|
|
91
|
+
Any other question (one task's memory trend, failures per project, which
|
|
92
|
+
inputs a key folded) is one read-only query: `vx last --sql "<SELECT>"
|
|
93
|
+
--format json` prints `{ rows }`. `runs` holds one row per task per run
|
|
94
|
+
(duration, cache hit, cpu, memory, attempts, failure reasons),
|
|
95
|
+
`invocations` one per run; join on `run_id`. Times are epoch ms.
|
|
96
|
+
|
|
82
97
|
## Workspace health
|
|
83
98
|
|
|
84
99
|
```sh
|
|
85
|
-
vx info --format json
|
|
100
|
+
vx info --format json # vx and Bun versions, projects, plugins, cache
|
|
101
|
+
vx lock --check --format json # a vx.config that changed since the lock, or no longer loads
|
|
86
102
|
```
|
|
87
103
|
|
|
88
104
|
## Rules
|
|
@@ -100,13 +116,13 @@ vx info --format json # vx and Bun versions, projects, config errors, plugins,
|
|
|
100
116
|
print whole.
|
|
101
117
|
- Docs as markdown: https://vznjs.github.io/vx/llms.txt (its index).
|
|
102
118
|
When that host is unreachable, the same pages are
|
|
103
|
-
`https://raw.githubusercontent.com/vznjs/vx/main/
|
|
119
|
+
`https://raw.githubusercontent.com/vznjs/vx/main/private/vx-docs/src/content/docs/<page>.md`:
|
|
104
120
|
`quickstart`, `guides/migrate`, `guides/configure`, `guides/agents`,
|
|
105
121
|
`guides/troubleshooting`, `guides/ci`, `guides/plugins`.
|
|
106
122
|
|
|
107
123
|
## Install
|
|
108
124
|
|
|
109
|
-
`
|
|
125
|
+
`bunx skills add vznjs/vx` installs this skill. To match the vx a workspace
|
|
110
126
|
has installed, copy it from there instead:
|
|
111
127
|
`cp node_modules/@vzn/vx/skills/vx/SKILL.md .claude/skills/vx/`.
|
|
112
128
|
`vx upgrade` inside a workspace moves the project's `@vzn/vx` and the
|