  cmd.addSubcommandGroup((g) => g
    .setName("char")
    .setDescription("Character management")
    .addSubcommand((s) => s.setName("add").setDescription("Add a character")
      .addStringOption((o) => o.setName("char_name").setDescription("Character name").setRequired(true))
      .addStringOption((o) => o.setName("class").setDescription("Class").setRequired(true)
        .addChoices(
          { name: "Blader (BL)",         value: "BL" },
          { name: "Force Blader (FB)",   value: "FB" },
          { name: "Force Shielder (FS)", value: "FS" },
          { name: "Force Archer (FA)",   value: "FA" },
          { name: "Force Gunner (FG)",   value: "FG" },
          { name: "Gladiator (GL)",      value: "GL" },
          { name: "Dark Mage (DM)",      value: "DM" },
          { name: "Wizard (WI)",         value: "WI" },
          { name: "Warrior (WA)",        value: "WA" },
        ))
      .addIntegerOption((o) => o.setName("level").setDescription("Level").setRequired(true))
      .addStringOption((o) => o.setName("nation").setDescription("Nation").setRequired(true)
        .addChoices({ name: "Capella", value: "Capella" }, { name: "Procyon", value: "Procyon" }))
      .addStringOption((o) => o.setName("name").setDescription("Usermap key (officer only)").setRequired(false)))
    .addSubcommand((s) => s.setName("remove").setDescription("Remove a character")
      .addStringOption((o) => o.setName("char_name").setDescription("Character name").setRequired(true))
      .addStringOption((o) => o.setName("name").setDescription("Usermap key (officer only)").setRequired(false)))
    .addSubcommand((s) => s.setName("set-active").setDescription("Set active character")
      .addStringOption((o) => o.setName("char_name").setDescription("Character name").setRequired(true))
      .addStringOption((o) => o.setName("name").setDescription("Usermap key (officer only)").setRequired(false)))
    .addSubcommand((s) => s.setName("set-nation").setDescription("Change a character's nation")
      .addStringOption((o) => o.setName("nation").setDescription("Nation").setRequired(true)
        .addChoices({ name: "Capella", value: "Capella" }, { name: "Procyon", value: "Procyon" }))
      .addStringOption((o) => o.setName("char_name").setDescription("Character name (defaults to active)").setRequired(false))
      .addStringOption((o) => o.setName("name").setDescription("Usermap key (officer only)").setRequired(false)))
    .addSubcommand((s) => s.setName("set-stats").setDescription("Set character combat stats")
    .addSubcommand((s) => s.setName("borrow").setDescription("Request to borrow a character for this session")
    .addStringOption((o) => o.setName("owner").setDescription("Owner's usermap key").setRequired(true))
    .addStringOption((o) => o.setName("char_name").setDescription("Character name").setRequired(true))
    .addStringOption((o) => o.setName("name").setDescription("Grant to this user (officer only)").setRequired(false)))
  .addSubcommand((s) => s.setName("accept").setDescription("Accept a borrow request")
    .addStringOption((o) => o.setName("name").setDescription("Requester's usermap key").setRequired(true)))
  .addSubcommand((s) => s.setName("decline").setDescription("Decline a borrow request")
    .addStringOption((o) => o.setName("name").setDescription("Requester's usermap key").setRequired(true)))
  .addSubcommand((s) => s.setName("share").setDescription("Permanently share a character")
    .addStringOption((o) => o.setName("char_name").setDescription("Character name").setRequired(true))
    .addStringOption((o) => o.setName("name").setDescription("Usermap key to share with").setRequired(true))
    .addStringOption((o) => o.setName("owner").setDescription("Owner's usermap key (officer only)").setRequired(false)))
  .addSubcommand((s) => s.setName("unshare").setDescription("Revoke permanent character share")
    .addStringOption((o) => o.setName("char_name").setDescription("Character name").setRequired(true))
    .addStringOption((o) => o.setName("name").setDescription("Usermap key to revoke").setRequired(true))
    .addStringOption((o) => o.setName("owner").setDescription("Owner's usermap key (officer only)").setRequired(false)))
      .addStringOption((o) => o.setName("char_name").setDescription("Character name (defaults to active)").setRequired(false))
      .addIntegerOption((o) => o.setName("atk").setDescription("Attack score").setRequired(false))
      .addIntegerOption((o) => o.setName("def").setDescription("Defense score").setRequired(false))
      .addIntegerOption((o) => o.setName("heal").setDescription("Healing score").setRequired(false))
      .addStringOption((o) => o.setName("name").setDescription("Usermap key (officer only)").setRequired(false)))
  );