They are outside the rule key, so a format change (like the one in the
previous commit) silently disabled rename detection for existing records.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Verify rename sources against recorded stats at copy time; colliding
rename destinations/sources fall back to running the rule
- Restrict rename detection to single-input, no-deps rules (sheet-style
rules embed input names in output bytes)
- Include input extensions in the rename template (magick picks output
format from extensions)
- Adopt only rules with no stored record, never known-dirty ones
- Skip dotfiles in glob (tup parity)
- Complete sheet dep closures (data/lib, lib/root)
- Validate --jobs; reject non-numeric values instead of silently no-oping
- Worker pool drains all workers before rethrowing; per-rule internal
errors abort scheduling instead of racing db.close()
- SIGKILL all live process groups on second Ctrl-C
- Transactional loadStoredRules snapshot; dry run without existing state
uses an in-memory db; idempotent DDL
- rule() rejects % placeholders in literal outputs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The build is now driven by tools/build (see Buildfile.ts). tupctime is
obsolete: the new tool hashes content behind a stat cache, so ctime/mtime
churn without content changes no longer causes rebuilds.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The .sheet.mjs files imported bare @smogon/sprite-data / @smogon/sprite-root,
which stopped resolving from the repo root after the TS7/Node 24 migration
dropped dist mains. Use explicit index.ts imports and add the workspace deps
to the root package.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>