diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 00000000..e5b6d8d6 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 00000000..cd28d13c --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": ["@changesets/changelog-github", { "repo": "cloudflare/computer" }], + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": ["@example/*", "@cloudflare/example-*"], + "privatePackages": { + "version": true, + "tag": false + } +} diff --git a/.github/changeset-publish.mjs b/.github/changeset-publish.mjs new file mode 100644 index 00000000..ab7e4422 --- /dev/null +++ b/.github/changeset-publish.mjs @@ -0,0 +1,86 @@ +#!/usr/bin/env node +// Called by the changesets action in release.yml as the `publish` +// command. It converges the computerd container image before publishing npm +// packages, so a rerun after npm failure is safe: Docker tags are pushed again +// first, then `changeset publish` publishes anything still missing from npm. + +import { execFileSync } from "node:child_process"; +import { chmodSync, copyFileSync, mkdirSync, readFileSync } from "node:fs"; + +function run(cmd, args, options = {}) { + execFileSync(cmd, args, { stdio: "inherit", ...options }); +} + +function readJson(path) { + return JSON.parse(readFileSync(path, "utf8")); +} + +function isStable(version) { + return !version.includes("-"); +} + +function computerdImageTags(version) { + const tags = [ + `ghcr.io/cloudflare/computer-computerd-linux-x64:${version}`, + `registry.cloudflare.com/library/computer-computerd-linux-x64:${version}`, + ]; + + if (isStable(version)) { + tags.push( + "ghcr.io/cloudflare/computer-computerd-linux-x64:latest", + "registry.cloudflare.com/library/computer-computerd-linux-x64:latest", + ); + } + + return tags; +} + +function imageExists(tag) { + try { + execFileSync("docker", ["buildx", "imagetools", "inspect", tag], { + stdio: "ignore", + }); + return true; + } catch { + return false; + } +} + +function stageComputerdBinary() { + mkdirSync("packages/computer-computerd-linux-x64/bin", { recursive: true }); + copyFileSync( + "artifacts/computerd/computerd-linux-x64", + "packages/computer-computerd-linux-x64/bin/computerd", + ); + chmodSync("packages/computer-computerd-linux-x64/bin/computerd", 0o755); +} + +const { version } = readJson("packages/computerd/package.json"); +const tags = computerdImageTags(version); +const missingTags = tags.filter((tag) => !imageExists(tag)); + +if (missingTags.length === 0) { + console.log(`computerd image ${version} already exists in both registries; skipping image build`); +} else { + console.log(`publishing computerd image for @cloudflare/computerd@${version}`); + console.log(`missing tag(s): ${missingTags.join(", ")}`); + + run("npm", ["run", "build:bin", "--workspace", "@cloudflare/computerd"]); + stageComputerdBinary(); + + const tagArgs = tags.flatMap((tag) => ["--tag", tag]); + run("docker", [ + "buildx", + "build", + "--platform", + "linux/amd64", + "--push", + "--provenance=false", + ...tagArgs, + "--file", + "packages/computer-computerd-linux-x64/Dockerfile", + "packages/computer-computerd-linux-x64", + ]); +} + +run("npx", ["changeset", "publish"]); diff --git a/.github/changeset-version.mjs b/.github/changeset-version.mjs new file mode 100644 index 00000000..60b8387a --- /dev/null +++ b/.github/changeset-version.mjs @@ -0,0 +1,114 @@ +#!/usr/bin/env node +// Called by the changesets action in release.yml as the `version` +// command. It consumes pending changesets, then applies release-time +// references that must be committed with the Version Packages PR. +// +// Changesets owns package versions and changelogs, including private +// packages (`privatePackages.version` is enabled in .changeset/config.json). +// The linux-x64 image context is derivative of @cloudflare/computerd, not a +// changeset target, so this script copies computerd's version into that +// package.json and updates Dockerfile/docs image pins to the same version. + +import { execFileSync } from "node:child_process"; +import { readdirSync, readFileSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; + +const IMAGE_TAG_RE = + /(ghcr\.io\/cloudflare\/computer-computerd-linux-x64:)[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?/g; +const TEXT_FILE_EXTENSIONS = new Set([ + "", + ".Dockerfile", + ".js", + ".json", + ".md", + ".mjs", + ".ts", + ".yaml", + ".yml", +]); +const IGNORED_DIRS = new Set([".git", ".devbox", ".venv", "artifacts", "dist", "node_modules"]); +const IGNORED_FILES = new Set([ + "package-lock.json", + "CHANGELOG.md", + ".github/changeset-version.mjs", +]); + +function run(cmd, args) { + execFileSync(cmd, args, { stdio: "inherit" }); +} + +function readJson(path) { + return JSON.parse(readFileSync(path, "utf8")); +} + +function writeJson(path, value) { + writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`); +} + +function* walk(dir) { + for (const entry of readdirSync(dir, { withFileTypes: true })) { + if (entry.name.startsWith(".") && entry.name !== ".github") continue; + + const path = join(dir, entry.name); + if (entry.isDirectory()) { + if (!IGNORED_DIRS.has(entry.name)) yield* walk(path); + continue; + } + + if (!entry.isFile()) continue; + if (IGNORED_FILES.has(path) || IGNORED_FILES.has(entry.name)) continue; + if (entry.name === "Dockerfile" || entry.name.startsWith("Dockerfile.")) { + yield path; + continue; + } + + const suffix = entry.name.includes(".") ? entry.name.slice(entry.name.lastIndexOf(".")) : ""; + if (TEXT_FILE_EXTENSIONS.has(suffix)) yield path; + } +} + +function syncDerivedImagePackage(computerdVersion) { + const path = "packages/computer-computerd-linux-x64/package.json"; + const pkg = readJson(path); + pkg.version = computerdVersion; + pkg.private = true; + writeJson(path, pkg); + console.log(`${path}: derivative image package version → ${computerdVersion}`); +} + +function updateImageReferences(computerdVersion) { + let updatedFiles = 0; + let replacements = 0; + + for (const file of walk(".")) { + const before = readFileSync(file, "utf8"); + if (!IMAGE_TAG_RE.test(before)) { + IMAGE_TAG_RE.lastIndex = 0; + continue; + } + + IMAGE_TAG_RE.lastIndex = 0; + const after = before.replace(IMAGE_TAG_RE, `$1${computerdVersion}`); + if (after !== before) { + const count = before.match(IMAGE_TAG_RE)?.length ?? 0; + writeFileSync(file, after); + updatedFiles += 1; + replacements += count; + console.log(`${file}: computerd image tag → ${computerdVersion}`); + } + IMAGE_TAG_RE.lastIndex = 0; + } + + console.log( + `updated ${replacements} computerd image tag reference(s) across ${updatedFiles} file(s)`, + ); +} + +run("npx", ["changeset", "version"]); + +const { version: computerdVersion } = readJson("packages/computerd/package.json"); +syncDerivedImagePackage(computerdVersion); +updateImageReferences(computerdVersion); + +// changeset version doesn't update package-lock.json (changesets/changesets#421). +run("npm", ["install", "--package-lock-only"]); diff --git a/.github/workflows/close-unrequested-prs.yml b/.github/workflows/close-unrequested-prs.yml index 9b73784d..d350bc07 100644 --- a/.github/workflows/close-unrequested-prs.yml +++ b/.github/workflows/close-unrequested-prs.yml @@ -17,11 +17,19 @@ jobs: uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | - const pullRequest = context.payload.pull_request; + const { owner, repo } = context.repo; + const pull_number = context.payload.pull_request.number; + const issue_number = pull_number; const allowedAssociations = new Set(['OWNER', 'MEMBER', 'COLLABORATOR']); - const allowedBots = new Set(['dependabot[bot]', 'renovate[bot]']); + const allowedBots = new Set(['dependabot[bot]', 'renovate[bot]', 'github-actions[bot]']); const allowedLabels = new Set(['allow-pr']); + const { data: pullRequest } = await github.rest.pulls.get({ + owner, + repo, + pull_number, + }); + if (allowedAssociations.has(pullRequest.author_association)) { return; } @@ -35,8 +43,6 @@ jobs: return; } - const { owner, repo } = context.repo; - const issue_number = pullRequest.number; const body = [ 'Thanks for your interest in Cloudflare Computer.', '', @@ -49,4 +55,4 @@ jobs: ].join('\n'); await github.rest.issues.createComment({ owner, repo, issue_number, body }); - await github.rest.pulls.update({ owner, repo, pull_number: issue_number, state: 'closed' }); + await github.rest.pulls.update({ owner, repo, pull_number, state: 'closed' }); diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 012c176e..73e0bbad 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,69 +1,28 @@ -# Tag-triggered release. Push a `v` tag and CI: +# Changesets-driven release. A green CI run on main either opens/updates the +# changesets Version Packages PR, or publishes the release after that PR merges. # -# 1. Builds every workspace. -# 2. Runs all package tests. -# 3. Builds the computerd linux-x64 SEA binary (build-only — proves the -# release tag still produces a working binary; not published). -# 4. Stamps the tag's version into the publishable package. -# 5. Publishes @cloudflare/computer under a dist-tag picked from -# the version: prerelease tags (`-alpha.N`, `-beta.N`, `-rc.N`) -# publish under the matching suffix (`alpha`, `beta`, `rc`) -# so plain `npm i @cloudflare/computer` doesn't pick them up; -# stable tags (no suffix) publish under `latest`. -# 6. Pushes the computerd binary image to two registries: ghcr.io (the -# canonical public source the example Dockerfiles reference) -# and registry.cloudflare.com (so wrangler / Containers can -# pull from inside Cloudflare's platform without an outbound -# hop). Stable releases also move each registry's `:latest` -# tag; prereleases only push the version-specific tag. +# Version PR path: +# - contributors commit `.changeset/*.md` files; +# - changesets/action runs `.github/changeset-version.mjs`; +# - the Version Packages PR commits package versions, changelogs, lockfile +# updates, and the Dockerfile/docs pins for the computerd image. # -# The computerd binary ships as a single-layer container image, -# mirrored to both ghcr.io/cloudflare/computer-computerd-linux-x64 -# and registry.cloudflare.com/library/computer-computerd-linux-x64. -# The example Dockerfiles pin the GHCR coordinate (anonymous pulls, -# no Cloudflare-account dependency); the CF copy is kept for -# consumers that prefer to stay on the in-platform registry. It is -# deliberately NOT bundled inside the @cloudflare/computer npm -# tarball — nothing in the package resolves it at runtime, and -# every consumer copies it out of the image via `COPY --from`, so -# bundling only bloated the tarball by ~120 MB. -# -# npm packages use trusted publishing (OIDC); no NPM_TOKEN is -# needed, only the workflow's `id-token: write` permission plus a -# trusted publisher config on the @cloudflare scope that names -# this repo + this workflow file. -# -# Image pushes need: -# - `packages: write` on the workflow's GITHUB_TOKEN (auto- -# injected; used to authenticate to ghcr.io). -# - Repository secrets CLOUDFLARE_API_TOKEN (scoped for Container -# Registry Write on the target account) and -# CLOUDFLARE_ACCOUNT_ID (used by .github/cf-registry-login.sh to -# mint a short-lived library_push credential). -# -# One manual step is needed once, after the first push of the GHCR -# package: flip the package visibility to Public at -# https://github.com/orgs/cloudflare/packages/container/computer-computerd-linux-x64/settings -# Subsequent pushes inherit the public visibility automatically. -# -# Triggers: -# - push: tags ['v*'] — the normal release path -# - workflow_dispatch — manual re-run for a tag that already -# exists, useful when the first run -# failed after a partial publish. +# Publish path: +# - no pending changesets remain on main; +# - changesets/action runs `.github/changeset-publish.mjs`; +# - the script builds and pushes the computerd container image first, then +# runs `changeset publish` for npm. Reruns are safe: pushing the same image +# tags again is idempotent, and changeset publish skips npm versions that +# already exist. name: Release on: - push: - tags: - - "v*" - workflow_dispatch: - inputs: - tag: - description: "Tag to release (must already exist, e.g. v0.1.0-alpha.1)" - required: true - type: string + workflow_run: + workflows: ["CI"] + branches: [main] + types: [completed] + workflow_dispatch: {} concurrency: group: ${{ github.workflow }} @@ -71,104 +30,76 @@ concurrency: jobs: release: + if: ${{ (github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success') && github.repository_owner == 'cloudflare' }} runs-on: ubuntu-24.04 timeout-minutes: 30 permissions: # Trusted publishing on npm requires the OIDC id-token. id-token: write - contents: read + # changesets/action creates the version PR, release commit, and tags. + contents: write + pull-requests: write # GHCR push uses GITHUB_TOKEN with `packages: write`. packages: write - if: ${{ github.repository_owner == 'cloudflare' }} - env: - # Used everywhere a version string is needed below. The push - # path takes it from the tag; the manual path takes it from - # the dispatch input. - RELEASE_TAG: ${{ inputs.tag || github.ref_name }} steps: - uses: actions/checkout@v6 with: - # On workflow_dispatch we need to check out the named tag - # explicitly; the workflow itself runs from the default - # branch otherwise. - ref: ${{ env.RELEASE_TAG }} fetch-depth: 1 - uses: ./.github/actions/install with: registry-url: "https://registry.npmjs.org" - # computerd's tests spawn the binary, which dynamically links - # libfuse2 (fuse-native) and uses fuse3 helpers for the - # FUSE_MOUNT=shim userspace mount path. Without these the computerd test - # suite fails with `libfuse.so.2: cannot open shared object - # file`. Mirrors the install in ci.yml. + # @cloudflare/computer's prepublishOnly runs `npm run build && npm + # test`; its tests spawn the computerd binary, which dynamically links + # libfuse2 and uses fuse3 helpers for the FUSE_MOUNT=shim path. Without + # these the suite fails with `libfuse.so.2: cannot open shared object + # file`. Mirrors ci.yml. - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y --no-install-recommends libfuse2t64 fuse3 + # Build every workspace's dist/ up front. changesets doesn't run the + # build itself (changesets/changesets#860), and package builds/tests + # resolve sibling dist/ directories. - name: Build all workspaces run: npm run build --workspaces --if-present - - name: Test - run: npm test --workspaces --if-present - - - name: Build computerd binary - run: npm run build:bin --workspace @cloudflare/computerd - - - name: Sync versions - run: node script/set-versions.mjs "${RELEASE_TAG}" - - # Pick the npm dist-tag and decide whether this release moves - # the `:latest` pointers. A stable semver (no `-` suffix) - # publishes under `latest` and bumps the image's :latest tag; - # a prerelease publishes under its prerelease channel - # (`alpha`, `beta`, `rc`) and leaves :latest alone so a stale - # alpha can't displace a real release. - - name: Compute release metadata - id: release-meta + - name: Detect pending changesets + id: pending-changesets + shell: bash run: | - version="${RELEASE_TAG#v}" - if [[ "$version" == *-* ]]; then - suffix="${version#*-}" - npm_tag="${suffix%%.*}" - is_stable=false + shopt -s nullglob + files=() + for file in .changeset/*.md; do + if [[ "$file" == ".changeset/README.md" ]]; then + continue + fi + files+=("$file") + done + if [[ ${#files[@]} -gt 0 ]]; then + echo "present=true" >> "$GITHUB_OUTPUT" else - npm_tag=latest - is_stable=true + echo "present=false" >> "$GITHUB_OUTPUT" fi - echo "version=${version}" >> "$GITHUB_OUTPUT" - echo "npm_tag=${npm_tag}" >> "$GITHUB_OUTPUT" - echo "is_stable=${is_stable}" >> "$GITHUB_OUTPUT" - - - name: Publish @cloudflare/computer - run: npm publish --workspace @cloudflare/computer --tag "${{ steps.release-meta.outputs.npm_tag }}" --provenance --access public - - # Stage the SEA binary into the computerd-linux-x64 package's bin/ - # directory — that package's Dockerfile copies from `bin/computerd` - # against a `scratch` base, producing a single-layer image - # whose only purpose is to ship the binary at a known path. - - name: Stage binary into @cloudflare/computer-computerd-linux-x64 - run: | - mkdir -p packages/computer-computerd-linux-x64/bin - cp artifacts/computerd/computerd-linux-x64 packages/computer-computerd-linux-x64/bin/computerd - chmod +x packages/computer-computerd-linux-x64/bin/computerd + # The following Docker setup is only needed on the publish path. The + # Version Packages PR path should not need registry credentials. - name: Set up buildx + if: steps.pending-changesets.outputs.present == 'false' uses: docker/setup-buildx-action@v3 - name: Log in to GHCR + if: steps.pending-changesets.outputs.present == 'false' uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - # Mint a short-lived credential and log docker in to the - # Cloudflare registry. The login script handles transient - # failures and surfaces permanent ones as ::error::. - name: Log in to registry.cloudflare.com + if: steps.pending-changesets.outputs.present == 'false' env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} @@ -178,21 +109,11 @@ jobs: echo "$CF_REGISTRY_PASSWORD" | docker login registry.cloudflare.com \ -u "$CF_REGISTRY_USERNAME" --password-stdin - # The version-specific tag always goes out to both registries. - # The `:latest` tag only moves on stable releases; empty - # trailing lines in the `tags` list are tolerated by - # build-push-action. One buildx invocation pushes to both - # registries in parallel, sharing the layer build. - - name: Build and push computerd-linux-x64 image - uses: docker/build-push-action@v6 + - id: changesets + uses: changesets/action@v1 with: - context: packages/computer-computerd-linux-x64 - file: packages/computer-computerd-linux-x64/Dockerfile - platforms: linux/amd64 - push: true - tags: | - ghcr.io/cloudflare/computer-computerd-linux-x64:${{ steps.release-meta.outputs.version }} - ${{ steps.release-meta.outputs.is_stable == 'true' && 'ghcr.io/cloudflare/computer-computerd-linux-x64:latest' || '' }} - registry.cloudflare.com/library/computer-computerd-linux-x64:${{ steps.release-meta.outputs.version }} - ${{ steps.release-meta.outputs.is_stable == 'true' && 'registry.cloudflare.com/library/computer-computerd-linux-x64:latest' || '' }} - provenance: false + version: node .github/changeset-version.mjs + publish: node .github/changeset-publish.mjs + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_CONFIG_PROVENANCE: "true" diff --git a/AGENTS.md b/AGENTS.md index 28fa451a..c886cc99 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -130,8 +130,6 @@ npm workspace package set on purpose — they're tooling, not shipped code. [`script/`](script/) holds maintainance scripts and operator-facing harnesses for `computerd` and the sync loop. Reach for these when you're chasing a behavior the unit tests don't cover. -- `set-versions.mjs` syncs the version of every published package in - lockstep. Invoked from the release pipeline. - `shell` boots a debian-slim container with the linux `computerd` binary mounted under `/usr/local/bin`. The starting point for anything that needs a real FUSE mount. diff --git a/COLLABORATORS.md b/COLLABORATORS.md index cecdd658..57360a16 100644 --- a/COLLABORATORS.md +++ b/COLLABORATORS.md @@ -119,6 +119,51 @@ Keep pull requests scoped to one logical change where you can. Do not include li External pull requests are closed automatically unless they come from an owner, member, collaborator, Dependabot, Renovate, or carry the `allow-pr` label. Add `allow-pr` before reopening an external pull request that should go through review. +## Releases + +Releases run on [changesets](https://github.com/changesets/changesets). +The short version: a change that should ship a new version of +`@cloudflare/computer` needs a changeset alongside it. Everything after +that is automated. + +When your change alters what a released package or image does, add a +changeset: + +```bash +npm run changeset +``` + +The prompt asks which bump the change warrants — patch, minor, or +major — and for a one-line summary. It writes a small markdown file +under `.changeset/`. Commit that file with your change. The summary +becomes a line in the changelog, so write it for someone reading the +release notes months from now, not for your reviewer today. A change +that touches only tests, CI, docs, or an example needs no changeset. + +Once your pull request merges to `main`, the release workflow takes +over in two steps: + +1. It gathers the pending changesets into a "Version Packages" pull + request that bumps package versions, rewrites changelogs, and updates + Dockerfile and documentation pins for the `computerd` image. Private + packages such as `@cloudflare/dofs`, `@cloudflare/computer-rpc`, and + `@cloudflare/computerd` are versioned and get changelogs, but are not + published to npm. +2. Merging that pull request first builds and pushes the `computerd` + binary image to `ghcr.io` and `registry.cloudflare.com`, then publishes + public npm packages. Rerunning a failed publish is safe: existing image + tags are pushed again and existing npm versions are skipped. + +The package publishes under the `unreleased` dist-tag while it's +pre-1.0, so `npm install @cloudflare/computer` does not yet pick up +these releases. Promoting it to `latest` is a deliberate maintainer +step: drop `publishConfig.tag` from `packages/computer/package.json`. + +For a prerelease channel (`alpha`, `beta`, `rc`), a maintainer runs +`npx changeset pre enter ` on `main` before the normal flow, and +`npx changeset pre exit` to leave it. See the +[changesets prerelease docs](https://github.com/changesets/changesets/blob/main/docs/prereleases.md). + ## What not to commit - `node_modules/`, `dist/`, `artifacts/`. These are already ignored, but double-check `git status` before staging. diff --git a/README.md b/README.md index 758062fc..e5763303 100644 --- a/README.md +++ b/README.md @@ -94,8 +94,8 @@ package-specific status and usage notes. (`@cloudflare/computer`) — the top-level Computer package consumed by Durable Objects. Work in progress. - [`packages/computer-computerd-linux-x64`](packages/computer-computerd-linux-x64/README.md) - (`@cloudflare/computer-computerd-linux-x64`) — the prebuilt `computerd` - binary for linux-x64, distributed for use in container images. + — private Docker image context for the prebuilt `computerd` linux-x64 + binary. The image, not an npm package, is the release artifact. ## Performance diff --git a/docs/10_project_layout.md b/docs/10_project_layout.md index f97514c4..92f18fc5 100644 --- a/docs/10_project_layout.md +++ b/docs/10_project_layout.md @@ -20,10 +20,10 @@ computer/ │ ├── dofs/ # @cloudflare/dofs — SQLite-backed VFS + sync │ ├── rpc/ # @cloudflare/computer-rpc — capnweb wire interface │ ├── computerd/ # @cloudflare/computerd — in-container daemon (binary) -│ └── computer-computerd-linux-x64/ # @cloudflare/computer-computerd-linux-x64 — prebuilt binary +│ └── computer-computerd-linux-x64/ # private Docker image context for the linux-x64 binary ├── examples/ # Runnable Worker examples (see below) ├── docs/ # This documentation set -└── package.json # Workspace root (workspaces: packages/*, examples/*) +└── package.json # Workspace root (explicit package workspaces + examples/*) ``` ### Folder rename history diff --git a/examples/container/Dockerfile b/examples/container/Dockerfile index ec859111..52684b8e 100644 --- a/examples/container/Dockerfile +++ b/examples/container/Dockerfile @@ -3,8 +3,8 @@ # Pulls the computerd binary out of the public GHCR image. That image is # a single layer over `scratch` whose only contents are the SEA # binary at /usr/local/bin/computerd; we COPY it into a slim debian -# runtime below. The :VERSION tag is rewritten in lockstep with -# the rest of the monorepo by script/set-versions.mjs. +# runtime below. The :VERSION tag is rewritten by the changesets +# Version Packages PR through .github/changeset-version.mjs. # # computerd mounts a FUSE filesystem at MOUNT_POINT so exec'd commands # see the same VFS the RPC surface reads and writes. With diff --git a/examples/think/Dockerfile b/examples/think/Dockerfile index d082be87..fbfc8062 100644 --- a/examples/think/Dockerfile +++ b/examples/think/Dockerfile @@ -1,8 +1,8 @@ # Container image for the think example. Identical wiring to # examples/container — we pull a computerd binary out of the public # GHCR image, drop it into a slim debian, and run it as PID 1. -# The :VERSION tag is rewritten in lockstep with the rest of the -# monorepo by script/set-versions.mjs. +# The :VERSION tag is rewritten by the changesets Version Packages PR +# through .github/changeset-version.mjs. # # computerd mounts a FUSE filesystem at MOUNT_POINT so exec'd commands # (git, npm, vitest, …) see the same files the Workspace RPC diff --git a/examples/tutorial/Dockerfile b/examples/tutorial/Dockerfile index 6d676c1a..9d860f62 100644 --- a/examples/tutorial/Dockerfile +++ b/examples/tutorial/Dockerfile @@ -1,8 +1,8 @@ # Container image for the recipe card tutorial. Same wiring as # examples/think — pull the computerd binary out of the public GHCR image, # drop it into a slim debian, and run it as PID 1. The :VERSION tag is -# rewritten in lockstep with the rest of the monorepo by -# script/set-versions.mjs. +# rewritten by the changesets Version Packages PR through +# .github/changeset-version.mjs. # # computerd mounts the workspace at MOUNT_POINT, so a file the host writes # through the Workspace is on disk for pandoc to read, and the PDF diff --git a/package-lock.json b/package-lock.json index 18ea2cf7..8676f5da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,8 @@ ], "devDependencies": { "@biomejs/biome": "^2.4.16", + "@changesets/changelog-github": "^0.5.2", + "@changesets/cli": "^2.29.8", "@types/node": "^25.9.1", "esbuild": "^0.28.1", "pkg-pr-new": "^0.0.75", @@ -1094,6 +1096,271 @@ "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", "license": "MIT" }, + "node_modules/@changesets/apply-release-plan": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.1.tgz", + "integrity": "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/config": "^3.1.4", + "@changesets/get-version-range-type": "^0.4.0", + "@changesets/git": "^3.0.4", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.10.tgz", + "integrity": "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/changelog-git": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", + "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0" + } + }, + "node_modules/@changesets/changelog-github": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.5.2.tgz", + "integrity": "sha512-HeGeDl8HaIGj9fQHo/tv5XKQ2SNEi9+9yl1Bss1jttPqeiASRXhfi0A2wv8yFKCp07kR1gpOI5ge6+CWNm1jPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/get-github-info": "^0.7.0", + "@changesets/types": "^6.1.0", + "dotenv": "^8.1.0" + } + }, + "node_modules/@changesets/cli": { + "version": "2.31.1", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.31.1.tgz", + "integrity": "sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/apply-release-plan": "^7.1.1", + "@changesets/assemble-release-plan": "^6.0.10", + "@changesets/changelog-git": "^0.2.1", + "@changesets/config": "^3.1.4", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/get-release-plan": "^4.0.16", + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.7", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@changesets/write": "^0.4.0", + "@inquirer/external-editor": "^1.0.2", + "@manypkg/get-packages": "^1.1.3", + "ansi-colors": "^4.1.3", + "enquirer": "^2.4.1", + "fs-extra": "^7.0.1", + "mri": "^1.2.0", + "package-manager-detector": "^0.2.0", + "picocolors": "^1.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^3.0.1", + "term-size": "^2.1.0" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@changesets/config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.4.tgz", + "integrity": "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/logger": "^0.1.1", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.8" + } + }, + "node_modules/@changesets/errors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", + "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", + "dev": true, + "license": "MIT", + "dependencies": { + "extendable-error": "^0.1.5" + } + }, + "node_modules/@changesets/get-dependents-graph": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.4.tgz", + "integrity": "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "picocolors": "^1.1.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/get-github-info": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.7.0.tgz", + "integrity": "sha512-+i67Bmhfj9V4KfDeS1+Tz3iF32btKZB2AAx+cYMqDSRFP7r3/ZdGbjCo+c6qkyViN9ygDuBjzageuPGJtKGe5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dataloader": "^1.4.0", + "node-fetch": "^2.5.0" + } + }, + "node_modules/@changesets/get-release-plan": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.16.tgz", + "integrity": "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/assemble-release-plan": "^6.0.10", + "@changesets/config": "^3.1.4", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.7", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/get-version-range-type": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", + "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/git": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", + "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.8", + "spawndamnit": "^3.0.1" + } + }, + "node_modules/@changesets/logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", + "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/parse": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.3.tgz", + "integrity": "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "js-yaml": "^4.1.1" + } + }, + "node_modules/@changesets/pre": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", + "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "node_modules/@changesets/read": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.7.tgz", + "integrity": "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/parse": "^0.4.3", + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0", + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/should-skip-package": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", + "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/write": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", + "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "human-id": "^4.1.1", + "prettier": "^2.7.1" + } + }, "node_modules/@cloudflare/codemode": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@cloudflare/codemode/-/codemode-0.5.1.tgz", @@ -3465,6 +3732,28 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@jitl/quickjs-ffi-types": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/@jitl/quickjs-ffi-types/-/quickjs-ffi-types-0.32.0.tgz", @@ -3984,6 +4273,78 @@ "tslib": "2" } }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/@mixmark-io/domino": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", @@ -4121,6 +4482,44 @@ ], "license": "MIT" }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@oxc-project/types": { "version": "0.142.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz", @@ -5416,6 +5815,16 @@ } } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5451,6 +5860,13 @@ ], "license": "MIT" }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/aria-query": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", @@ -5461,6 +5877,16 @@ "dequal": "^2.0.3" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -5581,6 +6007,19 @@ "node": ">=6.0.0" } }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/bidi-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", @@ -5709,6 +6148,19 @@ "node": "20 || >=22" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.28.7", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", @@ -5922,6 +6374,13 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, "node_modules/chat": { "version": "4.35.0", "resolved": "https://registry.npmjs.org/chat/-/chat-4.35.0.tgz", @@ -6185,6 +6644,13 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -6282,6 +6748,16 @@ "node": ">=6" } }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -6321,6 +6797,19 @@ "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", "license": "MIT" }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -6328,6 +6817,16 @@ "dev": true, "license": "MIT" }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, "node_modules/dts-resolver": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz", @@ -6425,21 +6924,48 @@ "node": ">=10.13.0" } }, - "node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20.19.0" + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "engines": { + "node": ">=8.6" } }, - "node_modules/error-stack-parser-es": { - "version": "1.0.5", + "node_modules/enquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", "dev": true, @@ -6553,6 +7079,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", @@ -6715,12 +7255,36 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-uri": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", @@ -6776,6 +7340,16 @@ "fxparser": "src/cli/cli.js" } }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -6812,6 +7386,19 @@ "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", @@ -6833,6 +7420,20 @@ "url": "https://opencollective.com/express" } }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -6873,6 +7474,21 @@ "license": "MIT", "optional": true }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -7032,6 +7648,19 @@ "license": "MIT", "optional": true }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/glob-to-regex.js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", @@ -7049,6 +7678,27 @@ "tslib": "2" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -7244,6 +7894,16 @@ "url": "https://opencollective.com/express" } }, + "node_modules/human-id": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.2.0.tgz", + "integrity": "sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==", + "dev": true, + "license": "MIT", + "bin": { + "human-id": "dist/cli.js" + } + }, "node_modules/hyperdyperid": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", @@ -7395,6 +8055,29 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-hexadecimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", @@ -7405,6 +8088,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -7430,6 +8123,19 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "better-path-resolve": "1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", @@ -7457,6 +8163,16 @@ ], "license": "MIT" }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -7526,6 +8242,29 @@ "dev": true, "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsdom": { "version": "29.1.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", @@ -7616,6 +8355,16 @@ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/just-bash": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/just-bash/-/just-bash-3.2.0.tgz", @@ -7943,6 +8692,26 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true, + "license": "MIT" + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -8333,6 +9102,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -8896,6 +9675,33 @@ ], "license": "MIT" }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -9072,6 +9878,16 @@ "node": ">=18.0.0" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -9150,6 +9966,52 @@ "node": "^18 || ^20 || >= 21" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", @@ -9265,6 +10127,85 @@ "regex-recursion": "^6.0.2" } }, + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-manager-detector": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", + "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^0.2.7" + } + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -9353,6 +10294,16 @@ } } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-expression-matcher": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", @@ -9387,6 +10338,16 @@ "url": "https://opencollective.com/express" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -9541,6 +10502,22 @@ "node": ">=10" } }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -9625,6 +10602,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/quickjs-emscripten": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/quickjs-emscripten/-/quickjs-emscripten-0.32.0.tgz", @@ -9762,6 +10777,53 @@ "react": ">=18" } }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/read-yaml-file/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -9883,6 +10945,16 @@ "node": ">=0.10.0" } }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -9893,6 +10965,17 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rolldown": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.1.tgz", @@ -10030,6 +11113,30 @@ "node": ">= 18" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -10505,6 +11612,19 @@ "dev": true, "license": "ISC" }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -10550,6 +11670,16 @@ "simple-concat": "^1.0.0" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/smol-toml": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.1.tgz", @@ -10582,6 +11712,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/spawndamnit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", + "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "cross-spawn": "^7.0.5", + "signal-exit": "^4.0.1" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -10683,6 +11824,16 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -10841,6 +11992,19 @@ "node": ">= 6" } }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/thingies": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.1.tgz", @@ -10948,6 +12112,19 @@ "node": ">= 0.4" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -11255,6 +12432,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index 11ca2af7..58ebeb5c 100644 --- a/package.json +++ b/package.json @@ -18,10 +18,13 @@ "build:all": "npm run build && npm run build:bin && npm run build:docker", "format": "biome format --write .", "check": "biome check . && biome format . && sherif --fail-on-warnings", - "check:fix": "biome check . --fix && sherif --fix --select highest" + "check:fix": "biome check . --fix && sherif --fix --select highest", + "changeset": "changeset" }, "devDependencies": { "@biomejs/biome": "^2.4.16", + "@changesets/changelog-github": "^0.5.2", + "@changesets/cli": "^2.29.8", "@types/node": "^25.9.1", "esbuild": "^0.28.1", "pkg-pr-new": "^0.0.75", diff --git a/packages/computer-computerd-linux-x64/.dockerignore b/packages/computer-computerd-linux-x64/.dockerignore index 391e3ec6..237d6d88 100644 --- a/packages/computer-computerd-linux-x64/.dockerignore +++ b/packages/computer-computerd-linux-x64/.dockerignore @@ -1,4 +1,3 @@ -# Only the binary needs to enter the docker build context. README and -# package.json belong in the npm-published package, not in the image. +# Only the staged binary needs to enter the docker build context. * !bin/computerd diff --git a/packages/computer-computerd-linux-x64/README.md b/packages/computer-computerd-linux-x64/README.md index 4ab94753..b195d64a 100644 --- a/packages/computer-computerd-linux-x64/README.md +++ b/packages/computer-computerd-linux-x64/README.md @@ -1,59 +1,41 @@ # @cloudflare/computer-computerd-linux-x64 > [!IMPORTANT] -> **PREVIEW ONLY** This package is provided as a preview for feedback only. +> **PREVIEW ONLY** This image is provided as a preview for feedback only. > APIs are unstable and the design is subject to change. > -> Suitable for experiments, exploration and prototypes. It is NOT suitable +> Suitable for experiments, exploration, and prototypes. It is not suitable > for production use at this time. -Prebuilt `computerd` binary for linux-x64. `computerd` is the daemon -side of [`@cloudflare/computer`](../computer) — see [`docs/`](../../docs) -for the wire protocol and architecture. +Docker image context for the prebuilt `computerd` linux-x64 binary. +`computerd` is the daemon side of [`@cloudflare/computer`](../computer) — +see [`docs/`](../../docs) for the wire protocol and architecture. -The binary is a Node SEA (Single Executable Application). Everything -needed at runtime — the Node runtime, fuse-native, libfuse — is baked -in. The host needs `/dev/fuse` and a recent enough kernel for FUSE, -nothing else. +The binary is a Node single executable application. Everything needed at +runtime — the Node runtime, `fuse-native`, and libfuse — is baked in. The +host needs `/dev/fuse` and a recent enough kernel for FUSE, nothing else. -## Install - -```sh -npm install @cloudflare/computer-computerd-linux-x64 -``` - -Adds `computerd` to `node_modules/.bin/`. On any host that isn't linux-x64 -npm refuses the install via the package's `os` / `cpu` constraints — -that's intentional. - -## Docker - -The intended path. Multi-stage build pulls the binary from npm, -copies it into a minimal runtime image: +This package is private and is not published to npm. The release workflow +builds the binary, stages it into `bin/computerd`, and publishes the image +instead: ```dockerfile -FROM node:22-slim AS computerd -RUN npm install --no-save --omit=dev \ - @cloudflare/computer-computerd-linux-x64@0.1.1 - +FROM ghcr.io/cloudflare/computer-computerd-linux-x64:0.1.0-alpha.1 AS computerd FROM debian:stable-slim RUN apt-get update \ && apt-get install -y --no-install-recommends \ fuse3 libfuse2t64 ca-certificates \ && rm -rf /var/lib/apt/lists/* -COPY --from=computerd \ - /node_modules/@cloudflare/computer-computerd-linux-x64/bin/computerd \ - /usr/local/bin/computerd +COPY --from=computerd /usr/local/bin/computerd /usr/local/bin/computerd ENV PORT=8080 MOUNT_POINT=/workspace EXPOSE 8080 ENTRYPOINT ["/usr/local/bin/computerd"] ``` -No local SEA build, no binary staged into the build context. Pin the -version explicitly — `latest` is fine for experimentation but bites in -production when wire-protocol changes land. +Pin the image version explicitly. `latest` is fine for experimentation but +can bite when wire-protocol changes land. ## Configuration diff --git a/packages/computer-computerd-linux-x64/package.json b/packages/computer-computerd-linux-x64/package.json index 38e7489e..b3d98c10 100644 --- a/packages/computer-computerd-linux-x64/package.json +++ b/packages/computer-computerd-linux-x64/package.json @@ -1,19 +1,7 @@ { "name": "@cloudflare/computer-computerd-linux-x64", "version": "0.1.0-alpha.1", - "description": "Prebuilt computerd binary for linux-x64. Single-platform distribution; install on a linux-x64 host or COPY --from a docker build stage that installed it.", + "description": "Docker image context for the prebuilt computerd linux-x64 binary.", "license": "MIT", - "os": [ - "linux" - ], - "cpu": [ - "x64" - ], - "files": [ - "bin/", - "README.md" - ], - "bin": { - "computerd": "./bin/computerd" - } + "private": true } diff --git a/packages/computerd/package.json b/packages/computerd/package.json index 148f0512..fb3102fc 100644 --- a/packages/computerd/package.json +++ b/packages/computerd/package.json @@ -18,7 +18,6 @@ "build:docker": "node ./scripts/build-docker.mjs", "typecheck": "tsc -p tsconfig.json --noEmit", "test": "vitest run", - "publish:linux-x64": "node ./scripts/publish-linux-x64.mjs", "publish:docker": "node ./scripts/build-docker.mjs --push" }, "engines": { diff --git a/packages/computerd/scripts/publish-linux-x64.mjs b/packages/computerd/scripts/publish-linux-x64.mjs deleted file mode 100644 index 6ac12809..00000000 --- a/packages/computerd/scripts/publish-linux-x64.mjs +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env node -// Build the SEA binary, stamp the platform package's version to match -// packages/computerd/package.json (the source of truth), copy the binary -// into packages/computer-computerd-linux-x64/bin/, and npm publish. -// -// Run manually for now: -// npm run publish:linux-x64 --workspace @cloudflare/computerd -// -// The script is idempotent — build-bin's no-op detection skips -// re-downloading Node and re-running postject when the artifact is -// fresh, so re-running this is cheap. - -import { execFileSync } from "node:child_process"; -import { chmodSync, copyFileSync, readFileSync, writeFileSync } from "node:fs"; -import { dirname, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; - -const here = dirname(fileURLToPath(import.meta.url)); -const computerdRoot = resolve(here, ".."); -const repoRoot = resolve(computerdRoot, "../.."); -const platformDir = resolve(repoRoot, "packages/computer-computerd-linux-x64"); - -const { version } = JSON.parse(readFileSync(resolve(computerdRoot, "package.json"), "utf8")); - -// 1. Build the SEA binary. Always re-run; build-bin caches the -// expensive bits internally. -console.log("[publish-linux-x64] building computerd-linux-x64"); -execFileSync("node", ["./scripts/build-bin.mjs"], { cwd: computerdRoot, stdio: "inherit" }); - -// 2. Stamp the platform package version so it never drifts from the -// binary's source version. Same number on both sides is the -// invariant publish flows rely on. -const pkgJsonPath = resolve(platformDir, "package.json"); -const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf8")); -if (pkg.version !== version) { - console.log(`[publish-linux-x64] bumping platform package ${pkg.version} -> ${version}`); - pkg.version = version; - writeFileSync(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}\n`); -} - -// 3. Copy the binary in. The COPY --from path in downstream -// Dockerfiles depends on this exact location. -const src = resolve(repoRoot, "artifacts/computerd/computerd-linux-x64"); -const dst = resolve(platformDir, "bin/computerd"); -copyFileSync(src, dst); -chmodSync(dst, 0o755); -console.log(`[publish-linux-x64] copied ${src} -> ${dst}`); - -// 4. Publish. --access public because npm defaults scoped packages -// to restricted, which would fail without a paid org plan. -console.log(`[publish-linux-x64] publishing @cloudflare/computer-computerd-linux-x64@${version}`); -execFileSync("npm", ["publish", "--access", "public"], { - cwd: platformDir, - stdio: "inherit", -}); diff --git a/script/set-versions.mjs b/script/set-versions.mjs deleted file mode 100644 index ae9a8f4c..00000000 --- a/script/set-versions.mjs +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env node -// Sync the version of every published package in lockstep. -// Usage: -// node script/set-versions.mjs 0.1.0-alpha.2 -// node script/set-versions.mjs v0.1.0-alpha.2 # leading 'v' tolerated -// -// Both @cloudflare/computer and @cloudflare/computer-computerd-linux-x64 -// land at the same release tag. The release workflow runs this with -// the pushed tag before publishing. - -import { readFile, writeFile } from "node:fs/promises"; -import { argv } from "node:process"; - -const PACKAGES = [ - "packages/computer/package.json", - "packages/computer-computerd-linux-x64/package.json", - // computerd itself stays private, but its package.json version is what - // the build-docker.mjs script reads to tag the published image. - // Keeping it in lockstep means the docker tag matches the npm - // tag. - "packages/computerd/package.json", -]; - -// Example Dockerfiles pin a specific -// ghcr.io/cloudflare/computer-computerd-linux-x64: in their -// first FROM line. Bump it in lockstep with the npm version so a -// `git clone && wrangler dev` against any release tag pulls the -// matching computerd image. -const DOCKERFILES = [ - "examples/container/Dockerfile", - "examples/think/Dockerfile", - "examples/think-compare-runtimes/Dockerfile.workspace", -]; -const COMPUTERD_IMAGE_TAG_RE = /(ghcr\.io\/cloudflare\/computer-computerd-linux-x64:)[^\s]+/g; - -const raw = argv[2]; -if (raw === undefined) { - console.error("usage: set-versions.mjs "); - process.exit(2); -} - -const version = raw.replace(/^v/, ""); -if (!/^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(version)) { - console.error(`bad version: ${raw}`); - process.exit(2); -} - -for (const pkg of PACKAGES) { - const json = JSON.parse(await readFile(pkg, "utf8")); - json.version = version; - await writeFile(pkg, `${JSON.stringify(json, null, 2)}\n`); - console.log(`${pkg}: version → ${version}`); -} - -for (const dockerfile of DOCKERFILES) { - const before = await readFile(dockerfile, "utf8"); - if (!COMPUTERD_IMAGE_TAG_RE.test(before)) { - console.error( - `${dockerfile}: no computerd-linux-x64 image tag matched ${COMPUTERD_IMAGE_TAG_RE}`, - ); - process.exit(2); - } - // RegExp with /g keeps lastIndex between calls; reset before replace(). - COMPUTERD_IMAGE_TAG_RE.lastIndex = 0; - const after = before.replace(COMPUTERD_IMAGE_TAG_RE, `$1${version}`); - if (after !== before) await writeFile(dockerfile, after); - console.log(`${dockerfile}: computerd image tag → ${version}`); -}