pnpm-workspace.yaml
Rama main · réplica de lectura del repositorio original.
packages:
- '.'
# The control plane. Its own package because it is its own service with its
# own database, and because nothing in the daemon may ever import from it —
# the dependency runs one way, at enrollment, over HTTP.
- 'packages/*'
# **The native shell is a directory under `packages/` and deliberately not a
# member of this workspace**, which is a stranger shape than it looks and is
# three measurements rather than a preference.
#
# `deploy/bootstrap.sh` and `deploy/deploy.sh` both run `pnpm install
# --frozen-lockfile` at the repository root, **unfiltered**, on every machine
# in the fleet — and `deploy.sh`'s `INSTALL_DEPS` matches
# `^packages/[^/]+/package\.json$`, so a native-only edit re-runs it. As a
# member, `@tauri-apps/cli` and the one platform binary pnpm picks for the host
# would install on every daemon host, to be run by none of them. That is
# Q4.114's argument again at a smaller number, and it has the same answer.
#
# Second: `deploy.sh`'s `RELAY_INPUTS` matches `^pnpm-lock\.yaml$`, because the
# lockfile decides which `tsx` the relay runs. A member writes that file on
# every Tauri bump, so **every tunnel in the fleet would drop** for a change no
# relay contains. Out of the workspace, the root lockfile never moves for it.
#
# Third: the build context for the control plane's image is deny-first, and
# `deploy/docker/Dockerfile`'s `--frozen-lockfile` verifies the lockfile against
# *every* importer before installing the filtered subset. A member would be an
# importer the context cannot see, and the image would stop building — caught
# only by `imagecheck`, which is a separate CI job needing docker.
#
# The cost is stated rather than hidden: `packages/native` has its own
# `node_modules` and its own lockfile, `pnpm install` at the root does not
# install it, and `pnpm --filter @reemoat/native` does not resolve — the root
# scripts say `pnpm --dir packages/native` instead. `pnpm nativecheck` asserts
# this exclusion is still here, because deleting one line quietly undoes all
# three.
- '!packages/native'
allowBuilds:
# esbuild's install script links its prebuilt platform binary; tsx needs it.
esbuild: true
# `opencode-ai` used to sit here too, its postinstall allowed so that the
# platform binary its shim re-execs was linked. It is no longer a dependency at
# all (Q4.114) — and ⚠ a `pnpm install` that meets a package with a build script
# and no verdict here writes `<name>: set this to true or false` into this list
# by itself, which is how a placeholder for a package that had just been removed
# came to ship in a draft of this change. `pincheck` reads this list now.
# **The coding-agent CLIs are not installed by `pnpm install`, and these lines are
# what keeps them out.** Two adapters this repository pins bring a CLI with them
# as *optional* platform packages — `@anthropic-ai/claude-agent-sdk` under
# `claude-agent-acp`, the `@openai/codex` shim under `codex-acp` — one build per
# OS and architecture, of which pnpm installs the one that matches. Measured on
# this repository's own darwin-arm64 checkout: 245 MB and 307 MB, 552 MB of a
# 907 MB `node_modules`, for two programs `deploy/agents.sh` installs anyway with
# each vendor's own installer and keeps current from there. The pinned copy was
# exactly as old as the release and never the one that ran once a vendor's copy
# was on the machine, so it bought nothing but the download (Q4.114).
#
# `-` removes a dependency; the adapters still resolve, and each is told where its
# CLI is by `CLAUDE_CODE_EXECUTABLE` / `CODEX_PATH`, which `LocalRuntime.launch`
# writes on every spawn from the copy `deploy/agents.sh` installed. A machine that
# cannot reach the vendors' hosts installs the same four from the npm registry
# instead — `REEMOAT_AGENT_SOURCE=npm`, in `.env.example` — never from here.
#
# **One line per platform package, and `pnpm pincheck` asserts the list is exactly
# what the installed adapters declare**: a platform the vendor adds is a package
# that would ride back in with every check green, and a line left over after one
# is dropped is a pin on nothing.
overrides:
'@anthropic-ai/claude-agent-sdk-darwin-arm64': '-'
'@anthropic-ai/claude-agent-sdk-darwin-x64': '-'
'@anthropic-ai/claude-agent-sdk-linux-arm64': '-'
'@anthropic-ai/claude-agent-sdk-linux-arm64-musl': '-'
'@anthropic-ai/claude-agent-sdk-linux-x64': '-'
'@anthropic-ai/claude-agent-sdk-linux-x64-musl': '-'
'@anthropic-ai/claude-agent-sdk-win32-arm64': '-'
'@anthropic-ai/claude-agent-sdk-win32-x64': '-'
'@openai/codex-darwin-arm64': '-'
'@openai/codex-darwin-x64': '-'
'@openai/codex-linux-arm64': '-'
'@openai/codex-linux-x64': '-'
'@openai/codex-win32-arm64': '-'
'@openai/codex-win32-x64': '-'
# **`minimumReleaseAge` is not set, so this exclusion currently excludes nothing.**
#
# Said here rather than left to be discovered, because the shape reads like a policy
# and is not one: `pnpm config get minimumReleaseAge` answers `undefined`, and the
# setting appears in no `.npmrc`, here or in either package. `pnpm pincheck` reports
# the state in its output for the same reason — a line that looks load-bearing and
# is inert is worse than no line, and this one had a driver asserting on it.
#
# Turning it on is a real decision with a measured cost, which is why it is left to
# be taken rather than taken here. With `minimumReleaseAge: 10080`, on 2026-08-02:
# 27 lockfile entries are rejected — every `@rollup/rollup-*@4.62.3` platform
# binary, published six days earlier as a transitive dependency of Vite — so every
# `pnpm <script>` in the repository fails until they age out. And it applies to
# `--frozen-lockfile` too, which is not obvious: that install stops being offline
# and becomes a network verification of all 367 entries against the registry, in CI
# and on every deploy.
#
# The lines below are what the escape hatch looks like when it is switched on: one
# entry per package that genuinely has to be fresher than the window.
#
# `pnpm pincheck` asserts that each names the version `package.json` pins, so these
# are not free-floating — they are the second of the three places a pin is written
# down (four for the claude adapter, whose patch below is keyed on its version), and a
# bump that edits one file and not the other fails there.
minimumReleaseAgeExclude:
- '@agentclientprotocol/claude-agent-acp@0.73.0'
- '@agentclientprotocol/codex-acp@1.8.0'
# **One adapter is patched, and only to ask its CLI a question it already answers.**
# `claude-agent-acp` names claude's effort `default` and never says what that
# resolves to; the CLI does, as `get_settings`' `applied.effort` — the level its own
# `/effort` and status line show, per model and after the organization's caps. The
# patch adds one request, `_reemoat/effort`, that reads it (Q6.121). pnpm refuses an
# install whose patch no longer applies, so a bump of the pin is a re-patch rather
# than a silent loss; `packages/native/scripts/build-daemon.mjs` applies the same
# file to the app's npm tree, and `pnpm pincheck` holds the key to the pin.
patchedDependencies:
'@agentclientprotocol/claude-agent-acp@0.73.0': patches/@agentclientprotocol__claude-agent-acp@0.73.0.patch