shared-package-criteria
a framework-dependent or single-consumer item placed in the shared package
Agent checkadvisory by defaultbasecode
The argument
Use packages/shared/ when: 2+ packages need it, it has zero framework dependencies, and it defines a contract both sides agree on (constants, error codes, pure predicates).
Don't when: one package needs it (use its common/), it imports a framework (wrap the shared primitive locally), or it's an implementation detail (hooks, guards, resolvers).
Pattern — shared primitive + local wrapper:
packages/shared/src/permissions/utils/hasPermission.ts ← pure function
packages/frontend/src/common/permissions/useHasPermission.ts ← React hook wrapping it
packages/api/src/auth/guards/ ← NestJS guard using it
The proof
fail
import { getInvoiceRowClass } from '@scope/shared/billing/utils/getInvoiceRowClass';
export const renderInvoiceRow = getInvoiceRowClass;
pass
export const getInvoiceRowClass = () => 'row';
Turn it down
Both lines go in your lightsout.config.json.
"standards-checks": { "shared-package-criteria": "advisory" }"standards-checks": { "shared-package-criteria": "off" }