{"version":"2.1.229","anchor":"plugin-installs-replace-symlinks-with-real-files","canonical_anchor":"plugin-installs-replace-symlinks-with-real-files","heading":"Plugin installs replace symlinks with real files","tier":"notice","area":"Plugins","scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.229\/e\/plugin-installs-replace-symlinks-with-real-files","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.229","markdown":"### Plugin installs replace symlinks with real files\n\nInstalled plugins get real files instead of symlinks, with unsafe links removed.\n\n**What**\n\nWhen a plugin is copied into the versioned cache, a new pass walks it and turns symlinks into real copies. Links that dangle, escape the plugin root, form an ancestor cycle, point at something other than a regular file, or use a reserved top-level name are removed instead. If the plugin directory is read-only the pass logs and leaves the links alone rather than failing the install.\n\n**Details**\n\n- node_modules links are re-checked after conversion.\n- The outcome is written to a `.links_materialized` marker file holding the CLI version and the materialized, removed and failed counts.\n- Only some install paths invoke the pass; the conditions that select them sit outside the copy routine.\n\n**Evidence**\n\n`materializeLinks: ${e}: cannot write (${T}), leaving links in place`\n\n- Area: Plugins\n- Tier: You'll notice\n- Useful: 2\/5\n- Signal: 2\/5"}