diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 0000000..c7386dd --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,36 @@ +name: setup +description: Install the pinned toolchain and workspace dependencies, with caching + +runs: + using: composite + steps: + # installs the toolchain pinned in mise.toml (tool installs are cached by the action) + - uses: jdx/mise-action@v4 + + - name: resolve cache paths + id: paths + shell: bash + run: | + echo "pnpm-store=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT" + echo "go-mod=$(go env GOMODCACHE)" >> "$GITHUB_OUTPUT" + echo "go-build=$(go env GOCACHE)" >> "$GITHUB_OUTPUT" + + - uses: actions/cache@v6 + with: + path: ${{ steps.paths.outputs.pnpm-store }} + key: pnpm-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} + restore-keys: pnpm-${{ runner.os }}- + + # module downloads, compiled packages, cached test results and lint results; + # mise.toml is in the key because it pins the go and golangci-lint versions + - uses: actions/cache@v6 + with: + path: | + ${{ steps.paths.outputs.go-mod }} + ${{ steps.paths.outputs.go-build }} + ~/.cache/golangci-lint + key: go-${{ runner.os }}-${{ hashFiles('mise.toml', '**/go.sum', 'go.work.sum') }} + restore-keys: go-${{ runner.os }}- + + - shell: bash + run: pnpm install --frozen-lockfile diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..f4ce3fa --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,99 @@ +# Dependabot configuration +# +# Strategy: +# - Security patches flow through promptly (via Dependabot security updates, +# enabled in repo Settings -> Code security). These are not gated by the +# weekly schedule below. +# - Version updates run weekly; patch + minor are grouped into one PR per +# ecosystem to keep the noise down. +# - Major updates are opened individually (not grouped) so each gets a +# deliberate review. +# - `cooldown` lets new releases soak before we adopt them, mitigating +# supply-chain attacks on fresh versions. We soak longer for majors, which +# also naturally spaces them out to roughly monthly. +# +# Note: Dependabot allows only one schedule per ecosystem+directory, so we can't +# set a separate "monthly majors" cadence directly. The 30-day major cooldown +# below achieves the same effect — majors only surface once they've aged a month. +# +# Docs: https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 + +updates: + # JavaScript / TypeScript — pnpm workspace (single lockfile at root) + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "06:00" + timezone: "Etc/UTC" + open-pull-requests-limit: 10 + cooldown: + semver-patch-days: 3 + semver-minor-days: 5 + semver-major-days: 30 + default-days: 5 + groups: + npm-minor-and-patch: + applies-to: version-updates + update-types: + - "minor" + - "patch" + commit-message: + prefix: "deps" + prefix-development: "deps-dev" + include: "scope" + + # Go modules — glob matches any directory with a go.mod at any depth, so new + # modules are picked up without listing each one. Dependabot updates each + # module independently (it does not read go.work). + - package-ecosystem: "gomod" + directories: + - "/**" + schedule: + interval: "weekly" + day: "monday" + time: "06:00" + timezone: "Etc/UTC" + open-pull-requests-limit: 10 + cooldown: + semver-patch-days: 3 + semver-minor-days: 5 + semver-major-days: 30 + default-days: 5 + groups: + gomod-minor-and-patch: + applies-to: version-updates + update-types: + - "minor" + - "patch" + commit-message: + prefix: "deps" + include: "scope" + + # GitHub Actions — workflows + composite actions under .github/ + - package-ecosystem: "github-actions" + directories: + - "/" + - "/.github/actions/*" + schedule: + interval: "weekly" + day: "monday" + time: "06:00" + timezone: "Etc/UTC" + open-pull-requests-limit: 10 + # GitHub Actions aren't versioned with semver, so Dependabot only honors + # `default-days` here (the `semver-*-days` keys are rejected for this ecosystem). + cooldown: + default-days: 5 + groups: + actions-minor-and-patch: + applies-to: version-updates + update-types: + - "minor" + - "patch" + commit-message: + prefix: "ci" + include: "scope" diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml new file mode 100644 index 0000000..88b0ff0 --- /dev/null +++ b/.github/workflows/main-build.yml @@ -0,0 +1,29 @@ +name: main-build + +on: + push: + branches: [main] + +# don't cancel: every commit on main gets a full verification +concurrency: + group: main-build + cancel-in-progress: false + +permissions: + contents: read + +jobs: + build-and-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + # toolchain, caches and pnpm install + - uses: ./.github/actions/setup + + # prettier over the whole repo (Go is formatted by golangci-lint) + - run: pnpm format:check + + # lint, build and test each depend on generate (build also on its + # dependencies' build), so nx runs generate once and shares it + - run: pnpm exec nx run-many -t lint build test diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml new file mode 100644 index 0000000..55fb384 --- /dev/null +++ b/.github/workflows/pr-build.yml @@ -0,0 +1,31 @@ +name: pr-build + +on: + pull_request: + branches: [main] + +concurrency: + group: pr-build-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + build-and-test: + runs-on: ubuntu-latest + steps: + # full history so nx can diff against origin/main + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + + # toolchain, caches and pnpm install + - uses: ./.github/actions/setup + + # prettier over the whole repo (Go is formatted by golangci-lint) + - run: pnpm format:check + + # lint, build and test (each depends on generate, build also on its + # dependencies' build), only for projects the PR affects + - run: pnpm affected diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10e74d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +.claude/settings.local.json +.idea/ +.vscode/ + +node_modules/ +build/ +dist/ +out/ + + +.pnpm-store/ + +# tool caches: TanStack Router's generator temp files, Vite's dep cache +.tanstack/ +.vite/ + +.nx/cache +.nx/workspace-data +.nx/migrate-runs \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..80e2ce9 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +.claude/ +.idea/ +.vscode/ +.pnpm-store/ +.nx/ + +pnpm-lock.yaml + +node_modules/ \ No newline at end of file diff --git a/.sandbox/README.md b/.sandbox/README.md new file mode 100644 index 0000000..c99f08f --- /dev/null +++ b/.sandbox/README.md @@ -0,0 +1,44 @@ +# .sandbox + +[Docker Sandboxes](https://docs.docker.com/ai/sandboxes/) setup for this workspace: Docker's Claude kit as the workload, plus two [mixin kits](https://docs.docker.com/ai/sandboxes/customize/use-kits/) of ours. + +## Usage + +From the repo root, create the sandbox or reopen it if it already exists: + +```bash +.sandbox/run.sh [name] # name defaults to "monorepo" +``` + +The Claude kit asks to approve its Anthropic credentials. Select **3. No** (start without them). + +Inside the sandbox, run `mise install` and `pnpm install`. Use `sbx ls` to list sandboxes and `sbx rm ` to remove one. + +## Kits + +Both are attached by `run.sh`. + +### mise + +Sets up the toolchain pinned in `mise.toml`: + +- installs the [mise](https://mise.jdx.dev) binary to `/usr/local/bin` (release pinned by `version` in `mise/mise.yaml`) +- puts the mise shims on `PATH`, so installed tools resolve in every shell without `mise activate` +- exports `GOPATH=/home/agent/go`, since the base image's `/go` isn't writable by the agent user + +### network-policy + +A declaration-only kit listing the outbound hosts the toolchain may reach: what mise needs to install the tools, plus the Go and npm registries and the shadcn component registry. Anything not listed stays blocked by the sandbox's default-deny policy, so the allowlist is reviewable in git. Hosts the agent itself needs, such as `api.anthropic.com`, come with the Claude kit. + +To change it: + +1. Add or remove a host in `network-policy/network-policy.yaml`. +2. Create a new sandbox with `.sandbox/run.sh `, since a sandbox keeps the kits it was created with. +3. Commit the change. + +Kit rules can't grant access beyond your organization's policy. To debug a blocked request: + +```bash +sbx policy log # recent connections and why they were blocked +sbx policy ls # active rules +``` diff --git a/.sandbox/mise/mise.dockerfile b/.sandbox/mise/mise.dockerfile new file mode 100644 index 0000000..e07fbcb --- /dev/null +++ b/.sandbox/mise/mise.dockerfile @@ -0,0 +1,8 @@ +# syntax=docker/dockerfile:1 +FROM alpine:3.20 AS fetch +ARG MISE_VERSION +RUN apk add --no-cache curl ca-certificates \ + && MISE_INSTALL_PATH=/tmp/mise sh -c "$(curl -fsSL https://mise.run)" + +FROM scratch AS content +COPY --from=fetch /tmp/mise /usr/local/bin/mise diff --git a/.sandbox/mise/mise.yaml b/.sandbox/mise/mise.yaml new file mode 100644 index 0000000..0f6456e --- /dev/null +++ b/.sandbox/mise/mise.yaml @@ -0,0 +1,41 @@ +# syntax=docker/sandbox-kit:3 +schemaVersion: "3" +kind: mixin +displayName: mise +description: Installs mise so the toolchain pinned in mise.toml can be installed in the sandbox. +dockerfile: mise.dockerfile + +args: + version: + default: "v2026.11.3" + pattern: '^v[0-9]+\.[0-9]+\.[0-9]+$' + description: mise release to install + buildArg: MISE_VERSION + +capabilities: + - type: com.docker.sandbox/network-policy@1 + config: + runtime: + allow: + - mise.jdx.dev + - mise-versions.jdx.dev + - github.com + - objects.githubusercontent.com + # The base image sets GOPATH=/go, which the agent user can't write to, and a + # kit can't override image env (sbx rejects the conflict). Export it from the + # sandbox's persistent env file instead, which every shell sources. + - type: com.docker.sandbox/lifecycle@1 + config: + startup: + - description: Point GOPATH at a writable directory + user: root + command: >- + grep -qs '^export GOPATH=' /etc/sandbox-persistent.sh || + echo 'export GOPATH=/home/agent/go' >> /etc/sandbox-persistent.sh + # Non-interactive shells never run `mise activate` hooks, so put the + # shims on PATH: tools installed by `mise install` then resolve everywhere. + - description: Put mise shims on PATH + user: root + command: >- + grep -qs 'mise/shims' /etc/sandbox-persistent.sh || + echo 'export PATH="/home/agent/.local/share/mise/shims:$PATH"' >> /etc/sandbox-persistent.sh diff --git a/.sandbox/network-policy/network-policy.yaml b/.sandbox/network-policy/network-policy.yaml new file mode 100644 index 0000000..8d5977b --- /dev/null +++ b/.sandbox/network-policy/network-policy.yaml @@ -0,0 +1,51 @@ +# syntax=docker/sandbox-kit:3 +# Network allowlist for this workspace, as a declaration-only mixin. +# Anything not listed here stays blocked by the sandbox's default-deny policy. +schemaVersion: "3" +kind: mixin +displayName: Monorepo network policy +description: Hosts mise needs to install the toolchain pinned in mise.toml. + +capabilities: + - type: com.docker.sandbox/network-policy@1 + config: + runtime: + allow: + # mise itself: version index + - mise.jdx.dev + - mise-versions.jdx.dev + + # aqua backend (air, atlas, buf, golangci-lint, pnpm, protoc-gen-go, + # sqlc): registry (raw.githubusercontent.com), version lookup and + # release assets from GitHub + - github.com + - api.github.com + - raw.githubusercontent.com + - objects.githubusercontent.com + - release-assets.githubusercontent.com + + # aqua downloads that aren't served from GitHub: atlas (release.ariga.io) + # and sqlc (downloads.sqlc.dev) + - release.ariga.io + - downloads.sqlc.dev + + # core:go (go): release index and downloads + - go.dev + - dl.google.com + + # core:node (node): release index and downloads + - nodejs.org + + # go backend (protoc-gen-connect-go): go install via the module proxy + - proxy.golang.org + - sum.golang.org + + # connectrpc.com: vanity import path resolved for protoc-gen-connect-go + # and the connectrpc.com/connect module + - connectrpc.com + + # npm backend (@bufbuild/protoc-gen-es, @fission-ai/openspec) + - registry.npmjs.org + + # shadcn CLI (ui-kit): component registry and schema + - ui.shadcn.com diff --git a/.sandbox/run.sh b/.sandbox/run.sh new file mode 100755 index 0000000..91d942d --- /dev/null +++ b/.sandbox/run.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# Start (or reopen) the workspace sandbox with the workspace kits attached. +# Usage: .sandbox/run.sh [name] (default name: monorepo) +set -euo pipefail + +name="${1:-"base-template"}" +cd "$(dirname "$0")/.." + +if sbx ls | awk -v n="$name" '$1 == n { found = 1 } END { exit !found }'; then + exec sbx run --name "$name" +fi + +# v3 kits need exactly one workload kit plus any mixins; the built-in "claude" +# agent is not a v3 kit, so it cannot fill that role. Docker's published Claude +# workload kit does, pinned to a tag. +claude_kit="docker.io/docker/sbx-kit-claude:2.1.316" + +exec sbx run "$claude_kit" --name "$name" \ + --kit ./.sandbox/mise \ + --kit ./.sandbox/network-policy diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..967a5c6 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,42 @@ +# AGENTS.md + +Monorepo of Go services and TypeScript surfaces, orchestrated with Nx and pnpm, with the toolchain pinned by mise. Setup is in [README.md](README.md). + +## Toolchain + +- Tool versions are pinned in `mise.toml`. Install them with `mise install`, then `pnpm install`. +- Run tasks through Nx from the root: `pnpm dev`, `pnpm lint`, `pnpm test`, `pnpm build`. +- The task graph is defined in `nx.json`: `lint`, `test` and `build` depend on `generate` and on their dependencies' `build` (`^build`), so workspace packages are consumed built, as they would be from a registry. Don't run `generate` separately, Nx runs it first. +- `dev` targets are marked `continuous` in `nx.json`, so `pnpm dev` starts all of them at once rather than filling the parallel slots with tasks that never finish. Keep any new long-running target continuous. +- `pnpm affected` runs `lint`, `build` and `test` for projects changed since `origin/main`. CI runs this on pull requests, along with `pnpm format:check`, so run both before pushing. + +## Working in a sandbox + +Agents run in a [Docker Sandbox](https://docs.docker.com/ai/sandboxes/) that the user starts from the host with `.sandbox/run.sh` (see [.sandbox/README.md](.sandbox/README.md)). + +### Go cache + +The base image sets `GOPATH=/go`, which isn't writable, and a kit can't override it. The mise kit exports `GOPATH=/home/agent/go` on startup. If Go still fails to create its cache, run `export GOPATH=$HOME/go` first. + +### Network access + +- Outbound traffic is default-deny. The allowed hosts live in `.sandbox/network-policy/network-policy.yaml`, so widening access is a reviewed change to that file, not an ad-hoc workaround. +- A blocked request returns HTTP 403 with an explanation in the body. Read it, then check `sbx policy log`. +- Agents cannot approve their own access. Ask the user to approve on the host (`sbx policy approval ls`, then `sbx policy approval respond`), or to run `sbx policy allow network `. +- A sandbox keeps the kits it was created with. After editing the network policy, ask the user to create a new sandbox with `.sandbox/run.sh `. + +### Git and GitHub + +Use HTTPS for all GitHub operations. Do not change the `origin` remote. + +```bash +git push -u https://github.com/labset/base-template.git +gh pr create --repo labset/base-template --base main --head +``` + +## Commits and pull requests + +- Work on a feature branch, never directly on `main`. +- Keep commit messages short and lowercase, in the imperative (for example `add sandbox network policy kit`). +- Commit and push only when asked. +- Do not run `pnpm sign`. The author signs commits outside the sandbox. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/README.md b/README.md index 0d858d1..2896db0 100644 --- a/README.md +++ b/README.md @@ -1 +1,81 @@ -# base-template \ No newline at end of file +# base-template + +Labset base template: an [Nx](https://nx.dev) + [pnpm](https://pnpm.io) monorepo with a mise-pinned polyglot toolchain (Node, Go, protobuf/buf codegen), CI pipelines and an optional Docker sandbox for agent work. + +## Requirements + +- [mise](https://mise.jdx.dev), which installs the pinned toolchain (Go, Node, pnpm and the code generators) +- Optional, to run an agent in a sandbox: [Docker](https://docs.docker.com/get-docker/) and [Docker Sandboxes](https://docs.docker.com/ai/sandboxes/) (`sbx`) + +### Installing mise + +```bash +brew install mise +``` + +Then [activate mise in your shell](https://mise.jdx.dev/getting-started.html#activate-mise). For other install methods, see the [mise installation docs](https://mise.jdx.dev/installing-mise.html). + +### Installing Docker Sandboxes (optional) + +```bash +brew install docker/tap/sbx +sbx login +``` + +For other install methods, see the [Docker Sandboxes docs](https://docs.docker.com/ai/sandboxes/). + +## Getting started + +```bash +# 1. Install the pinned toolchain +mise install + +# 2. Install JS dependencies +pnpm install + +# 3. Run tasks across the workspace +pnpm dev # start everything in dev mode +pnpm lint +pnpm test +pnpm build +``` + +## Task graph + +Code generation (protobuf/buf, sqlc, ...) is an Nx `generate` target, and `build`, `lint` and `test` each depend on it. Nx runs a project's `generate` first, so generated code is always present and fresh. `build`, `lint` and `test` also depend on the `build` of the project's dependencies (`^build`), including nested ones, so they are built first. The wiring is in [`nx.json`](nx.json): + +```text +build, lint, test ──► generate (same project) +build, lint, test ──► ^build (dependencies' build) +``` + +`dev` is a [continuous](https://nx.dev/docs/concepts/mental-model#continuous-tasks) task (a long-running server or watcher), so it never blocks the tasks that depend on it. It depends on `^build` and `generate` too, so its dependencies are built before it starts. + +`generate`, `build`, `lint` and `test` are cached (`dev` is not). A cache hit replays the output and restores the `build` outputs (`dist`, `build`, `out` under each project) instead of re-running the task. Projects whose `generate` writes files should declare them as `outputs` so they are restored from cache as well. The local cache lives in `.nx/cache` (gitignored). + +```bash +pnpm exec nx graph # explore the project graph +pnpm exec nx build --graph # preview the tasks a build would run +``` + +## Developing in a sandbox + +Run your agent in a [Docker Sandbox](https://docs.docker.com/ai/sandboxes/) so it only reaches the network hosts listed in [`.sandbox/network-policy`](.sandbox/network-policy/network-policy.yaml). + +```bash +# From the repo root: create the sandbox, or reopen it if it already exists +.sandbox/run.sh [name] + +# Inside the sandbox: install the toolchain and dependencies as usual +mise install +pnpm install +``` + +When the Claude kit asks to approve its Anthropic credentials, select **3. No** (start without them). + +See [`.sandbox/README.md`](.sandbox/README.md) for how the kits work, changing the network policy and debugging blocked requests. + +## CI + +- **pr-build**: on pull requests to `main`, checks formatting and runs `pnpm affected`. +- **main-build**: on every push to `main`, full verification. diff --git a/go.work b/go.work new file mode 100644 index 0000000..ceffc7c --- /dev/null +++ b/go.work @@ -0,0 +1 @@ +go 1.27.2 diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..13f5d52 --- /dev/null +++ b/mise.toml @@ -0,0 +1,35 @@ +[settings] +disable_backends = ["asdf", "vfox"] +enable_tools = [ + "air", + "atlas", + "buf", + "go", + "golangci-lint", + "node", + "pnpm", + "protoc-gen-connect-go", + "protoc-gen-go", + "sqlc", + + "npm:@bufbuild/protoc-gen-es", + "npm:@fission-ai/openspec", +] + +# Codegen plugins (protoc-gen-*): keep each in step with the runtime library the +# generated code imports (connectrpc.com/connect and google.golang.org/protobuf +# in Go, @bufbuild/protobuf in product/advisor/sdks/web/package.json). +[tools] +air = "1.67.4" +atlas = "1.3.0" +buf = "1.75.0" +go = "1.27.2" +golangci-lint = "2.15.0" +node = "24.21.0" +pnpm = "12.16.1" +protoc-gen-connect-go = "1.21.1" +protoc-gen-go = "1.36.11" +sqlc = "1.31.1" + +"npm:@bufbuild/protoc-gen-es" = "2.16.0" +"npm:@fission-ai/openspec" = "1.16.0" diff --git a/nx.json b/nx.json new file mode 100644 index 0000000..85136f2 --- /dev/null +++ b/nx.json @@ -0,0 +1,19 @@ +{ + "$schema": "./node_modules/nx/schemas/nx-schema.json", + "analytics": false, + "targetDefaults": { + "generate": { "cache": true }, + "build": { + "cache": true, + "dependsOn": ["^build", "generate"], + "outputs": [ + "{projectRoot}/dist", + "{projectRoot}/build", + "{projectRoot}/out" + ] + }, + "lint": { "cache": true, "dependsOn": ["^build", "generate"] }, + "test": { "cache": true, "dependsOn": ["^build", "generate"] }, + "dev": { "continuous": true, "dependsOn": ["^build", "generate"] } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..274ec85 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "@labset/base-template", + "version": "1.0.0", + "description": "Labset Base Template", + "main": "index.js", + "scripts": { + "dev": "nx run-many -t dev", + "lint": "nx run-many -t lint", + "build": "nx run-many -t build", + "test": "nx run-many -t test", + "affected": "nx affected -t lint build test --base=origin/main", + "format": "prettier --write .", + "format:check": "prettier --check .", + "clean": "nx run-many -t clean && nx reset && rm -rf node_modules .nx/", + "sign": "git rebase --exec 'git commit --amend --no-edit -S' origin/main" + }, + "keywords": [ + "monorepo", + "template" + ], + "author": "Hasnae R. <>", + "license": "Apache-2.0", + "devEngines": { + "packageManager": { + "name": "pnpm", + "version": "12.16.1", + "onFail": "download" + } + }, + "packageManager": "pnpm@12.16.1", + "type": "module", + "devDependencies": { + "nx": "24.0.4", + "prettier": "^3.9.10" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..c0f1ff9 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1343 @@ +--- +lockfileVersion: "9.0" + +importers: + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.16.1 + version: 12.16.1 + +packages: + "@pnpm/exe.android-arm64@12.16.1": + resolution: + { + integrity: sha512-PKf78Ew+i0CBYf0Xc+eMcqQiqyBT+u8XCVg1F5roc98/6wWfdYlWhrUMmEBiKWaJ3JqHxrtt8l1NwZ7qfJt2/Q==, + } + cpu: [arm64] + os: [android] + + "@pnpm/exe.android-x64@12.16.1": + resolution: + { + integrity: sha512-xdu7gMbB98pdvhwMeA6612Of515FDlRUtfA/1f7nWPZfPLnEdSRBO2u+1N0XBtQ/ennhPH/lrxB1gC6gnR/cdg==, + } + cpu: [x64] + os: [android] + + "@pnpm/exe.darwin-arm64@12.16.1": + resolution: + { + integrity: sha512-pVbmIIbhixiLvADLu1WA3TaW8FZy/D72R1De27WbbFx8/2mxvnsTyFVm4fO9kjpjMY7RzJd48CiQ96p8fO3ebQ==, + } + cpu: [arm64] + os: [darwin] + + "@pnpm/exe.darwin-x64@12.16.1": + resolution: + { + integrity: sha512-xZvQBFqcZjO7vFKTK3XsJpqY6lnBL9EWSLCzVUPq3kZ94+D96gwJCa76xxGNK8Cj32f4eeM91Qg+yNRR4sRpDw==, + } + cpu: [x64] + os: [darwin] + + "@pnpm/exe.freebsd-x64@12.16.1": + resolution: + { + integrity: sha512-zTtunfi9mBhRXiXEJYfwiJj0tk7MgTSfqDSRh+Az9FZ9THazVIiQiVNS8jpcsftDOqu7LKNffQdjmgwHDThfUg==, + } + cpu: [x64] + os: [freebsd] + + "@pnpm/exe.linux-arm64-musl@12.16.1": + resolution: + { + integrity: sha512-BJ3mOmcmQgcUo92Ee/WfEOt1pRiv3y2MMAkhEiYHd85UiPpHTfFhv+SpCbALmfExzXk3UlaRtMYwHlkQymc4VA==, + } + cpu: [arm64] + os: [linux] + libc: [musl] + + "@pnpm/exe.linux-arm64@12.16.1": + resolution: + { + integrity: sha512-JaRd5gNxwdNGBBkrZFt8bknrK4YmHVJBW0JMhUQ0fJ0dEYp6C2GT9ExaCqOO8EwYEyqM+jpKgJIK+8WFaJy3ew==, + } + cpu: [arm64] + os: [linux] + libc: [glibc] + + "@pnpm/exe.linux-ppc64@12.16.1": + resolution: + { + integrity: sha512-FnSV0Jv40S1cMv7vFNWwvu0X567Lec4L4HCRead3CFcD6zQDNbGw81s8N5bcKPahtPD9ApVuhsbmFCx4rw6RMw==, + } + cpu: [ppc64] + os: [linux] + libc: [glibc] + + "@pnpm/exe.linux-riscv64@12.16.1": + resolution: + { + integrity: sha512-C1Sww4FN5IttD4atRRhAKmQtSGWVp04ZAKNxO8pfu2bkRPwOW+7v+2DH1Xs1W+kZYYpO86BYDvUcadefF+AgaQ==, + } + cpu: [riscv64] + os: [linux] + libc: [glibc] + + "@pnpm/exe.linux-s390x@12.16.1": + resolution: + { + integrity: sha512-kn2fautsTcxIMODoovQVqZyfpDRdNgGkoeVqNdrKqbeBBvrEl+fXLkmZiq5xDht1LMr4sYiCNcsMfNMT6JPFmg==, + } + cpu: [s390x] + os: [linux] + libc: [glibc] + + "@pnpm/exe.linux-x64-musl@12.16.1": + resolution: + { + integrity: sha512-PM6ccHCOe/O9SsTflTJTYWfwogJZa6EmUvpnwZgiPguJBddh20wDQKgxUPXf48rDsPm9vMsIij0uHswwwbXL8g==, + } + cpu: [x64] + os: [linux] + libc: [musl] + + "@pnpm/exe.linux-x64@12.16.1": + resolution: + { + integrity: sha512-RK//8ZLcXGW8A2k8bQOXZDBN1Qu92zN4dYnG1bzj1zoQ1fkZ6jNzZ1AvXtsfGVma795CJtvoaF5bLXf4l/FIUw==, + } + cpu: [x64] + os: [linux] + libc: [glibc] + + "@pnpm/exe.win32-arm64@12.16.1": + resolution: + { + integrity: sha512-Ox3kNNVxtGw6pK7SVejmeOUgHhUTZgAM7NQQ6cU7frPw3ix9+j7d2MGbRg3fyEFAaKWq8ZAZLTQGcDyLnAu+qA==, + } + cpu: [arm64] + os: [win32] + + "@pnpm/exe.win32-x64@12.16.1": + resolution: + { + integrity: sha512-k+FhRJ0ttphFoFIVB1Sk4v76YJAulafmA/Ly57cysesUhhIzVlApeOShUz0jXubKx317TThlEfpQrukldnqORA==, + } + cpu: [x64] + os: [win32] + + pnpm@12.16.1: + resolution: + { + integrity: sha512-CR0d7nknV1Zhsl2rPCrjHK/BxU1rce1qZgDPDByxBDSkR+rhQBXxsj4ua+3u1535SpMuIWTSgyKA3OP7MvZW0Q==, + } + engines: { node: ">=18" } + hasBin: true + +snapshots: + "@pnpm/exe.android-arm64@12.16.1": + optional: true + + "@pnpm/exe.android-x64@12.16.1": + optional: true + + "@pnpm/exe.darwin-arm64@12.16.1": + optional: true + + "@pnpm/exe.darwin-x64@12.16.1": + optional: true + + "@pnpm/exe.freebsd-x64@12.16.1": + optional: true + + "@pnpm/exe.linux-arm64-musl@12.16.1": + optional: true + + "@pnpm/exe.linux-arm64@12.16.1": + optional: true + + "@pnpm/exe.linux-ppc64@12.16.1": + optional: true + + "@pnpm/exe.linux-riscv64@12.16.1": + optional: true + + "@pnpm/exe.linux-s390x@12.16.1": + optional: true + + "@pnpm/exe.linux-x64-musl@12.16.1": + optional: true + + "@pnpm/exe.linux-x64@12.16.1": + optional: true + + "@pnpm/exe.win32-arm64@12.16.1": + optional: true + + "@pnpm/exe.win32-x64@12.16.1": + optional: true + + pnpm@12.16.1: + optionalDependencies: + "@pnpm/exe.android-arm64": 12.16.1 + "@pnpm/exe.android-x64": 12.16.1 + "@pnpm/exe.darwin-arm64": 12.16.1 + "@pnpm/exe.darwin-x64": 12.16.1 + "@pnpm/exe.freebsd-x64": 12.16.1 + "@pnpm/exe.linux-arm64": 12.16.1 + "@pnpm/exe.linux-arm64-musl": 12.16.1 + "@pnpm/exe.linux-ppc64": 12.16.1 + "@pnpm/exe.linux-riscv64": 12.16.1 + "@pnpm/exe.linux-s390x": 12.16.1 + "@pnpm/exe.linux-x64": 12.16.1 + "@pnpm/exe.linux-x64-musl": 12.16.1 + "@pnpm/exe.win32-arm64": 12.16.1 + "@pnpm/exe.win32-x64": 12.16.1 + +--- +lockfileVersion: "9.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + devDependencies: + nx: + specifier: 24.0.4 + version: 24.0.4 + prettier: + specifier: ^3.9.10 + version: 3.9.10 + +packages: + "@clack/core@1.4.3": + resolution: + { + integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==, + } + engines: { node: ">= 20.12.0" } + + "@clack/prompts@1.7.0": + resolution: + { + integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==, + } + engines: { node: ">= 20.12.0" } + + "@emnapi/core@1.4.5": + resolution: + { + integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==, + } + + "@emnapi/runtime@1.4.5": + resolution: + { + integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==, + } + + "@emnapi/wasi-threads@1.0.4": + resolution: + { + integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==, + } + + "@jest/diff-sequences@30.0.1": + resolution: + { + integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==, + } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@napi-rs/wasm-runtime@0.2.4": + resolution: + { + integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==, + } + + "@nx/nx-darwin-arm64@24.0.4": + resolution: + { + integrity: sha512-VMs0zpDi7qeGOrLdMAo0btFSNyweqKzw6ibh+xuE0ihlgtVN05lkLDEPuRoag7lf1aWLUx3o+GZzSklOL2cMYQ==, + } + cpu: [arm64] + os: [darwin] + + "@nx/nx-darwin-x64@24.0.4": + resolution: + { + integrity: sha512-BIeXOf3R7OFdJH9MDPTnDCU8bHE5bOm1lwQnU2+RmlH4dzcZ4grIeOZZ9rALLxjMH2qfQLi/xIW70ysQirKlmQ==, + } + cpu: [x64] + os: [darwin] + + "@nx/nx-freebsd-x64@24.0.4": + resolution: + { + integrity: sha512-a/PlLpaDpR54OeLuv3/9zlM0CSNK8P7xGekPxqAvAujqA7UqdBNJPkvIuSh0Potf6a72qsYQllT9HhkB1rLt9w==, + } + cpu: [x64] + os: [freebsd] + + "@nx/nx-linux-arm-gnueabihf@24.0.4": + resolution: + { + integrity: sha512-u9+7haxqR3c42lerfikAnM0CRqYHKdxFLzSetgZHSwlaLWQo/u+OqheYRvWhBUmVtuihIY0vfHVCQkq5SGoY3g==, + } + cpu: [arm] + os: [linux] + + "@nx/nx-linux-arm64-gnu@24.0.4": + resolution: + { + integrity: sha512-XhCfaFcYYDnJXNJP+DePfOrUqib/xjwISFxIyRI1/D7L5L0zJldhmeRhJBTf/1ZzrqzOw20mHpZ0pRvNPeTk7A==, + } + cpu: [arm64] + os: [linux] + libc: [glibc] + + "@nx/nx-linux-arm64-musl@24.0.4": + resolution: + { + integrity: sha512-HOijP+CqLKdRbx20pL/+rJ4amRG5wzXDQyZONbtabzMGAm0HU++GA2FakBgWo+dyZO7UVsyfrI6rMd+UnwPZjg==, + } + cpu: [arm64] + os: [linux] + libc: [musl] + + "@nx/nx-linux-x64-gnu@24.0.4": + resolution: + { + integrity: sha512-8EjpL/68G/qvjNAhMGx5MzWxqjCj3ZkZRNOcq6ROchrCtUZPz9R3B7bt/a9Sm+0rZwcsMZWvonpuDZkQV3ZYGw==, + } + cpu: [x64] + os: [linux] + libc: [glibc] + + "@nx/nx-linux-x64-musl@24.0.4": + resolution: + { + integrity: sha512-XnyzJdLLK3InS/Zk9QqAMQFP0OY7XAbcnku+LTZN/gsZAaM9zHGAzYqKFwFZuiNCJzuSCRn2W5871uAkputLOg==, + } + cpu: [x64] + os: [linux] + libc: [musl] + + "@nx/nx-win32-arm64-msvc@24.0.4": + resolution: + { + integrity: sha512-cAZfMwLTmFkm0+vWxnPp4Hv4XMyl1dOy7IJUJfOa8fwGdrvrtToyoCA3lQxd1IkL5+9/05RBAxDPT278rdVzmQ==, + } + cpu: [arm64] + os: [win32] + + "@nx/nx-win32-x64-msvc@24.0.4": + resolution: + { + integrity: sha512-NQj/Iy0auDQysqBhin3u8XlmGfY4xLCrCU9a9G5Xrc99fak79ClZku6rZRfy2k8Cyoq1u1e/Kx2SVPnTda1E6Q==, + } + cpu: [x64] + os: [win32] + + "@tybys/wasm-util@0.9.0": + resolution: + { + integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==, + } + + "@yarnpkg/lockfile@1.1.0": + resolution: + { + integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==, + } + + "@zkochan/js-yaml@0.0.7": + resolution: + { + integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==, + } + hasBin: true + + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + + argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + balanced-match@4.0.3: + resolution: + { + integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==, + } + engines: { node: 20 || >=22 } + + base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + bl@4.1.0: + resolution: + { + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, + } + + brace-expansion@5.0.12: + resolution: + { + integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==, + } + engines: { node: 20 || >=22 } + + buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + + chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + + cli-cursor@3.1.0: + resolution: + { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + } + engines: { node: ">=8" } + + cli-spinners@2.6.1: + resolution: + { + integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==, + } + engines: { node: ">=6" } + + cliui@8.0.1: + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: ">=12" } + + clone@1.0.4: + resolution: + { + integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, + } + engines: { node: ">=0.8" } + + color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + + color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + defaults@1.0.4: + resolution: + { + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, + } + + dotenv-expand@12.0.3: + resolution: + { + integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==, + } + engines: { node: ">=12" } + + dotenv@16.4.7: + resolution: + { + integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==, + } + engines: { node: ">=12" } + + ejs@5.0.1: + resolution: + { + integrity: sha512-COqBPFMxuPTPspXl2DkVYaDS3HtrD1GpzOGkNTJ1IYkifq/r9h8SVEFrjA3D9/VJGOEoMQcrlhpntcSUrM8k6A==, + } + engines: { node: ">=0.12.18" } + hasBin: true + + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + end-of-stream@1.4.5: + resolution: + { + integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==, + } + + escalade@3.2.0: + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: ">=6" } + + escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } + + fast-string-truncated-width@3.0.3: + resolution: + { + integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==, + } + + fast-string-width@3.0.2: + resolution: + { + integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==, + } + + fast-wrap-ansi@0.2.0: + resolution: + { + integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==, + } + + figures@3.2.0: + resolution: + { + integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, + } + engines: { node: ">=8" } + + fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + + get-caller-file@2.0.5: + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } + + has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + + ignore@7.0.12: + resolution: + { + integrity: sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==, + } + engines: { node: ">= 4" } + + inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + + is-interactive@1.0.0: + resolution: + { + integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, + } + engines: { node: ">=8" } + + is-unicode-supported@0.1.0: + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: ">=10" } + + isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } + hasBin: true + + jsonc-parser@3.3.1: + resolution: + { + integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==, + } + + lines-and-columns@2.0.3: + resolution: + { + integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + log-symbols@4.1.0: + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: ">=10" } + + mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } + + minimatch@10.2.5: + resolution: + { + integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==, + } + engines: { node: 18 || 20 || >=22 } + + minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: ">=8" } + + nx@24.0.4: + resolution: + { + integrity: sha512-2CfR+V584K05+wdWGiiJhXTzIWWtJdKPBkzlZSp4HDY+RwGhIOUZ6W/Q/7i+9GISQPEdyeOpAboSkbcdvZGfTg==, + } + hasBin: true + peerDependencies: + "@swc-node/register": ^1.11.1 + "@swc/core": ^1.15.8 + peerDependenciesMeta: + "@swc-node/register": + optional: true + "@swc/core": + optional: true + + once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + + onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + + ora@5.4.1: + resolution: + { + integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, + } + engines: { node: ">=10" } + + path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + picocolors@1.1.1: + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } + + prettier@3.9.10: + resolution: + { + integrity: sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==, + } + engines: { node: ">=14" } + hasBin: true + + readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + + require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } + + resolve.exports@2.0.3: + resolution: + { + integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==, + } + engines: { node: ">=10" } + + restore-cursor@3.1.0: + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: ">=8" } + + safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + semver@7.8.5: + resolution: + { + integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==, + } + engines: { node: ">=10" } + hasBin: true + + signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + + sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } + + smol-toml@1.9.0: + resolution: + { + integrity: sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==, + } + engines: { node: ">= 18" } + + string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } + + string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + + strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + + strip-bom@3.0.0: + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: ">=4" } + + supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + + tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } + + tmp@0.2.7: + resolution: + { + integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==, + } + engines: { node: ">=14.14" } + + tsconfig-paths@4.2.0: + resolution: + { + integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==, + } + engines: { node: ">=6" } + + tslib@2.8.1: + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } + + undici@7.30.1: + resolution: + { + integrity: sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==, + } + engines: { node: ">=20.18.1" } + + util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + wcwidth@1.0.1: + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + } + + which@3.0.1: + resolution: + { + integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + + wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } + + wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + y18n@5.0.8: + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } + + yaml@2.9.0: + resolution: + { + integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==, + } + engines: { node: ">= 14.6" } + hasBin: true + + yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } + + yargs@17.7.2: + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: ">=12" } + +snapshots: + "@clack/core@1.4.3": + dependencies: + fast-wrap-ansi: 0.2.0 + sisteransi: 1.0.5 + + "@clack/prompts@1.7.0": + dependencies: + "@clack/core": 1.4.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.0 + sisteransi: 1.0.5 + + "@emnapi/core@1.4.5": + dependencies: + "@emnapi/wasi-threads": 1.0.4 + tslib: 2.8.1 + + "@emnapi/runtime@1.4.5": + dependencies: + tslib: 2.8.1 + + "@emnapi/wasi-threads@1.0.4": + dependencies: + tslib: 2.8.1 + + "@jest/diff-sequences@30.0.1": {} + + "@napi-rs/wasm-runtime@0.2.4": + dependencies: + "@emnapi/core": 1.4.5 + "@emnapi/runtime": 1.4.5 + "@tybys/wasm-util": 0.9.0 + + "@nx/nx-darwin-arm64@24.0.4": + optional: true + + "@nx/nx-darwin-x64@24.0.4": + optional: true + + "@nx/nx-freebsd-x64@24.0.4": + optional: true + + "@nx/nx-linux-arm-gnueabihf@24.0.4": + optional: true + + "@nx/nx-linux-arm64-gnu@24.0.4": + optional: true + + "@nx/nx-linux-arm64-musl@24.0.4": + optional: true + + "@nx/nx-linux-x64-gnu@24.0.4": + optional: true + + "@nx/nx-linux-x64-musl@24.0.4": + optional: true + + "@nx/nx-win32-arm64-msvc@24.0.4": + optional: true + + "@nx/nx-win32-x64-msvc@24.0.4": + optional: true + + "@tybys/wasm-util@0.9.0": + dependencies: + tslib: 2.8.1 + + "@yarnpkg/lockfile@1.1.0": {} + + "@zkochan/js-yaml@0.0.7": + dependencies: + argparse: 2.0.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + balanced-match@4.0.3: {} + + base64-js@1.5.1: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + brace-expansion@5.0.12: + dependencies: + balanced-match: 4.0.3 + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.6.1: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + dotenv-expand@12.0.3: + dependencies: + dotenv: 16.4.7 + + dotenv@16.4.7: {} + + ejs@5.0.1: {} + + emoji-regex@8.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.0: + dependencies: + fast-string-width: 3.0.2 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + fs-constants@1.0.0: {} + + get-caller-file@2.0.5: {} + + has-flag@4.0.0: {} + + ieee754@1.2.1: {} + + ignore@7.0.12: {} + + inherits@2.0.4: {} + + is-fullwidth-code-point@3.0.0: {} + + is-interactive@1.0.0: {} + + is-unicode-supported@0.1.0: {} + + isexe@2.0.0: {} + + json5@2.2.3: {} + + jsonc-parser@3.3.1: {} + + lines-and-columns@2.0.3: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + mimic-fn@2.1.0: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.12 + + minimist@1.2.8: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nx@24.0.4: + dependencies: + "@clack/core": 1.4.3 + "@clack/prompts": 1.7.0 + "@emnapi/core": 1.4.5 + "@emnapi/runtime": 1.4.5 + "@emnapi/wasi-threads": 1.0.4 + "@jest/diff-sequences": 30.0.1 + "@napi-rs/wasm-runtime": 0.2.4 + "@tybys/wasm-util": 0.9.0 + "@yarnpkg/lockfile": 1.1.0 + "@zkochan/js-yaml": 0.0.7 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + argparse: 2.0.1 + balanced-match: 4.0.3 + base64-js: 1.5.1 + bl: 4.1.0 + brace-expansion: 5.0.12 + buffer: 5.7.1 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 8.0.1 + clone: 1.0.4 + color-convert: 2.0.1 + color-name: 1.1.4 + defaults: 1.0.4 + dotenv: 16.4.7 + dotenv-expand: 12.0.3 + ejs: 5.0.1 + emoji-regex: 8.0.0 + end-of-stream: 1.4.5 + escalade: 3.2.0 + escape-string-regexp: 1.0.5 + fast-string-truncated-width: 3.0.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.0 + figures: 3.2.0 + fs-constants: 1.0.0 + get-caller-file: 2.0.5 + has-flag: 4.0.0 + ieee754: 1.2.1 + ignore: 7.0.12 + inherits: 2.0.4 + is-fullwidth-code-point: 3.0.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + isexe: 2.0.0 + json5: 2.2.3 + jsonc-parser: 3.3.1 + lines-and-columns: 2.0.3 + log-symbols: 4.1.0 + mimic-fn: 2.1.0 + minimatch: 10.2.5 + minimist: 1.2.8 + npm-run-path: 4.0.1 + once: 1.4.0 + onetime: 5.1.2 + ora: 5.4.1 + path-key: 3.1.1 + picocolors: 1.1.1 + readable-stream: 3.6.2 + require-directory: 2.1.1 + resolve.exports: 2.0.3 + restore-cursor: 3.1.0 + safe-buffer: 5.2.1 + semver: 7.8.5 + signal-exit: 3.0.7 + sisteransi: 1.0.5 + smol-toml: 1.9.0 + string-width: 4.2.3 + string_decoder: 1.3.0 + strip-ansi: 6.0.1 + strip-bom: 3.0.0 + supports-color: 7.2.0 + tar-stream: 2.2.0 + tmp: 0.2.7 + tsconfig-paths: 4.2.0 + tslib: 2.8.1 + undici: 7.30.1 + util-deprecate: 1.0.2 + wcwidth: 1.0.1 + which: 3.0.1 + wrap-ansi: 7.0.0 + wrappy: 1.0.2 + y18n: 5.0.8 + yaml: 2.9.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + "@nx/nx-darwin-arm64": 24.0.4 + "@nx/nx-darwin-x64": 24.0.4 + "@nx/nx-freebsd-x64": 24.0.4 + "@nx/nx-linux-arm-gnueabihf": 24.0.4 + "@nx/nx-linux-arm64-gnu": 24.0.4 + "@nx/nx-linux-arm64-musl": 24.0.4 + "@nx/nx-linux-x64-gnu": 24.0.4 + "@nx/nx-linux-x64-musl": 24.0.4 + "@nx/nx-win32-arm64-msvc": 24.0.4 + "@nx/nx-win32-x64-msvc": 24.0.4 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + path-key@3.1.1: {} + + picocolors@1.1.1: {} + + prettier@3.9.10: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + require-directory@2.1.1: {} + + resolve.exports@2.0.3: {} + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + safe-buffer@5.2.1: {} + + semver@7.8.5: {} + + signal-exit@3.0.7: {} + + sisteransi@1.0.5: {} + + smol-toml@1.9.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tmp@0.2.7: {} + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + undici@7.30.1: {} + + util-deprecate@1.0.2: {} + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + which@3.0.1: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yaml@2.9.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..07ff0ce --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,10 @@ +allowBuilds: + nx: true + +# node_modules is shared between the macOS host and the Linux sandbox, so keep the store +# in the repo (gitignored) and install native binaries for both platforms +storeDir: .pnpm-store +supportedArchitectures: + os: [current, darwin, linux] + cpu: [current, arm64] + libc: [current, glibc]