Releases: irrg/hoard
@irrg/itchio-hoard@0.4.0
Minor Changes
-
92fde18: Fix data integrity and error propagation issues across all providers
- Partial-before-verify: hash
.partialfile before renaming to final path; unlink partial on mismatch instead of quarantining (corrupt freshly-downloaded files never reach the output path) - Deep mode sidecar bypass: when
--deepis set, always re-hash the local file rather than trusting the sidecar - Quarantine filename collision: timestamp now includes milliseconds and a 4-digit hex random suffix (
YYYY-MM-DDTHH-MM-SS-mmm-xxxx) to make same-second overwrites inold/astronomically unlikely - Error propagation: drivethru and itch.io providers now return discriminated
'downloaded' | 'skipped' | 'error'fromdoDownload()and{ newFiles, errors }fromdownload(), so per-file checksum and network failures are counted and surfaced indownloadLibrary()results - itch.io: 403/404 from the uploads endpoint is treated as "no access" (silent skip) rather than an error; affects bundle games and access-restricted items that will never have a downloadable file
- itch.io: games with no downloadable file (browser-based tools, online character sheets) return
'skipped'instead of'error'when the response carries no content-disposition header
- Partial-before-verify: hash
-
3d06cfa: Add FairScheduler and ProviderRuntime for fair global concurrency
FairScheduler: registered providers retain a progress slot while active, with round-robin FIFO queues and a global connection limitProviderRuntimeinterface withnetwork<T>andfilesystem<T>capabilities;directRuntimeno-op default for standalone use- All four providers now accept
runtime?: ProviderRuntimein their options; individual network calls (fetchWithRetry, streamToFile) and filesystem calls (md5sum) are gated through the runtime rather than at the per-game task level hoard syncregisters configured storefronts in fair network and checksum schedulers; downloads use the globaljobslimit while checksums use one round-robin disk slot- Provider libraries retain bounded per-game backpressure while individual network and checksum operations are gated at the call site
-
3d06cfa: Add --keep-old flag; fix checksum handling for watermarked files
--keep-old: new CLI flag that moves replaced files toold/with a timestamped name; default behavior is now to delete the old file rather than accumulate versions- Watermark/stale-checksum fix: when a downloaded file's MD5 differs from the API-reported checksum, the file is kept and the actual MD5 is stored in the sidecar; subsequent shallow runs skip the file correctly instead of looping forever
- Sidecar integrity check: on shallow runs, if the stored sidecar MD5 differs from the API checksum, the actual file MD5 is compared to the sidecar before deciding to re-download; this correctly handles both watermarked files and genuine file corruption
errors.txtis now truncated at the start of each sync run so it reflects only the current run- Fix misleading "Downloading" log line in itchio and drivethru that fired before the existence check
Patch Changes
-
295068a: Publish @irrg/hoard-core as a public package; providers depend on it at runtime
Fixes a packaging defect in 0.3.0 where @irrg/hoard-core was marked private but
referenced as a runtime dependency in the CLI and as an import in provider type
declarations. Provider builds revert from tsup back to tsc; core is now a real
published dependency rather than an inlined bundle. -
Updated dependencies [3d06cfa]
-
Updated dependencies [295068a]
- @irrg/hoard-core@0.2.0
@irrg/humblebundle-hoard@0.4.0
Minor Changes
-
92fde18: Fix data integrity and error propagation issues across all providers
- Partial-before-verify: hash
.partialfile before renaming to final path; unlink partial on mismatch instead of quarantining (corrupt freshly-downloaded files never reach the output path) - Deep mode sidecar bypass: when
--deepis set, always re-hash the local file rather than trusting the sidecar - Quarantine filename collision: timestamp now includes milliseconds and a 4-digit hex random suffix (
YYYY-MM-DDTHH-MM-SS-mmm-xxxx) to make same-second overwrites inold/astronomically unlikely - Error propagation: drivethru and itch.io providers now return discriminated
'downloaded' | 'skipped' | 'error'fromdoDownload()and{ newFiles, errors }fromdownload(), so per-file checksum and network failures are counted and surfaced indownloadLibrary()results - itch.io: 403/404 from the uploads endpoint is treated as "no access" (silent skip) rather than an error; affects bundle games and access-restricted items that will never have a downloadable file
- itch.io: games with no downloadable file (browser-based tools, online character sheets) return
'skipped'instead of'error'when the response carries no content-disposition header
- Partial-before-verify: hash
-
3d06cfa: Add FairScheduler and ProviderRuntime for fair global concurrency
FairScheduler: registered providers retain a progress slot while active, with round-robin FIFO queues and a global connection limitProviderRuntimeinterface withnetwork<T>andfilesystem<T>capabilities;directRuntimeno-op default for standalone use- All four providers now accept
runtime?: ProviderRuntimein their options; individual network calls (fetchWithRetry, streamToFile) and filesystem calls (md5sum) are gated through the runtime rather than at the per-game task level hoard syncregisters configured storefronts in fair network and checksum schedulers; downloads use the globaljobslimit while checksums use one round-robin disk slot- Provider libraries retain bounded per-game backpressure while individual network and checksum operations are gated at the call site
-
3d06cfa: Add --keep-old flag; fix checksum handling for watermarked files
--keep-old: new CLI flag that moves replaced files toold/with a timestamped name; default behavior is now to delete the old file rather than accumulate versions- Watermark/stale-checksum fix: when a downloaded file's MD5 differs from the API-reported checksum, the file is kept and the actual MD5 is stored in the sidecar; subsequent shallow runs skip the file correctly instead of looping forever
- Sidecar integrity check: on shallow runs, if the stored sidecar MD5 differs from the API checksum, the actual file MD5 is compared to the sidecar before deciding to re-download; this correctly handles both watermarked files and genuine file corruption
errors.txtis now truncated at the start of each sync run so it reflects only the current run- Fix misleading "Downloading" log line in itchio and drivethru that fired before the existence check
Patch Changes
-
295068a: Publish @irrg/hoard-core as a public package; providers depend on it at runtime
Fixes a packaging defect in 0.3.0 where @irrg/hoard-core was marked private but
referenced as a runtime dependency in the CLI and as an import in provider type
declarations. Provider builds revert from tsup back to tsc; core is now a real
published dependency rather than an inlined bundle. -
Updated dependencies [3d06cfa]
-
Updated dependencies [295068a]
- @irrg/hoard-core@0.2.0
@irrg/hoard@0.4.0
Minor Changes
-
3d06cfa: Add FairScheduler and ProviderRuntime for fair global concurrency
FairScheduler: registered providers retain a progress slot while active, with round-robin FIFO queues and a global connection limitProviderRuntimeinterface withnetwork<T>andfilesystem<T>capabilities;directRuntimeno-op default for standalone use- All four providers now accept
runtime?: ProviderRuntimein their options; individual network calls (fetchWithRetry, streamToFile) and filesystem calls (md5sum) are gated through the runtime rather than at the per-game task level hoard syncregisters configured storefronts in fair network and checksum schedulers; downloads use the globaljobslimit while checksums use one round-robin disk slot- Provider libraries retain bounded per-game backpressure while individual network and checksum operations are gated at the call site
-
3d06cfa: Add --keep-old flag; fix checksum handling for watermarked files
--keep-old: new CLI flag that moves replaced files toold/with a timestamped name; default behavior is now to delete the old file rather than accumulate versions- Watermark/stale-checksum fix: when a downloaded file's MD5 differs from the API-reported checksum, the file is kept and the actual MD5 is stored in the sidecar; subsequent shallow runs skip the file correctly instead of looping forever
- Sidecar integrity check: on shallow runs, if the stored sidecar MD5 differs from the API checksum, the actual file MD5 is compared to the sidecar before deciding to re-download; this correctly handles both watermarked files and genuine file corruption
errors.txtis now truncated at the start of each sync run so it reflects only the current run- Fix misleading "Downloading" log line in itchio and drivethru that fired before the existence check
Patch Changes
-
92fde18: Fix exit status, job validation, and parallel sync scheduling
- Humble partial inventory: failed order fetches now count toward the error total and produce a non-zero exit code instead of reporting success with a verbose warning only
--jobsflag now rejects non-integer values such as4xand4.5; previouslyparseIntsilently accepted trailing garbage- Each storefront now gets its own
Scheduler(jobs)instead of sharing a single global pool; previously a slow storefront (e.g. humblebundle md5-checking large files) would occupy all slots and stall the others for the duration of a run
-
Updated dependencies [92fde18]
-
Updated dependencies [3d06cfa]
-
Updated dependencies [295068a]
-
Updated dependencies [3d06cfa]
- @irrg/itchio-hoard@0.4.0
- @irrg/humblebundle-hoard@0.4.0
- @irrg/drivethrurpg-hoard@0.4.0
- @irrg/bundleofholding-hoard@0.4.0
- @irrg/hoard-core@0.2.0
@irrg/bundleofholding-hoard@0.4.0
Minor Changes
-
92fde18: Fix data integrity and error propagation issues across all providers
- Partial-before-verify: hash
.partialfile before renaming to final path; unlink partial on mismatch instead of quarantining (corrupt freshly-downloaded files never reach the output path) - Deep mode sidecar bypass: when
--deepis set, always re-hash the local file rather than trusting the sidecar - Quarantine filename collision: timestamp now includes milliseconds and a 4-digit hex random suffix (
YYYY-MM-DDTHH-MM-SS-mmm-xxxx) to make same-second overwrites inold/astronomically unlikely - Error propagation: drivethru and itch.io providers now return discriminated
'downloaded' | 'skipped' | 'error'fromdoDownload()and{ newFiles, errors }fromdownload(), so per-file checksum and network failures are counted and surfaced indownloadLibrary()results - itch.io: 403/404 from the uploads endpoint is treated as "no access" (silent skip) rather than an error; affects bundle games and access-restricted items that will never have a downloadable file
- itch.io: games with no downloadable file (browser-based tools, online character sheets) return
'skipped'instead of'error'when the response carries no content-disposition header
- Partial-before-verify: hash
-
3d06cfa: Add FairScheduler and ProviderRuntime for fair global concurrency
FairScheduler: registered providers retain a progress slot while active, with round-robin FIFO queues and a global connection limitProviderRuntimeinterface withnetwork<T>andfilesystem<T>capabilities;directRuntimeno-op default for standalone use- All four providers now accept
runtime?: ProviderRuntimein their options; individual network calls (fetchWithRetry, streamToFile) and filesystem calls (md5sum) are gated through the runtime rather than at the per-game task level hoard syncregisters configured storefronts in fair network and checksum schedulers; downloads use the globaljobslimit while checksums use one round-robin disk slot- Provider libraries retain bounded per-game backpressure while individual network and checksum operations are gated at the call site
-
3d06cfa: Add --keep-old flag; fix checksum handling for watermarked files
--keep-old: new CLI flag that moves replaced files toold/with a timestamped name; default behavior is now to delete the old file rather than accumulate versions- Watermark/stale-checksum fix: when a downloaded file's MD5 differs from the API-reported checksum, the file is kept and the actual MD5 is stored in the sidecar; subsequent shallow runs skip the file correctly instead of looping forever
- Sidecar integrity check: on shallow runs, if the stored sidecar MD5 differs from the API checksum, the actual file MD5 is compared to the sidecar before deciding to re-download; this correctly handles both watermarked files and genuine file corruption
errors.txtis now truncated at the start of each sync run so it reflects only the current run- Fix misleading "Downloading" log line in itchio and drivethru that fired before the existence check
Patch Changes
-
295068a: Publish @irrg/hoard-core as a public package; providers depend on it at runtime
Fixes a packaging defect in 0.3.0 where @irrg/hoard-core was marked private but
referenced as a runtime dependency in the CLI and as an import in provider type
declarations. Provider builds revert from tsup back to tsc; core is now a real
published dependency rather than an inlined bundle. -
Updated dependencies [3d06cfa]
-
Updated dependencies [295068a]
- @irrg/hoard-core@0.2.0
@irrg/itchio-hoard@0.3.0
Minor Changes
-
a27ce2e: 0.3: global scheduler, atomic downloads, checksum-as-error
- Private
@irrg/hoard-corepackage bundled inline via tsup; providers have zero new runtime deps - Global
Schedulerin apps/hoard —--jobs Nnow limits total concurrency across all providers, not per-provider - Atomic downloads: stream to
.partial, rename on success, cleanup on failure — no truncated files survive interrupts - Post-download checksum mismatch is now an error: bad file moved to
old/, sidecar not written, errors.txt entry added - Optional
runTaskin all providerLibraryOptionsfor external scheduler injection - Fix: bundleofholding sidecar path was stripping file extension
- Fix: humblebundle
hasFilesnow correctly excludes theold/subdirectory
- Private
@irrg/humblebundle-hoard@0.3.0
Minor Changes
-
a27ce2e: 0.3: global scheduler, atomic downloads, checksum-as-error
- Private
@irrg/hoard-corepackage bundled inline via tsup; providers have zero new runtime deps - Global
Schedulerin apps/hoard —--jobs Nnow limits total concurrency across all providers, not per-provider - Atomic downloads: stream to
.partial, rename on success, cleanup on failure — no truncated files survive interrupts - Post-download checksum mismatch is now an error: bad file moved to
old/, sidecar not written, errors.txt entry added - Optional
runTaskin all providerLibraryOptionsfor external scheduler injection - Fix: bundleofholding sidecar path was stripping file extension
- Fix: humblebundle
hasFilesnow correctly excludes theold/subdirectory
- Private
@irrg/hoard@0.3.0
Minor Changes
-
a27ce2e: 0.3: global scheduler, atomic downloads, checksum-as-error
- Private
@irrg/hoard-corepackage bundled inline via tsup; providers have zero new runtime deps - Global
Schedulerin apps/hoard —--jobs Nnow limits total concurrency across all providers, not per-provider - Atomic downloads: stream to
.partial, rename on success, cleanup on failure — no truncated files survive interrupts - Post-download checksum mismatch is now an error: bad file moved to
old/, sidecar not written, errors.txt entry added - Optional
runTaskin all providerLibraryOptionsfor external scheduler injection - Fix: bundleofholding sidecar path was stripping file extension
- Fix: humblebundle
hasFilesnow correctly excludes theold/subdirectory
- Private
Patch Changes
- Updated dependencies [a27ce2e]
- @irrg/itchio-hoard@0.3.0
- @irrg/humblebundle-hoard@0.3.0
- @irrg/drivethru-hoard@0.3.0
- @irrg/bundleofholding-hoard@0.3.0
@irrg/drivethru-hoard@0.3.0
Minor Changes
-
a27ce2e: 0.3: global scheduler, atomic downloads, checksum-as-error
- Private
@irrg/hoard-corepackage bundled inline via tsup; providers have zero new runtime deps - Global
Schedulerin apps/hoard —--jobs Nnow limits total concurrency across all providers, not per-provider - Atomic downloads: stream to
.partial, rename on success, cleanup on failure — no truncated files survive interrupts - Post-download checksum mismatch is now an error: bad file moved to
old/, sidecar not written, errors.txt entry added - Optional
runTaskin all providerLibraryOptionsfor external scheduler injection - Fix: bundleofholding sidecar path was stripping file extension
- Fix: humblebundle
hasFilesnow correctly excludes theold/subdirectory
- Private
@irrg/bundleofholding-hoard@0.3.0
Minor Changes
-
a27ce2e: 0.3: global scheduler, atomic downloads, checksum-as-error
- Private
@irrg/hoard-corepackage bundled inline via tsup; providers have zero new runtime deps - Global
Schedulerin apps/hoard —--jobs Nnow limits total concurrency across all providers, not per-provider - Atomic downloads: stream to
.partial, rename on success, cleanup on failure — no truncated files survive interrupts - Post-download checksum mismatch is now an error: bad file moved to
old/, sidecar not written, errors.txt entry added - Optional
runTaskin all providerLibraryOptionsfor external scheduler injection - Fix: bundleofholding sidecar path was stripping file extension
- Fix: humblebundle
hasFilesnow correctly excludes theold/subdirectory
- Private
@irrg/itchio-hoard@0.2.2
Patch Changes
- 63ddb59: Fix infinite re-download loop when a storefront has two files for the same product with filenames that differ only in case (e.g. "file.pdf" vs "File.pdf"). On macOS's case-insensitive filesystem these resolve to the same path, causing a ping-pong overwrite loop. Filenames that collide after lowercasing now have a stable disambiguator appended before the extension.