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

  1. Pass --pet-name "My Pet" or --display-name "My Pet".
  2. If passing via a variable, ensure it is set and non-empty, e.g. --pet-name "${PET:?PET is unset}".
  3. 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

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


AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12). Data as JSON: /api/errors/73b7acda81a0c163. Report an issue: GitHub.