mirror of
https://github.com/stablyai/orca.git
synced 2026-11-01 17:47:40 +00:00
* build: share one pnpm virtual store across worktrees, off under CI
Each worktree carried a full node_modules; the global virtual store links
one slot per package version instead. pnpm keeps an explicit setting on
under CI, so a pnpmfile hook turns it off there: CI packages from,
caches and verifies a project-local node_modules.
* fix(build): keep shared electron and windows-process-tree dirs untouched under GVS
Every worktree runs Electron from the one shared electron package, so the
per-repo dist cache must not swap that dist and a foreign-arch install must
not land in it. The relay addon builder now repairs and compiles a private
copy instead of the shared windows-process-tree dir.
* fix(build): accept CLI runtime imports reached through an in-artifact store link
Under the global virtual store node_modules/<pkg> realpaths into a store
outside the repo. The check still rejects anything not reached through a
node_modules link inside the artifact, such as a stray ~/node_modules.
* docs: explain the global virtual store layout and the ~/node_modules hazard
* test: compare CLI closure paths with POSIX separators so the suite passes on Windows
* build: keep Windows on the normal pnpm layout unless ORCA_PNPM_GLOBAL_VIRTUAL_STORE=1
Store links are true symlinks on Windows, and installs without admin or
Developer Mode are unverified; CI still forces the normal layout first.
* fix(build): close the remaining shared-slot gaps under the global virtual store
- verify-skills-cli-runtime resolves each import from the importer's realpath,
as Node does, so an artifact-local copy can't mask a ~/node_modules load.
- A concurrent sibling install of the shared Electron dist is kept, not swapped out.
- rebuild:node goes through ensure-native-runtime, which builds a shared
node-pty beside the slot instead of node-gyp cleaning its build/ dir.
* fix(build): keep pnpm rebuild:node a forced rebuild
It replaced pnpm rebuild node-pty, which always rebuilt; without --force it
only rebuilt a node-pty that failed to load.
* docs: note that the store switches must stay set, since pnpm run relinks
* build: move the pnpmfile under config/ to keep the repo root allowlisted
pnpm-workspace.yaml points pnpm at it; the lockfile checksum is unchanged
because the content is.
* fix(build): enable the global virtual store from the pnpmfile, not the workspace file
pnpm exec derives NODE_PATH from the file setting, so even with the store
forced off under CI every child process got the root node_modules on its
NODE_PATH; a Windows rebuild fixture then resolved the real
@orca/windows-registry it deliberately omits. The hook now sets the store
both ways, and ORCA_PNPM_GLOBAL_VIRTUAL_STORE=0/1 is the one switch.
* test(pty): keep F3's concurrent spawns on the node-pty mock
Two concurrent first import('node-pty') calls race vitest's mock registry
and the loser loads the real addon under the mocked linux platform. It
passed only where a platform-agnostic build/Release happened to exist,
so it failed on every shared-store worktree.
* ci: fail PRs whose packages need a dependency they never declared
A new dependency_isolation job installs with the global virtual store
forced on (ORCA_PNPM_FORCE_GLOBAL_VIRTUAL_STORE_IN_CI), HOME and the store
in an empty temp dir, then runs pnpm tc and the undeclared-dependency test.
Postinstall now warns when a node_modules above the shared store, such as
~/node_modules, would mask the same class of bug locally.
* ci: set the isolation job's HOME and store through GITHUB_ENV
Job-level env cannot read the runner context, which made pr.yml invalid.
186 lines
7.3 KiB
YAML
186 lines
7.3 KiB
YAML
# The desktop host and internal packages share an install. `mobile/` is a separate workspace
|
|
# with its own pnpm-workspace.yaml and lockfile, so keep it out of the root
|
|
# package graph. Without this file `pnpm -r` auto-discovers mobile/ and its
|
|
# nested package, and the root's patchedDependencies fail as ERR_PNPM_UNUSED_PATCH.
|
|
#
|
|
# native/windows-registry and native/windows-security are listed explicitly rather than reached by a glob: as a `file:`
|
|
# dependency pnpm re-linked it on every install (including --frozen-lockfile), and that
|
|
# virtual-store churn raced node-gyp reading the same tree, which lost @vscode/windows-process-tree's
|
|
# binding.gyp mid-rebuild on Windows CI. A workspace link is resolved once instead.
|
|
packages:
|
|
- native/windows-registry
|
|
- native/windows-security
|
|
- src/packages/*
|
|
|
|
minimumReleaseAge: 4320
|
|
# Latest requested releases are still within the three-day delay; exempt only these versions.
|
|
minimumReleaseAgeExclude:
|
|
- '@oxc-project/types@0.154.0'
|
|
- '@rolldown/binding-android-arm-eabi@1.2.14'
|
|
- '@rolldown/binding-android-arm64@1.2.14'
|
|
- '@rolldown/binding-darwin-arm64@1.2.14'
|
|
- '@rolldown/binding-darwin-x64@1.2.14'
|
|
- '@rolldown/binding-freebsd-x64@1.2.14'
|
|
- '@rolldown/binding-linux-arm-gnueabihf@1.2.14'
|
|
- '@rolldown/binding-linux-arm64-gnu@1.2.14'
|
|
- '@rolldown/binding-linux-arm64-musl@1.2.14'
|
|
- '@rolldown/binding-linux-ppc64-gnu@1.2.14'
|
|
- '@rolldown/binding-linux-s390x-gnu@1.2.14'
|
|
- '@rolldown/binding-linux-x64-gnu@1.2.14'
|
|
- '@rolldown/binding-linux-x64-musl@1.2.14'
|
|
- '@rolldown/binding-openharmony-arm64@1.2.14'
|
|
- '@rolldown/binding-win32-arm64-msvc@1.2.14'
|
|
- '@rolldown/binding-win32-x64-msvc@1.2.14'
|
|
- '@vitest/mocker@5.0.5'
|
|
- '@vitest/spy@5.0.5'
|
|
- 'electron-vite@6.0.0'
|
|
- 'rolldown@1.2.14'
|
|
- 'vitest@5.0.5'
|
|
- '@oxfmt/binding-android-arm-eabi@0.73.0'
|
|
- '@oxfmt/binding-android-arm64@0.73.0'
|
|
- '@oxfmt/binding-darwin-arm64@0.73.0'
|
|
- '@oxfmt/binding-darwin-x64@0.73.0'
|
|
- '@oxfmt/binding-freebsd-x64@0.73.0'
|
|
- '@oxfmt/binding-linux-arm-gnueabihf@0.73.0'
|
|
- '@oxfmt/binding-linux-arm-musleabihf@0.73.0'
|
|
- '@oxfmt/binding-linux-arm64-gnu@0.73.0'
|
|
- '@oxfmt/binding-linux-arm64-musl@0.73.0'
|
|
- '@oxfmt/binding-linux-ppc64-gnu@0.73.0'
|
|
- '@oxfmt/binding-linux-riscv64-gnu@0.73.0'
|
|
- '@oxfmt/binding-linux-riscv64-musl@0.73.0'
|
|
- '@oxfmt/binding-linux-s390x-gnu@0.73.0'
|
|
- '@oxfmt/binding-linux-x64-gnu@0.73.0'
|
|
- '@oxfmt/binding-linux-x64-musl@0.73.0'
|
|
- '@oxfmt/binding-openharmony-arm64@0.73.0'
|
|
- '@oxfmt/binding-win32-arm64-msvc@0.73.0'
|
|
- '@oxfmt/binding-win32-ia32-msvc@0.73.0'
|
|
- '@oxfmt/binding-win32-x64-msvc@0.73.0'
|
|
- '@oxlint/binding-android-arm-eabi@1.88.0'
|
|
- '@oxlint/binding-android-arm64@1.88.0'
|
|
- '@oxlint/binding-darwin-arm64@1.88.0'
|
|
- '@oxlint/binding-darwin-x64@1.88.0'
|
|
- '@oxlint/binding-freebsd-x64@1.88.0'
|
|
- '@oxlint/binding-linux-arm-gnueabihf@1.88.0'
|
|
- '@oxlint/binding-linux-arm-musleabihf@1.88.0'
|
|
- '@oxlint/binding-linux-arm64-gnu@1.88.0'
|
|
- '@oxlint/binding-linux-arm64-musl@1.88.0'
|
|
- '@oxlint/binding-linux-ppc64-gnu@1.88.0'
|
|
- '@oxlint/binding-linux-riscv64-gnu@1.88.0'
|
|
- '@oxlint/binding-linux-riscv64-musl@1.88.0'
|
|
- '@oxlint/binding-linux-s390x-gnu@1.88.0'
|
|
- '@oxlint/binding-linux-x64-gnu@1.88.0'
|
|
- '@oxlint/binding-linux-x64-musl@1.88.0'
|
|
- '@oxlint/binding-openharmony-arm64@1.88.0'
|
|
- '@oxlint/binding-win32-arm64-msvc@1.88.0'
|
|
- '@oxlint/binding-win32-ia32-msvc@1.88.0'
|
|
- '@oxlint/binding-win32-x64-msvc@1.88.0'
|
|
- '@oxlint/plugins@1.88.0'
|
|
- oxfmt@0.73.0
|
|
- oxlint@1.88.0
|
|
shamefullyHoist: true
|
|
|
|
# Enables pnpm's global virtual store outside CI; under config/ because the repo root only admits
|
|
# allowlisted entries.
|
|
pnpmfile: config/pnpmfile.cjs
|
|
|
|
# Orca always launches the user's own resolved Claude CLI via
|
|
# pathToClaudeCodeExecutable, so the SDK's bundled ~95 MB-per-platform CLI
|
|
# binaries must never be installed. Excluding them is what makes the path
|
|
# override mandatory rather than merely preferred.
|
|
ignoredOptionalDependencies:
|
|
- '@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'
|
|
|
|
# Development and test jobs need only their host. Cross-target packaging opts in
|
|
# with pnpm install:release (or explicit pnpm install --os / --cpu targets).
|
|
supportedArchitectures:
|
|
os:
|
|
- current
|
|
cpu:
|
|
- current
|
|
|
|
allowBuilds:
|
|
'@parcel/watcher': true
|
|
'@swc/core': false
|
|
'@vscode/windows-process-tree': false
|
|
agent-browser: false
|
|
bun: true
|
|
cpu-features: true
|
|
electron-winstaller: false
|
|
esbuild: true
|
|
msw: false
|
|
node-pty: true
|
|
ssh2: false
|
|
'@orca/windows-registry': false
|
|
'@orca/windows-security': false
|
|
|
|
# Links the project's @types/<peer> next to every package that peer-depends on <peer> (e.g.
|
|
# @types/react beside lucide-react), so peer types resolve under the global virtual store.
|
|
addMissingPeerTypes: true
|
|
|
|
# These packages' published .d.ts import modules they never declare. Hoisting hides that,
|
|
# but under the global virtual store each package sees only its declared deps, so the types
|
|
# silently became `any` or (jest-dom) the vitest matcher augmentation vanished.
|
|
packageExtensions:
|
|
'@testing-library/jest-dom':
|
|
dependencies:
|
|
'@types/aria-query': ^5.0.1
|
|
peerDependencies:
|
|
vitest: '*'
|
|
peerDependenciesMeta:
|
|
vitest:
|
|
optional: true
|
|
'@tiptap/extension-list':
|
|
dependencies:
|
|
prosemirror-model: ^1.0.0
|
|
# electron-vite reads electron/package.json and the binary path at build and dev time.
|
|
electron-vite:
|
|
peerDependencies:
|
|
electron: '*'
|
|
electron-updater:
|
|
peerDependencies:
|
|
electron: '*'
|
|
peerDependenciesMeta:
|
|
electron:
|
|
optional: true
|
|
mermaid:
|
|
dependencies:
|
|
'@iconify/types': ^2.0.0
|
|
'@types/d3-selection': ^3.0.0
|
|
type-fest: ^5.0.0
|
|
playwright-core:
|
|
peerDependencies:
|
|
electron: '*'
|
|
peerDependenciesMeta:
|
|
electron:
|
|
optional: true
|
|
remark-parse:
|
|
dependencies:
|
|
vfile: ^6.0.0
|
|
|
|
overrides:
|
|
monaco-editor>dompurify: 3.4.16
|
|
# Upstream markdown/math packages still require the vulnerable 0.16 line.
|
|
katex@>=0.11.0 <0.18.2: 0.18.10
|
|
|
|
patchedDependencies:
|
|
'@xterm/addon-image@0.10.0-beta.301': config/patches/@xterm__addon-image@0.10.0-beta.301.patch
|
|
node-pty@1.1.0: config/patches/node-pty@1.1.0.patch
|
|
'@xterm/addon-ligatures@0.11.0-beta.301': config/patches/@xterm__addon-ligatures@0.11.0-beta.301.patch
|
|
'@xterm/addon-webgl@0.20.0-beta.300': config/patches/@xterm__addon-webgl@0.20.0-beta.300.patch
|
|
'@xterm/addon-search@0.17.0-beta.301': config/patches/@xterm__addon-search@0.17.0-beta.301.patch
|
|
'@xterm/addon-serialize@0.15.0-beta.301': config/patches/@xterm__addon-serialize@0.15.0-beta.301.patch
|
|
'@xterm/xterm@6.1.0-beta.304': config/patches/@xterm__xterm@6.1.0-beta.304.patch
|
|
lint-staged@16.4.0: config/patches/lint-staged@16.4.0.patch
|
|
'@vscode/windows-process-tree@0.8.0': config/patches/@vscode__windows-process-tree@0.8.0.patch
|
|
i18next-cli@1.74.2: config/patches/i18next-cli@1.74.2.patch
|
|
ws@8.22.0: config/patches/ws@8.22.0.patch
|
|
oxlint-plugin-anti-slop@0.1.2: config/patches/oxlint-plugin-anti-slop@0.1.2.patch
|
|
monaco-editor@0.55.1: config/patches/monaco-editor@0.55.1.patch
|