@follenfang/fupload 0.0.24 → 0.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/fupload/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: fupload
|
|
3
3
|
description: Explicit author-publishing workflow for World of Warcraft plugins, configuration shares, and WA/strings on NewBeeBox, NetEase DD, CurseForge, Heybox Workshop, and ModUs.Creator, including local Creator login reuse and plugin ZIP publishing. Use only when the user explicitly invokes `$fupload`, explicitly asks to use the Fupload Skill, or loads this Skill by path. Do not trigger from ordinary mentions of publishing, NewBeeBox, DD, CurseForge, Heybox, ModUs, plugins, configurations, or WA.
|
|
4
4
|
metadata:
|
|
5
|
-
version: "0.0.
|
|
5
|
+
version: "0.0.25"
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Fupload
|
|
@@ -131,7 +131,7 @@ PUT are separate stages.
|
|
|
131
131
|
| `file_id` | `fileId` | positive integer | update/edit/delete required; upload allocates | `GET /game/data/author/project/fileId/{projectId}` | allocated ID is used by signature; create metadata omits it | update/delete/signature | `id`/`fileId` in release detail |
|
|
132
132
|
| `version` | `version` | non-empty string, max 120 | create/upload required after ZIP preflight | ZIP `.toc` plus caller label | caller value preserved | metadata create/update | `version` |
|
|
133
133
|
| `type` | `type` | non-empty string, max 40 | create/upload required | Creator release-type choices/API | must be a server-supported value | metadata create/update | `type` |
|
|
134
|
-
| `supported_game_versions` | `supportedGameVersionsReqs[]` | non-empty object array | required; ZIP-derived | installed `.toc` `Interface` values and game config | each entry requires string `gameVersion` and `server`; explicit caller
|
|
134
|
+
| `supported_game_versions` | `supportedGameVersionsReqs[]` | non-empty object array | required; defaults to ZIP-derived builds | installed `.toc` `Interface` values and game config | each entry requires string `gameVersion` and `server`; explicit caller values must be live `wow_builds` choices on client branches declared in the ZIP | metadata create/update | `supportedGameVersionsReqs`/version compatibility rows |
|
|
135
135
|
| `md5` | `md5` | hex string, max 64 | derived from exact ZIP bytes | local ZIP preflight | must describe bytes later PUT | metadata create/update | `md5` |
|
|
136
136
|
| `zip_size` | `zipSize` | non-negative integer | derived | local ZIP stat | must describe exact ZIP | metadata create/update | `zipSize` |
|
|
137
137
|
| `unzip_size` | `unzipSize` | non-negative integer | derived | ZIP central directory | bounded by ZIP preflight | metadata create/update | `unzipSize` |
|
|
@@ -149,7 +149,7 @@ before file-ID allocation and ZIP preflight, so those early failures are also
|
|
|
149
149
|
durable. Binary-upload errors expose only a query-free endpoint identifier,
|
|
150
150
|
status when available, and a bounded redacted response summary. The provider parses each addon `.toc`
|
|
151
151
|
`Interface` value to derive
|
|
152
|
-
`toc_version` and `supported_game_versions`, and ignores TOCs under a `Libs` directory. Explicit `toc_version` must match. Known clients absent from live `wow_builds` are excluded from automatic selection; unknown Interface codes still fail.
|
|
152
|
+
`toc_version` and `supported_game_versions`, and ignores TOCs under a `Libs` directory. Explicit `toc_version` must match. Interface `16001` maps to `wow_forever` / `1.60.1`. Known clients absent from live `wow_builds` are excluded from automatic selection; unknown Interface codes still fail. Omitted `supported_game_versions` continues to select only exact TOC-derived builds offered by the live service. Explicit values are the author's compatibility declaration: they may select a newer live build (for example `12.1.5` for a `120100` retail TOC), but cannot add a client branch absent from the ZIP or a build absent from live choices. Empty and duplicate selections are rejected. This does not rewrite the ZIP or `toc_version`, or automatically assert compatibility with newer builds. Creator `plugin get/versions` uses the Creator session; main-client addon reads retain their separate session.
|
|
153
153
|
The provider validates the ZIP, computes `md5`, `zip_size`, and `unzip_size`,
|
|
154
154
|
registers metadata, obtains a signed URL, then uploads the ZIP bytes with HTTP
|
|
155
155
|
`PUT` and `Content-Type: application/zip`. A local path is metadata only; it is
|
|
@@ -40,6 +40,7 @@ INTERFACE_GAME_VERSION_MAP: Mapping[str, Mapping[str, str]] = {
|
|
|
40
40
|
"11508": {"gameVersion": "Classic Era", "server": "wow_classic_era"},
|
|
41
41
|
"40401": {"gameVersion": "Cataclysm Classic", "server": "wow_classic_cata"},
|
|
42
42
|
"11509": {"gameVersion": "1.15.9", "server": "wow_classic_era"},
|
|
43
|
+
"16001": {"gameVersion": "1.60.1", "server": "wow_forever"},
|
|
43
44
|
"20506": {"gameVersion": "2.5.6", "server": "wow_anniversary"},
|
|
44
45
|
"38002": {"gameVersion": "3.80.2", "server": "wow_classic_titan"},
|
|
45
46
|
"40402": {"gameVersion": "4.4.2", "server": "wow_classic_cata"},
|
|
@@ -48,7 +49,7 @@ INTERFACE_GAME_VERSION_MAP: Mapping[str, Mapping[str, str]] = {
|
|
|
48
49
|
|
|
49
50
|
# Recognized WoW clients in universal ZIPs which currently have no Creator
|
|
50
51
|
# server mapping. Preserve their Interface codes, without inventing wire keys.
|
|
51
|
-
KNOWN_UNMAPPED_INTERFACES = {"
|
|
52
|
+
KNOWN_UNMAPPED_INTERFACES = {"30405"}
|
|
52
53
|
|
|
53
54
|
_INTERFACE_RE = re.compile(r"^\s*##\s*Interface\s*:\s*(.*?)\s*$", re.IGNORECASE)
|
|
54
55
|
_INTERFACE_VALUE_RE = re.compile(r"^\d+$")
|
|
@@ -213,7 +214,7 @@ parse_zip_metadata = parse_modus_zip
|
|
|
213
214
|
|
|
214
215
|
def select_game_versions(derived: Sequence[Mapping[str, str]], config: Any,
|
|
215
216
|
supplied: Any = None) -> List[Dict[str, str]]:
|
|
216
|
-
"""
|
|
217
|
+
"""Default to exact TOC builds; allow explicit live builds on ZIP clients."""
|
|
217
218
|
rows = config if isinstance(config, list) else []
|
|
218
219
|
row = next((item for item in rows if isinstance(item, Mapping) and item.get("key") == "wow_builds"), None)
|
|
219
220
|
try:
|
|
@@ -228,9 +229,16 @@ def select_game_versions(derived: Sequence[Mapping[str, str]], config: Any,
|
|
|
228
229
|
raise ValidationError("live wow_builds config is missing or malformed", path="$.supported_game_versions")
|
|
229
230
|
available = [dict(item) for item in derived
|
|
230
231
|
if item["server"] in builds and item["gameVersion"] in builds[item["server"]]["versions"]]
|
|
232
|
+
# An explicit build is the author's compatibility declaration, like the
|
|
233
|
+
# Creator dropdown. It must still belong to a client present in the ZIP
|
|
234
|
+
# and be offered by the live service. Never opt into newer builds by default.
|
|
235
|
+
clients = {item["server"] for item in derived}
|
|
236
|
+
live_choices = [{"server": server, "gameVersion": version}
|
|
237
|
+
for server in builds if server in clients
|
|
238
|
+
for version in builds[server]["versions"]]
|
|
231
239
|
selected = available if supplied is None else supplied
|
|
232
|
-
if not isinstance(selected, list) or not selected or any(item not in
|
|
233
|
-
raise ValidationError("supported_game_versions must be a nonempty subset of ZIP and live Creator choices", path="$.supported_game_versions")
|
|
240
|
+
if not isinstance(selected, list) or not selected or any(item not in live_choices for item in selected):
|
|
241
|
+
raise ValidationError("supported_game_versions must be a nonempty subset of ZIP client branches and live Creator choices", path="$.supported_game_versions")
|
|
234
242
|
if len({(item["server"], item["gameVersion"]) for item in selected}) != len(selected):
|
|
235
243
|
raise ValidationError("supported_game_versions must not contain duplicates", path="$.supported_game_versions")
|
|
236
244
|
return [dict(item) for item in selected]
|
package/npm/skill-manifest.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "fupload.npm-skill-manifest.v1",
|
|
3
3
|
"package_name": "@follenfang/fupload",
|
|
4
|
-
"package_version": "0.0.
|
|
5
|
-
"skill_version": "0.0.
|
|
6
|
-
"tree_sha256": "
|
|
4
|
+
"package_version": "0.0.25",
|
|
5
|
+
"skill_version": "0.0.25",
|
|
6
|
+
"tree_sha256": "a90fdc7fc77bec86d92215bd4adc50d3aef7eb48b6e9cfac1f20051e5eb3a3e5",
|
|
7
7
|
"files": [
|
|
8
8
|
{
|
|
9
9
|
"path": "agents/openai.yaml",
|
|
@@ -92,8 +92,8 @@
|
|
|
92
92
|
},
|
|
93
93
|
{
|
|
94
94
|
"path": "references/modus.md",
|
|
95
|
-
"bytes":
|
|
96
|
-
"sha256": "
|
|
95
|
+
"bytes": 38146,
|
|
96
|
+
"sha256": "1aa357333988e076b2ab3754a6f530b6e0b8ed30cc6bdd0091bab3cece970f18"
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
99
|
"path": "references/newbee-official-cli.md",
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
{
|
|
114
114
|
"path": "scripts/fupload_cli/__init__.py",
|
|
115
115
|
"bytes": 50,
|
|
116
|
-
"sha256": "
|
|
116
|
+
"sha256": "33eefade5f5f7a8d274c5106873503d86397e994c0b22a0fad6d27bacd7960de"
|
|
117
117
|
},
|
|
118
118
|
{
|
|
119
119
|
"path": "scripts/fupload_cli/blackbox_web.py",
|
|
@@ -162,8 +162,8 @@
|
|
|
162
162
|
},
|
|
163
163
|
{
|
|
164
164
|
"path": "scripts/fupload_cli/modus_zip.py",
|
|
165
|
-
"bytes":
|
|
166
|
-
"sha256": "
|
|
165
|
+
"bytes": 11993,
|
|
166
|
+
"sha256": "45e84c175feccfc1f05368048ea3e6f24058fe30bbc770396f3be7a43868d188"
|
|
167
167
|
},
|
|
168
168
|
{
|
|
169
169
|
"path": "scripts/fupload_cli/modus.py",
|
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
{
|
|
209
209
|
"path": "SKILL.md",
|
|
210
210
|
"bytes": 28729,
|
|
211
|
-
"sha256": "
|
|
211
|
+
"sha256": "24c423a3f33cafc5d98e7efc5be199147088d268673ea03d121bbbc850a5f90e"
|
|
212
212
|
}
|
|
213
213
|
]
|
|
214
214
|
}
|