[{"data":1,"prerenderedAt":984},["ShallowReactive",2],{"docs-page:\u002Fdocs\u002Fpackage-manager\u002Fjailed-builds":3,"docs-pages":638},{"id":4,"title":5,"body":6,"description":630,"extension":631,"meta":632,"navigation":633,"path":634,"seo":635,"stem":636,"__hash__":637},"docs\u002Fdocs\u002Fpackage-manager\u002Fjailed-builds.md","Jailed dependency builds",{"type":7,"value":8,"toc":621},"minimark",[9,13,22,33,59,62,94,97,157,162,200,204,224,284,287,291,294,361,370,407,412,416,419,438,449,453,456,471,478,482,485,525,528,570,573,577,614,617],[10,11,5],"h1",{"id":12},"jailed-dependency-builds",[14,15,16,17,21],"p",{},"Dependency lifecycle scripts are one of the sharpest supply-chain edges in a\nJavaScript install. scpm already keeps dependency scripts skipped until a\nproject approves them with ",[18,19,20],"code",{},"allowBuilds",". Jailed\nbuilds add a second boundary: approved packages may build, but they do\nnot automatically get the user's full filesystem, network, and environment.",[14,23,24,25,28,29,32],{},"Jailed builds default to ",[18,26,27],{},"false"," today and are planned to default to ",[18,30,31],{},"true"," in\nthe next major version. Enable them now in workspace config:",[34,35,40],"pre",{"className":36,"code":37,"language":38,"meta":39,"style":39},"language-yaml shiki shiki-themes github-light github-dark","jailBuilds: true\n","yaml","",[18,41,42],{"__ignoreMap":39},[43,44,47,51,55],"span",{"class":45,"line":46},"line",1,[43,48,50],{"class":49},"s9eBZ","jailBuilds",[43,52,54],{"class":53},"sVt8B",": ",[43,56,58],{"class":57},"sj4cs","true\n",[14,60,61],{},"If one reviewed package cannot run in the jail yet, keep jailed builds enabled\nglobally and exempt only that package:",[34,63,65],{"className":36,"code":64,"language":38,"meta":39,"style":39},"jailBuilds: true\njailBuildExclusions:\n  - \"@vendor\u002F*\"\n",[18,66,67,75,84],{"__ignoreMap":39},[43,68,69,71,73],{"class":45,"line":46},[43,70,50],{"class":49},[43,72,54],{"class":53},[43,74,58],{"class":57},[43,76,78,81],{"class":45,"line":77},2,[43,79,80],{"class":49},"jailBuildExclusions",[43,82,83],{"class":53},":\n",[43,85,87,90],{"class":45,"line":86},3,[43,88,89],{"class":53},"  - ",[43,91,93],{"class":92},"sZZnC","\"@vendor\u002F*\"\n",[14,95,96],{},"If a package only needs a narrow exception, grant that privilege instead of\nturning the jail off:",[34,98,100],{"className":36,"code":99,"language":38,"meta":39,"style":39},"jailBuilds: true\njailBuildPermissions:\n  \"@vendor\u002F*\":\n    env:\n      - SHARP_DIST_BASE_URL\n    write:\n      - ~\u002F.cache\u002Fsharp\n",[18,101,102,110,117,124,132,141,149],{"__ignoreMap":39},[43,103,104,106,108],{"class":45,"line":46},[43,105,50],{"class":49},[43,107,54],{"class":53},[43,109,58],{"class":57},[43,111,112,115],{"class":45,"line":77},[43,113,114],{"class":49},"jailBuildPermissions",[43,116,83],{"class":53},[43,118,119,122],{"class":45,"line":86},[43,120,121],{"class":92},"  \"@vendor\u002F*\"",[43,123,83],{"class":53},[43,125,127,130],{"class":45,"line":126},4,[43,128,129],{"class":49},"    env",[43,131,83],{"class":53},[43,133,135,138],{"class":45,"line":134},5,[43,136,137],{"class":53},"      - ",[43,139,140],{"class":92},"SHARP_DIST_BASE_URL\n",[43,142,144,147],{"class":45,"line":143},6,[43,145,146],{"class":49},"    write",[43,148,83],{"class":53},[43,150,152,154],{"class":45,"line":151},7,[43,153,137],{"class":53},[43,155,156],{"class":92},"~\u002F.cache\u002Fsharp\n",[158,159,161],"h2",{"id":160},"goals","Goals",[163,164,165,169,172,175,197],"ul",{},[166,167,168],"li",{},"Keep dependency lifecycle scripts denied by default.",[166,170,171],{},"Run approved dependency scripts inside a narrow build jail.",[166,173,174],{},"Prevent approved build scripts from reading credentials or mutating unrelated\nproject and user files.",[166,176,177,178,181,182,185,186,185,189,192,193,196],{},"Preserve compatibility for common native-package builds such as ",[18,179,180],{},"esbuild",",\n",[18,183,184],{},"sharp",", ",[18,187,188],{},"node-gyp",[18,190,191],{},"prebuild-install",", and ",[18,194,195],{},"napi-postinstall",".",[166,198,199],{},"Avoid Docker, daemon processes, images, and other heavyweight runtime\ndependencies.",[158,201,203],{"id":202},"default-profile","Default profile",[14,205,206,207,209,210,212,213,185,216,219,220,223],{},"When ",[18,208,50],{}," is enabled and a dependency is approved through ",[18,211,20],{},",\nscpm runs its ",[18,214,215],{},"preinstall",[18,217,218],{},"install",", and\n",[18,221,222],{},"postinstall"," scripts with a default native jail profile:",[225,226,227,240],"table",{},[228,229,230],"thead",{},[231,232,233,237],"tr",{},[234,235,236],"th",{},"Capability",[234,238,239],{},"Default",[241,242,243,252,260,268,276],"tbody",{},[231,244,245,249],{},[246,247,248],"td",{},"Filesystem reads",[246,250,251],{},"unrestricted today; package\u002Ftoolchain-only reads are planned",[231,253,254,257],{},[246,255,256],{},"Filesystem writes",[246,258,259],{},"package directory and scpm-owned temporary directories",[231,261,262,265],{},[246,263,264],{},"Network",[246,266,267],{},"denied",[231,269,270,273],{},[246,271,272],{},"Environment",[246,274,275],{},"scrubbed allowlist only",[231,277,278,281],{},[246,279,280],{},"Home directory",[246,282,283],{},"temporary scpm-owned jail home",[14,285,286],{},"The important distinction is that approval means \"this package may build\nitself.\" It does not mean \"this package may write shell startup files, modify\nunrelated workspace files, inherit registry tokens, or reach the network.\"",[158,288,290],{"id":289},"package-permissions","Package permissions",[14,292,293],{},"Package-specific permissions let a reviewed package keep the jail while gaining\nonly the privileges its build script needs:",[34,295,297],{"className":36,"code":296,"language":38,"meta":39,"style":39},"jailBuildPermissions:\n  sharp:\n    env:\n      - SHARP_DIST_BASE_URL\n    read:\n      - ~\u002F.cache\u002Fnode-gyp\n    write:\n      - ~\u002F.cache\u002Fsharp\n    network: true\n",[18,298,299,305,312,318,324,331,338,344,351],{"__ignoreMap":39},[43,300,301,303],{"class":45,"line":46},[43,302,114],{"class":49},[43,304,83],{"class":53},[43,306,307,310],{"class":45,"line":77},[43,308,309],{"class":49},"  sharp",[43,311,83],{"class":53},[43,313,314,316],{"class":45,"line":86},[43,315,129],{"class":49},[43,317,83],{"class":53},[43,319,320,322],{"class":45,"line":126},[43,321,137],{"class":53},[43,323,140],{"class":92},[43,325,326,329],{"class":45,"line":134},[43,327,328],{"class":49},"    read",[43,330,83],{"class":53},[43,332,333,335],{"class":45,"line":143},[43,334,137],{"class":53},[43,336,337],{"class":92},"~\u002F.cache\u002Fnode-gyp\n",[43,339,340,342],{"class":45,"line":151},[43,341,146],{"class":49},[43,343,83],{"class":53},[43,345,347,349],{"class":45,"line":346},8,[43,348,137],{"class":53},[43,350,156],{"class":92},[43,352,354,357,359],{"class":45,"line":353},9,[43,355,356],{"class":49},"    network",[43,358,54],{"class":53},[43,360,58],{"class":57},[14,362,363,364,366,367,369],{},"Boolean ",[18,365,20],{}," entries stay compatible with pnpm and continue to mean\n\"approved to run.\" scpm-specific ",[18,368,114],{}," narrow or widen the\njail used after that approval decision.",[14,371,372,373,375,376,379,380,383,384,375,387,390,391,394,395,398,399,402,403,406],{},"Keys use the same package glob syntax as ",[18,374,20],{}," and\n",[18,377,378],{},"neverBuiltDependencies",": bare names, ",[18,381,382],{},"*"," wildcards like ",[18,385,386],{},"@scope\u002F*",[18,388,389],{},"*-native",", exact ",[18,392,393],{},"name@version"," pins, and exact version unions. ",[18,396,397],{},"env"," entries\nare exact variable names inherited from the parent process. ",[18,400,401],{},"write"," entries are\nadded to the macOS Seatbelt write allowlist today. ",[18,404,405],{},"read"," entries are accepted\nnow for the stricter future read-deny profile; reads are currently\nunrestricted.",[14,408,409,411],{},[18,410,80],{}," remains the package-level escape hatch when the\nneeded privilege is too broad. It accepts the same package glob syntax, only\ndisables the jail, and does not bypass the build approval policy.",[158,413,415],{"id":414},"native-enforcement","Native enforcement",[14,417,418],{},"The jail uses the same lightweight strategy as mise:",[163,420,421,428,435],{},[166,422,423,424,427],{},"macOS: generate a Seatbelt profile and run scripts through ",[18,425,426],{},"sandbox-exec"," to\ndeny network access and writes outside the package \u002F temporary directories.",[166,429,430,431,434],{},"Linux: apply Landlock write restrictions (kernel ≥ 5.19, Landlock ABI v2) and\na seccomp network filter in the child process before it execs the script. If\nthe kernel cannot enforce the requested jail, the script fails instead of\nrunning unsandboxed. Landlock v2 does not gate ",[18,432,433],{},"truncate()"," on otherwise\nread-only paths; build scripts that need that protection require kernel ≥ 6.2.",[166,436,437],{},"Windows: start with environment scrubbing, a temporary home directory, and an\nunsupported-native-jail warning until there is a good OS-native policy.",[14,439,440,441,444,445,448],{},"The implementation should live below the script runner rather than the install\ndriver. Every npm-style lifecycle path funnels through\n",[18,442,443],{},"scpm_scripts::run_script",", so the install path, ",[18,446,447],{},"rebuild",", and other callers\ncan share one enforcement point.",[158,450,452],{"id":451},"quarantined-build-directory","Quarantined build directory",[14,454,455],{},"The stronger future mode is to build each dependency in quarantine:",[457,458,459,462,465,468],"ol",{},[166,460,461],{},"Reflink, hardlink, or copy the package into an scpm-owned temporary build\ndirectory.",[166,463,464],{},"Run lifecycle scripts with writes limited to that build directory and a\ntemporary jail home.",[166,466,467],{},"Copy the resulting package tree back into the linked package directory after\na successful build.",[166,469,470],{},"Save that result in the side-effects cache when caching is enabled.",[14,472,473,474,477],{},"This keeps build output package-local and prevents a script from mutating\nsibling packages, project files, lockfiles, global stores, or unrelated\n",[18,475,476],{},"node_modules"," state.",[158,479,481],{"id":480},"environment-policy","Environment policy",[14,483,484],{},"Dependency scripts should receive only the environment they need to behave like\nnpm lifecycle scripts:",[163,486,487,492,498,503,508,513,518],{},[166,488,489],{},[18,490,491],{},"PATH",[166,493,494,497],{},[18,495,496],{},"HOME",", pointing at the jail home",[166,499,500],{},[18,501,502],{},"INIT_CWD",[166,504,505],{},[18,506,507],{},"npm_lifecycle_event",[166,509,510],{},[18,511,512],{},"npm_package_name",[166,514,515],{},[18,516,517],{},"npm_package_version",[166,519,520,521,524],{},"selected ",[18,522,523],{},"npm_config_*"," values needed for platform and build tooling",[14,526,527],{},"Tokens are denied unless a package-specific env grant allows them:",[163,529,530,535,540,545,550,555,560,565],{},[166,531,532],{},[18,533,534],{},"SCPM_AUTH_TOKEN",[166,536,537],{},[18,538,539],{},"NPM_TOKEN",[166,541,542],{},[18,543,544],{},"NODE_AUTH_TOKEN",[166,546,547],{},[18,548,549],{},"GITHUB_TOKEN",[166,551,552],{},[18,553,554],{},"SSH_AUTH_SOCK",[166,556,557],{},[18,558,559],{},"AWS_*",[166,561,562],{},[18,563,564],{},"GOOGLE_*",[166,566,567],{},[18,568,569],{},"AZURE_*",[14,571,572],{},"Root lifecycle scripts can remain unjailed at first because they are project\ncode. The supply-chain boundary is dependency code.",[158,574,576],{"id":575},"rollout","Rollout",[457,578,579,585,588,591,598,601,604],{},[166,580,581,582,584],{},"Add ",[18,583,50],{}," as an opt-in for dependency lifecycle scripts.",[166,586,587],{},"Add package\u002Ftoolchain-only read enforcement.",[166,589,590],{},"Add Linux Landlock \u002F seccomp enforcement.",[166,592,593,594,597],{},"Teach ",[18,595,596],{},"scpm approve-builds"," to show the default jail profile for newly\napproved packages.",[166,599,600],{},"Add more granular jail permission kinds as real packages need them.",[166,602,603],{},"Make jailed dependency builds the default in the next major version.",[166,605,606,607,610,611,613],{},"Keep explicit config escape hatches for debugging:\n",[18,608,609],{},"jailBuilds=false"," globally, or ",[18,612,80],{}," for a package.",[14,615,616],{},"The escape hatch should be noisy in CI-oriented output because disabling the\njail turns an approved dependency build back into ambient code execution.",[618,619,620],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":39,"searchDepth":77,"depth":77,"links":622},[623,624,625,626,627,628,629],{"id":160,"depth":77,"text":161},{"id":202,"depth":77,"text":203},{"id":289,"depth":77,"text":290},{"id":414,"depth":77,"text":415},{"id":451,"depth":77,"text":452},{"id":480,"depth":77,"text":481},{"id":575,"depth":77,"text":576},"Dependency lifecycle scripts are one of the sharpest supply-chain edges in a\nJavaScript install. scpm already keeps dependency scripts skipped until a\nproject approves them with allowBuilds. Jailed\nbuilds add a second boundary: approved packages may build, but they do\nnot automatically get the user's full filesystem, network, and environment.","md",{},true,"\u002Fdocs\u002Fpackage-manager\u002Fjailed-builds",{"title":5,"description":630},"docs\u002Fpackage-manager\u002Fjailed-builds","VQXAEUc9X7WOSYCsbyNtuomBdYw5JRrGWd0zE1YlQK0",[639,642,645,648,650,653,656,659,662,665,668,671,674,677,680,683,686,689,692,695,698,701,704,707,710,713,716,719,722,725,728,731,734,737,740,743,746,749,752,755,758,761,764,767,770,773,776,779,782,785,788,791,794,797,800,803,806,809,812,815,818,821,824,827,830,833,836,839,842,845,848,851,854,857,860,863,866,869,872,875,878,881,884,887,890,893,896,899,902,905,908,911,914,917,920,923,926,929,932,933,936,939,942,945,948,951,954,957,960,963,966,969,972,975,978,981],{"path":640,"title":641},"\u002Fdocs\u002Fbenchmarks","Benchmarks",{"path":643,"title":644},"\u002Fdocs\u002Fbun-users","For bun users",{"path":646,"title":647},"\u002Fdocs\u002Fcli\u002Fadd","scpm add",{"path":649,"title":596},"\u002Fdocs\u002Fcli\u002Fapprove-builds",{"path":651,"title":652},"\u002Fdocs\u002Fcli\u002Faudit","scpm audit",{"path":654,"title":655},"\u002Fdocs\u002Fcli\u002Fbin","scpm bin",{"path":657,"title":658},"\u002Fdocs\u002Fcli\u002Fcache","scpm cache",{"path":660,"title":661},"\u002Fdocs\u002Fcli\u002Fcache\u002Fdelete","scpm cache delete",{"path":663,"title":664},"\u002Fdocs\u002Fcli\u002Fcache\u002Flist","scpm cache list",{"path":666,"title":667},"\u002Fdocs\u002Fcli\u002Fcache\u002Flist-registries","scpm cache list-registries",{"path":669,"title":670},"\u002Fdocs\u002Fcli\u002Fcache\u002Fprune","scpm cache prune",{"path":672,"title":673},"\u002Fdocs\u002Fcli\u002Fcache\u002Fview","scpm cache view",{"path":675,"title":676},"\u002Fdocs\u002Fcli\u002Fcat-file","scpm cat-file",{"path":678,"title":679},"\u002Fdocs\u002Fcli\u002Fcat-index","scpm cat-index",{"path":681,"title":682},"\u002Fdocs\u002Fcli\u002Fcheck","scpm check",{"path":684,"title":685},"\u002Fdocs\u002Fcli\u002Fci","scpm ci",{"path":687,"title":688},"\u002Fdocs\u002Fcli\u002Fclean","scpm clean",{"path":690,"title":691},"\u002Fdocs\u002Fcli\u002Fcompletion","scpm completion",{"path":693,"title":694},"\u002Fdocs\u002Fcli\u002Fconfig","scpm config",{"path":696,"title":697},"\u002Fdocs\u002Fcli\u002Fconfig\u002Fdelete","scpm config delete",{"path":699,"title":700},"\u002Fdocs\u002Fcli\u002Fconfig\u002Fexplain","scpm config explain",{"path":702,"title":703},"\u002Fdocs\u002Fcli\u002Fconfig\u002Ffind","scpm config find",{"path":705,"title":706},"\u002Fdocs\u002Fcli\u002Fconfig\u002Fget","scpm config get",{"path":708,"title":709},"\u002Fdocs\u002Fcli\u002Fconfig\u002Flist","scpm config list",{"path":711,"title":712},"\u002Fdocs\u002Fcli\u002Fconfig\u002Fset","scpm config set",{"path":714,"title":715},"\u002Fdocs\u002Fcli\u002Fconfig\u002Ftui","scpm config tui",{"path":717,"title":718},"\u002Fdocs\u002Fcli\u002Fcreate","scpm create",{"path":720,"title":721},"\u002Fdocs\u002Fcli\u002Fdedupe","scpm dedupe",{"path":723,"title":724},"\u002Fdocs\u002Fcli\u002Fdeploy","scpm deploy",{"path":726,"title":727},"\u002Fdocs\u002Fcli\u002Fdeprecate","scpm deprecate",{"path":729,"title":730},"\u002Fdocs\u002Fcli\u002Fdeprecations","scpm deprecations",{"path":732,"title":733},"\u002Fdocs\u002Fcli\u002Fdiag","scpm diag",{"path":735,"title":736},"\u002Fdocs\u002Fcli\u002Fdiag\u002Fanalyze","scpm diag analyze",{"path":738,"title":739},"\u002Fdocs\u002Fcli\u002Fdiag\u002Fcompare","scpm diag compare",{"path":741,"title":742},"\u002Fdocs\u002Fcli\u002Fdist-tag","scpm dist-tag",{"path":744,"title":745},"\u002Fdocs\u002Fcli\u002Fdist-tag\u002Fadd","scpm dist-tag add",{"path":747,"title":748},"\u002Fdocs\u002Fcli\u002Fdist-tag\u002Fls","scpm dist-tag ls",{"path":750,"title":751},"\u002Fdocs\u002Fcli\u002Fdist-tag\u002Frm","scpm dist-tag rm",{"path":753,"title":754},"\u002Fdocs\u002Fcli\u002Fdlx","scpm dlx",{"path":756,"title":757},"\u002Fdocs\u002Fcli\u002Fdoctor","scpm doctor",{"path":759,"title":760},"\u002Fdocs\u002Fcli\u002Fexec","scpm exec",{"path":762,"title":763},"\u002Fdocs\u002Fcli\u002Ffetch","scpm fetch",{"path":765,"title":766},"\u002Fdocs\u002Fcli\u002Ffind-hash","scpm find-hash",{"path":768,"title":769},"\u002Fdocs\u002Fcli\u002Fignored-builds","scpm ignored-builds",{"path":771,"title":772},"\u002Fdocs\u002Fcli\u002Fimport","scpm import",{"path":774,"title":775},"\u002Fdocs\u002Fcli","scpm",{"path":777,"title":778},"\u002Fdocs\u002Fcli\u002Finit","scpm init",{"path":780,"title":781},"\u002Fdocs\u002Fcli\u002Finstall","scpm install",{"path":783,"title":784},"\u002Fdocs\u002Fcli\u002Flicenses","scpm licenses",{"path":786,"title":787},"\u002Fdocs\u002Fcli\u002Flink","scpm link",{"path":789,"title":790},"\u002Fdocs\u002Fcli\u002Flist","scpm list",{"path":792,"title":793},"\u002Fdocs\u002Fcli\u002Flogin","scpm login",{"path":795,"title":796},"\u002Fdocs\u002Fcli\u002Flogout","scpm logout",{"path":798,"title":799},"\u002Fdocs\u002Fcli\u002Foutdated","scpm outdated",{"path":801,"title":802},"\u002Fdocs\u002Fcli\u002Fpack","scpm pack",{"path":804,"title":805},"\u002Fdocs\u002Fcli\u002Fpatch","scpm patch",{"path":807,"title":808},"\u002Fdocs\u002Fcli\u002Fpatch-commit","scpm patch-commit",{"path":810,"title":811},"\u002Fdocs\u002Fcli\u002Fpatch-remove","scpm patch-remove",{"path":813,"title":814},"\u002Fdocs\u002Fcli\u002Fpeers","scpm peers",{"path":816,"title":817},"\u002Fdocs\u002Fcli\u002Fpeers\u002Fcheck","scpm peers check",{"path":819,"title":820},"\u002Fdocs\u002Fcli\u002Fprune","scpm prune",{"path":822,"title":823},"\u002Fdocs\u002Fcli\u002Fpublish","scpm publish",{"path":825,"title":826},"\u002Fdocs\u002Fcli\u002Fpurge","scpm purge",{"path":828,"title":829},"\u002Fdocs\u002Fcli\u002Fquery","scpm query",{"path":831,"title":832},"\u002Fdocs\u002Fcli\u002Frebuild","scpm rebuild",{"path":834,"title":835},"\u002Fdocs\u002Fcli\u002Frecursive","scpm recursive",{"path":837,"title":838},"\u002Fdocs\u002Fcli\u002Fremove","scpm remove",{"path":840,"title":841},"\u002Fdocs\u002Fcli\u002Frestart","scpm restart",{"path":843,"title":844},"\u002Fdocs\u002Fcli\u002Froot","scpm root",{"path":846,"title":847},"\u002Fdocs\u002Fcli\u002Frun","scpm run",{"path":849,"title":850},"\u002Fdocs\u002Fcli\u002Fsbom","scpm sbom",{"path":852,"title":853},"\u002Fdocs\u002Fcli\u002Fsponsors","scpm sponsors",{"path":855,"title":856},"\u002Fdocs\u002Fcli\u002Fstage","scpm stage",{"path":858,"title":859},"\u002Fdocs\u002Fcli\u002Fstart","scpm start",{"path":861,"title":862},"\u002Fdocs\u002Fcli\u002Fstop","scpm stop",{"path":864,"title":865},"\u002Fdocs\u002Fcli\u002Fstore","scpm store",{"path":867,"title":868},"\u002Fdocs\u002Fcli\u002Fstore\u002Fadd","scpm store add",{"path":870,"title":871},"\u002Fdocs\u002Fcli\u002Fstore\u002Fpath","scpm store path",{"path":873,"title":874},"\u002Fdocs\u002Fcli\u002Fstore\u002Fprune","scpm store prune",{"path":876,"title":877},"\u002Fdocs\u002Fcli\u002Fstore\u002Fstatus","scpm store status",{"path":879,"title":880},"\u002Fdocs\u002Fcli\u002Ftest","scpm test",{"path":882,"title":883},"\u002Fdocs\u002Fcli\u002Fundeprecate","scpm undeprecate",{"path":885,"title":886},"\u002Fdocs\u002Fcli\u002Funlink","scpm unlink",{"path":888,"title":889},"\u002Fdocs\u002Fcli\u002Funpublish","scpm unpublish",{"path":891,"title":892},"\u002Fdocs\u002Fcli\u002Fupdate","scpm update",{"path":894,"title":895},"\u002Fdocs\u002Fcli\u002Fversion","scpm version",{"path":897,"title":898},"\u002Fdocs\u002Fcli\u002Fview","scpm view",{"path":900,"title":901},"\u002Fdocs\u002Fcli\u002Fwhy","scpm why",{"path":903,"title":904},"\u002Fdocs\u002Ferror-codes","Error and warning codes",{"path":906,"title":907},"\u002Fdocs\u002Fgetting-started","Getting Started",{"path":909,"title":910},"\u002Fdocs\u002Fguide","Guide",{"path":912,"title":913},"\u002Fdocs","SCPM Documentation",{"path":915,"title":916},"\u002Fdocs\u002Finstallation","Installation",{"path":918,"title":919},"\u002Fdocs\u002Fnpm-users","For npm users",{"path":921,"title":922},"\u002Fdocs\u002Fpackage-manager\u002Fconfiguration","Configuration",{"path":924,"title":925},"\u002Fdocs\u002Fpackage-manager\u002Fdependencies","Manage dependencies",{"path":927,"title":928},"\u002Fdocs\u002Fpackage-manager\u002Fglobal-virtual-store","Global virtual store",{"path":930,"title":931},"\u002Fdocs\u002Fpackage-manager\u002Finstall","Install dependencies",{"path":634,"title":5},{"path":934,"title":935},"\u002Fdocs\u002Fpackage-manager\u002Flifecycle-scripts","Lifecycle scripts",{"path":937,"title":938},"\u002Fdocs\u002Fpackage-manager\u002Flockfiles","Lockfiles",{"path":940,"title":941},"\u002Fdocs\u002Fpackage-manager\u002Fnode-modules","node_modules layout",{"path":943,"title":944},"\u002Fdocs\u002Fpackage-manager\u002Fpublishing","Publishing",{"path":946,"title":947},"\u002Fdocs\u002Fpackage-manager\u002Fregistry-auth","Registry and auth",{"path":949,"title":950},"\u002Fdocs\u002Fpackage-manager\u002Fscripts","Run scripts and binaries",{"path":952,"title":953},"\u002Fdocs\u002Fpackage-manager\u002Fsecurity-scanner","Security scanner",{"path":955,"title":956},"\u002Fdocs\u002Fpackage-manager\u002Fworkspaces","Workspaces",{"path":958,"title":959},"\u002Fdocs\u002Fpnpm-users","For pnpm users",{"path":961,"title":962},"\u002Fdocs\u002Fsecurity","Security",{"path":964,"title":965},"\u002Fdocs\u002Fsettings\u002Fcli","CLI Settings",{"path":967,"title":968},"\u002Fdocs\u002Fsettings\u002Fenv","Environment Settings",{"path":970,"title":971},"\u002Fdocs\u002Fsettings","Settings",{"path":973,"title":974},"\u002Fdocs\u002Fsettings\u002Fnpmrc",".npmrc Settings",{"path":976,"title":977},"\u002Fdocs\u002Fsettings\u002Fworkspace-yaml","Workspace YAML Settings",{"path":979,"title":980},"\u002Fdocs\u002Ftroubleshooting","Troubleshooting",{"path":982,"title":983},"\u002Fdocs\u002Fyarn-users","For yarn users",1780584396925]