nexu-io/open-design · error · SystemExit
pet name is required
Error message
pet name is required
What it means
Raised by package_custom_pet.py main() when both --pet-name and --display-name are empty after stripping. The packager needs at least one of them to derive the pet id and folder name.
Source
Thrown at skills/hatch-pet/scripts/package_custom_pet.py:71
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--pet-name", default="")
parser.add_argument("--display-name", default="")
parser.add_argument("--description", required=True)
parser.add_argument("--spritesheet", required=True)
parser.add_argument("--codex-home", default=str(default_codex_home()))
parser.add_argument(
"--output-dir",
help="Exact pet package directory. Defaults to ${CODEX_HOME:-$HOME/.codex}/pets/<pet-name>.",
)
parser.add_argument("--force", action="store_true")
args = parser.parse_args()
raw_pet_name = (args.pet_name or args.display_name).strip()
if not raw_pet_name:
raise SystemExit("pet name is required")
pet_id = slugify(raw_pet_name)
if not pet_id:
raise SystemExit("pet name must contain at least one letter or digit")
display_name = (args.display_name or raw_pet_name).strip()
source = Path(args.spritesheet).expanduser().resolve()
source_format = validate_spritesheet(source)
target_dir = (
Path(args.output_dir).expanduser().resolve()
if args.output_dir
else Path(args.codex_home).expanduser().resolve() / "pets" / pet_id
)
target_dir.mkdir(parents=True, exist_ok=True)
target_sheet = target_dir / "spritesheet.webp"
manifest_path = target_dir / "pet.json"
if not args.force and (target_sheet.exists() or manifest_path.exists()):
raise SystemExit(f"{target_dir} already contains pet files; pass --force to overwrite")View on GitHub (pinned to 5be4028344)
Solutions
- Pass --pet-name "My Pet" or --display-name "My Pet".
- If passing via a variable, ensure it is set and non-empty, e.g. --pet-name "${PET:?PET is unset}".
- Re-run with the name supplied.
Example fix
// before python package_custom_pet.py --description "..." --spritesheet sheet.png # SystemExit: pet name is required // after python package_custom_pet.py --pet-name "Sprite" --description "..." --spritesheet sheet.png
Defensive patterns
Strategy: validation
Validate before calling
raw_pet_name = (args.pet_name or args.display_name).strip()
if not raw_pet_name:
raise SystemExit("pet name is required") Prevention
- Always pass --pet-name or --display-name when packaging.
- If sourcing from a variable, guard it: --pet-name "${PET:?PET is unset}".
- Add a wrapper script that asserts the name before invoking the packager.
When it happens
Trigger: Invoking the script with neither --pet-name nor --display-name, or passing only whitespace to both.
Common situations: Assuming --display-name is required (it is not; --description and --spritesheet are); running the script with an empty shell variable expansion (e.g. --pet-name "$PET" where PET is unset).
Related errors
- pet name must contain at least one letter or digit
- invalid chroma key color: {value}; expected #RRGGBB
- pet id must contain at least one letter or digit
- invalid JSON in ${filePath}: ${message}
- ${filePath} must contain a JSON object
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/73b7acda81a0c163.
Report an issue: GitHub.