[{"data":1,"prerenderedAt":1813},["ShallowReactive",2],{"docs-doc-en-scnexus-package":3,"docs-list-en":1719},{"doc":4,"locale":1716,"available":1717},{"id":5,"title":6,"body":7,"description":1706,"extension":1707,"group":1708,"meta":1709,"navigation":1710,"order":728,"path":1711,"section":1708,"seo":1712,"stem":1713,"updated":1714,"__hash__":1715},"docs_en\u002Fdocs\u002Fscnexus-package.md","SCNexus package standard",{"type":8,"value":9,"toc":1695},"minimark",[10,14,27,32,42,74,78,142,151,236,258,262,265,512,544,583,732,738,742,759,865,933,947,950,983,986,991,1049,1067,1076,1080,1099,1233,1243,1246,1336,1342,1365,1400,1403,1462,1465,1469,1472,1584,1587,1591,1629,1632,1636,1674,1691],[11,12,13],"p",{},"SCNexus treats an archive as the installer itself: the player imports it, the app extracts it, reads the manifest, plans the installation, and places maps and mods into the game directory as declared. Get the directories right and fill the manifest in fully, and installation is entirely automatic.",[11,15,16,17,21,22,26],{},"This page defines the fields of that manifest. The manifest file is ",[18,19,20],"code",{},"package.json"," — it is the ",[23,24,25],"strong",{},"SCNexus work manifest"," and has nothing to do with the dependency file of a Node.js project; scripts or URLs inside it are never executed as code.",[28,29,31],"h2",{"id":30},"the-basic-shape-of-a-package","The basic shape of a package",[33,34,40],"pre",{"className":35,"code":37,"language":38,"meta":39},[36],"language-text","My Project\u002F\n├─ package.json\n├─ Maps\u002F\n│  └─ MyProject\u002F\n│     ├─ Launcher.SC2Map\n│     └─ Chapter01.SC2Map\n└─ Mods\u002F\n   └─ MyProject.SC2Mod\n","text","",[18,41,37],{"__ignoreMap":39},[43,44,45,49,71],"ul",{},[46,47,48],"li",{},"The manifest sits in the archive root and there is exactly one. When uploading to the Workshop the root must be the manifest itself, with no extra \"My Project\" folder around it; local imports can still find it one level down for compatibility, but new works should not rely on that.",[46,50,51,54,55,58,59,62,63,66,67,70],{},[18,52,53],{},"Maps\u002F"," and ",[18,56,57],{},"Mods\u002F"," are ",[23,60,61],{},"logical path prefixes",", not absolute paths on disk. ",[18,64,65],{},"source_path"," in the manifest is relative to the package root and ",[18,68,69],{},"target_path"," is relative to the game directory; neither should contain a path from your own machine.",[46,72,73],{},"The manifest is standard UTF-8 JSON: no comments, no trailing commas, no duplicate field names.",[28,75,77],{"id":76},"work-types","Work types",[79,80,81,99],"table",{},[82,83,84],"thead",{},[85,86,87,93,96],"tr",{},[88,89,90],"th",{},[18,91,92],{},"type",[88,94,95],{},"Meaning",[88,97,98],{},"What happens after installation",[100,101,102,116,129],"tbody",{},[85,103,104,110,113],{},[105,106,107],"td",{},[18,108,109],{},"campaign",[105,111,112],{},"A work that replaces the matching official campaign",[105,114,115],{},"After activating it in Campaigns, the campaign is entered from the game",[85,117,118,123,126],{},[105,119,120],{},[18,121,122],{},"customize",[105,124,125],{},"A standalone custom map or work",[105,127,128],{},"Installed where declared, launchable from the client through a launcher map",[85,130,131,136,139],{},[105,132,133],{},[18,134,135],{},"dependency",[105,137,138],{},"A mod package shared by several works",[105,140,141],{},"Installed and uninstalled on its own; supplies mod resources only",[11,143,144,145,147,148,150],{},"A ",[18,146,109],{}," must also give the ",[18,149,109],{}," field, with these values and the map regions they correspond to:",[79,152,153,166],{},[82,154,155],{},[85,156,157,160,163],{},[88,158,159],{},"Value",[88,161,162],{},"Campaign",[88,164,165],{},"Map region the client recognises",[100,167,168,184,203,221],{},[85,169,170,175,178],{},[105,171,172],{},[18,173,174],{},"WOL",[105,176,177],{},"Wings of Liberty",[105,179,180,183],{},[18,181,182],{},"\u002FMaps\u002FCampaign\u002F",", excluding the other campaign subdirectories",[85,185,186,191,194],{},[105,187,188],{},[18,189,190],{},"HOTS",[105,192,193],{},"Heart of the Swarm",[105,195,196,199,200],{},[18,197,198],{},"\u002FMaps\u002FCampaign\u002Fswarm\u002F",", including ",[18,201,202],{},"evolution\u002F",[85,204,205,210,213],{},[105,206,207],{},[18,208,209],{},"LOTV",[105,211,212],{},"Legacy of the Void",[105,214,215,54,218],{},[18,216,217],{},"\u002FMaps\u002FCampaign\u002Fvoid\u002F",[18,219,220],{},"\u002FMaps\u002FCampaign\u002Fvoidprologue\u002F",[85,222,223,228,231],{},[105,224,225],{},[18,226,227],{},"NCO",[105,229,230],{},"Nova Covert Ops",[105,232,233],{},[18,234,235],{},"\u002FMaps\u002FCampaign\u002Fnova\u002F",[11,237,238,239,242,243,242,245,242,248,242,251,242,254,257],{},"A dependency package may not declare ",[18,240,241],{},"maps",", ",[18,244,109],{},[18,246,247],{},"manager",[18,249,250],{},"launcher",[18,252,253],{},"dependencies",[18,255,256],{},"localization"," or any of the save-related fields.",[28,259,261],{"id":260},"common-fields","Common fields",[11,263,264],{},"These fields apply to all three types.",[79,266,267,283],{},[82,268,269],{},[85,270,271,274,277,280],{},[88,272,273],{},"Field",[88,275,276],{},"Type",[88,278,279],{},"Required",[88,281,282],{},"Description",[100,284,285,306,320,334,348,362,378,393,407,422,436,450,464,478,492],{},[85,286,287,291,294,297],{},[105,288,289],{},[18,290,92],{},[105,292,293],{},"string",[105,295,296],{},"yes",[105,298,299,300,242,302,242,304],{},"One of ",[18,301,109],{},[18,303,122],{},[18,305,135],{},[85,307,308,313,315,317],{},[105,309,310],{},[18,311,312],{},"name",[105,314,293],{},[105,316,296],{},[105,318,319],{},"Work name; may not be blank",[85,321,322,327,329,331],{},[105,323,324],{},[18,325,326],{},"description",[105,328,293],{},[105,330,296],{},[105,332,333],{},"Short description",[85,335,336,341,343,345],{},[105,337,338],{},[18,339,340],{},"version",[105,342,293],{},[105,344,296],{},[105,346,347],{},"Work version; a semantic version is recommended",[85,349,350,355,357,359],{},[105,351,352],{},[18,353,354],{},"author",[105,356,293],{},[105,358,296],{},[105,360,361],{},"Author or team",[85,363,364,369,372,375],{},[105,365,366],{},[18,367,368],{},"scnid",[105,370,371],{},"number",[105,373,374],{},"no",[105,376,377],{},"Workshop project number, a non-negative safe integer; never a string",[85,379,380,385,388,390],{},[105,381,382],{},[18,383,384],{},"tags",[105,386,387],{},"string array",[105,389,374],{},[105,391,392],{},"Work tags",[85,394,395,400,402,404],{},[105,396,397],{},[18,398,399],{},"website",[105,401,293],{},[105,403,374],{},[105,405,406],{},"Work website",[85,408,409,414,417,419],{},[105,410,411],{},[18,412,413],{},"social",[105,415,416],{},"object",[105,418,374],{},[105,420,421],{},"Social links, see below",[85,423,424,429,431,433],{},[105,425,426],{},[18,427,428],{},"sponsor",[105,430,416],{},[105,432,374],{},[105,434,435],{},"Sponsorship links, see below",[85,437,438,443,445,447],{},[105,439,440],{},[18,441,442],{},"$schema",[105,444,293],{},[105,446,374],{},[105,448,449],{},"JSON Schema URL for editors; not a format version",[85,451,452,457,459,461],{},[105,453,454],{},[18,455,456],{},"readme",[105,458,293],{},[105,460,374],{},[105,462,463],{},"Path to the readme inside the package",[85,465,466,471,473,475],{},[105,467,468],{},[18,469,470],{},"changelog",[105,472,293],{},[105,474,374],{},[105,476,477],{},"Path to the changelog inside the package",[85,479,480,485,487,489],{},[105,481,482],{},[18,483,484],{},"docs",[105,486,387],{},[105,488,374],{},[105,490,491],{},"Additional documents inside the package",[85,493,494,499,501,503],{},[105,495,496],{},[18,497,498],{},"assets",[105,500,387],{},[105,502,374],{},[105,504,505,506,54,509],{},"Allowlist of other display attachments, supporting ",[18,507,508],{},"*",[18,510,511],{},"**",[11,513,514,515,518,519,522,523,54,526,529,530,242,533,536,537,540,541,543],{},"Write the version as ",[18,516,517],{},"major.minor.patch",", for example ",[18,520,521],{},"1.2.3","; pre-releases and build metadata may look like ",[18,524,525],{},"1.2.3-beta.1",[18,527,528],{},"1.2.3+build.5",". Do not use ",[18,531,532],{},"v1.2.3",[18,534,535],{},"latest"," or ",[18,538,539],{},"1.2"," as a release version. Manifest validation only requires ",[18,542,340],{}," to be valid text; Workshop uploads and GitHub sources run their own full semantic-version checks.",[11,545,546,548,549,242,552,242,555,242,558,242,561,54,564,567,568,548,570,242,573,242,576,54,579,582],{},[18,547,413],{}," accepts ",[18,550,551],{},"twitter",[18,553,554],{},"discord",[18,556,557],{},"youtube",[18,559,560],{},"weibo",[18,562,563],{},"bilibili",[18,565,566],{},"qq_group","; ",[18,569,428],{},[18,571,572],{},"paypal",[18,574,575],{},"patreon",[18,577,578],{},"buymeacoffee",[18,580,581],{},"afdian",". All values are strings:",[33,584,588],{"className":585,"code":586,"language":587,"meta":39,"style":39},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"website\": \"https:\u002F\u002Fexample.com\u002Fproject\",\n  \"social\": {\n    \"bilibili\": \"https:\u002F\u002Fspace.bilibili.com\u002F123456\",\n    \"qq_group\": \"123456789\"\n  },\n  \"sponsor\": {\n    \"afdian\": \"https:\u002F\u002Fexample.com\u002Fsupport\"\n  }\n}\n","json",[18,589,590,599,628,642,664,683,689,702,720,726],{"__ignoreMap":39},[591,592,595],"span",{"class":593,"line":594},"line",1,[591,596,598],{"class":597},"sP7_E","{\n",[591,600,602,606,609,612,615,619,623,625],{"class":593,"line":601},2,[591,603,605],{"class":604},"s39Yj","  \"",[591,607,399],{"class":608},"sseR_",[591,610,611],{"class":604},"\"",[591,613,614],{"class":597},":",[591,616,618],{"class":617},"sjJ54"," \"",[591,620,622],{"class":621},"s_sjI","https:\u002F\u002Fexample.com\u002Fproject",[591,624,611],{"class":617},[591,626,627],{"class":597},",\n",[591,629,631,633,635,637,639],{"class":593,"line":630},3,[591,632,605],{"class":604},[591,634,413],{"class":608},[591,636,611],{"class":604},[591,638,614],{"class":597},[591,640,641],{"class":597}," {\n",[591,643,645,648,651,653,655,657,660,662],{"class":593,"line":644},4,[591,646,647],{"class":604},"    \"",[591,649,563],{"class":650},"sZMiF",[591,652,611],{"class":604},[591,654,614],{"class":597},[591,656,618],{"class":617},[591,658,659],{"class":621},"https:\u002F\u002Fspace.bilibili.com\u002F123456",[591,661,611],{"class":617},[591,663,627],{"class":597},[591,665,667,669,671,673,675,677,680],{"class":593,"line":666},5,[591,668,647],{"class":604},[591,670,566],{"class":650},[591,672,611],{"class":604},[591,674,614],{"class":597},[591,676,618],{"class":617},[591,678,679],{"class":621},"123456789",[591,681,682],{"class":617},"\"\n",[591,684,686],{"class":593,"line":685},6,[591,687,688],{"class":597},"  },\n",[591,690,692,694,696,698,700],{"class":593,"line":691},7,[591,693,605],{"class":604},[591,695,428],{"class":608},[591,697,611],{"class":604},[591,699,614],{"class":597},[591,701,641],{"class":597},[591,703,705,707,709,711,713,715,718],{"class":593,"line":704},8,[591,706,647],{"class":604},[591,708,581],{"class":650},[591,710,611],{"class":604},[591,712,614],{"class":597},[591,714,618],{"class":617},[591,716,717],{"class":621},"https:\u002F\u002Fexample.com\u002Fsupport",[591,719,682],{"class":617},[591,721,723],{"class":593,"line":722},9,[591,724,725],{"class":597},"  }\n",[591,727,729],{"class":593,"line":728},10,[591,730,731],{"class":597},"}\n",[11,733,734,735,737],{},"Never invent a Workshop project number; when linking a project, use the ",[18,736,368],{}," actually assigned to it. Social and sponsorship details are not guaranteed to appear on every client screen.",[28,739,741],{"id":740},"resource-declarations","Resource declarations",[11,743,744,745,54,747,750,751,754,755,758],{},"Maps and mods go into the ",[18,746,241],{},[18,748,749],{},"mods"," arrays. Map files end in ",[18,752,753],{},".SC2Map"," and mods in ",[18,756,757],{},".SC2Mod","; the check is case-insensitive.",[79,760,761,773],{},[82,762,763],{},[85,764,765,767,769,771],{},[88,766,273],{},[88,768,276],{},[88,770,279],{},[88,772,282],{},[100,774,775,788,809,824,837,850],{},[85,776,777,781,783,785],{},[105,778,779],{},[18,780,312],{},[105,782,293],{},[105,784,296],{},[105,786,787],{},"Resource name including its extension; the launcher references maps by this",[85,789,790,794,796,798],{},[105,791,792],{},[18,793,65],{},[105,795,293],{},[105,797,296],{},[105,799,800,801,804,805,808],{},"Path inside the package, starting with ",[18,802,803],{},"\u002FMaps\u002F"," for maps and ",[18,806,807],{},"\u002FMods\u002F"," for mods",[85,810,811,815,817,819],{},[105,812,813],{},[18,814,69],{},[105,816,293],{},[105,818,374],{},[105,820,821,822],{},"Logical target path in the game directory; defaults to ",[18,823,65],{},[85,825,826,830,832,834],{},[105,827,828],{},[18,829,326],{},[105,831,293],{},[105,833,374],{},[105,835,836],{},"Resource description",[85,838,839,843,845,847],{},[105,840,841],{},[18,842,340],{},[105,844,293],{},[105,846,374],{},[105,848,849],{},"The resource's own version; does not replace the work version",[85,851,852,857,860,862],{},[105,853,854],{},[18,855,856],{},"components",[105,858,859],{},"boolean",[105,861,374],{},[105,863,864],{},"The resource is stored as a component directory; the actual file layout decides",[33,866,868],{"className":585,"code":867,"language":587,"meta":39,"style":39},"{\n  \"name\": \"Launcher.SC2Map\",\n  \"source_path\": \"\u002FMaps\u002FMyProject\u002FLauncher.SC2Map\",\n  \"target_path\": \"\u002FMaps\u002FMyProject\u002FStart.SC2Map\"\n}\n",[18,869,870,874,893,912,929],{"__ignoreMap":39},[591,871,872],{"class":593,"line":594},[591,873,598],{"class":597},[591,875,876,878,880,882,884,886,889,891],{"class":593,"line":601},[591,877,605],{"class":604},[591,879,312],{"class":608},[591,881,611],{"class":604},[591,883,614],{"class":597},[591,885,618],{"class":617},[591,887,888],{"class":621},"Launcher.SC2Map",[591,890,611],{"class":617},[591,892,627],{"class":597},[591,894,895,897,899,901,903,905,908,910],{"class":593,"line":630},[591,896,605],{"class":604},[591,898,65],{"class":608},[591,900,611],{"class":604},[591,902,614],{"class":597},[591,904,618],{"class":617},[591,906,907],{"class":621},"\u002FMaps\u002FMyProject\u002FLauncher.SC2Map",[591,909,611],{"class":617},[591,911,627],{"class":597},[591,913,914,916,918,920,922,924,927],{"class":593,"line":644},[591,915,605],{"class":604},[591,917,69],{"class":608},[591,919,611],{"class":604},[591,921,614],{"class":597},[591,923,618],{"class":617},[591,925,926],{"class":621},"\u002FMaps\u002FMyProject\u002FStart.SC2Map",[591,928,682],{"class":617},[591,930,931],{"class":593,"line":666},[591,932,731],{"class":597},[11,934,935,936,939,940,943,944,946],{},"The example reads ",[18,937,938],{},"Maps\u002FMyProject\u002FLauncher.SC2Map"," from the package and installs it as ",[18,941,942],{},"Maps\u002FMyProject\u002FStart.SC2Map"," in the game directory. ",[18,945,69],{}," must match the resource paths referenced inside the map — never change it just because it looks nicer.",[11,948,949],{},"Path rules:",[43,951,952,964,974,977,980],{},[46,953,954,955,958,959,54,961,963],{},"Always use ",[18,956,957],{},"\u002F",", and match the case of the ",[18,960,803],{},[18,962,807],{}," prefixes exactly.",[46,965,966,967,54,970,973],{},"Drive letters, network shares, ",[18,968,969],{},".",[18,971,972],{},".."," are not allowed, and nothing may escape the installation directory.",[46,975,976],{},"Declared resources must exist; one target may not be claimed by two resources, and files and directories may not collide.",[46,978,979],{},"Do not pull files from outside the package in through symbolic links.",[46,981,982],{},"For a component-form map or mod, declare the resource root directory rather than listing every file inside it.",[28,984,985],{"id":250},"Launcher",[11,987,988,989,614],{},"Custom content may declare ",[18,990,250],{},[33,992,994],{"className":585,"code":993,"language":587,"meta":39,"style":39},"\"launcher\": {\n  \"name\": \"Launcher.SC2Map\",\n  \"description\": \"Work main menu\"\n}\n",[18,995,996,1010,1028,1045],{"__ignoreMap":39},[591,997,998,1000,1002,1004,1008],{"class":593,"line":594},[591,999,611],{"class":617},[591,1001,250],{"class":621},[591,1003,611],{"class":617},[591,1005,1007],{"class":1006},"su5hD",": ",[591,1009,598],{"class":597},[591,1011,1012,1014,1016,1018,1020,1022,1024,1026],{"class":593,"line":601},[591,1013,605],{"class":604},[591,1015,312],{"class":608},[591,1017,611],{"class":604},[591,1019,614],{"class":597},[591,1021,618],{"class":617},[591,1023,888],{"class":621},[591,1025,611],{"class":617},[591,1027,627],{"class":597},[591,1029,1030,1032,1034,1036,1038,1040,1043],{"class":593,"line":630},[591,1031,605],{"class":604},[591,1033,326],{"class":608},[591,1035,611],{"class":604},[591,1037,614],{"class":597},[591,1039,618],{"class":617},[591,1041,1042],{"class":621},"Work main menu",[591,1044,682],{"class":617},[591,1046,1047],{"class":593,"line":644},[591,1048,731],{"class":597},[11,1050,1051,1054,1055,1057,1058,1061,1062,1064,1065,969],{},[18,1052,1053],{},"launcher.name"," must exactly match the ",[18,1056,312],{}," of ",[23,1059,1060],{},"one"," entry in ",[18,1063,241],{}," — it is not a file path and not the installed ",[18,1066,69],{},[11,1068,1069,1070,536,1072,1075],{},"When it is not declared, the client tries to recognise common names such as ",[18,1071,888],{},[18,1073,1074],{},"启动器.SC2Map"," and lets the player pick during installation confirmation; the launcher map can also be changed later in the work's details. The player's local choice never rewrites the author's manifest.",[28,1077,1079],{"id":1078},"bundled-images-and-documents","Bundled images and documents",[11,1081,1082,1083,1086,1087,1090,1091,242,1093,242,1095,54,1097,969],{},"Campaigns may declare ",[18,1084,1085],{},"banner"," and custom content may declare ",[18,1088,1089],{},"cover","; the two cannot be swapped or used together, and dependencies may use neither. All three types may declare ",[18,1092,456],{},[18,1094,470],{},[18,1096,484],{},[18,1098,498],{},[33,1100,1102],{"className":585,"code":1101,"language":587,"meta":39,"style":39},"{\n  \"cover\": \"images\u002Fcover.webp\",\n  \"readme\": \"docs\u002FREADME.md\",\n  \"changelog\": \"docs\u002FCHANGELOG.txt\",\n  \"docs\": [\"docs\u002Fguide.md\", \"docs\u002Fcredits.txt\"],\n  \"assets\": [\"images\u002F**\", \"docs\u002F*.md\"]\n}\n",[18,1103,1104,1108,1127,1146,1165,1198,1229],{"__ignoreMap":39},[591,1105,1106],{"class":593,"line":594},[591,1107,598],{"class":597},[591,1109,1110,1112,1114,1116,1118,1120,1123,1125],{"class":593,"line":601},[591,1111,605],{"class":604},[591,1113,1089],{"class":608},[591,1115,611],{"class":604},[591,1117,614],{"class":597},[591,1119,618],{"class":617},[591,1121,1122],{"class":621},"images\u002Fcover.webp",[591,1124,611],{"class":617},[591,1126,627],{"class":597},[591,1128,1129,1131,1133,1135,1137,1139,1142,1144],{"class":593,"line":630},[591,1130,605],{"class":604},[591,1132,456],{"class":608},[591,1134,611],{"class":604},[591,1136,614],{"class":597},[591,1138,618],{"class":617},[591,1140,1141],{"class":621},"docs\u002FREADME.md",[591,1143,611],{"class":617},[591,1145,627],{"class":597},[591,1147,1148,1150,1152,1154,1156,1158,1161,1163],{"class":593,"line":644},[591,1149,605],{"class":604},[591,1151,470],{"class":608},[591,1153,611],{"class":604},[591,1155,614],{"class":597},[591,1157,618],{"class":617},[591,1159,1160],{"class":621},"docs\u002FCHANGELOG.txt",[591,1162,611],{"class":617},[591,1164,627],{"class":597},[591,1166,1167,1169,1171,1173,1175,1178,1180,1183,1185,1188,1190,1193,1195],{"class":593,"line":666},[591,1168,605],{"class":604},[591,1170,484],{"class":608},[591,1172,611],{"class":604},[591,1174,614],{"class":597},[591,1176,1177],{"class":597}," [",[591,1179,611],{"class":617},[591,1181,1182],{"class":621},"docs\u002Fguide.md",[591,1184,611],{"class":617},[591,1186,1187],{"class":597},",",[591,1189,618],{"class":617},[591,1191,1192],{"class":621},"docs\u002Fcredits.txt",[591,1194,611],{"class":617},[591,1196,1197],{"class":597},"],\n",[591,1199,1200,1202,1204,1206,1208,1210,1212,1215,1217,1219,1221,1224,1226],{"class":593,"line":685},[591,1201,605],{"class":604},[591,1203,498],{"class":608},[591,1205,611],{"class":604},[591,1207,614],{"class":597},[591,1209,1177],{"class":597},[591,1211,611],{"class":617},[591,1213,1214],{"class":621},"images\u002F**",[591,1216,611],{"class":617},[591,1218,1187],{"class":597},[591,1220,618],{"class":617},[591,1222,1223],{"class":621},"docs\u002F*.md",[591,1225,611],{"class":617},[591,1227,1228],{"class":597},"]\n",[591,1230,1231],{"class":593,"line":691},[591,1232,731],{"class":597},[11,1234,1235,1236,1239,1240,1242],{},"These paths are relative to ",[23,1237,1238],{},"the archive root","; writing them without a leading ",[18,1241,957],{}," is recommended. The manifest only declares paths and does not check that the files exist; reading them, validating them and displaying them is the client's job.",[11,1244,1245],{},"When a field is omitted, the client probes for default names next to the manifest in a fixed order (exact match, case-sensitive):",[79,1247,1248,1257],{},[82,1249,1250],{},[85,1251,1252,1254],{},[88,1253,273],{},[88,1255,1256],{},"Probe order",[100,1258,1259,1278,1296,1316],{},[85,1260,1261,1266],{},[105,1262,1263,1265],{},[18,1264,1085],{}," (campaigns only)",[105,1267,1268,1271,1272,1271,1275],{},[18,1269,1270],{},"banner.jpg"," → ",[18,1273,1274],{},"banner.png",[18,1276,1277],{},"banner.webp",[85,1279,1280,1285],{},[105,1281,1282,1284],{},[18,1283,1089],{}," (custom content only)",[105,1286,1287,1271,1290,1271,1293],{},[18,1288,1289],{},"cover.jpg",[18,1291,1292],{},"cover.png",[18,1294,1295],{},"cover.webp",[85,1297,1298,1302],{},[105,1299,1300],{},[18,1301,456],{},[105,1303,1304,1271,1307,1271,1310,1271,1313],{},[18,1305,1306],{},"README.txt",[18,1308,1309],{},"README.md",[18,1311,1312],{},"readme.txt",[18,1314,1315],{},"readme.md",[85,1317,1318,1322],{},[105,1319,1320],{},[18,1321,470],{},[105,1323,1324,1271,1327,1271,1330,1271,1333],{},[18,1325,1326],{},"CHANGELOG.txt",[18,1328,1329],{},"CHANGELOG.md",[18,1331,1332],{},"changelog.txt",[18,1334,1335],{},"changelog.md",[11,1337,1338,1339,1341],{},"If an image path is written explicitly but the file is missing or cannot be loaded, the client falls back to its default image without probing; if a document path is written explicitly but missing, that document is skipped, again without probing. ",[18,1340,484],{}," reads the listed files only and never scans a directory.",[11,1343,1344,1346,1347,1350,1351,242,1353,242,1355,1357,1358,1360,1361,1364],{},[18,1345,498],{}," is the allowlist for ",[23,1348,1349],{},"other attachments",". Explicitly declared images, ",[18,1352,456],{},[18,1354,470],{},[18,1356,484],{}," and the default candidates are included automatically and need not be listed again; any other attachment — including images linked from a document and a second document — must match ",[18,1359,498],{},". Leaving it out or writing ",[18,1362,1363],{},"[]"," keeps no unlisted attachments at all.",[11,1366,1367,1368,1370,1371,1373,1374,1377,1378,242,1381,1384,1385,1388,1389,1392,1393,1396,1397,1399],{},"The allowlist supports ",[18,1369,508],{}," within a single segment and ",[18,1372,511],{}," as a standalone segment: ",[18,1375,1376],{},"images\u002F*.png"," does not match ",[18,1379,1380],{},"images\u002Fsub\u002Fa.png",[18,1382,1383],{},"images\u002F**\u002F*.png"," matches at both levels, and ",[18,1386,1387],{},"**\u002F*.md"," also matches ",[18,1390,1391],{},"guide.md"," in the root. ",[18,1394,1395],{},"?",", brackets, braces, negation and ",[18,1398,511],{}," inside a segment are not supported.",[11,1401,1402],{},"What the current client will read:",[79,1404,1405,1415],{},[82,1406,1407],{},[85,1408,1409,1412],{},[88,1410,1411],{},"Item",[88,1413,1414],{},"Limit",[100,1416,1417,1425,1441,1449],{},[85,1418,1419,1422],{},[105,1420,1421],{},"Image formats and size",[105,1423,1424],{},"JPEG \u002F PNG \u002F WebP, ≤ 8 MiB per file; everything is decoded and shown as PNG",[85,1426,1427,1430],{},[105,1428,1429],{},"Document formats and size",[105,1431,1432,1433,1436,1437,1440],{},"UTF-8 ",[18,1434,1435],{},".md"," \u002F ",[18,1438,1439],{},".txt",", ≤ 1 MiB per file",[85,1442,1443,1446],{},[105,1444,1445],{},"Total attachments",[105,1447,1448],{},"At most 256 files, ≤ 64 MiB combined",[85,1450,1451,1454],{},[105,1452,1453],{},"Links inside documents",[105,1455,1456,1457,1436,1459,1461],{},"Only to ",[18,1458,1435],{},[18,1460,1439],{}," inside the same work package, optionally with a heading fragment; remote resources are never loaded",[11,1463,1464],{},"Attachments are kept as private copies managed by the client, so they can still be read after the original archive or source folder is gone, and later scans do not drop them.",[28,1466,1468],{"id":1467},"other-optional-fields","Other optional fields",[11,1470,1471],{},"These are available to campaigns and custom content only.",[79,1473,1474,1486],{},[82,1475,1476],{},[85,1477,1478,1480,1483],{},[88,1479,273],{},[88,1481,1482],{},"Structure",[88,1484,1485],{},"Current meaning",[100,1487,1488,1516,1532,1550,1567],{},[85,1489,1490,1494,1497],{},[105,1491,1492],{},[18,1493,256],{},[105,1495,1496],{},"array of objects",[105,1498,1499,1500,1503,1504,242,1506,242,1508,242,1510,54,1512,1515],{},"Each entry has a required ",[18,1501,1502],{},"locale"," plus optional ",[18,1505,312],{},[18,1507,326],{},[18,1509,354],{},[18,1511,340],{},[18,1513,1514],{},"translators","; declaring it does not mean the interface switches language",[85,1517,1518,1522,1524],{},[105,1519,1520],{},[18,1521,253],{},[105,1523,1496],{},[105,1525,1526,1527,54,1529,1531],{},"Each entry may hold ",[18,1528,368],{},[18,1530,340],{},"; it describes a dependency and never downloads or installs it",[85,1533,1534,1539,1547],{},[105,1535,1536],{},[18,1537,1538],{},"bank_enable",[105,1540,1541,536,1544],{},[18,1542,1543],{},"\"official\"",[18,1545,1546],{},"\"custom\"",[105,1548,1549],{},"Declares a save mode; it does not mean save migration is implemented",[85,1551,1552,1557,1559],{},[105,1553,1554],{},[18,1555,1556],{},"banks",[105,1558,1496],{},[105,1560,1561,1562,1564,1565],{},"Each entry has ",[18,1563,312],{}," and an optional ",[18,1566,326],{},[85,1568,1569,1573,1581],{},[105,1570,1571],{},[18,1572,247],{},[105,1574,1575,536,1578],{},[18,1576,1577],{},"\"SCNexus\"",[18,1579,1580],{},"\"CCM\"",[105,1582,1583],{},"Declares the work's manager; it cannot turn an arbitrary directory layout into a CCM package",[11,1585,1586],{},"Omit optional fields a new work does not need rather than filling them with empty strings or invented values.",[28,1588,1590],{"id":1589},"validation-happens-in-three-layers","Validation happens in three layers",[79,1592,1593,1603],{},[82,1594,1595],{},[85,1596,1597,1600],{},[88,1598,1599],{},"Layer",[88,1601,1602],{},"What it checks",[100,1604,1605,1613,1621],{},[85,1606,1607,1610],{},[105,1608,1609],{},"JSON Schema",[105,1611,1612],{},"Field names, types, enums and undeclared fields — useful for editor hints",[85,1614,1615,1618],{},[105,1616,1617],{},"Manifest validation",[105,1619,1620],{},"Basic structure, whether the type is one of the three, whether the campaign value is valid, whether the launcher maps to exactly one map, resource path prefixes",[85,1622,1623,1626],{},[105,1624,1625],{},"Client installation",[105,1627,1628],{},"Whether resources exist, path boundaries, archive safety, target conflicts; before installing it also shows the file plan for the player to confirm",[11,1630,1631],{},"A valid structure does not mean it installs, and it does not mean the work has passed a security review. The archive itself has further constraints: entry count, total extracted size, path depth and case collisions are all checked.",[28,1633,1635],{"id":1634},"checking-before-you-publish","Checking before you publish",[1637,1638,1639,1645,1653,1659,1665,1671],"ol",{},[46,1640,1641,1642,1644],{},"The manifest is valid UTF-8 JSON, the basic fields are complete, and ",[18,1643,312],{}," is not blank.",[46,1646,1647,1649,1650,1652],{},[18,1648,92],{}," matches what the work is; a replacement campaign carries the right ",[18,1651,109],{}," value.",[46,1654,1655,1656,1658],{},"The declared resources exist, and ",[18,1657,65],{}," matches the references inside the maps and mods.",[46,1660,1661,1662,1664],{},"The launcher is declared in ",[18,1663,250],{}," and points at exactly one map.",[46,1666,1667,1668,1670],{},"The Workshop archive has a single ",[18,1669,20],{}," directly in its root.",[46,1672,1673],{},"Check the target files in the client's import analysis, then actually launch the work once.",[11,1675,1676,1677,1682,1683,54,1687,969],{},"For how to lay out the authoring side and pack editor output, see ",[1678,1679,1681],"a",{"href":1680},"\u002Fdocs\u002Fpackaging","Packaging a work","; for importing and installing as a player, see ",[1678,1684,1686],{"href":1685},"\u002Fdocs\u002Fcampaign","Campaign management",[1678,1688,1690],{"href":1689},"\u002Fdocs\u002Fcustomize","Custom content",[1692,1693,1694],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":39,"searchDepth":630,"depth":630,"links":1696},[1697,1698,1699,1700,1701,1702,1703,1704,1705],{"id":30,"depth":601,"text":31},{"id":76,"depth":601,"text":77},{"id":260,"depth":601,"text":261},{"id":740,"depth":601,"text":741},{"id":250,"depth":601,"text":985},{"id":1078,"depth":601,"text":1079},{"id":1467,"depth":601,"text":1468},{"id":1589,"depth":601,"text":1590},{"id":1634,"depth":601,"text":1635},"Directory layout, package.json manifest fields, map and mod resource declarations, and how launchers and bundled documents are written for SCNexus work packages.","md","reference",{},true,"\u002Fdocs\u002Fscnexus-package",{"title":6,"description":1706},"docs\u002Fscnexus-package","2026-11-01","i1RbZSy-loFPxvU_W1yjq9RnCBVJstcEYYltQCN3d2o","en",[1716,1718],"zh-CN",[1720,1726,1731,1735,1738,1741,1742,1747,1749,1753,1758,1762,1767,1772,1777,1782,1787,1792,1797,1802,1808],{"path":1721,"title":1722,"description":1723,"order":594,"group":1724,"section":1725,"contentLocale":1718},"\u002Fdocs\u002Feditor","创作流程概览","从在《星际争霸II》编辑器中制作，到打包、分发与更新，说明星际枢纽在创作流程里承担的环节。","start","editor",{"path":1727,"title":1728,"description":1729,"order":594,"group":1724,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Foverview","Getting started","SCNexus is a hub app built for the StarCraft community","app",{"path":1732,"title":1733,"description":1734,"order":594,"group":1708,"section":1708,"contentLocale":1716},"\u002Fdocs\u002Freference","Overview","The packaging and source conventions that importing, installing and distributing content depends on.",{"path":1685,"title":1686,"description":1736,"order":728,"group":1737,"section":1730,"contentLocale":1716},"Import your own campaigns into the library, activate them in the game, and restore the official campaigns at any time","usage",{"path":1680,"title":1739,"description":1740,"order":728,"group":1737,"section":1725,"contentLocale":1718},"打包安装包","把编辑器产出的地图、模组与 package.json 组织成一个能被星际枢纽自动识别并安装的压缩包。",{"path":1711,"title":6,"description":1706,"order":728,"group":1708,"section":1708,"contentLocale":1716},{"path":1743,"title":1744,"description":1745,"order":1746,"group":1708,"section":1708,"contentLocale":1716},"\u002Fdocs\u002Fccm-package","CCM package standard","How CCM describes a campaign in metadata.txt, the key-value format, the directory layout and install targets, and how SCNexus reads these packages.",20,{"path":1689,"title":1690,"description":1748,"order":1746,"group":1737,"section":1730,"contentLocale":1716},"Install maps and mods straight into the game, then pick a launcher map and start in one click",{"path":1750,"title":1751,"description":1752,"order":1746,"group":1737,"section":1725,"contentLocale":1718},"\u002Fdocs\u002Ftoolbox","创作工具 · 编码转换","把中文等非 ASCII 文本转成 Galaxy 代码里可用的转义写法，可选直接转码、字符串、文本与触发调试四种输出。",{"path":1754,"title":1755,"description":1756,"order":1757,"group":1708,"section":1708,"contentLocale":1716},"\u002Fdocs\u002Fgithub-source","GitHub source standard","The manifest and structural requirements a public GitHub repository has to meet to serve as an install source, and how addresses and branches are written.",30,{"path":1759,"title":1760,"description":1761,"order":1757,"group":1737,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Fweekly-mutations","Weekly mutations","This week's mutation map, mutators and community rating, plus the full mutator reference",{"path":1763,"title":1764,"description":1765,"order":1766,"group":1737,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Freplays","Replays","Index replays by StarCraft profile and replay type, with duplicate detection, bulk export and match data",40,{"path":1768,"title":1769,"description":1770,"order":1771,"group":1737,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Fworkshop","Workshop","Browse community works, open their details and download reviewed releases",50,{"path":1773,"title":1774,"description":1775,"order":1776,"group":1737,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Fcreator","Creator center and uploads","Create works, maintain their details, upload new versions and track upload tasks",60,{"path":1778,"title":1779,"description":1780,"order":1781,"group":1737,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Fdownloads","Downloads","Fetch content from GitHub or the Workshop, then install it once you have checked it",70,{"path":1783,"title":1784,"description":1785,"order":1786,"group":1737,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Ftools","Creation tools","Local helpers such as the encoding converter; input is never uploaded or stored",80,{"path":1788,"title":1789,"description":1790,"order":1791,"group":1737,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Fai-assistant","Smart Assistant","A controlled MCP service connecting local data to AI clients on the same machine",90,{"path":1793,"title":1794,"description":1795,"order":1796,"group":1737,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Faccount","Account and personal center","Signing in, your profile and level progression, and setting up and maintaining two-step verification",100,{"path":1798,"title":1799,"description":1800,"order":1801,"group":1737,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Fsettings","Settings","Language, game directories, feature switches and logging privacy, tab by tab",110,{"path":1803,"title":1804,"description":1805,"order":1806,"group":1807,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Fcontributing","Contributing","How to contribute to SCNexus: where the repositories live, how to set up a development environment, what to run before submitting, the code and documentation conventions, the code of conduct, and how to report security issues.",200,"contribute",{"path":1809,"title":1810,"description":1811,"order":1812,"group":1807,"section":1730,"contentLocale":1716},"\u002Fdocs\u002Flocalization","Translating the interface","Where the interface translation files live, how keys are named, how to submit changes, how to verify them locally, and what adding a language touches.",210,1793550744913]