feat(nwsync): upload sink, key-addressed CLI, fail-closed publication marker
ci / ci (pull_request) Successful in 3m21s
ci / ci (pull_request) Successful in 3m21s
Resolves the build half of sow-tools#60 and closes the CLI gap sow-tools#53's sweep found: PR #71 shipped #53's original surface, not the one #56, #62 and #65 settled. - `depot.KeyStore` (`ProbeKey`/`PutReader`/`GetKey`) addresses the zone by object key instead of by depot sha, reusing the existing IPv4-pinned transport, retry and tri-state probe. The sha-addressed `Backend` now rides on it; no new HTTP client. - `nwsync` gains a sink: the zone by default, a local tree with `--out DIR` as the conformance path. Blobs upload as they are produced, the index lands last, and a blob already in the zone is skipped without paying for compression. - CLI is now `emit [--as NAME] [--out DIR] <artifact-key> <file>` and `assemble --group-id N [--tlk-key KEY] [--out DIR] <artifact-key>...`. Indexes live beside their artifact with the extension replaced, derived in one place. Flags may follow positionals, which cost a run during sow-tools#59. - Fail-closed: an artifact key whose digest does not match the file is refused, and `assemble` refuses an artifact with no index rather than publishing a manifest missing a hak. Conformance re-checked through the new CLI against upstream nwn_nwsync_write 2.1.2 on sow_vfxs_01.hak: the manifest is still byte-identical. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+26
-4
@@ -43,10 +43,32 @@ flags are mutually exclusive.
|
||||
|
||||
`nwsync emit` runs where an artifact is born (a `.hak`/`.erf`, or a loose file
|
||||
such as the TLK); `nwsync assemble` runs at module release and reads only the
|
||||
small per-artifact manifests. `--order` lists artifact names highest priority
|
||||
first: a resref in more than one artifact resolves to the earliest one, the way
|
||||
the game resolves it. `--group-id` is per channel — 1 is current, 2 is testing,
|
||||
and 0 leaves the field out of the sidecar.
|
||||
small per-artifact indexes. Both take **depot keys**: an artifact's index lives
|
||||
beside the artifact itself with the extension replaced, so `emit` and
|
||||
`assemble` agree on where it is without being told.
|
||||
|
||||
```
|
||||
nwsync emit [--as NAME] [--out DIR] <artifact-key> <file>
|
||||
nwsync assemble --group-id N [--tlk-key KEY] [--out DIR] <artifact-key>...
|
||||
```
|
||||
|
||||
Both verbs upload by default; nothing bulky is ever written to the runner's
|
||||
disk. `--out DIR` writes a local repository tree instead, which is the
|
||||
conformance path against upstream `nwn_nwsync_write`. The zone comes from
|
||||
`NWSYNC_STORAGE_ZONE` and `NWSYNC_STORAGE_PASSWORD`, with the host from
|
||||
`BUNNY_STORAGE_HOST` — NWSync data is a separate zone from the asset depot.
|
||||
|
||||
`assemble`'s artifact keys are in `Mod_HakList` order, highest priority first: a
|
||||
resref in more than one artifact resolves to the earliest one, the way the game
|
||||
resolves it. `--tlk-key` has its own slot because the TLK shadows nothing.
|
||||
`--group-id` is per channel — 1 is current, 2 is testing, and 0 leaves the field
|
||||
out of the sidecar.
|
||||
|
||||
`emit` uploads blobs first and the index last, so the presence of an index is
|
||||
the publication marker: an artifact whose emit died halfway leaves real blobs in
|
||||
the zone and no index. Blob names are content hashes, so re-running skips
|
||||
whatever already landed, and `assemble` fails closed on an artifact with no
|
||||
index rather than publishing a manifest that is missing a hak.
|
||||
|
||||
## Hidden compatibility aliases
|
||||
|
||||
|
||||
Reference in New Issue
Block a user