kovidgoyal/kitty · error · SystemExit

is not a known entry point. Choices are

Error message

{args[1]} is not a known entry point. Choices are: 

What it means

The second token on kitty's command line does not match any key in the namespaced_entry_points mapping, so kitty lists the valid choices and exits. It is the dispatcher's unknown-subcommand error.

Solutions

  1. Check the printed Choices list and use an exact name.
  2. If the name came from docs, confirm it exists in your kitty version (kitty --debug-configuration or the entry_points dict).
  3. For removed/renamed commands, update scripts to the new name.

Example fix

# before
kitty list-font
# after
kitty list-fonts
Defensive patterns

Strategy: validation

Validate before calling

from kitty.entry_points import namespaced_entry_points
if args[1] not in namespaced_entry_points:
    valid = ', '.join(namespaced_entry_points)
    raise SystemExit(f'unknown {args[1]}; choices: {valid}')

Prevention

When it happens

Trigger: `kitty <unknown>` — args[1] not in namespaced_entry_points (e.g. `kitty +foo` or a misspelled built-in like `kitty list-font` instead of `list-fonts`).

Common situations: Typos in shell scripts/aliases; using an entry point removed or renamed in a newer kitty version; copying docs from a different kitty version.

Related errors


AI-assisted analysis of kovidgoyal/kitty@6d5d0c4406 (2026-08-27). Data as JSON: /api/errors/fd406ae4783ec7a3. Report an issue: GitHub.

Appendix: source

Thrown at kitty/entry_points.py:112

        list_kittens()
        raise SystemExit(1)
    sys.argv = args[1:]
    from kittens.runner import run_kitten as rk

    rk(kitten)


def namespaced(args: list[str]) -> None:
    try:
        func = namespaced_entry_points[args[1]]
    except IndexError:
        raise SystemExit('The kitty command line is incomplete')
    except KeyError:
        pass
    else:
        func(args[1:])
        return
    raise SystemExit(f'{args[1]} is not a known entry point. Choices are: ' + ', '.join(namespaced_entry_points))


entry_points = {
    # These two are here for backwards compat
    'icat': icat,
    'list-fonts': list_fonts,
    '+': namespaced,
}
namespaced_entry_points = {k: v for k, v in entry_points.items() if k[0] not in '+@'}
namespaced_entry_points['hold'] = hold
namespaced_entry_points['complete'] = complete
namespaced_entry_points['runpy'] = runpy
namespaced_entry_points['launch'] = launch
namespaced_entry_points['open'] = open_urls
namespaced_entry_points['kitten'] = run_kitten
namespaced_entry_points['shebang'] = shebang

View on GitHub (pinned to 6d5d0c4406)