Developing against a checkout
task vendor-evolve runs a project against a checkout of evolve-framework, evolve-storefront or
evolve-contrib instead of the published packages. The checkout sits under vendor/, which git
ignores apart from its README, so its branches and uncommitted work belong to the developer.
task vendor-evolve -- link [framework|storefront|contrib|all] # clones what is missing, installstask vendor-evolve -- statustask vendor-evolve -- unlink # installs tootask vendor-evolve -- update [framework|storefront|contrib|all] # git pull in the checkouts--no-install skips the install that link, unlink and update end with. The project’s
CONTRIBUTING.md describes the mechanism for people; this skill is what an agent needs on top.
What linking changes
Section titled “What linking changes”Only pnpm-workspace.yaml, and the lockfile through the install:
| Change | Why |
|---|---|
vendor/<repo>/packages/* added to packages: |
turbo only sees workspace members |
Every package of the checkout the project uses → workspace:* |
the override is what makes every consumer resolve the checkout |
| The storefront’s catalog entries the project lacks, copied in | storefront packages name their dependencies as catalog: |
| Shared dependencies → the linked package’s own version | otherwise pnpm installs two copies whose types do not match |
…except across a major, and for the names in KEEP |
the project’s own code is bound to its major or exact version |
Each changed line carries a # vendor.sh: was … note and each added line sits between
# vendor.sh: markers. The lockfile from before linking is kept in vendor/ and restored on
unlink, so a round trip leaves no diff.
Rules while linked
Section titled “Rules while linked”- Never commit
pnpm-workspace.yamlorpnpm-lock.yaml.statussays which mode the workspace is in;workspace:*overrides orvendor.sh:markers mean linked. Unlink before committing anything in the project itself. - Commit and push package changes from the checkout,
vendor/<repo>, on a branch of that repository. It is a normal clone with its own remote. - Run a linked package’s scripts from the project root, as
pnpm --filter @evolve-framework/<name> run tsc. Insidevendor/, pnpm reads that repository’s ownpackageManager, which the project’sminimumReleaseAgemay refuse. pnpm tscandpnpm testskipvendor/. Check a linked package with its own scripts, and in its own repository before opening a pull request there.- Run the app on the host:
pnpm dev, withtask docker:servicesfor the infrastructure.task docker:devmounts the host’snode_modulesundervendor/, which hold the host’s binaries.
Reading failures
Section titled “Reading failures”- The app does not compile, or the supergraph does not compose. Linked
maincan be ahead of the versions the project is written against. Separate drift (the project has to adapt, as it would on the next version bump) from a defect in the package (fix it in the checkout). A composition error over two subgraphs is worth checking in the package’s schema: its own repository may compose only one. - “Type X is not assignable to type X”, or a module state that seems to reset. Two copies of
one package. Find them under
node_modules/.pnpm; a dependency the linked package shares with the project but thatlinkdid not override is the usual cause. Relinking re-derives the overrides. - The project breaks only while linked, in a package of its own (an instrumentation hook
that throws, a missing export). An override forced one of the project’s own dependencies onto
the linked package’s version, and an override replaces every copy in the tree. Across a major
linkalready leaves both copies; for a same-major break, add the name toKEEPinscripts/vendor.shand relink. - A checkout is cloned but not linked. The project depends on none of its packages yet.
Add the dependency to the consuming
package.jsonand link again.

