{
  "id": 14495337,
  "title": "Say which projects may depend on which",
  "url": "https://urgent.news/2026/10/14/say-which-projects-may-depend-on-which",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-10-14T17:06:45.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/vzn-vx/say-which-projects-may-depend-on-which-3eek"
  },
  "original_language": "en",
  "account": "A UI kit that imports a checkout flow or an app that relies on a helper it should not see is simple to add, yet difficult to remove. Assign tags to the layers and establish the rules once, then lock them. These tags and rules are stored in a project's own configuration file. The workspace defines what each tag can depend on, using selectors such as tag: glob or project-name glob. The workspace rules specify dependencies, allowing projects to depend on tags like tag:type:app or tag:type:ui, while denying dependencies like tag:type:app or tag:type:feature. If a project has no selected rules, it remains free. The vx lock tool checks the workspace dependencies and workspace rules, refusing any graph that violates the rules, listing every broken dependency and writing nothing. To resolve the issue, either drop the dependency or adjust the project tags or rules. Once the lock is set, it remains unchanged, so a pull request that introduces a forbidden dependency will fail the test. Runs do not verify these rules; instead, they use the locked configurations from the lock file, which have already passed the checks. In NX, the @nx/enforce-module-boundaries lint rule reads the depConstraints from the root ESLint config and fills in the workspace rules when none are set. This process creates the workspace rules, which then replace the original rules. However, Nx's lint rule checks source imports, while vx checks the dependencies declared by the projects. The vx-migrate README also notes other constraints that vx does not check, such as allSourceTags, /regex/ tags, and constraints that only ban external imports. The schema for these configurations can be found in the configuration reference.",
  "summary": "A UI kit that imports a checkout flow, or an app that reaches into a helper it should not see, is easy to add and hard to remove. Tag the layers, write the rules once, and vx lock holds every change to them. Tags and rules A project names its tags in its own config: // packages/button/vx.config.ts import { defineProject } from ' @vzn/vx/config ' export default defineProject ({ tags : [ ' type:ui…",
  "key_points": [
    "Projects depend on tags defined in project's configuration file",
    "Workspace rules specify dependencies using selectors like tag: glob",
    "vx lock tool enforces workspace dependencies and rules"
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}