[object Object]

← back to Cli Printing Press

feat(press): add Phase 0.7 prediction engine, Discord CLI, 6-artifact pipeline

6775a8629659d361858b76a6117ca92375ef2e92 · 2026-03-26 07:31:42 -0700 · Matt Van Horn

- Add Phase 0.7: Power User Prediction Engine to SKILL.md
  - Entity classification (Accumulating/Reference/Append-only/Ephemeral)
  - Social signal mining (7 parallel searches)
  - Data gravity scoring (Volume+QueryFreq+JoinDemand+SearchNeed+TemporalValue)
  - Schema+Sync+Search specification with API validation
- Add artifact writing system: /ce:plan integration with built-in fallback
  - 6 comprehensive plan documents per run
  - Each phase gate invokes /ce:plan or 200+ line built-in writer
- Add Discord CLI (330 commands, 7 workflow commands, Grade A)
  - channel-health, audit-report, member-report, server-snapshot
  - message-stats, webhook-test, prune-preview
- Update Phase 4 priorities: data layer first, then workflows
- Add 7 new anti-shortcut rules for prediction engine
- Add discrawl gap analysis and prediction engine plan docs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Files touched

Diff

commit 6775a8629659d361858b76a6117ca92375ef2e92
Author: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Date:   Thu Mar 26 07:31:42 2026 -0700

    feat(press): add Phase 0.7 prediction engine, Discord CLI, 6-artifact pipeline
    
    - Add Phase 0.7: Power User Prediction Engine to SKILL.md
      - Entity classification (Accumulating/Reference/Append-only/Ephemeral)
      - Social signal mining (7 parallel searches)
      - Data gravity scoring (Volume+QueryFreq+JoinDemand+SearchNeed+TemporalValue)
      - Schema+Sync+Search specification with API validation
    - Add artifact writing system: /ce:plan integration with built-in fallback
      - 6 comprehensive plan documents per run
      - Each phase gate invokes /ce:plan or 200+ line built-in writer
    - Add Discord CLI (330 commands, 7 workflow commands, Grade A)
      - channel-health, audit-report, member-report, server-snapshot
      - message-stats, webhook-test, prune-preview
    - Update Phase 4 priorities: data layer first, then workflows
    - Add 7 new anti-shortcut rules for prediction engine
    - Add discrawl gap analysis and prediction engine plan docs
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---
 discord-cli/Makefile                               |   16 +
 discord-cli/README.md                              |  306 ++
 discord-cli/cmd/discord-cli/main.go                |   17 +
 discord-cli/go.mod                                 |   25 +
 discord-cli/go.sum                                 |   59 +
 discord-cli/internal/cache/cache.go                |   58 +
 discord-cli/internal/cli/analytics.go              |  136 +
 discord-cli/internal/cli/applications.go           |   27 +
 .../cli/applications_activity-instances.go         |   17 +
 ...ications_activity-instances_applications-get.go |   54 +
 .../internal/cli/applications_attachment.go        |   17 +
 .../applications_attachment_upload-application.go  |   71 +
 discord-cli/internal/cli/applications_commands.go  |   22 +
 .../applications_commands_bulk-set-application.go  |   65 +
 .../applications_commands_create-application.go    |   96 +
 .../applications_commands_delete-application.go    |   53 +
 .../cli/applications_commands_get-application.go   |   54 +
 .../cli/applications_commands_list-application.go  |   54 +
 .../applications_commands_update-application.go    |   93 +
 discord-cli/internal/cli/applications_emojis.go    |   21 +
 .../cli/applications_emojis_create-application.go  |   77 +
 .../cli/applications_emojis_delete-application.go  |   53 +
 .../cli/applications_emojis_get-application.go     |   54 +
 .../cli/applications_emojis_list-application.go    |   49 +
 .../cli/applications_emojis_update-application.go  |   74 +
 .../internal/cli/applications_entitlements.go      |   21 +
 .../cli/applications_entitlements_consume.go       |   68 +
 .../cli/applications_entitlements_create.go        |   82 +
 .../cli/applications_entitlements_delete.go        |   52 +
 .../applications_entitlements_get-applications.go  |   53 +
 .../internal/cli/applications_entitlements_get.go  |   78 +
 discord-cli/internal/cli/applications_get-my.go    |   46 +
 discord-cli/internal/cli/applications_get.go       |   49 +
 discord-cli/internal/cli/applications_guilds.go    |   25 +
 ...cations_guilds_bulk-set-application-commands.go |   69 +
 ...plications_guilds_create-application-command.go |  100 +
 ...plications_guilds_delete-application-command.go |   57 +
 ...s_guilds_get-application-command-permissions.go |   57 +
 .../applications_guilds_get-application-command.go |   58 +
 ..._guilds_list-application-command-permissions.go |   53 +
 ...pplications_guilds_list-application-commands.go |   58 +
 ...s_guilds_set-application-command-permissions.go |   72 +
 ...plications_guilds_update-application-command.go |   97 +
 .../internal/cli/applications_role-connections.go  |   18 +
 ...ns_role-connections_get-application-metadata.go |   50 +
 ...role-connections_update-application-metadata.go |   65 +
 discord-cli/internal/cli/applications_update-my.go |  115 +
 discord-cli/internal/cli/applications_update.go    |  119 +
 discord-cli/internal/cli/auth.go                   |  250 ++
 discord-cli/internal/cli/channel_workflow.go       |  209 ++
 discord-cli/internal/cli/channels.go               |   32 +
 discord-cli/internal/cli/channels_delete.go        |   48 +
 discord-cli/internal/cli/channels_followers.go     |   17 +
 .../cli/channels_followers_follow-channel.go       |   71 +
 discord-cli/internal/cli/channels_get.go           |   49 +
 discord-cli/internal/cli/channels_invites.go       |   18 +
 .../cli/channels_invites_create-channel.go         |   65 +
 .../internal/cli/channels_invites_list-channel.go  |   50 +
 discord-cli/internal/cli/channels_messages.go      |   33 +
 .../cli/channels_messages_add-my-reaction.go       |   72 +
 .../internal/cli/channels_messages_bulk-delete.go  |   64 +
 .../internal/cli/channels_messages_create-pin.go   |   68 +
 .../cli/channels_messages_create-thread-from.go    |   84 +
 .../internal/cli/channels_messages_create.go       |  113 +
 .../internal/cli/channels_messages_crosspost.go    |   68 +
 ...nnels_messages_delete-all-reactions-by-emoji.go |   56 +
 .../cli/channels_messages_delete-all-reactions.go  |   52 +
 .../cli/channels_messages_delete-my-reaction.go    |   56 +
 .../internal/cli/channels_messages_delete-pin.go   |   52 +
 .../cli/channels_messages_delete-user-reaction.go  |   60 +
 .../internal/cli/channels_messages_delete.go       |   52 +
 discord-cli/internal/cli/channels_messages_get.go  |   53 +
 .../internal/cli/channels_messages_list-pins.go    |   57 +
 .../channels_messages_list-reactions-by-emoji.go   |   68 +
 discord-cli/internal/cli/channels_messages_list.go |   63 +
 .../internal/cli/channels_messages_update.go       |   83 +
 discord-cli/internal/cli/channels_permissions.go   |   18 +
 ...hannels_permissions_delete-channel-overwrite.go |   53 +
 .../channels_permissions_set-channel-overwrite.go  |   84 +
 discord-cli/internal/cli/channels_pins.go          |   19 +
 .../cli/channels_pins_deprecated-create.go         |   69 +
 .../cli/channels_pins_deprecated-delete.go         |   53 +
 .../internal/cli/channels_pins_deprecated-list.go  |   50 +
 discord-cli/internal/cli/channels_polls.go         |   18 +
 discord-cli/internal/cli/channels_polls_expire.go  |   69 +
 .../cli/channels_polls_get-answer-voters.go        |   66 +
 discord-cli/internal/cli/channels_recipients.go    |   18 +
 .../cli/channels_recipients_add-group-dm-user.go   |   79 +
 .../channels_recipients_delete-group-dm-user.go    |   53 +
 .../internal/cli/channels_send-soundboard-sound.go |   17 +
 ..._send-soundboard-sound_send_soundboard_sound.go |   76 +
 .../internal/cli/channels_thread-members.go        |   22 +
 .../internal/cli/channels_thread-members_add.go    |   69 +
 .../internal/cli/channels_thread-members_delete.go |   52 +
 .../internal/cli/channels_thread-members_get.go    |   58 +
 .../cli/channels_thread-members_join-thread.go     |   64 +
 .../cli/channels_thread-members_leave-thread.go    |   48 +
 .../internal/cli/channels_thread-members_list.go   |   60 +
 discord-cli/internal/cli/channels_threads.go       |   20 +
 .../internal/cli/channels_threads_create.go        |   64 +
 .../cli/channels_threads_list-private-archived.go  |   58 +
 .../cli/channels_threads_list-public-archived.go   |   57 +
 .../internal/cli/channels_threads_search.go        |   84 +
 discord-cli/internal/cli/channels_typing.go        |   17 +
 .../cli/channels_typing_trigger-indicator.go       |   65 +
 discord-cli/internal/cli/channels_update.go        |   64 +
 discord-cli/internal/cli/channels_users.go         |   17 +
 ...nnels_users_list-my-private-archived-threads.go |   58 +
 discord-cli/internal/cli/channels_webhooks.go      |   18 +
 .../internal/cli/channels_webhooks_create.go       |   75 +
 .../internal/cli/channels_webhooks_list-channel.go |   50 +
 discord-cli/internal/cli/doctor.go                 |  138 +
 discord-cli/internal/cli/export.go                 |  106 +
 discord-cli/internal/cli/gateway.go                |   18 +
 discord-cli/internal/cli/gateway_get-bot.go        |   45 +
 discord-cli/internal/cli/gateway_get.go            |   46 +
 discord-cli/internal/cli/guilds.go                 |   47 +
 discord-cli/internal/cli/guilds_audit-logs.go      |   17 +
 .../cli/guilds_audit-logs_list-guild-entries.go    |   70 +
 discord-cli/internal/cli/guilds_auto-moderation.go |   21 +
 .../cli/guilds_auto-moderation_create-rule.go      |   65 +
 .../cli/guilds_auto-moderation_delete-rule.go      |   53 +
 .../cli/guilds_auto-moderation_get-rule.go         |   54 +
 .../cli/guilds_auto-moderation_list-rules.go       |   49 +
 .../cli/guilds_auto-moderation_update-rule.go      |   69 +
 discord-cli/internal/cli/guilds_bans.go            |   20 +
 discord-cli/internal/cli/guilds_bans_get-guild.go  |   54 +
 discord-cli/internal/cli/guilds_bans_list-guild.go |   60 +
 .../cli/guilds_bans_unban-user-from-guild.go       |   53 +
 .../internal/cli/guilds_bans_user-from-guild.go    |   79 +
 discord-cli/internal/cli/guilds_bulk-ban.go        |   17 +
 .../cli/guilds_bulk-ban_users-from-guild.go        |   70 +
 discord-cli/internal/cli/guilds_channels.go        |   19 +
 .../cli/guilds_channels_bulk-update-guild.go       |   65 +
 .../internal/cli/guilds_channels_create-guild.go   |  151 +
 .../internal/cli/guilds_channels_list-guild.go     |   50 +
 discord-cli/internal/cli/guilds_emojis.go          |   21 +
 .../internal/cli/guilds_emojis_create-guild.go     |   77 +
 .../internal/cli/guilds_emojis_delete-guild.go     |   53 +
 .../internal/cli/guilds_emojis_get-guild.go        |   54 +
 .../internal/cli/guilds_emojis_list-guild.go       |   49 +
 .../internal/cli/guilds_emojis_update-guild.go     |   74 +
 discord-cli/internal/cli/guilds_get-template.go    |   49 +
 discord-cli/internal/cli/guilds_get.go             |   54 +
 discord-cli/internal/cli/guilds_integrations.go    |   18 +
 .../cli/guilds_integrations_delete-guild.go        |   53 +
 .../internal/cli/guilds_integrations_list-guild.go |   50 +
 discord-cli/internal/cli/guilds_invites.go         |   17 +
 .../internal/cli/guilds_invites_list-guild.go      |   50 +
 discord-cli/internal/cli/guilds_members.go         |   25 +
 .../internal/cli/guilds_members_add-guild-role.go  |   72 +
 .../internal/cli/guilds_members_add-guild.go       |   95 +
 .../cli/guilds_members_delete-guild-role.go        |   56 +
 .../internal/cli/guilds_members_delete-guild.go    |   53 +
 .../internal/cli/guilds_members_get-guild.go       |   54 +
 .../internal/cli/guilds_members_list-guild.go      |   57 +
 .../internal/cli/guilds_members_search-guild.go    |   58 +
 .../internal/cli/guilds_members_update-guild.go    |   98 +
 .../internal/cli/guilds_members_update-my-guild.go |   84 +
 discord-cli/internal/cli/guilds_messages.go        |   17 +
 .../internal/cli/guilds_messages_guild-search.go   |  124 +
 .../internal/cli/guilds_new-member-welcome.go      |   17 +
 .../cli/guilds_new-member-welcome_get-guild.go     |   50 +
 discord-cli/internal/cli/guilds_onboarding.go      |   18 +
 .../internal/cli/guilds_onboarding_get-guilds.go   |   50 +
 .../internal/cli/guilds_onboarding_put-guilds.go   |   75 +
 discord-cli/internal/cli/guilds_preview.go         |   17 +
 .../internal/cli/guilds_preview_get-guild.go       |   50 +
 discord-cli/internal/cli/guilds_prune.go           |   18 +
 discord-cli/internal/cli/guilds_prune_guild.go     |   80 +
 .../internal/cli/guilds_prune_preview-guild.go     |   60 +
 discord-cli/internal/cli/guilds_regions.go         |   17 +
 .../cli/guilds_regions_list-guild-voice.go         |   50 +
 discord-cli/internal/cli/guilds_roles.go           |   23 +
 .../internal/cli/guilds_roles_bulk-update-guild.go |   65 +
 .../internal/cli/guilds_roles_create-guild.go      |  105 +
 .../internal/cli/guilds_roles_delete-guild.go      |   53 +
 discord-cli/internal/cli/guilds_roles_get-guild.go |   54 +
 .../cli/guilds_roles_guild-member-counts.go        |   49 +
 .../internal/cli/guilds_roles_list-guild.go        |   49 +
 .../internal/cli/guilds_roles_update-guild.go      |  108 +
 .../internal/cli/guilds_scheduled-events.go        |   22 +
 .../cli/guilds_scheduled-events_create-guild.go    |   65 +
 .../cli/guilds_scheduled-events_delete-guild.go    |   53 +
 .../cli/guilds_scheduled-events_get-guild.go       |   59 +
 .../guilds_scheduled-events_list-guild-users.go    |   67 +
 .../cli/guilds_scheduled-events_list-guild.go      |   54 +
 .../cli/guilds_scheduled-events_update-guild.go    |   69 +
 .../internal/cli/guilds_soundboard-sounds.go       |   21 +
 .../cli/guilds_soundboard-sounds_create-guild.go   |   92 +
 .../cli/guilds_soundboard-sounds_delete-guild.go   |   53 +
 .../cli/guilds_soundboard-sounds_get-guild.go      |   54 +
 .../cli/guilds_soundboard-sounds_list-guild.go     |   49 +
 .../cli/guilds_soundboard-sounds_update-guild.go   |   89 +
 discord-cli/internal/cli/guilds_stickers.go        |   21 +
 .../internal/cli/guilds_stickers_create-guild.go   |   88 +
 .../internal/cli/guilds_stickers_delete-guild.go   |   53 +
 .../internal/cli/guilds_stickers_get-guild.go      |   54 +
 .../internal/cli/guilds_stickers_list-guild.go     |   49 +
 .../internal/cli/guilds_stickers_update-guild.go   |   84 +
 discord-cli/internal/cli/guilds_templates.go       |   21 +
 .../internal/cli/guilds_templates_create-guild.go  |   76 +
 .../internal/cli/guilds_templates_delete-guild.go  |   53 +
 .../internal/cli/guilds_templates_list-guild.go    |   50 +
 .../internal/cli/guilds_templates_sync-guild.go    |   69 +
 .../internal/cli/guilds_templates_update-guild.go  |   78 +
 discord-cli/internal/cli/guilds_threads.go         |   17 +
 .../cli/guilds_threads_get-active-guild.go         |   50 +
 discord-cli/internal/cli/guilds_update.go          |  164 +
 discord-cli/internal/cli/guilds_vanity-url.go      |   17 +
 .../internal/cli/guilds_vanity-url_get-guild.go    |   50 +
 discord-cli/internal/cli/guilds_voice-states.go    |   20 +
 .../internal/cli/guilds_voice-states_get-self.go   |   49 +
 .../internal/cli/guilds_voice-states_get.go        |   53 +
 .../cli/guilds_voice-states_update-self.go         |   79 +
 .../internal/cli/guilds_voice-states_update.go     |   78 +
 discord-cli/internal/cli/guilds_webhooks.go        |   17 +
 .../internal/cli/guilds_webhooks_get-guild.go      |   50 +
 discord-cli/internal/cli/guilds_welcome-screen.go  |   18 +
 .../cli/guilds_welcome-screen_get-guild.go         |   50 +
 .../cli/guilds_welcome-screen_update-guild.go      |   75 +
 discord-cli/internal/cli/guilds_widget-json.go     |   17 +
 .../cli/guilds_widget-json_get-guild-widget.go     |   50 +
 discord-cli/internal/cli/guilds_widget-png.go      |   17 +
 .../internal/cli/guilds_widget-png_get-guild.go    |   55 +
 discord-cli/internal/cli/guilds_widget.go          |   18 +
 .../cli/guilds_widget_get-guild-settings.go        |   50 +
 .../cli/guilds_widget_update-guild-settings.go     |   75 +
 discord-cli/internal/cli/helpers.go                |  385 ++
 discord-cli/internal/cli/import.go                 |  100 +
 discord-cli/internal/cli/interactions.go           |   17 +
 discord-cli/internal/cli/interactions_callback.go  |   17 +
 ...actions_callback_create-interaction-response.go |   71 +
 discord-cli/internal/cli/invites.go                |   19 +
 discord-cli/internal/cli/invites_resolve.go        |   60 +
 discord-cli/internal/cli/invites_revoke.go         |   49 +
 discord-cli/internal/cli/invites_target-users.go   |   19 +
 .../invites_target-users_get-invite-job-status.go  |   49 +
 .../cli/invites_target-users_get-invite.go         |   50 +
 .../cli/invites_target-users_update-invite.go      |   71 +
 discord-cli/internal/cli/lobbies.go                |   23 +
 .../internal/cli/lobbies_channel-linking.go        |   17 +
 ...bies_channel-linking_edit-lobby-channel-link.go |   70 +
 discord-cli/internal/cli/lobbies_create-lobby.go   |   76 +
 .../internal/cli/lobbies_create-or-join-lobby.go   |   77 +
 discord-cli/internal/cli/lobbies_edit-lobby.go     |   79 +
 discord-cli/internal/cli/lobbies_get-lobby.go      |   50 +
 discord-cli/internal/cli/lobbies_members.go        |   22 +
 .../internal/cli/lobbies_members_add-lobby.go      |   74 +
 .../cli/lobbies_members_bulk-update-lobby.go       |   65 +
 ...rs_create-linked-lobby-guild-invite-for-self.go |   64 +
 ...rs_create-linked-lobby-guild-invite-for-user.go |   68 +
 .../internal/cli/lobbies_members_delete-lobby.go   |   53 +
 .../internal/cli/lobbies_members_leave-lobby.go    |   48 +
 discord-cli/internal/cli/lobbies_messages.go       |   19 +
 .../internal/cli/lobbies_messages_create-lobby.go  |  110 +
 .../internal/cli/lobbies_messages_get-lobby.go     |   55 +
 ...es_update-lobby-external-moderation-metadata.go |   69 +
 discord-cli/internal/cli/oauth2.go                 |   20 +
 .../internal/cli/oauth2_get-my-application.go      |   46 +
 .../internal/cli/oauth2_get-my-authorization.go    |   45 +
 .../cli/oauth2_get-openid-connect-userinfo.go      |   45 +
 discord-cli/internal/cli/oauth2_get-public-keys.go |   45 +
 discord-cli/internal/cli/partner-sdk.go            |   21 +
 discord-cli/internal/cli/partner-sdk_bot-token.go  |   72 +
 .../partner-sdk_bot-unmerge-provisional-account.go |   66 +
 discord-cli/internal/cli/partner-sdk_token.go      |   83 +
 .../cli/partner-sdk_unmerge-provisional-account.go |   83 +
 ...te-user-message-external-moderation-metadata.go |   73 +
 discord-cli/internal/cli/root.go                   |  145 +
 discord-cli/internal/cli/search.go                 |   77 +
 .../internal/cli/soundboard-default-sounds.go      |   17 +
 .../internal/cli/soundboard-default-sounds_get.go  |   46 +
 discord-cli/internal/cli/stage-instances.go        |   20 +
 discord-cli/internal/cli/stage-instances_create.go |   87 +
 discord-cli/internal/cli/stage-instances_delete.go |   48 +
 discord-cli/internal/cli/stage-instances_get.go    |   49 +
 discord-cli/internal/cli/stage-instances_update.go |   74 +
 discord-cli/internal/cli/sticker-packs.go          |   18 +
 discord-cli/internal/cli/sticker-packs_get.go      |   49 +
 discord-cli/internal/cli/sticker-packs_list.go     |   45 +
 discord-cli/internal/cli/stickers.go               |   17 +
 discord-cli/internal/cli/stickers_get.go           |   49 +
 discord-cli/internal/cli/sync.go                   |  128 +
 discord-cli/internal/cli/tail.go                   |  117 +
 discord-cli/internal/cli/users.go                  |   28 +
 discord-cli/internal/cli/users_create-dm.go        |   66 +
 .../users_delete-application-role-connection.go    |   49 +
 .../cli/users_get-application-role-connection.go   |   49 +
 .../users_get-current-application-entitlements.go  |   59 +
 .../internal/cli/users_get-my-guild-member.go      |   49 +
 discord-cli/internal/cli/users_get-my.go           |   46 +
 discord-cli/internal/cli/users_get.go              |   49 +
 discord-cli/internal/cli/users_leave-guild.go      |   48 +
 .../internal/cli/users_list-my-connections.go      |   45 +
 discord-cli/internal/cli/users_list-my-guilds.go   |   59 +
 .../users_update-application-role-connection.go    |   75 +
 discord-cli/internal/cli/users_update-my.go        |   76 +
 discord-cli/internal/cli/voice.go                  |   17 +
 discord-cli/internal/cli/voice_list-regions.go     |   46 +
 discord-cli/internal/cli/webhooks.go               |   26 +
 .../internal/cli/webhooks_delete-by-token.go       |   52 +
 discord-cli/internal/cli/webhooks_delete.go        |   48 +
 discord-cli/internal/cli/webhooks_execute.go       |   75 +
 discord-cli/internal/cli/webhooks_get-by-token.go  |   53 +
 discord-cli/internal/cli/webhooks_get.go           |   49 +
 discord-cli/internal/cli/webhooks_github.go        |   17 +
 .../webhooks_github_execute-compatible-webhook.go  |  163 +
 discord-cli/internal/cli/webhooks_messages.go      |   22 +
 .../webhooks_messages_delete-original-webhook.go   |   55 +
 .../cli/webhooks_messages_delete-webhook.go        |   58 +
 .../cli/webhooks_messages_get-original-webhook.go  |   59 +
 .../internal/cli/webhooks_messages_get-webhook.go  |   62 +
 .../webhooks_messages_update-original-webhook.go   |   93 +
 .../cli/webhooks_messages_update-webhook.go        |   96 +
 discord-cli/internal/cli/webhooks_slack.go         |   17 +
 .../webhooks_slack_execute-compatible-webhook.go   |   88 +
 .../internal/cli/webhooks_update-by-token.go       |   78 +
 discord-cli/internal/cli/webhooks_update.go        |   79 +
 discord-cli/internal/cli/workflow_audit_report.go  |  139 +
 .../internal/cli/workflow_channel_health.go        |  167 +
 discord-cli/internal/cli/workflow_member_report.go |  134 +
 discord-cli/internal/cli/workflow_message_stats.go |  173 +
 discord-cli/internal/cli/workflow_prune_preview.go |   90 +
 .../internal/cli/workflow_server_snapshot.go       |  110 +
 discord-cli/internal/cli/workflow_webhook_send.go  |   68 +
 discord-cli/internal/client/client.go              |  346 ++
 discord-cli/internal/config/config.go              |  104 +
 discord-cli/internal/store/store.go                |  277 ++
 discord-cli/internal/types/types.go                | 3877 ++++++++++++++++++++
 docs/plans/2026-03-25-feat-discord-cli-research.md |   74 +-
 ...26-03-25-feat-discord-cli-visionary-research.md |   69 +
 docs/plans/2026-03-25-fix-discord-cli-audit.md     |  124 +-
 ...at-discord-cli-vs-discrawl-gap-analysis-plan.md |  318 ++
 ...03-26-feat-power-user-prediction-engine-plan.md |  620 ++++
 skills/printing-press/SKILL.md                     |  316 +-
 336 files changed, 25502 insertions(+), 109 deletions(-)

diff --git a/discord-cli/Makefile b/discord-cli/Makefile
new file mode 100644
index 00000000..4c06a1a4
--- /dev/null
+++ b/discord-cli/Makefile
@@ -0,0 +1,16 @@
+.PHONY: build test lint install clean
+
+build:
+	go build -o bin/discord-cli ./cmd/discord-cli
+
+test:
+	go test ./...
+
+lint:
+	golangci-lint run
+
+install:
+	go install ./cmd/discord-cli
+
+clean:
+	rm -rf bin/
diff --git a/discord-cli/README.md b/discord-cli/README.md
new file mode 100644
index 00000000..9196327b
--- /dev/null
+++ b/discord-cli/README.md
@@ -0,0 +1,306 @@
+# discord-cli
+
+Manage Discord servers, channels, messages, roles, and more from your terminal. Built for bot developers, server admins, and AI agents.
+
+## Install
+
+### Homebrew
+
+```
+brew install USER/tap/discord-cli
+```
+
+### Go
+
+```
+go install github.com/USER/discord-cli/cmd/discord-cli@latest
+```
+
+### Binary
+
+Download from [Releases](https://github.com/USER/discord-cli/releases).
+
+## Quick Start
+
+```bash
+# 1. Set your bot token
+export DISCORD_TOKEN="Bot YOUR_BOT_TOKEN_HERE"
+
+# 2. Verify everything works
+discord-cli doctor
+
+# 3. List your guilds (servers)
+discord-cli users list-my-guilds --json
+
+# 4. List channels in a guild
+discord-cli guilds channels list-guild 123456789012345678 --json
+```
+
+## Workflow Commands
+
+These compound commands combine multiple API calls into single operations. They're the reason this CLI exists - not just an API wrapper.
+
+### channel-health
+
+Detect stale channels and show activity trends across a guild.
+
+```bash
+# Find inactive channels (no messages in 30 days)
+discord-cli workflow channel-health --guild 123456789012345678
+
+# Custom staleness threshold
+discord-cli workflow channel-health --guild 123456789012345678 --days 14 --json
+```
+
+### audit-report
+
+Analyze audit log entries grouped by action type and user.
+
+```bash
+# Full audit report
+discord-cli workflow audit-report --guild 123456789012345678
+
+# Filter by action type (22 = MEMBER_BAN_ADD)
+discord-cli workflow audit-report --guild 123456789012345678 --action 22 --json
+```
+
+### member-report
+
+Analyze member roles, join dates, and composition across a guild.
+
+```bash
+# Member report with role distribution
+discord-cli workflow member-report --guild 123456789012345678
+
+# Fetch more members
+discord-cli workflow member-report --guild 123456789012345678 --max 500 --json
+```
+
+### server-snapshot
+
+Backup guild configuration (roles, channels, emojis) to JSON.
+
+```bash
+# Backup to file
+discord-cli workflow server-snapshot --guild 123456789012345678 -o backup.json
+
+# Backup to stdout
+discord-cli workflow server-snapshot --guild 123456789012345678 --json
+```
+
+### message-stats
+
+Show message volume and top contributors for a channel or guild.
+
+```bash
+# Stats for a specific channel
+discord-cli workflow message-stats --channel 123456789012345678 --limit 100
+
+# Stats across all channels in a guild
+discord-cli workflow message-stats --guild 123456789012345678 --json
+```
+
+### prune-preview
+
+Preview how many members would be pruned without executing.
+
+```bash
+# Preview 7-day prune (never modifies the guild)
+discord-cli workflow prune-preview --guild 123456789012345678 --days 7
+```
+
+### webhook-test
+
+Send a test payload to a Discord webhook.
+
+```bash
+# Simple test message
+discord-cli workflow webhook-test --id 123456789012345678 --token abcdef123456 --message "Hello from CLI!"
+
+# Rich embed via stdin
+echo '{"content":"Deploy alert","embeds":[{"title":"Build #42","color":3066993}]}' | discord-cli workflow webhook-test --id 123456789012345678 --token abcdef123456 --stdin
+```
+
+## API Commands
+
+### channels
+
+Manage Discord channels, messages, threads, pins, and permissions.
+
+```bash
+# Get channel details
+discord-cli channels get 123456789012345678
+
+# List messages
+discord-cli channels messages list 123456789012345678 --limit 25 --json
+
+# Send a message
+discord-cli channels messages create 123456789012345678 --content "Hello, world!"
+
+# Send a rich message with embeds
+echo '{"content":"Announcement","embeds":[{"title":"v2.0 Released","description":"Check out the new features","color":5814783}]}' | discord-cli channels messages create 123456789012345678 --stdin
+
+# Pin a message
+discord-cli channels pins pin 123456789012345678 987654321098765432
+
+# Create a thread
+echo '{"name":"Bug Discussion","auto_archive_duration":1440}' | discord-cli channels threads create 123456789012345678 --stdin
+```
+
+### guilds
+
+Manage guilds (servers) - members, roles, bans, channels, audit logs, and more.
+
+```bash
+# Get guild details
+discord-cli guilds get 123456789012345678 --json
+
+# List members
+discord-cli guilds members list 123456789012345678 --limit 100 --json
+
+# List roles
+discord-cli guilds roles list-guild 123456789012345678 --json
+
+# Ban a user
+discord-cli guilds bans user-from-guild 123456789012345678 987654321098765432
+
+# List audit log
+discord-cli guilds audit-logs list-guild-entries 123456789012345678 --json
+
+# Create a channel
+echo '{"name":"new-channel","type":0,"permission_overwrites":[{"id":"ROLE_ID","type":0,"allow":"1024"}]}' | discord-cli guilds channels create-guild 123456789012345678 --stdin
+```
+
+### webhooks
+
+```bash
+# Get webhook details
+discord-cli webhooks get 123456789012345678
+
+# Execute a webhook
+echo '{"content":"Build passed!","embeds":[{"title":"CI/CD","color":3066993}]}' | discord-cli webhooks execute 123456789012345678 TOKEN --stdin
+```
+
+### users
+
+```bash
+# Get current user
+discord-cli users get-my --json
+
+# List guilds you're in
+discord-cli users list-my-guilds --json
+
+# Get a user by ID
+discord-cli users get 123456789012345678 --json
+```
+
+## Local Sync and Search
+
+Sync messages to a local SQLite database for instant full-text search without API calls.
+
+```bash
+# Sync all resources
+discord-cli sync
+
+# Full-text search across synced data
+discord-cli search "error timeout" --json
+
+# Follow new messages (tail -f for Discord)
+discord-cli tail messages --interval 5s
+
+# Export messages to JSONL
+discord-cli export messages --format jsonl --output messages.jsonl
+
+# Analytics on synced data
+discord-cli analytics --type messages --group-by channel_id
+```
+
+## Output Formats
+
+```bash
+# Human-readable table (default)
+discord-cli guilds roles list-guild 123456789012345678
+
+# JSON for scripting and agents
+discord-cli guilds roles list-guild 123456789012345678 --json
+
+# Filter specific fields
+discord-cli guilds roles list-guild 123456789012345678 --json --select id,name,color
+
+# Plain tab-separated for piping
+discord-cli guilds members list 123456789012345678 --plain
+
+# Dry run (show request without sending)
+discord-cli guilds bans user-from-guild 123456789012345678 USER_ID --dry-run
+```
+
+## Agent Usage
+
+This CLI is designed for AI agent consumption:
+
+- **Non-interactive** - never prompts, every input is a flag
+- **Pipeable** - `--json` output to stdout, errors to stderr
+- **Filterable** - `--select id,name` returns only fields you need
+- **Previewable** - `--dry-run` shows the request without sending
+- **Retryable** - creates return "already exists" on retry, deletes return "already deleted"
+- **Confirmable** - `--yes` for explicit confirmation of destructive actions
+- **Piped input** - `echo '{"key":"value"}' | discord-cli <resource> create --stdin`
+- **Cacheable** - GET responses cached for 5 minutes, bypass with `--no-cache`
+- **Agent-safe by default** - no colors or formatting unless `--human-friendly` is set
+- **Progress events** - paginated commands emit NDJSON events to stderr in default mode
+
+Exit codes: `0` success, `2` usage error, `3` not found, `4` auth error, `5` API error, `7` rate limited, `10` config error.
+
+## Doctor
+
+```bash
+discord-cli doctor
+```
+
+Validates your bot token, API connectivity, and configuration.
+
+## Configuration
+
+Config file: `~/.config/discord-cli/config.toml`
+
+Environment variables:
+- `DISCORD_TOKEN` - Bot token (format: `Bot YOUR_TOKEN`)
+
+## FAQ
+
+**How do I get a bot token?**
+1. Go to [Discord Developer Portal](https://discord.com/developers/applications)
+2. Create an application
+3. Go to Bot section, click "Reset Token"
+4. Copy the token and set `DISCORD_TOKEN="Bot YOUR_TOKEN"`
+
+**What permissions does my bot need?**
+It depends on what you want to do. For read-only operations (list channels, messages), the bot needs basic permissions. For management (bans, role changes), it needs admin permissions. Check Discord's [permission calculator](https://discord.com/developers/docs/topics/permissions).
+
+**Can I use a user token?**
+This CLI is designed for bot tokens (TOS-compliant). User tokens may work but violate Discord's Terms of Service and risk account suspension.
+
+**How does rate limiting work?**
+The CLI automatically handles Discord's per-route rate limits with retry + exponential backoff. If you see `exit code 7`, you're being rate-limited - wait a few minutes.
+
+**Where is the local database stored?**
+`~/.local/share/discord-cli/data.db` (SQLite). Use `--db` flag to specify a custom path.
+
+## Troubleshooting
+
+**Authentication errors (exit code 4)**
+- Run `discord-cli doctor` to check credentials
+- Verify the environment variable: `echo $DISCORD_TOKEN`
+- Make sure the format is `Bot YOUR_TOKEN` (with the "Bot " prefix)
+
+**Not found errors (exit code 3)**
+- Check the resource ID is correct (use Developer Mode in Discord to copy IDs)
+- Run the `list` command to see available items
+
+**Rate limit errors (exit code 7)**
+- The CLI auto-retries with exponential backoff
+- If persistent, wait a few minutes and try again
+
+---
+
+Generated by [CLI Printing Press](https://github.com/mvanhorn/cli-printing-press)
diff --git a/discord-cli/cmd/discord-cli/main.go b/discord-cli/cmd/discord-cli/main.go
new file mode 100644
index 00000000..56550b04
--- /dev/null
+++ b/discord-cli/cmd/discord-cli/main.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package main
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/USER/discord-cli/internal/cli"
+)
+
+func main() {
+	if err := cli.Execute(); err != nil {
+		fmt.Fprintln(os.Stderr, err.Error())
+		os.Exit(cli.ExitCode(err))
+	}
+}
diff --git a/discord-cli/go.mod b/discord-cli/go.mod
new file mode 100644
index 00000000..0cdd3357
--- /dev/null
+++ b/discord-cli/go.mod
@@ -0,0 +1,25 @@
+module github.com/USER/discord-cli
+
+go 1.23.0
+
+require (
+	github.com/mattn/go-isatty v0.0.20
+	github.com/pelletier/go-toml/v2 v2.2.4
+	github.com/spf13/cobra v1.9.1
+)
+
+require modernc.org/sqlite v1.37.0
+
+require (
+	github.com/dustin/go-humanize v1.0.1 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/inconshreveable/mousetrap v1.1.0 // indirect
+	github.com/ncruces/go-strftime v0.1.9 // indirect
+	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
+	github.com/spf13/pflag v1.0.6 // indirect
+	golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect
+	golang.org/x/sys v0.31.0 // indirect
+	modernc.org/libc v1.62.1 // indirect
+	modernc.org/mathutil v1.7.1 // indirect
+	modernc.org/memory v1.9.1 // indirect
+)
diff --git a/discord-cli/go.sum b/discord-cli/go.sum
new file mode 100644
index 00000000..9c8f1377
--- /dev/null
+++ b/discord-cli/go.sum
@@ -0,0 +1,59 @@
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
+github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
+github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
+github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
+github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
+github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
+github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
+github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
+github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
+golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
+golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
+golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
+golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
+golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+modernc.org/cc/v4 v4.25.2 h1:T2oH7sZdGvTaie0BRNFbIYsabzCxUQg8nLqCdQ2i0ic=
+modernc.org/cc/v4 v4.25.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
+modernc.org/ccgo/v4 v4.25.1 h1:TFSzPrAGmDsdnhT9X2UrcPMI3N/mJ9/X9ykKXwLhDsU=
+modernc.org/ccgo/v4 v4.25.1/go.mod h1:njjuAYiPflywOOrm3B7kCB444ONP5pAVr8PIEoE0uDw=
+modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
+modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
+modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
+modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
+modernc.org/libc v1.62.1 h1:s0+fv5E3FymN8eJVmnk0llBe6rOxCu/DEU+XygRbS8s=
+modernc.org/libc v1.62.1/go.mod h1:iXhATfJQLjG3NWy56a6WVU73lWOcdYVxsvwCgoPljuo=
+modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
+modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
+modernc.org/memory v1.9.1 h1:V/Z1solwAVmMW1yttq3nDdZPJqV1rM05Ccq6KMSZ34g=
+modernc.org/memory v1.9.1/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
+modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
+modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
+modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
+modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
+modernc.org/sqlite v1.37.0 h1:s1TMe7T3Q3ovQiK2Ouz4Jwh7dw4ZDqbebSDTlSJdfjI=
+modernc.org/sqlite v1.37.0/go.mod h1:5YiWv+YviqGMuGw4V+PNplcyaJ5v+vQd7TQOgkACoJM=
+modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
+modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
+modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
+modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
diff --git a/discord-cli/internal/cache/cache.go b/discord-cli/internal/cache/cache.go
new file mode 100644
index 00000000..ff4e2d6a
--- /dev/null
+++ b/discord-cli/internal/cache/cache.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+// Package cache provides a file-based response cache with optional embedded database backend.
+// The default implementation stores JSON responses as flat files in ~/.cache/<cli>/ with a TTL.
+// For higher-throughput or concurrent-write scenarios, replace the file backend with an
+// embedded database such as bolt (go.etcd.io/bbolt), badger (github.com/dgraph-io/badger),
+// or sqlite (modernc.org/sqlite).
+package cache
+
+import (
+	"crypto/sha256"
+	"encoding/hex"
+	"encoding/json"
+	"os"
+	"path/filepath"
+	"time"
+)
+
+// Store is a key-value cache backed by the filesystem.
+type Store struct {
+	Dir string
+	TTL time.Duration
+}
+
+// New creates a file-based cache store.
+func New(dir string, ttl time.Duration) *Store {
+	return &Store{Dir: dir, TTL: ttl}
+}
+
+// Get retrieves a cached value. Returns nil if not found or expired.
+func (s *Store) Get(key string) (json.RawMessage, bool) {
+	path := s.path(key)
+	info, err := os.Stat(path)
+	if err != nil || time.Since(info.ModTime()) > s.TTL {
+		return nil, false
+	}
+	data, err := os.ReadFile(path)
+	if err != nil {
+		return nil, false
+	}
+	return json.RawMessage(data), true
+}
+
+// Set stores a value in the cache.
+func (s *Store) Set(key string, value json.RawMessage) {
+	_ = os.MkdirAll(s.Dir, 0o755)
+	_ = os.WriteFile(s.path(key), []byte(value), 0o644)
+}
+
+// Clear removes all cached entries.
+func (s *Store) Clear() error {
+	return os.RemoveAll(s.Dir)
+}
+
+func (s *Store) path(key string) string {
+	h := sha256.Sum256([]byte(key))
+	return filepath.Join(s.Dir, hex.EncodeToString(h[:8])+".json")
+}
diff --git a/discord-cli/internal/cli/analytics.go b/discord-cli/internal/cli/analytics.go
new file mode 100644
index 00000000..75dc95bb
--- /dev/null
+++ b/discord-cli/internal/cli/analytics.go
@@ -0,0 +1,136 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"path/filepath"
+	"sort"
+
+	"github.com/USER/discord-cli/internal/store"
+	"github.com/spf13/cobra"
+)
+
+func newAnalyticsCmd(flags *rootFlags) *cobra.Command {
+	var resourceType string
+	var groupBy string
+	var dbPath string
+	var limit int
+
+	cmd := &cobra.Command{
+		Use:   "analytics",
+		Short: "Run analytics queries on locally synced data",
+		Long: `Analyze locally synced data with count, group-by, and summary operations.
+Data must be synced first with the sync command.`,
+		Example: `  # Count records by type
+  discord-cli analytics --type messages
+
+  # Group by a field
+  discord-cli analytics --type messages --group-by author_id
+
+  # Top 10 most frequent values
+  discord-cli analytics --type messages --group-by channel_id --limit 10 --json`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if dbPath == "" {
+				home, _ := os.UserHomeDir()
+				dbPath = filepath.Join(home, ".local", "share", "discord-cli", "data.db")
+			}
+
+			db, err := store.Open(dbPath)
+			if err != nil {
+				return fmt.Errorf("opening local database: %w\nRun 'discord-cli sync' first.", err)
+			}
+			defer db.Close()
+
+			if resourceType == "" {
+				// Show summary of all resource types
+				status, err := db.Status()
+				if err != nil {
+					return fmt.Errorf("getting status: %w", err)
+				}
+				if flags.asJSON {
+					enc := json.NewEncoder(os.Stdout)
+					enc.SetIndent("", "  ")
+					return enc.Encode(status)
+				}
+				fmt.Println("Resource Type\tCount")
+				fmt.Println("-------------\t-----")
+				for rt, count := range status {
+					fmt.Printf("%s\t%d\n", rt, count)
+				}
+				return nil
+			}
+
+			if groupBy != "" {
+				return runGroupBy(db, resourceType, groupBy, limit, flags)
+			}
+
+			count, err := db.Count(resourceType)
+			if err != nil {
+				return fmt.Errorf("counting: %w", err)
+			}
+
+			if flags.asJSON {
+				result := map[string]any{"resource_type": resourceType, "count": count}
+				enc := json.NewEncoder(os.Stdout)
+				enc.SetIndent("", "  ")
+				return enc.Encode(result)
+			}
+
+			fmt.Printf("%s: %d records\n", resourceType, count)
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&resourceType, "type", "", "Resource type to analyze")
+	cmd.Flags().StringVar(&groupBy, "group-by", "", "Field to group by")
+	cmd.Flags().StringVar(&dbPath, "db", "", "Database path")
+	cmd.Flags().IntVar(&limit, "limit", 25, "Max groups to show")
+
+	return cmd
+}
+
+func runGroupBy(db *store.Store, resourceType, field string, limit int, flags *rootFlags) error {
+	items, err := db.List(resourceType, 0)
+	if err != nil {
+		return err
+	}
+
+	counts := make(map[string]int)
+	for _, item := range items {
+		var obj map[string]any
+		if err := json.Unmarshal(item, &obj); err != nil {
+			continue
+		}
+		val := fmt.Sprintf("%v", obj[field])
+		counts[val]++
+	}
+
+	type kv struct {
+		Key   string `json:"value"`
+		Count int    `json:"count"`
+	}
+	var sorted []kv
+	for k, v := range counts {
+		sorted = append(sorted, kv{k, v})
+	}
+	sort.Slice(sorted, func(i, j int) bool { return sorted[i].Count > sorted[j].Count })
+	if limit > 0 && len(sorted) > limit {
+		sorted = sorted[:limit]
+	}
+
+	if flags.asJSON {
+		enc := json.NewEncoder(os.Stdout)
+		enc.SetIndent("", "  ")
+		return enc.Encode(sorted)
+	}
+
+	fmt.Printf("%s\tCount\n", field)
+	fmt.Println("---\t-----")
+	for _, kv := range sorted {
+		fmt.Printf("%s\t%d\n", kv.Key, kv.Count)
+	}
+	return nil
+}
diff --git a/discord-cli/internal/cli/applications.go b/discord-cli/internal/cli/applications.go
new file mode 100644
index 00000000..68b24a40
--- /dev/null
+++ b/discord-cli/internal/cli/applications.go
@@ -0,0 +1,27 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newApplicationsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "applications",
+		Short: "Manage applications",
+	}
+
+	cmd.AddCommand(newApplicationsGetCmd(flags))
+	cmd.AddCommand(newApplicationsGetMyCmd(flags))
+	cmd.AddCommand(newApplicationsUpdateCmd(flags))
+	cmd.AddCommand(newApplicationsUpdateMyCmd(flags))
+	cmd.AddCommand(newApplicationsActivityInstancesCmd(flags))
+	cmd.AddCommand(newApplicationsAttachmentCmd(flags))
+	cmd.AddCommand(newApplicationsCommandsCmd(flags))
+	cmd.AddCommand(newApplicationsEmojisCmd(flags))
+	cmd.AddCommand(newApplicationsEntitlementsCmd(flags))
+	cmd.AddCommand(newApplicationsGuildsCmd(flags))
+	cmd.AddCommand(newApplicationsRoleConnectionsCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_activity-instances.go b/discord-cli/internal/cli/applications_activity-instances.go
new file mode 100644
index 00000000..12c6ac1d
--- /dev/null
+++ b/discord-cli/internal/cli/applications_activity-instances.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newApplicationsActivityInstancesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "activity-instances",
+		Short: "Manage activity instances",
+	}
+
+	cmd.AddCommand(newApplicationsActivityInstancesApplicationsGetCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_activity-instances_applications-get.go b/discord-cli/internal/cli/applications_activity-instances_applications-get.go
new file mode 100644
index 00000000..e198294f
--- /dev/null
+++ b/discord-cli/internal/cli/applications_activity-instances_applications-get.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsActivityInstancesApplicationsGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "applications-get <application_id> <instance_id>",
+		Aliases: []string{"get"},
+		Short: "Applications get",
+		Example: "  discord-cli applications activity-instances applications-get abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/activity-instances/{instance_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("instance_id is required"))
+			}
+			path = replacePathParam(path, "instance_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_attachment.go b/discord-cli/internal/cli/applications_attachment.go
new file mode 100644
index 00000000..2640e1e6
--- /dev/null
+++ b/discord-cli/internal/cli/applications_attachment.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newApplicationsAttachmentCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "attachment",
+		Short: "Manage attachment",
+	}
+
+	cmd.AddCommand(newApplicationsAttachmentUploadApplicationCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_attachment_upload-application.go b/discord-cli/internal/cli/applications_attachment_upload-application.go
new file mode 100644
index 00000000..236a9221
--- /dev/null
+++ b/discord-cli/internal/cli/applications_attachment_upload-application.go
@@ -0,0 +1,71 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsAttachmentUploadApplicationCmd(flags *rootFlags) *cobra.Command {
+	var bodyFile string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "upload-application <application_id>",
+		Aliases: []string{"create"},
+		Short: "Upload application",
+		Example: "  discord-cli applications attachment upload-application abc123 --file value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/attachment"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyFile != "" {
+					body["file"] = bodyFile
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyFile, "file", "", "File")
+	_ = cmd.MarkFlagRequired("file")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands.go b/discord-cli/internal/cli/applications_commands.go
new file mode 100644
index 00000000..4ca9f7ad
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands.go
@@ -0,0 +1,22 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newApplicationsCommandsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "commands",
+		Short: "Manage commands",
+	}
+
+	cmd.AddCommand(newApplicationsCommandsBulkSetApplicationCmd(flags))
+	cmd.AddCommand(newApplicationsCommandsCreateApplicationCmd(flags))
+	cmd.AddCommand(newApplicationsCommandsDeleteApplicationCmd(flags))
+	cmd.AddCommand(newApplicationsCommandsGetApplicationCmd(flags))
+	cmd.AddCommand(newApplicationsCommandsListApplicationCmd(flags))
+	cmd.AddCommand(newApplicationsCommandsUpdateApplicationCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_bulk-set-application.go b/discord-cli/internal/cli/applications_commands_bulk-set-application.go
new file mode 100644
index 00000000..071bdc47
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_bulk-set-application.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsCommandsBulkSetApplicationCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "bulk-set-application <application_id>",
+		Aliases: []string{"update"},
+		Short: "Bulk set application",
+		Example: "  discord-cli applications commands bulk-set-application abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/commands"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_create-application.go b/discord-cli/internal/cli/applications_commands_create-application.go
new file mode 100644
index 00000000..6e62ee45
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_create-application.go
@@ -0,0 +1,96 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsCommandsCreateApplicationCmd(flags *rootFlags) *cobra.Command {
+	var bodyDefaultMemberPermissions int
+	var bodyDescription string
+	var bodyDmPermission bool
+	var bodyHandler string
+	var bodyName string
+	var bodyType string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-application <application_id>",
+		Aliases: []string{"create"},
+		Short: "Create application",
+		Example: "  discord-cli applications commands create-application abc123 --name my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/commands"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDefaultMemberPermissions != 0 {
+					body["default_member_permissions"] = bodyDefaultMemberPermissions
+				}
+				if bodyDescription != "" {
+					body["description"] = bodyDescription
+				}
+				if bodyDmPermission != false {
+					body["dm_permission"] = bodyDmPermission
+				}
+				if bodyHandler != "" {
+					body["handler"] = bodyHandler
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodyType != "" {
+					body["type"] = bodyType
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyDefaultMemberPermissions, "default-member-permissions", 0, "Default member permissions")
+	cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+	cmd.Flags().BoolVar(&bodyDmPermission, "dm-permission", false, "Dm permission")
+	cmd.Flags().StringVar(&bodyHandler, "handler", "", "Handler")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	_ = cmd.MarkFlagRequired("name")
+	cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_delete-application.go b/discord-cli/internal/cli/applications_commands_delete-application.go
new file mode 100644
index 00000000..6668cb8d
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_delete-application.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsCommandsDeleteApplicationCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-application <application_id> <command_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete application",
+		Example: "  discord-cli applications commands delete-application abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/commands/{command_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("command_id is required"))
+			}
+			path = replacePathParam(path, "command_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_get-application.go b/discord-cli/internal/cli/applications_commands_get-application.go
new file mode 100644
index 00000000..d6d4ff21
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_get-application.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsCommandsGetApplicationCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-application <application_id> <command_id>",
+		Aliases: []string{"get"},
+		Short: "Get application",
+		Example: "  discord-cli applications commands get-application abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/commands/{command_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("command_id is required"))
+			}
+			path = replacePathParam(path, "command_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_list-application.go b/discord-cli/internal/cli/applications_commands_list-application.go
new file mode 100644
index 00000000..d1dc076b
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_list-application.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsCommandsListApplicationCmd(flags *rootFlags) *cobra.Command {
+	var flagWithLocalizations bool
+
+	cmd := &cobra.Command{
+		Use:   "list-application <application_id>",
+		Short: "List application",
+		Example: "  discord-cli applications commands list-application abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/commands"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			params := map[string]string{}
+			if flagWithLocalizations != false {
+				params["with_localizations"] = fmt.Sprintf("%v", flagWithLocalizations)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWithLocalizations, "with-localizations", false, "With localizations")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_commands_update-application.go b/discord-cli/internal/cli/applications_commands_update-application.go
new file mode 100644
index 00000000..70fd3117
--- /dev/null
+++ b/discord-cli/internal/cli/applications_commands_update-application.go
@@ -0,0 +1,93 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsCommandsUpdateApplicationCmd(flags *rootFlags) *cobra.Command {
+	var bodyDefaultMemberPermissions int
+	var bodyDescription string
+	var bodyDmPermission bool
+	var bodyHandler string
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-application <application_id> <command_id>",
+		Short: "Update application",
+		Example: "  discord-cli applications commands update-application abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/commands/{command_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("command_id is required"))
+			}
+			path = replacePathParam(path, "command_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDefaultMemberPermissions != 0 {
+					body["default_member_permissions"] = bodyDefaultMemberPermissions
+				}
+				if bodyDescription != "" {
+					body["description"] = bodyDescription
+				}
+				if bodyDmPermission != false {
+					body["dm_permission"] = bodyDmPermission
+				}
+				if bodyHandler != "" {
+					body["handler"] = bodyHandler
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyDefaultMemberPermissions, "default-member-permissions", 0, "Default member permissions")
+	cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+	cmd.Flags().BoolVar(&bodyDmPermission, "dm-permission", false, "Dm permission")
+	cmd.Flags().StringVar(&bodyHandler, "handler", "", "Handler")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis.go b/discord-cli/internal/cli/applications_emojis.go
new file mode 100644
index 00000000..3a8323bd
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newApplicationsEmojisCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "emojis",
+		Short: "Manage emojis",
+	}
+
+	cmd.AddCommand(newApplicationsEmojisCreateApplicationCmd(flags))
+	cmd.AddCommand(newApplicationsEmojisDeleteApplicationCmd(flags))
+	cmd.AddCommand(newApplicationsEmojisGetApplicationCmd(flags))
+	cmd.AddCommand(newApplicationsEmojisListApplicationCmd(flags))
+	cmd.AddCommand(newApplicationsEmojisUpdateApplicationCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis_create-application.go b/discord-cli/internal/cli/applications_emojis_create-application.go
new file mode 100644
index 00000000..d8214e91
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis_create-application.go
@@ -0,0 +1,77 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsEmojisCreateApplicationCmd(flags *rootFlags) *cobra.Command {
+	var bodyImage string
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-application <application_id>",
+		Aliases: []string{"create"},
+		Short: "Create application",
+		Example: "  discord-cli applications emojis create-application abc123 --image value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/emojis"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyImage != "" {
+					body["image"] = bodyImage
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyImage, "image", "", "Image")
+	_ = cmd.MarkFlagRequired("image")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	_ = cmd.MarkFlagRequired("name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis_delete-application.go b/discord-cli/internal/cli/applications_emojis_delete-application.go
new file mode 100644
index 00000000..3b29014f
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis_delete-application.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsEmojisDeleteApplicationCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-application <application_id> <emoji_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete application",
+		Example: "  discord-cli applications emojis delete-application abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/emojis/{emoji_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("emoji_id is required"))
+			}
+			path = replacePathParam(path, "emoji_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis_get-application.go b/discord-cli/internal/cli/applications_emojis_get-application.go
new file mode 100644
index 00000000..6d619a22
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis_get-application.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsEmojisGetApplicationCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-application <application_id> <emoji_id>",
+		Aliases: []string{"get"},
+		Short: "Get application",
+		Example: "  discord-cli applications emojis get-application abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/emojis/{emoji_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("emoji_id is required"))
+			}
+			path = replacePathParam(path, "emoji_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis_list-application.go b/discord-cli/internal/cli/applications_emojis_list-application.go
new file mode 100644
index 00000000..fa730874
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis_list-application.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsEmojisListApplicationCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-application <application_id>",
+		Short: "List application",
+		Example: "  discord-cli applications emojis list-application abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/emojis"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_emojis_update-application.go b/discord-cli/internal/cli/applications_emojis_update-application.go
new file mode 100644
index 00000000..8e27890b
--- /dev/null
+++ b/discord-cli/internal/cli/applications_emojis_update-application.go
@@ -0,0 +1,74 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsEmojisUpdateApplicationCmd(flags *rootFlags) *cobra.Command {
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-application <application_id> <emoji_id>",
+		Aliases: []string{"update"},
+		Short: "Update application",
+		Example: "  discord-cli applications emojis update-application abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/emojis/{emoji_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("emoji_id is required"))
+			}
+			path = replacePathParam(path, "emoji_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements.go b/discord-cli/internal/cli/applications_entitlements.go
new file mode 100644
index 00000000..77461440
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newApplicationsEntitlementsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "entitlements",
+		Short: "Manage entitlements",
+	}
+
+	cmd.AddCommand(newApplicationsEntitlementsConsumeCmd(flags))
+	cmd.AddCommand(newApplicationsEntitlementsCreateCmd(flags))
+	cmd.AddCommand(newApplicationsEntitlementsDeleteCmd(flags))
+	cmd.AddCommand(newApplicationsEntitlementsGetCmd(flags))
+	cmd.AddCommand(newApplicationsEntitlementsGetApplicationsCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements_consume.go b/discord-cli/internal/cli/applications_entitlements_consume.go
new file mode 100644
index 00000000..2bb7e43c
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements_consume.go
@@ -0,0 +1,68 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsEntitlementsConsumeCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "consume <application_id> <entitlement_id>",
+		Short: "Consume",
+		Example: "  discord-cli applications entitlements consume abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/entitlements/{entitlement_id}/consume"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("entitlement_id is required"))
+			}
+			path = replacePathParam(path, "entitlement_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements_create.go b/discord-cli/internal/cli/applications_entitlements_create.go
new file mode 100644
index 00000000..d116c1b3
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements_create.go
@@ -0,0 +1,82 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsEntitlementsCreateCmd(flags *rootFlags) *cobra.Command {
+	var bodyOwnerId string
+	var bodyOwnerType int
+	var bodySkuId string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create <application_id>",
+		Short: "Create",
+		Example: "  discord-cli applications entitlements create abc123 --owner-id abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/entitlements"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyOwnerId != "" {
+					body["owner_id"] = bodyOwnerId
+				}
+				if bodyOwnerType != 0 {
+					body["owner_type"] = bodyOwnerType
+				}
+				if bodySkuId != "" {
+					body["sku_id"] = bodySkuId
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyOwnerId, "owner-id", "", "Owner id")
+	_ = cmd.MarkFlagRequired("owner-id")
+	cmd.Flags().IntVar(&bodyOwnerType, "owner-type", 0, "Owner type")
+	_ = cmd.MarkFlagRequired("owner-type")
+	cmd.Flags().StringVar(&bodySkuId, "sku-id", "", "Sku id")
+	_ = cmd.MarkFlagRequired("sku-id")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements_delete.go b/discord-cli/internal/cli/applications_entitlements_delete.go
new file mode 100644
index 00000000..b877a2f2
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements_delete.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsEntitlementsDeleteCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete <application_id> <entitlement_id>",
+		Short: "Delete",
+		Example: "  discord-cli applications entitlements delete abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/entitlements/{entitlement_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("entitlement_id is required"))
+			}
+			path = replacePathParam(path, "entitlement_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements_get-applications.go b/discord-cli/internal/cli/applications_entitlements_get-applications.go
new file mode 100644
index 00000000..4a4853fc
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements_get-applications.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsEntitlementsGetApplicationsCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-applications <application_id> <entitlement_id>",
+		Short: "Get applications",
+		Example: "  discord-cli applications entitlements get-applications abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/entitlements/{entitlement_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("entitlement_id is required"))
+			}
+			path = replacePathParam(path, "entitlement_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_entitlements_get.go b/discord-cli/internal/cli/applications_entitlements_get.go
new file mode 100644
index 00000000..6d8fcfb3
--- /dev/null
+++ b/discord-cli/internal/cli/applications_entitlements_get.go
@@ -0,0 +1,78 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsEntitlementsGetCmd(flags *rootFlags) *cobra.Command {
+	var flagUserId string
+	var flagSkuIds string
+	var flagGuildId string
+	var flagBefore string
+	var flagAfter string
+	var flagLimit int
+	var flagExcludeEnded bool
+	var flagExcludeDeleted bool
+	var flagOnlyActive bool
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "get <application_id>",
+		Short: "Get",
+		Example: "  discord-cli applications entitlements get abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/entitlements"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"user_id": fmt.Sprintf("%v", flagUserId),
+				"sku_ids": fmt.Sprintf("%v", flagSkuIds),
+				"guild_id": fmt.Sprintf("%v", flagGuildId),
+				"before": fmt.Sprintf("%v", flagBefore),
+				"after": fmt.Sprintf("%v", flagAfter),
+				"limit": fmt.Sprintf("%v", flagLimit),
+				"exclude_ended": fmt.Sprintf("%v", flagExcludeEnded),
+				"exclude_deleted": fmt.Sprintf("%v", flagExcludeDeleted),
+				"only_active": fmt.Sprintf("%v", flagOnlyActive),
+			}, flagAll, "after", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagUserId, "user-id", "", "User id")
+	cmd.Flags().StringVar(&flagSkuIds, "sku-ids", "", "Sku ids")
+	cmd.Flags().StringVar(&flagGuildId, "guild-id", "", "Guild id")
+	cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+	cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().BoolVar(&flagExcludeEnded, "exclude-ended", false, "Exclude ended")
+	cmd.Flags().BoolVar(&flagExcludeDeleted, "exclude-deleted", false, "Exclude deleted")
+	cmd.Flags().BoolVar(&flagOnlyActive, "only-active", false, "Only active")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_get-my.go b/discord-cli/internal/cli/applications_get-my.go
new file mode 100644
index 00000000..7a2ac2af
--- /dev/null
+++ b/discord-cli/internal/cli/applications_get-my.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGetMyCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-my",
+		Aliases: []string{"list"},
+		Short: "Get my",
+		Example: "  discord-cli applications get-my",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/@me"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_get.go b/discord-cli/internal/cli/applications_get.go
new file mode 100644
index 00000000..fff459f9
--- /dev/null
+++ b/discord-cli/internal/cli/applications_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get <application_id>",
+		Short: "Get",
+		Example: "  discord-cli applications get abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds.go b/discord-cli/internal/cli/applications_guilds.go
new file mode 100644
index 00000000..a414825a
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds.go
@@ -0,0 +1,25 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newApplicationsGuildsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "guilds",
+		Short: "Manage guilds",
+	}
+
+	cmd.AddCommand(newApplicationsGuildsBulkSetApplicationCommandsCmd(flags))
+	cmd.AddCommand(newApplicationsGuildsCreateApplicationCommandCmd(flags))
+	cmd.AddCommand(newApplicationsGuildsDeleteApplicationCommandCmd(flags))
+	cmd.AddCommand(newApplicationsGuildsGetApplicationCommandCmd(flags))
+	cmd.AddCommand(newApplicationsGuildsGetApplicationCommandPermissionsCmd(flags))
+	cmd.AddCommand(newApplicationsGuildsListApplicationCommandPermissionsCmd(flags))
+	cmd.AddCommand(newApplicationsGuildsListApplicationCommandsCmd(flags))
+	cmd.AddCommand(newApplicationsGuildsSetApplicationCommandPermissionsCmd(flags))
+	cmd.AddCommand(newApplicationsGuildsUpdateApplicationCommandCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_bulk-set-application-commands.go b/discord-cli/internal/cli/applications_guilds_bulk-set-application-commands.go
new file mode 100644
index 00000000..cff9a530
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_bulk-set-application-commands.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGuildsBulkSetApplicationCommandsCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "bulk-set-application-commands <application_id> <guild_id>",
+		Aliases: []string{"update"},
+		Short: "Bulk set application commands",
+		Example: "  discord-cli applications guilds bulk-set-application-commands abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/guilds/{guild_id}/commands"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_create-application-command.go b/discord-cli/internal/cli/applications_guilds_create-application-command.go
new file mode 100644
index 00000000..419f8f46
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_create-application-command.go
@@ -0,0 +1,100 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGuildsCreateApplicationCommandCmd(flags *rootFlags) *cobra.Command {
+	var bodyDefaultMemberPermissions int
+	var bodyDescription string
+	var bodyDmPermission bool
+	var bodyHandler string
+	var bodyName string
+	var bodyType string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-application-command <application_id> <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Create application command",
+		Example: "  discord-cli applications guilds create-application-command abc123 abc123 --name my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/guilds/{guild_id}/commands"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDefaultMemberPermissions != 0 {
+					body["default_member_permissions"] = bodyDefaultMemberPermissions
+				}
+				if bodyDescription != "" {
+					body["description"] = bodyDescription
+				}
+				if bodyDmPermission != false {
+					body["dm_permission"] = bodyDmPermission
+				}
+				if bodyHandler != "" {
+					body["handler"] = bodyHandler
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodyType != "" {
+					body["type"] = bodyType
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyDefaultMemberPermissions, "default-member-permissions", 0, "Default member permissions")
+	cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+	cmd.Flags().BoolVar(&bodyDmPermission, "dm-permission", false, "Dm permission")
+	cmd.Flags().StringVar(&bodyHandler, "handler", "", "Handler")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	_ = cmd.MarkFlagRequired("name")
+	cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_delete-application-command.go b/discord-cli/internal/cli/applications_guilds_delete-application-command.go
new file mode 100644
index 00000000..31e3a596
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_delete-application-command.go
@@ -0,0 +1,57 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGuildsDeleteApplicationCommandCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-application-command <application_id> <guild_id> <command_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete application command",
+		Example: "  discord-cli applications guilds delete-application-command abc123 abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/guilds/{guild_id}/commands/{command_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("command_id is required"))
+			}
+			path = replacePathParam(path, "command_id", args[2])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_get-application-command-permissions.go b/discord-cli/internal/cli/applications_guilds_get-application-command-permissions.go
new file mode 100644
index 00000000..cd2c879a
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_get-application-command-permissions.go
@@ -0,0 +1,57 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGuildsGetApplicationCommandPermissionsCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-application-command-permissions <application_id> <guild_id> <command_id>",
+		Short: "Get application command permissions",
+		Example: "  discord-cli applications guilds get-application-command-permissions abc123 abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/guilds/{guild_id}/commands/{command_id}/permissions"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("command_id is required"))
+			}
+			path = replacePathParam(path, "command_id", args[2])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_get-application-command.go b/discord-cli/internal/cli/applications_guilds_get-application-command.go
new file mode 100644
index 00000000..047e003c
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_get-application-command.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGuildsGetApplicationCommandCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-application-command <application_id> <guild_id> <command_id>",
+		Aliases: []string{"get"},
+		Short: "Get application command",
+		Example: "  discord-cli applications guilds get-application-command abc123 abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/guilds/{guild_id}/commands/{command_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("command_id is required"))
+			}
+			path = replacePathParam(path, "command_id", args[2])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_list-application-command-permissions.go b/discord-cli/internal/cli/applications_guilds_list-application-command-permissions.go
new file mode 100644
index 00000000..0eefb705
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_list-application-command-permissions.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGuildsListApplicationCommandPermissionsCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-application-command-permissions <application_id> <guild_id>",
+		Short: "List application command permissions",
+		Example: "  discord-cli applications guilds list-application-command-permissions abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/guilds/{guild_id}/commands/permissions"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_list-application-commands.go b/discord-cli/internal/cli/applications_guilds_list-application-commands.go
new file mode 100644
index 00000000..15f188ae
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_list-application-commands.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGuildsListApplicationCommandsCmd(flags *rootFlags) *cobra.Command {
+	var flagWithLocalizations bool
+
+	cmd := &cobra.Command{
+		Use:   "list-application-commands <application_id> <guild_id>",
+		Short: "List application commands",
+		Example: "  discord-cli applications guilds list-application-commands abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/guilds/{guild_id}/commands"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[1])
+			params := map[string]string{}
+			if flagWithLocalizations != false {
+				params["with_localizations"] = fmt.Sprintf("%v", flagWithLocalizations)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWithLocalizations, "with-localizations", false, "With localizations")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_set-application-command-permissions.go b/discord-cli/internal/cli/applications_guilds_set-application-command-permissions.go
new file mode 100644
index 00000000..5fae6035
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_set-application-command-permissions.go
@@ -0,0 +1,72 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGuildsSetApplicationCommandPermissionsCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "set-application-command-permissions <application_id> <guild_id> <command_id>",
+		Short: "Set application command permissions",
+		Example: "  discord-cli applications guilds set-application-command-permissions abc123 abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/guilds/{guild_id}/commands/{command_id}/permissions"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("command_id is required"))
+			}
+			path = replacePathParam(path, "command_id", args[2])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_guilds_update-application-command.go b/discord-cli/internal/cli/applications_guilds_update-application-command.go
new file mode 100644
index 00000000..014c881d
--- /dev/null
+++ b/discord-cli/internal/cli/applications_guilds_update-application-command.go
@@ -0,0 +1,97 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsGuildsUpdateApplicationCommandCmd(flags *rootFlags) *cobra.Command {
+	var bodyDefaultMemberPermissions int
+	var bodyDescription string
+	var bodyDmPermission bool
+	var bodyHandler string
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-application-command <application_id> <guild_id> <command_id>",
+		Short: "Update application command",
+		Example: "  discord-cli applications guilds update-application-command abc123 abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/guilds/{guild_id}/commands/{command_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("command_id is required"))
+			}
+			path = replacePathParam(path, "command_id", args[2])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDefaultMemberPermissions != 0 {
+					body["default_member_permissions"] = bodyDefaultMemberPermissions
+				}
+				if bodyDescription != "" {
+					body["description"] = bodyDescription
+				}
+				if bodyDmPermission != false {
+					body["dm_permission"] = bodyDmPermission
+				}
+				if bodyHandler != "" {
+					body["handler"] = bodyHandler
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyDefaultMemberPermissions, "default-member-permissions", 0, "Default member permissions")
+	cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+	cmd.Flags().BoolVar(&bodyDmPermission, "dm-permission", false, "Dm permission")
+	cmd.Flags().StringVar(&bodyHandler, "handler", "", "Handler")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_role-connections.go b/discord-cli/internal/cli/applications_role-connections.go
new file mode 100644
index 00000000..5722509e
--- /dev/null
+++ b/discord-cli/internal/cli/applications_role-connections.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newApplicationsRoleConnectionsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "role-connections",
+		Short: "Manage role connections",
+	}
+
+	cmd.AddCommand(newApplicationsRoleConnectionsGetApplicationMetadataCmd(flags))
+	cmd.AddCommand(newApplicationsRoleConnectionsUpdateApplicationMetadataCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_role-connections_get-application-metadata.go b/discord-cli/internal/cli/applications_role-connections_get-application-metadata.go
new file mode 100644
index 00000000..b348b172
--- /dev/null
+++ b/discord-cli/internal/cli/applications_role-connections_get-application-metadata.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsRoleConnectionsGetApplicationMetadataCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-application-metadata <application_id>",
+		Aliases: []string{"get"},
+		Short: "Get application metadata",
+		Example: "  discord-cli applications role-connections get-application-metadata abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/role-connections/metadata"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_role-connections_update-application-metadata.go b/discord-cli/internal/cli/applications_role-connections_update-application-metadata.go
new file mode 100644
index 00000000..9242c2a2
--- /dev/null
+++ b/discord-cli/internal/cli/applications_role-connections_update-application-metadata.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsRoleConnectionsUpdateApplicationMetadataCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-application-metadata <application_id>",
+		Aliases: []string{"update"},
+		Short: "Update application metadata",
+		Example: "  discord-cli applications role-connections update-application-metadata abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}/role-connections/metadata"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_update-my.go b/discord-cli/internal/cli/applications_update-my.go
new file mode 100644
index 00000000..fe9e4b29
--- /dev/null
+++ b/discord-cli/internal/cli/applications_update-my.go
@@ -0,0 +1,115 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsUpdateMyCmd(flags *rootFlags) *cobra.Command {
+	var bodyCoverImage string
+	var bodyCustomInstallUrl string
+	var bodyExplicitContentFilter string
+	var bodyFlags int
+	var bodyIcon string
+	var bodyInstallParams string
+	var bodyInteractionsEndpointUrl string
+	var bodyMaxParticipants int
+	var bodyRoleConnectionsVerificationUrl string
+	var bodyTeamId string
+	var bodyType string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-my",
+		Short: "Update my",
+		Example: "  discord-cli applications update-my",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/@me"
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyCoverImage != "" {
+					body["cover_image"] = bodyCoverImage
+				}
+				if bodyCustomInstallUrl != "" {
+					body["custom_install_url"] = bodyCustomInstallUrl
+				}
+				if bodyExplicitContentFilter != "" {
+					body["explicit_content_filter"] = bodyExplicitContentFilter
+				}
+				if bodyFlags != 0 {
+					body["flags"] = bodyFlags
+				}
+				if bodyIcon != "" {
+					body["icon"] = bodyIcon
+				}
+				if bodyInstallParams != "" {
+					body["install_params"] = bodyInstallParams
+				}
+				if bodyInteractionsEndpointUrl != "" {
+					body["interactions_endpoint_url"] = bodyInteractionsEndpointUrl
+				}
+				if bodyMaxParticipants != 0 {
+					body["max_participants"] = bodyMaxParticipants
+				}
+				if bodyRoleConnectionsVerificationUrl != "" {
+					body["role_connections_verification_url"] = bodyRoleConnectionsVerificationUrl
+				}
+				if bodyTeamId != "" {
+					body["team_id"] = bodyTeamId
+				}
+				if bodyType != "" {
+					body["type"] = bodyType
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyCoverImage, "cover-image", "", "Cover image")
+	cmd.Flags().StringVar(&bodyCustomInstallUrl, "custom-install-url", "", "Custom install url")
+	cmd.Flags().StringVar(&bodyExplicitContentFilter, "explicit-content-filter", "", "Explicit content filter")
+	cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+	cmd.Flags().StringVar(&bodyIcon, "icon", "", "Icon")
+	cmd.Flags().StringVar(&bodyInstallParams, "install-params", "", "Install params")
+	cmd.Flags().StringVar(&bodyInteractionsEndpointUrl, "interactions-endpoint-url", "", "Interactions endpoint url")
+	cmd.Flags().IntVar(&bodyMaxParticipants, "max-participants", 0, "Max participants")
+	cmd.Flags().StringVar(&bodyRoleConnectionsVerificationUrl, "role-connections-verification-url", "", "Role connections verification url")
+	cmd.Flags().StringVar(&bodyTeamId, "team-id", "", "Team id")
+	cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/applications_update.go b/discord-cli/internal/cli/applications_update.go
new file mode 100644
index 00000000..6dcaba2d
--- /dev/null
+++ b/discord-cli/internal/cli/applications_update.go
@@ -0,0 +1,119 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newApplicationsUpdateCmd(flags *rootFlags) *cobra.Command {
+	var bodyCoverImage string
+	var bodyCustomInstallUrl string
+	var bodyExplicitContentFilter string
+	var bodyFlags int
+	var bodyIcon string
+	var bodyInstallParams string
+	var bodyInteractionsEndpointUrl string
+	var bodyMaxParticipants int
+	var bodyRoleConnectionsVerificationUrl string
+	var bodyTeamId string
+	var bodyType string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update <application_id>",
+		Short: "Update",
+		Example: "  discord-cli applications update abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/applications/{application_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyCoverImage != "" {
+					body["cover_image"] = bodyCoverImage
+				}
+				if bodyCustomInstallUrl != "" {
+					body["custom_install_url"] = bodyCustomInstallUrl
+				}
+				if bodyExplicitContentFilter != "" {
+					body["explicit_content_filter"] = bodyExplicitContentFilter
+				}
+				if bodyFlags != 0 {
+					body["flags"] = bodyFlags
+				}
+				if bodyIcon != "" {
+					body["icon"] = bodyIcon
+				}
+				if bodyInstallParams != "" {
+					body["install_params"] = bodyInstallParams
+				}
+				if bodyInteractionsEndpointUrl != "" {
+					body["interactions_endpoint_url"] = bodyInteractionsEndpointUrl
+				}
+				if bodyMaxParticipants != 0 {
+					body["max_participants"] = bodyMaxParticipants
+				}
+				if bodyRoleConnectionsVerificationUrl != "" {
+					body["role_connections_verification_url"] = bodyRoleConnectionsVerificationUrl
+				}
+				if bodyTeamId != "" {
+					body["team_id"] = bodyTeamId
+				}
+				if bodyType != "" {
+					body["type"] = bodyType
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyCoverImage, "cover-image", "", "Cover image")
+	cmd.Flags().StringVar(&bodyCustomInstallUrl, "custom-install-url", "", "Custom install url")
+	cmd.Flags().StringVar(&bodyExplicitContentFilter, "explicit-content-filter", "", "Explicit content filter")
+	cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+	cmd.Flags().StringVar(&bodyIcon, "icon", "", "Icon")
+	cmd.Flags().StringVar(&bodyInstallParams, "install-params", "", "Install params")
+	cmd.Flags().StringVar(&bodyInteractionsEndpointUrl, "interactions-endpoint-url", "", "Interactions endpoint url")
+	cmd.Flags().IntVar(&bodyMaxParticipants, "max-participants", 0, "Max participants")
+	cmd.Flags().StringVar(&bodyRoleConnectionsVerificationUrl, "role-connections-verification-url", "", "Role connections verification url")
+	cmd.Flags().StringVar(&bodyTeamId, "team-id", "", "Team id")
+	cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/auth.go b/discord-cli/internal/cli/auth.go
new file mode 100644
index 00000000..71fa513c
--- /dev/null
+++ b/discord-cli/internal/cli/auth.go
@@ -0,0 +1,250 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"context"
+	"crypto/rand"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"net"
+	"net/http"
+	"net/url"
+	"os"
+	"os/exec"
+	"runtime"
+	"strings"
+	"time"
+
+	"github.com/USER/discord-cli/internal/config"
+	"github.com/spf13/cobra"
+)
+
+func newAuthCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "auth",
+		Short: "Manage authentication",
+	}
+
+	cmd.AddCommand(newAuthLoginCmd(flags))
+	cmd.AddCommand(newAuthStatusCmd(flags))
+	cmd.AddCommand(newAuthLogoutCmd(flags))
+
+	return cmd
+}
+
+func newAuthLoginCmd(flags *rootFlags) *cobra.Command {
+	var clientID string
+	var clientSecret string
+	var port int
+
+	cmd := &cobra.Command{
+		Use:   "login",
+		Short: "Authenticate via OAuth2",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if clientID == "" {
+				return fmt.Errorf("--client-id is required")
+			}
+
+			cfg, err := config.Load(flags.configPath)
+			if err != nil {
+				return err
+			}
+
+			stateBytes := make([]byte, 16)
+			if _, err := rand.Read(stateBytes); err != nil {
+				return fmt.Errorf("generating state: %w", err)
+			}
+			state := hex.EncodeToString(stateBytes)
+
+			listener, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", port))
+			if err != nil {
+				return fmt.Errorf("starting callback server: %w", err)
+			}
+			defer listener.Close()
+
+			redirectURI := fmt.Sprintf("http://localhost:%d/callback", listener.Addr().(*net.TCPAddr).Port)
+
+			authURL := "https://discord.com/api/oauth2/authorize"
+			params := url.Values{
+				"client_id":     {clientID},
+				"redirect_uri":  {redirectURI},
+				"response_type": {"code"},
+				"state":         {state},
+				"access_type":   {"offline"},
+				"prompt":        {"consent"},
+			}
+			scopes := []string{"activities.invites.write", "activities.read", "activities.write", "applications.builds.read", "applications.builds.upload", "applications.commands", "applications.commands.permissions.update", "applications.entitlements", "applications.store.update", "bot", "connections", "dm_channels.read", "email", "gdm.join", "guilds", "guilds.join", "guilds.members.read", "identify", "messages.read", "openid", "relationships.read", "role_connections.write", "rpc", "rpc.activities.write", "rpc.notifications.read", "rpc.screenshare.read", "rpc.screenshare.write", "rpc.video.read", "rpc.video.write", "rpc.voice.read", "rpc.voice.write", "voice", "webhook.incoming",  }
+			if len(scopes) > 0 {
+				params.Set("scope", strings.Join(scopes, " "))
+			}
+
+			fullURL := authURL + "?" + params.Encode()
+			fmt.Fprintf(os.Stderr, "Opening browser for authentication...\n")
+			fmt.Fprintf(os.Stderr, "If the browser doesn't open, visit:\n%s\n\n", fullURL)
+			openBrowser(fullURL)
+
+			codeCh := make(chan string, 1)
+			errCh := make(chan error, 1)
+
+			mux := http.NewServeMux()
+			mux.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) {
+				if r.URL.Query().Get("state") != state {
+					errCh <- fmt.Errorf("state mismatch")
+					http.Error(w, "State mismatch", http.StatusBadRequest)
+					return
+				}
+				if errMsg := r.URL.Query().Get("error"); errMsg != "" {
+					errCh <- fmt.Errorf("auth error: %s", errMsg)
+					http.Error(w, errMsg, http.StatusBadRequest)
+					return
+				}
+				code := r.URL.Query().Get("code")
+				if code == "" {
+					errCh <- fmt.Errorf("no code in callback")
+					http.Error(w, "No code", http.StatusBadRequest)
+					return
+				}
+				w.Header().Set("Content-Type", "text/html")
+				fmt.Fprint(w, "<html><body><h2>Authentication successful!</h2><p>You can close this tab.</p></body></html>")
+				codeCh <- code
+			})
+
+			server := &http.Server{Handler: mux}
+			go server.Serve(listener)
+
+			var code string
+			select {
+			case code = <-codeCh:
+			case err := <-errCh:
+				return err
+			case <-time.After(2 * time.Minute):
+				return fmt.Errorf("authentication timed out after 2 minutes")
+			}
+
+			server.Shutdown(context.Background())
+
+			tokenURL := "https://discord.com/api/oauth2/token"
+			tokenParams := url.Values{
+				"grant_type":   {"authorization_code"},
+				"code":         {code},
+				"redirect_uri": {redirectURI},
+				"client_id":    {clientID},
+			}
+			if clientSecret != "" {
+				tokenParams.Set("client_secret", clientSecret)
+			}
+
+			resp, err := http.PostForm(tokenURL, tokenParams)
+			if err != nil {
+				return fmt.Errorf("exchanging code for token: %w", err)
+			}
+			defer resp.Body.Close()
+
+			if resp.StatusCode >= 400 {
+				var body map[string]any
+				if err := json.NewDecoder(resp.Body).Decode(&body); err == nil {
+					return fmt.Errorf("exchanging code for token: HTTP %d: %v", resp.StatusCode, body)
+				}
+				return fmt.Errorf("exchanging code for token: HTTP %d", resp.StatusCode)
+			}
+
+			var tokenResp struct {
+				AccessToken  string `json:"access_token"`
+				RefreshToken string `json:"refresh_token"`
+				ExpiresIn    int    `json:"expires_in"`
+				TokenType    string `json:"token_type"`
+			}
+			if err := json.NewDecoder(resp.Body).Decode(&tokenResp); err != nil {
+				return fmt.Errorf("parsing token response: %w", err)
+			}
+			if tokenResp.AccessToken == "" {
+				return fmt.Errorf("no access token in response")
+			}
+
+			expiry := time.Now().Add(time.Duration(tokenResp.ExpiresIn) * time.Second)
+			if err := cfg.SaveTokens(clientID, clientSecret, tokenResp.AccessToken, tokenResp.RefreshToken, expiry); err != nil {
+				return fmt.Errorf("saving tokens: %w", err)
+			}
+
+			fmt.Fprintf(os.Stderr, "%s Authentication successful! Token expires at %s\n", green("OK"), expiry.Format(time.RFC3339))
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&clientID, "client-id", os.Getenv("DISCORD_CLIENT_ID"), "OAuth2 client ID")
+	cmd.Flags().StringVar(&clientSecret, "client-secret", os.Getenv("DISCORD_CLIENT_SECRET"), "OAuth2 client secret")
+	cmd.Flags().IntVar(&port, "port", 8085, "Local callback server port")
+
+	return cmd
+}
+
+func newAuthStatusCmd(flags *rootFlags) *cobra.Command {
+	return &cobra.Command{
+		Use:   "status",
+		Short: "Show authentication status",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			cfg, err := config.Load(flags.configPath)
+			if err != nil {
+				return err
+			}
+
+			w := cmd.OutOrStdout()
+			if cfg.AccessToken == "" {
+				fmt.Fprintf(w, "  %s Not authenticated. Run 'auth login' to authenticate.\n", red("FAIL"))
+				return nil
+			}
+
+			if cfg.TokenExpiry.IsZero() {
+				fmt.Fprintf(w, "  %s Authenticated (no expiry info)\n", green("OK"))
+			} else if time.Now().Before(cfg.TokenExpiry) {
+				fmt.Fprintf(w, "  %s Authenticated (expires %s)\n", green("OK"), cfg.TokenExpiry.Format(time.RFC3339))
+			} else {
+				if cfg.RefreshToken != "" {
+					fmt.Fprintf(w, "  %s Token expired (will auto-refresh on next request)\n", yellow("WARN"))
+				} else {
+					fmt.Fprintf(w, "  %s Token expired. Run 'auth login' to re-authenticate.\n", red("FAIL"))
+				}
+			}
+
+			if cfg.AuthSource != "" {
+				fmt.Fprintf(w, "  source: %s\n", cfg.AuthSource)
+			}
+			return nil
+		},
+	}
+}
+
+func newAuthLogoutCmd(flags *rootFlags) *cobra.Command {
+	return &cobra.Command{
+		Use:   "logout",
+		Short: "Remove stored authentication tokens",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			cfg, err := config.Load(flags.configPath)
+			if err != nil {
+				return err
+			}
+			if err := cfg.ClearTokens(); err != nil {
+				return fmt.Errorf("clearing tokens: %w", err)
+			}
+			fmt.Fprintf(os.Stderr, "Logged out. Tokens removed.\n")
+			return nil
+		},
+	}
+}
+
+func openBrowser(url string) {
+	var cmd *exec.Cmd
+	switch runtime.GOOS {
+	case "darwin":
+		cmd = exec.Command("open", url)
+	case "linux":
+		cmd = exec.Command("xdg-open", url)
+	case "windows":
+		cmd = exec.Command("rundll32", "url.dll,FileProtocolHandler", url)
+	default:
+		return
+	}
+	cmd.Start()
+}
diff --git a/discord-cli/internal/cli/channel_workflow.go b/discord-cli/internal/cli/channel_workflow.go
new file mode 100644
index 00000000..44d1f45c
--- /dev/null
+++ b/discord-cli/internal/cli/channel_workflow.go
@@ -0,0 +1,209 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"path/filepath"
+	"time"
+
+	"github.com/USER/discord-cli/internal/store"
+	"github.com/spf13/cobra"
+)
+
+func newWorkflowCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "workflow",
+		Short: "Compound workflows that combine multiple API operations",
+	}
+
+	cmd.AddCommand(newWorkflowArchiveCmd(flags))
+	cmd.AddCommand(newWorkflowStatusCmd(flags))
+	cmd.AddCommand(newChannelHealthCmd(flags))
+	cmd.AddCommand(newAuditReportCmd(flags))
+	cmd.AddCommand(newMemberReportCmd(flags))
+	cmd.AddCommand(newServerSnapshotCmd(flags))
+	cmd.AddCommand(newMessageStatsCmd(flags))
+	cmd.AddCommand(newWebhookTestCmd(flags))
+	cmd.AddCommand(newPrunePreviewCmd(flags))
+
+	return cmd
+}
+
+func newWorkflowArchiveCmd(flags *rootFlags) *cobra.Command {
+	var dbPath string
+	var full bool
+
+	cmd := &cobra.Command{
+		Use:   "archive",
+		Short: "Sync all resources to local store for offline access and search",
+		Long: `Archive fetches all syncable resources from the API and stores them in a
+local SQLite database. Supports incremental sync (only new data since last run)
+and full resync. After archiving, use 'search' for instant full-text search.`,
+		Example: `  # Archive all resources
+  discord-cli workflow archive
+
+  # Full re-archive (ignore previous sync state)
+  discord-cli workflow archive --full`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+			c.NoCache = true
+
+			if dbPath == "" {
+				dbPath = defaultDBPath("discord-cli")
+			}
+			s, err := store.Open(dbPath)
+			if err != nil {
+				return fmt.Errorf("opening store: %w", err)
+			}
+			defer s.Close()
+
+			resources := []string{"audit-logs", "bans", "entitlements", "members", "messages", "polls", "scheduled-events", "thread-members", "threads", "users",  }
+			totalSynced := 0
+
+			for _, resource := range resources {
+				cursor := ""
+				if !full {
+					existing, _, _, err := s.GetSyncState(resource)
+					if err == nil && existing != "" {
+						cursor = existing
+					}
+				}
+
+				fmt.Fprintf(cmd.ErrOrStderr(), "Syncing %s...\n", resource)
+
+				params := map[string]string{"limit": "100"}
+				if cursor != "" {
+					params["after"] = cursor
+				}
+
+				count := 0
+				for {
+					data, fetchErr := c.Get("/"+resource, params)
+					if fetchErr != nil {
+						fmt.Fprintf(cmd.ErrOrStderr(), "  warning: %s: %v\n", resource, fetchErr)
+						break
+					}
+					var items []json.RawMessage
+					if err := json.Unmarshal(data, &items); err != nil {
+						// Might be a single object, not array
+						if err := s.Upsert(resource, resource+"-singleton", data); err != nil {
+							fmt.Fprintf(cmd.ErrOrStderr(), "  warning: store %s: %v\n", resource, err)
+						}
+						count++
+						break
+					}
+					if len(items) == 0 {
+						break
+					}
+					for _, item := range items {
+						var obj struct{ ID string `json:"id"` }
+						json.Unmarshal(item, &obj)
+						id := obj.ID
+						if id == "" {
+							id = fmt.Sprintf("%s-%d", resource, count)
+						}
+						if err := s.Upsert(resource, id, item); err != nil {
+							fmt.Fprintf(cmd.ErrOrStderr(), "  warning: store %s/%s: %v\n", resource, id, err)
+						}
+						cursor = id
+						count++
+					}
+					if len(items) < 100 {
+						break
+					}
+					params["after"] = cursor
+				}
+
+				if count > 0 {
+					s.SaveSyncState(resource, cursor, count)
+				}
+				totalSynced += count
+				fmt.Fprintf(cmd.ErrOrStderr(), "  %s: %d items\n", resource, count)
+			}
+
+			if flags.asJSON {
+				enc := json.NewEncoder(cmd.OutOrStdout())
+				enc.SetIndent("", "  ")
+				return enc.Encode(map[string]any{
+					"resources_synced": len(resources),
+					"total_items":      totalSynced,
+					"store_path":       dbPath,
+					"timestamp":        time.Now().UTC().Format(time.RFC3339),
+				})
+			}
+
+			fmt.Fprintf(cmd.OutOrStdout(), "Archived %d items across %d resources to %s\n", totalSynced, len(resources), dbPath)
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&dbPath, "db", "", "Database path (default: ~/.config/discord-cli/store.db)")
+	cmd.Flags().BoolVar(&full, "full", false, "Full re-archive (ignore previous sync state)")
+
+	return cmd
+}
+
+func newWorkflowStatusCmd(flags *rootFlags) *cobra.Command {
+	var dbPath string
+
+	cmd := &cobra.Command{
+		Use:   "status",
+		Short: "Show local archive status and sync state for all resources",
+		Example: `  # Show archive status
+  discord-cli workflow status
+
+  # Show status as JSON
+  discord-cli workflow status --json`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if dbPath == "" {
+				dbPath = defaultDBPath("discord-cli")
+			}
+			s, err := store.Open(dbPath)
+			if err != nil {
+				return fmt.Errorf("opening store: %w", err)
+			}
+			defer s.Close()
+
+			status, err := s.Status()
+			if err != nil {
+				return err
+			}
+
+			if flags.asJSON {
+				enc := json.NewEncoder(cmd.OutOrStdout())
+				enc.SetIndent("", "  ")
+				return enc.Encode(status)
+			}
+
+			if len(status) == 0 {
+				fmt.Fprintln(cmd.OutOrStdout(), "No archived data. Run 'workflow archive' to sync.")
+				return nil
+			}
+
+			fmt.Fprintln(cmd.OutOrStdout(), "Archive Status:")
+			total := 0
+			for resource, count := range status {
+				fmt.Fprintf(cmd.OutOrStdout(), "  %-30s %d items\n", resource, count)
+				total += count
+			}
+			fmt.Fprintf(cmd.OutOrStdout(), "\n  Total: %d items\n", total)
+			fmt.Fprintf(cmd.OutOrStdout(), "  Store: %s\n", dbPath)
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&dbPath, "db", "", "Database path")
+
+	return cmd
+}
+
+func defaultDBPath(name string) string {
+	home, _ := os.UserHomeDir()
+	return filepath.Join(home, ".config", name, "store.db")
+}
diff --git a/discord-cli/internal/cli/channels.go b/discord-cli/internal/cli/channels.go
new file mode 100644
index 00000000..d1a9a20f
--- /dev/null
+++ b/discord-cli/internal/cli/channels.go
@@ -0,0 +1,32 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "channels",
+		Short: "Manage Discord channels, messages, threads, pins, and permissions",
+	}
+
+	cmd.AddCommand(newChannelsDeleteCmd(flags))
+	cmd.AddCommand(newChannelsGetCmd(flags))
+	cmd.AddCommand(newChannelsUpdateCmd(flags))
+	cmd.AddCommand(newChannelsFollowersCmd(flags))
+	cmd.AddCommand(newChannelsInvitesCmd(flags))
+	cmd.AddCommand(newChannelsMessagesCmd(flags))
+	cmd.AddCommand(newChannelsPermissionsCmd(flags))
+	cmd.AddCommand(newChannelsPinsCmd(flags))
+	cmd.AddCommand(newChannelsPollsCmd(flags))
+	cmd.AddCommand(newChannelsRecipientsCmd(flags))
+	cmd.AddCommand(newChannelsSendSoundboardSoundCmd(flags))
+	cmd.AddCommand(newChannelsThreadMembersCmd(flags))
+	cmd.AddCommand(newChannelsThreadsCmd(flags))
+	cmd.AddCommand(newChannelsTypingCmd(flags))
+	cmd.AddCommand(newChannelsUsersCmd(flags))
+	cmd.AddCommand(newChannelsWebhooksCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_delete.go b/discord-cli/internal/cli/channels_delete.go
new file mode 100644
index 00000000..4255de9d
--- /dev/null
+++ b/discord-cli/internal/cli/channels_delete.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsDeleteCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete <channel_id>",
+		Short: "Delete",
+		Example: "  discord-cli channels delete abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_followers.go b/discord-cli/internal/cli/channels_followers.go
new file mode 100644
index 00000000..7621fdc5
--- /dev/null
+++ b/discord-cli/internal/cli/channels_followers.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsFollowersCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "followers",
+		Short: "Manage followers",
+	}
+
+	cmd.AddCommand(newChannelsFollowersFollowChannelCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_followers_follow-channel.go b/discord-cli/internal/cli/channels_followers_follow-channel.go
new file mode 100644
index 00000000..6e3e1ca1
--- /dev/null
+++ b/discord-cli/internal/cli/channels_followers_follow-channel.go
@@ -0,0 +1,71 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsFollowersFollowChannelCmd(flags *rootFlags) *cobra.Command {
+	var bodyWebhookChannelId string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "follow-channel <channel_id>",
+		Aliases: []string{"create"},
+		Short: "Follow channel",
+		Example: "  discord-cli channels followers follow-channel abc123 --webhook-channel-id abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/followers"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyWebhookChannelId != "" {
+					body["webhook_channel_id"] = bodyWebhookChannelId
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyWebhookChannelId, "webhook-channel-id", "", "Webhook channel id")
+	_ = cmd.MarkFlagRequired("webhook-channel-id")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_get.go b/discord-cli/internal/cli/channels_get.go
new file mode 100644
index 00000000..e121dd40
--- /dev/null
+++ b/discord-cli/internal/cli/channels_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get <channel_id>",
+		Short: "Get",
+		Example: "  discord-cli channels get abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_invites.go b/discord-cli/internal/cli/channels_invites.go
new file mode 100644
index 00000000..7fc2de58
--- /dev/null
+++ b/discord-cli/internal/cli/channels_invites.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsInvitesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "invites",
+		Short: "Manage invites",
+	}
+
+	cmd.AddCommand(newChannelsInvitesCreateChannelCmd(flags))
+	cmd.AddCommand(newChannelsInvitesListChannelCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_invites_create-channel.go b/discord-cli/internal/cli/channels_invites_create-channel.go
new file mode 100644
index 00000000..5ea66336
--- /dev/null
+++ b/discord-cli/internal/cli/channels_invites_create-channel.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsInvitesCreateChannelCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-channel <channel_id>",
+		Aliases: []string{"create"},
+		Short: "Create channel",
+		Example: "  discord-cli channels invites create-channel abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/invites"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_invites_list-channel.go b/discord-cli/internal/cli/channels_invites_list-channel.go
new file mode 100644
index 00000000..b7ccdd5e
--- /dev/null
+++ b/discord-cli/internal/cli/channels_invites_list-channel.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsInvitesListChannelCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-channel <channel_id>",
+		Aliases: []string{"get"},
+		Short: "List channel",
+		Example: "  discord-cli channels invites list-channel abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/invites"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages.go b/discord-cli/internal/cli/channels_messages.go
new file mode 100644
index 00000000..9f6f500d
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages.go
@@ -0,0 +1,33 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsMessagesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "messages",
+		Short: "Manage messages",
+	}
+
+	cmd.AddCommand(newChannelsMessagesAddMyReactionCmd(flags))
+	cmd.AddCommand(newChannelsMessagesBulkDeleteCmd(flags))
+	cmd.AddCommand(newChannelsMessagesCreateCmd(flags))
+	cmd.AddCommand(newChannelsMessagesCreatePinCmd(flags))
+	cmd.AddCommand(newChannelsMessagesCreateThreadFromCmd(flags))
+	cmd.AddCommand(newChannelsMessagesCrosspostCmd(flags))
+	cmd.AddCommand(newChannelsMessagesDeleteCmd(flags))
+	cmd.AddCommand(newChannelsMessagesDeleteAllReactionsCmd(flags))
+	cmd.AddCommand(newChannelsMessagesDeleteAllReactionsByEmojiCmd(flags))
+	cmd.AddCommand(newChannelsMessagesDeleteMyReactionCmd(flags))
+	cmd.AddCommand(newChannelsMessagesDeletePinCmd(flags))
+	cmd.AddCommand(newChannelsMessagesDeleteUserReactionCmd(flags))
+	cmd.AddCommand(newChannelsMessagesGetCmd(flags))
+	cmd.AddCommand(newChannelsMessagesListCmd(flags))
+	cmd.AddCommand(newChannelsMessagesListPinsCmd(flags))
+	cmd.AddCommand(newChannelsMessagesListReactionsByEmojiCmd(flags))
+	cmd.AddCommand(newChannelsMessagesUpdateCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_add-my-reaction.go b/discord-cli/internal/cli/channels_messages_add-my-reaction.go
new file mode 100644
index 00000000..73c8dfaa
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_add-my-reaction.go
@@ -0,0 +1,72 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesAddMyReactionCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "add-my-reaction <channel_id> <message_id> <emoji_name>",
+		Short: "Add my reaction",
+		Example: "  discord-cli channels messages add-my-reaction abc123 abc123 my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}/reactions/{emoji_name}/@me"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("emoji_name is required"))
+			}
+			path = replacePathParam(path, "emoji_name", args[2])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_bulk-delete.go b/discord-cli/internal/cli/channels_messages_bulk-delete.go
new file mode 100644
index 00000000..eeb8060d
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_bulk-delete.go
@@ -0,0 +1,64 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesBulkDeleteCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "bulk-delete <channel_id>",
+		Short: "Bulk delete",
+		Example: "  discord-cli channels messages bulk-delete abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/bulk-delete"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_create-pin.go b/discord-cli/internal/cli/channels_messages_create-pin.go
new file mode 100644
index 00000000..5b0ab7f2
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_create-pin.go
@@ -0,0 +1,68 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesCreatePinCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-pin <channel_id> <message_id>",
+		Short: "Create pin",
+		Example: "  discord-cli channels messages create-pin abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/pins/{message_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_create-thread-from.go b/discord-cli/internal/cli/channels_messages_create-thread-from.go
new file mode 100644
index 00000000..2e411c88
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_create-thread-from.go
@@ -0,0 +1,84 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesCreateThreadFromCmd(flags *rootFlags) *cobra.Command {
+	var bodyAutoArchiveDuration string
+	var bodyName string
+	var bodyRateLimitPerUser int
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-thread-from <channel_id> <message_id>",
+		Short: "Create thread from",
+		Example: "  discord-cli channels messages create-thread-from abc123 abc123 --name my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}/threads"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAutoArchiveDuration != "" {
+					body["auto_archive_duration"] = bodyAutoArchiveDuration
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodyRateLimitPerUser != 0 {
+					body["rate_limit_per_user"] = bodyRateLimitPerUser
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAutoArchiveDuration, "auto-archive-duration", "", "Auto archive duration")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	_ = cmd.MarkFlagRequired("name")
+	cmd.Flags().IntVar(&bodyRateLimitPerUser, "rate-limit-per-user", 0, "Rate limit per user")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_create.go b/discord-cli/internal/cli/channels_messages_create.go
new file mode 100644
index 00000000..f6a033df
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_create.go
@@ -0,0 +1,113 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesCreateCmd(flags *rootFlags) *cobra.Command {
+	var bodyAllowedMentions string
+	var bodyContent string
+	var bodyEnforceNonce bool
+	var bodyFlags int
+	var bodyMessageReference string
+	var bodyNonce string
+	var bodyPoll string
+	var bodySharedClientTheme string
+	var bodyTts bool
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create <channel_id>",
+		Short: "Send a message to a channel",
+		Example: `  # Send a text message
+  discord-cli channels messages create 123456789012345678 --content "Hello, world!"
+
+  # Send a message with embeds via stdin
+  echo '{"content":"Deploy complete","embeds":[{"title":"Build #123","color":3066993}]}' | discord-cli channels messages create 123456789012345678 --stdin`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAllowedMentions != "" {
+					body["allowed_mentions"] = bodyAllowedMentions
+				}
+				if bodyContent != "" {
+					body["content"] = bodyContent
+				}
+				if bodyEnforceNonce != false {
+					body["enforce_nonce"] = bodyEnforceNonce
+				}
+				if bodyFlags != 0 {
+					body["flags"] = bodyFlags
+				}
+				if bodyMessageReference != "" {
+					body["message_reference"] = bodyMessageReference
+				}
+				if bodyNonce != "" {
+					body["nonce"] = bodyNonce
+				}
+				if bodyPoll != "" {
+					body["poll"] = bodyPoll
+				}
+				if bodySharedClientTheme != "" {
+					body["shared_client_theme"] = bodySharedClientTheme
+				}
+				if bodyTts != false {
+					body["tts"] = bodyTts
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAllowedMentions, "allowed-mentions", "", "Allowed mentions")
+	cmd.Flags().StringVar(&bodyContent, "content", "", "Content")
+	cmd.Flags().BoolVar(&bodyEnforceNonce, "enforce-nonce", false, "Enforce nonce")
+	cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+	cmd.Flags().StringVar(&bodyMessageReference, "message-reference", "", "Message reference")
+	cmd.Flags().StringVar(&bodyNonce, "nonce", "", "Nonce")
+	cmd.Flags().StringVar(&bodyPoll, "poll", "", "Poll")
+	cmd.Flags().StringVar(&bodySharedClientTheme, "shared-client-theme", "", "Shared client theme")
+	cmd.Flags().BoolVar(&bodyTts, "tts", false, "Tts")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_crosspost.go b/discord-cli/internal/cli/channels_messages_crosspost.go
new file mode 100644
index 00000000..172c4cc6
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_crosspost.go
@@ -0,0 +1,68 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesCrosspostCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "crosspost <channel_id> <message_id>",
+		Short: "Crosspost",
+		Example: "  discord-cli channels messages crosspost abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}/crosspost"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete-all-reactions-by-emoji.go b/discord-cli/internal/cli/channels_messages_delete-all-reactions-by-emoji.go
new file mode 100644
index 00000000..9f5e4ffb
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete-all-reactions-by-emoji.go
@@ -0,0 +1,56 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesDeleteAllReactionsByEmojiCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-all-reactions-by-emoji <channel_id> <message_id> <emoji_name>",
+		Short: "Delete all reactions by emoji",
+		Example: "  discord-cli channels messages delete-all-reactions-by-emoji abc123 abc123 my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}/reactions/{emoji_name}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("emoji_name is required"))
+			}
+			path = replacePathParam(path, "emoji_name", args[2])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete-all-reactions.go b/discord-cli/internal/cli/channels_messages_delete-all-reactions.go
new file mode 100644
index 00000000..f026c66a
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete-all-reactions.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesDeleteAllReactionsCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-all-reactions <channel_id> <message_id>",
+		Short: "Delete all reactions",
+		Example: "  discord-cli channels messages delete-all-reactions abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}/reactions"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete-my-reaction.go b/discord-cli/internal/cli/channels_messages_delete-my-reaction.go
new file mode 100644
index 00000000..692268e6
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete-my-reaction.go
@@ -0,0 +1,56 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesDeleteMyReactionCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-my-reaction <channel_id> <message_id> <emoji_name>",
+		Short: "Delete my reaction",
+		Example: "  discord-cli channels messages delete-my-reaction abc123 abc123 my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}/reactions/{emoji_name}/@me"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("emoji_name is required"))
+			}
+			path = replacePathParam(path, "emoji_name", args[2])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete-pin.go b/discord-cli/internal/cli/channels_messages_delete-pin.go
new file mode 100644
index 00000000..ca6a854f
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete-pin.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesDeletePinCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-pin <channel_id> <message_id>",
+		Short: "Delete pin",
+		Example: "  discord-cli channels messages delete-pin abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/pins/{message_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete-user-reaction.go b/discord-cli/internal/cli/channels_messages_delete-user-reaction.go
new file mode 100644
index 00000000..32b85069
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete-user-reaction.go
@@ -0,0 +1,60 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesDeleteUserReactionCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-user-reaction <channel_id> <message_id> <emoji_name> <user_id>",
+		Short: "Delete user reaction",
+		Example: "  discord-cli channels messages delete-user-reaction abc123 abc123 my-resource abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}/reactions/{emoji_name}/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("emoji_name is required"))
+			}
+			path = replacePathParam(path, "emoji_name", args[2])
+			if len(args) < 4 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[3])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_delete.go b/discord-cli/internal/cli/channels_messages_delete.go
new file mode 100644
index 00000000..d812a4e6
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_delete.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesDeleteCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete <channel_id> <message_id>",
+		Short: "Delete",
+		Example: "  discord-cli channels messages delete abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_get.go b/discord-cli/internal/cli/channels_messages_get.go
new file mode 100644
index 00000000..048eea1c
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_get.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get <channel_id> <message_id>",
+		Short: "Get",
+		Example: "  discord-cli channels messages get abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_list-pins.go b/discord-cli/internal/cli/channels_messages_list-pins.go
new file mode 100644
index 00000000..8ddd01e8
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_list-pins.go
@@ -0,0 +1,57 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesListPinsCmd(flags *rootFlags) *cobra.Command {
+	var flagBefore string
+	var flagLimit int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list-pins <channel_id>",
+		Short: "List pins",
+		Example: "  discord-cli channels messages list-pins abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/pins"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"before": fmt.Sprintf("%v", flagBefore),
+				"limit": fmt.Sprintf("%v", flagLimit),
+			}, flagAll, "", "", "has_more")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_list-reactions-by-emoji.go b/discord-cli/internal/cli/channels_messages_list-reactions-by-emoji.go
new file mode 100644
index 00000000..57026d0e
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_list-reactions-by-emoji.go
@@ -0,0 +1,68 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesListReactionsByEmojiCmd(flags *rootFlags) *cobra.Command {
+	var flagAfter string
+	var flagLimit int
+	var flagType int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list-reactions-by-emoji <channel_id> <message_id> <emoji_name>",
+		Short: "List reactions by emoji",
+		Example: "  discord-cli channels messages list-reactions-by-emoji abc123 abc123 my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}/reactions/{emoji_name}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("emoji_name is required"))
+			}
+			path = replacePathParam(path, "emoji_name", args[2])
+			data, err := paginatedGet(c, path, map[string]string{
+				"after": fmt.Sprintf("%v", flagAfter),
+				"limit": fmt.Sprintf("%v", flagLimit),
+				"type": fmt.Sprintf("%v", flagType),
+			}, flagAll, "after", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().IntVar(&flagType, "type", 0, "Type")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_list.go b/discord-cli/internal/cli/channels_messages_list.go
new file mode 100644
index 00000000..f5c75851
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_list.go
@@ -0,0 +1,63 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesListCmd(flags *rootFlags) *cobra.Command {
+	var flagAround string
+	var flagBefore string
+	var flagAfter string
+	var flagLimit int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list <channel_id>",
+		Short: "List",
+		Example: "  discord-cli channels messages list abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"around": fmt.Sprintf("%v", flagAround),
+				"before": fmt.Sprintf("%v", flagBefore),
+				"after": fmt.Sprintf("%v", flagAfter),
+				"limit": fmt.Sprintf("%v", flagLimit),
+			}, flagAll, "after", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagAround, "around", "", "Around")
+	cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+	cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_messages_update.go b/discord-cli/internal/cli/channels_messages_update.go
new file mode 100644
index 00000000..19f68940
--- /dev/null
+++ b/discord-cli/internal/cli/channels_messages_update.go
@@ -0,0 +1,83 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsMessagesUpdateCmd(flags *rootFlags) *cobra.Command {
+	var bodyAllowedMentions string
+	var bodyContent string
+	var bodyFlags int
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update <channel_id> <message_id>",
+		Short: "Update",
+		Example: "  discord-cli channels messages update abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/messages/{message_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAllowedMentions != "" {
+					body["allowed_mentions"] = bodyAllowedMentions
+				}
+				if bodyContent != "" {
+					body["content"] = bodyContent
+				}
+				if bodyFlags != 0 {
+					body["flags"] = bodyFlags
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAllowedMentions, "allowed-mentions", "", "Allowed mentions")
+	cmd.Flags().StringVar(&bodyContent, "content", "", "Content")
+	cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_permissions.go b/discord-cli/internal/cli/channels_permissions.go
new file mode 100644
index 00000000..5eae673f
--- /dev/null
+++ b/discord-cli/internal/cli/channels_permissions.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsPermissionsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "permissions",
+		Short: "Manage permissions",
+	}
+
+	cmd.AddCommand(newChannelsPermissionsDeleteChannelOverwriteCmd(flags))
+	cmd.AddCommand(newChannelsPermissionsSetChannelOverwriteCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_permissions_delete-channel-overwrite.go b/discord-cli/internal/cli/channels_permissions_delete-channel-overwrite.go
new file mode 100644
index 00000000..0e743d0f
--- /dev/null
+++ b/discord-cli/internal/cli/channels_permissions_delete-channel-overwrite.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsPermissionsDeleteChannelOverwriteCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-channel-overwrite <channel_id> <overwrite_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete channel overwrite",
+		Example: "  discord-cli channels permissions delete-channel-overwrite abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/permissions/{overwrite_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("overwrite_id is required"))
+			}
+			path = replacePathParam(path, "overwrite_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_permissions_set-channel-overwrite.go b/discord-cli/internal/cli/channels_permissions_set-channel-overwrite.go
new file mode 100644
index 00000000..e7ac37a5
--- /dev/null
+++ b/discord-cli/internal/cli/channels_permissions_set-channel-overwrite.go
@@ -0,0 +1,84 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsPermissionsSetChannelOverwriteCmd(flags *rootFlags) *cobra.Command {
+	var bodyAllow int
+	var bodyDeny int
+	var bodyType string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "set-channel-overwrite <channel_id> <overwrite_id>",
+		Aliases: []string{"update"},
+		Short: "Set channel overwrite",
+		Example: "  discord-cli channels permissions set-channel-overwrite abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/permissions/{overwrite_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("overwrite_id is required"))
+			}
+			path = replacePathParam(path, "overwrite_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAllow != 0 {
+					body["allow"] = bodyAllow
+				}
+				if bodyDeny != 0 {
+					body["deny"] = bodyDeny
+				}
+				if bodyType != "" {
+					body["type"] = bodyType
+				}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyAllow, "allow", 0, "Allow")
+	cmd.Flags().IntVar(&bodyDeny, "deny", 0, "Deny")
+	cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_pins.go b/discord-cli/internal/cli/channels_pins.go
new file mode 100644
index 00000000..a2314a85
--- /dev/null
+++ b/discord-cli/internal/cli/channels_pins.go
@@ -0,0 +1,19 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsPinsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "pins",
+		Short: "Manage pins",
+	}
+
+	cmd.AddCommand(newChannelsPinsDeprecatedCreateCmd(flags))
+	cmd.AddCommand(newChannelsPinsDeprecatedDeleteCmd(flags))
+	cmd.AddCommand(newChannelsPinsDeprecatedListCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_pins_deprecated-create.go b/discord-cli/internal/cli/channels_pins_deprecated-create.go
new file mode 100644
index 00000000..0fbc9ce7
--- /dev/null
+++ b/discord-cli/internal/cli/channels_pins_deprecated-create.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsPinsDeprecatedCreateCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "deprecated-create <channel_id> <message_id>",
+		Aliases: []string{"update"},
+		Short: "Deprecated create",
+		Example: "  discord-cli channels pins deprecated-create abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/pins/{message_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_pins_deprecated-delete.go b/discord-cli/internal/cli/channels_pins_deprecated-delete.go
new file mode 100644
index 00000000..e1d2409a
--- /dev/null
+++ b/discord-cli/internal/cli/channels_pins_deprecated-delete.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsPinsDeprecatedDeleteCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "deprecated-delete <channel_id> <message_id>",
+		Aliases: []string{"delete"},
+		Short: "Deprecated delete",
+		Example: "  discord-cli channels pins deprecated-delete abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/pins/{message_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_pins_deprecated-list.go b/discord-cli/internal/cli/channels_pins_deprecated-list.go
new file mode 100644
index 00000000..2a7f06a2
--- /dev/null
+++ b/discord-cli/internal/cli/channels_pins_deprecated-list.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsPinsDeprecatedListCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "deprecated-list <channel_id>",
+		Aliases: []string{"get"},
+		Short: "Deprecated list",
+		Example: "  discord-cli channels pins deprecated-list abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/pins"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_polls.go b/discord-cli/internal/cli/channels_polls.go
new file mode 100644
index 00000000..8de897fb
--- /dev/null
+++ b/discord-cli/internal/cli/channels_polls.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsPollsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "polls",
+		Short: "Manage polls",
+	}
+
+	cmd.AddCommand(newChannelsPollsExpireCmd(flags))
+	cmd.AddCommand(newChannelsPollsGetAnswerVotersCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_polls_expire.go b/discord-cli/internal/cli/channels_polls_expire.go
new file mode 100644
index 00000000..b6d3b476
--- /dev/null
+++ b/discord-cli/internal/cli/channels_polls_expire.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsPollsExpireCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "expire <channel_id> <message_id>",
+		Aliases: []string{"create"},
+		Short: "Expire",
+		Example: "  discord-cli channels polls expire abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/polls/{message_id}/expire"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_polls_get-answer-voters.go b/discord-cli/internal/cli/channels_polls_get-answer-voters.go
new file mode 100644
index 00000000..108cbb34
--- /dev/null
+++ b/discord-cli/internal/cli/channels_polls_get-answer-voters.go
@@ -0,0 +1,66 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsPollsGetAnswerVotersCmd(flags *rootFlags) *cobra.Command {
+	var flagAfter string
+	var flagLimit int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "get-answer-voters <channel_id> <message_id> <answer_id>",
+		Aliases: []string{"get"},
+		Short: "Get answer voters",
+		Example: "  discord-cli channels polls get-answer-voters abc123 abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/polls/{message_id}/answers/{answer_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("answer_id is required"))
+			}
+			path = replacePathParam(path, "answer_id", args[2])
+			data, err := paginatedGet(c, path, map[string]string{
+				"after": fmt.Sprintf("%v", flagAfter),
+				"limit": fmt.Sprintf("%v", flagLimit),
+			}, flagAll, "after", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_recipients.go b/discord-cli/internal/cli/channels_recipients.go
new file mode 100644
index 00000000..30c4089a
--- /dev/null
+++ b/discord-cli/internal/cli/channels_recipients.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsRecipientsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "recipients",
+		Short: "Manage recipients",
+	}
+
+	cmd.AddCommand(newChannelsRecipientsAddGroupDmUserCmd(flags))
+	cmd.AddCommand(newChannelsRecipientsDeleteGroupDmUserCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_recipients_add-group-dm-user.go b/discord-cli/internal/cli/channels_recipients_add-group-dm-user.go
new file mode 100644
index 00000000..7b0dc52c
--- /dev/null
+++ b/discord-cli/internal/cli/channels_recipients_add-group-dm-user.go
@@ -0,0 +1,79 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsRecipientsAddGroupDmUserCmd(flags *rootFlags) *cobra.Command {
+	var bodyAccessToken string
+	var bodyNick string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "add-group-dm-user <channel_id> <user_id>",
+		Aliases: []string{"update"},
+		Short: "Add group dm user",
+		Example: "  discord-cli channels recipients add-group-dm-user abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/recipients/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAccessToken != "" {
+					body["access_token"] = bodyAccessToken
+				}
+				if bodyNick != "" {
+					body["nick"] = bodyNick
+				}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAccessToken, "access-token", "", "Access token")
+	cmd.Flags().StringVar(&bodyNick, "nick", "", "Nick")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_recipients_delete-group-dm-user.go b/discord-cli/internal/cli/channels_recipients_delete-group-dm-user.go
new file mode 100644
index 00000000..53930a80
--- /dev/null
+++ b/discord-cli/internal/cli/channels_recipients_delete-group-dm-user.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsRecipientsDeleteGroupDmUserCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-group-dm-user <channel_id> <user_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete group dm user",
+		Example: "  discord-cli channels recipients delete-group-dm-user abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/recipients/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_send-soundboard-sound.go b/discord-cli/internal/cli/channels_send-soundboard-sound.go
new file mode 100644
index 00000000..a63e26de
--- /dev/null
+++ b/discord-cli/internal/cli/channels_send-soundboard-sound.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsSendSoundboardSoundCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "send-soundboard-sound",
+		Short: "Manage send soundboard sound",
+	}
+
+	cmd.AddCommand(newChannelsSendSoundboardSoundSendSoundboardSoundCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_send-soundboard-sound_send_soundboard_sound.go b/discord-cli/internal/cli/channels_send-soundboard-sound_send_soundboard_sound.go
new file mode 100644
index 00000000..e317e627
--- /dev/null
+++ b/discord-cli/internal/cli/channels_send-soundboard-sound_send_soundboard_sound.go
@@ -0,0 +1,76 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsSendSoundboardSoundSendSoundboardSoundCmd(flags *rootFlags) *cobra.Command {
+	var bodySoundId string
+	var bodySourceGuildId string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "send_soundboard_sound <channel_id>",
+		Aliases: []string{"create"},
+		Short: "Send soundboard sound",
+		Example: "  discord-cli channels send-soundboard-sound send_soundboard_sound abc123 --sound-id abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/send-soundboard-sound"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodySoundId != "" {
+					body["sound_id"] = bodySoundId
+				}
+				if bodySourceGuildId != "" {
+					body["source_guild_id"] = bodySourceGuildId
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodySoundId, "sound-id", "", "Sound id")
+	_ = cmd.MarkFlagRequired("sound-id")
+	cmd.Flags().StringVar(&bodySourceGuildId, "source-guild-id", "", "Source guild id")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members.go b/discord-cli/internal/cli/channels_thread-members.go
new file mode 100644
index 00000000..6be0ec3b
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members.go
@@ -0,0 +1,22 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsThreadMembersCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "thread-members",
+		Short: "Manage thread members",
+	}
+
+	cmd.AddCommand(newChannelsThreadMembersAddCmd(flags))
+	cmd.AddCommand(newChannelsThreadMembersDeleteCmd(flags))
+	cmd.AddCommand(newChannelsThreadMembersGetCmd(flags))
+	cmd.AddCommand(newChannelsThreadMembersJoinThreadCmd(flags))
+	cmd.AddCommand(newChannelsThreadMembersLeaveThreadCmd(flags))
+	cmd.AddCommand(newChannelsThreadMembersListCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_add.go b/discord-cli/internal/cli/channels_thread-members_add.go
new file mode 100644
index 00000000..d562b457
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_add.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsThreadMembersAddCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "add <channel_id> <user_id>",
+		Aliases: []string{"update"},
+		Short: "Add",
+		Example: "  discord-cli channels thread-members add abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/thread-members/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_delete.go b/discord-cli/internal/cli/channels_thread-members_delete.go
new file mode 100644
index 00000000..c7b3df97
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_delete.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsThreadMembersDeleteCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete <channel_id> <user_id>",
+		Short: "Delete",
+		Example: "  discord-cli channels thread-members delete abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/thread-members/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_get.go b/discord-cli/internal/cli/channels_thread-members_get.go
new file mode 100644
index 00000000..31cc0c14
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_get.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsThreadMembersGetCmd(flags *rootFlags) *cobra.Command {
+	var flagWithMember bool
+
+	cmd := &cobra.Command{
+		Use:   "get <channel_id> <user_id>",
+		Short: "Get",
+		Example: "  discord-cli channels thread-members get abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/thread-members/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			params := map[string]string{}
+			if flagWithMember != false {
+				params["with_member"] = fmt.Sprintf("%v", flagWithMember)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWithMember, "with-member", false, "With member")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_join-thread.go b/discord-cli/internal/cli/channels_thread-members_join-thread.go
new file mode 100644
index 00000000..02e303cd
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_join-thread.go
@@ -0,0 +1,64 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsThreadMembersJoinThreadCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "join-thread <channel_id>",
+		Short: "Join thread",
+		Example: "  discord-cli channels thread-members join-thread abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/thread-members/@me"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_leave-thread.go b/discord-cli/internal/cli/channels_thread-members_leave-thread.go
new file mode 100644
index 00000000..5f433b97
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_leave-thread.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsThreadMembersLeaveThreadCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "leave-thread <channel_id>",
+		Short: "Leave thread",
+		Example: "  discord-cli channels thread-members leave-thread abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/thread-members/@me"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_thread-members_list.go b/discord-cli/internal/cli/channels_thread-members_list.go
new file mode 100644
index 00000000..65a5fcee
--- /dev/null
+++ b/discord-cli/internal/cli/channels_thread-members_list.go
@@ -0,0 +1,60 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsThreadMembersListCmd(flags *rootFlags) *cobra.Command {
+	var flagWithMember bool
+	var flagLimit int
+	var flagAfter string
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list <channel_id>",
+		Short: "List",
+		Example: "  discord-cli channels thread-members list abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/thread-members"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"with_member": fmt.Sprintf("%v", flagWithMember),
+				"limit": fmt.Sprintf("%v", flagLimit),
+				"after": fmt.Sprintf("%v", flagAfter),
+			}, flagAll, "after", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWithMember, "with-member", false, "With member")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_threads.go b/discord-cli/internal/cli/channels_threads.go
new file mode 100644
index 00000000..a2ce162d
--- /dev/null
+++ b/discord-cli/internal/cli/channels_threads.go
@@ -0,0 +1,20 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsThreadsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "threads",
+		Short: "Manage threads",
+	}
+
+	cmd.AddCommand(newChannelsThreadsCreateCmd(flags))
+	cmd.AddCommand(newChannelsThreadsListPrivateArchivedCmd(flags))
+	cmd.AddCommand(newChannelsThreadsListPublicArchivedCmd(flags))
+	cmd.AddCommand(newChannelsThreadsSearchCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_threads_create.go b/discord-cli/internal/cli/channels_threads_create.go
new file mode 100644
index 00000000..e4d21d51
--- /dev/null
+++ b/discord-cli/internal/cli/channels_threads_create.go
@@ -0,0 +1,64 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsThreadsCreateCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create <channel_id>",
+		Short: "Create",
+		Example: "  discord-cli channels threads create abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/threads"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_threads_list-private-archived.go b/discord-cli/internal/cli/channels_threads_list-private-archived.go
new file mode 100644
index 00000000..68484c55
--- /dev/null
+++ b/discord-cli/internal/cli/channels_threads_list-private-archived.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsThreadsListPrivateArchivedCmd(flags *rootFlags) *cobra.Command {
+	var flagBefore string
+	var flagLimit int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list-private-archived <channel_id>",
+		Aliases: []string{"get"},
+		Short: "List private archived",
+		Example: "  discord-cli channels threads list-private-archived abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/threads/archived/private"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"before": fmt.Sprintf("%v", flagBefore),
+				"limit": fmt.Sprintf("%v", flagLimit),
+			}, flagAll, "", "", "has_more")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_threads_list-public-archived.go b/discord-cli/internal/cli/channels_threads_list-public-archived.go
new file mode 100644
index 00000000..b27d0e0c
--- /dev/null
+++ b/discord-cli/internal/cli/channels_threads_list-public-archived.go
@@ -0,0 +1,57 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsThreadsListPublicArchivedCmd(flags *rootFlags) *cobra.Command {
+	var flagBefore string
+	var flagLimit int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list-public-archived <channel_id>",
+		Short: "List public archived",
+		Example: "  discord-cli channels threads list-public-archived abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/threads/archived/public"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"before": fmt.Sprintf("%v", flagBefore),
+				"limit": fmt.Sprintf("%v", flagLimit),
+			}, flagAll, "", "", "has_more")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_threads_search.go b/discord-cli/internal/cli/channels_threads_search.go
new file mode 100644
index 00000000..9d4755a6
--- /dev/null
+++ b/discord-cli/internal/cli/channels_threads_search.go
@@ -0,0 +1,84 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsThreadsSearchCmd(flags *rootFlags) *cobra.Command {
+	var flagName string
+	var flagSlop int
+	var flagMinId string
+	var flagMaxId string
+	var flagTag string
+	var flagTagSetting string
+	var flagArchived bool
+	var flagSortBy string
+	var flagSortOrder string
+	var flagLimit int
+	var flagOffset int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "search <channel_id>",
+		Short: "Search",
+		Example: "  discord-cli channels threads search abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/threads/search"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"name": fmt.Sprintf("%v", flagName),
+				"slop": fmt.Sprintf("%v", flagSlop),
+				"min_id": fmt.Sprintf("%v", flagMinId),
+				"max_id": fmt.Sprintf("%v", flagMaxId),
+				"tag": fmt.Sprintf("%v", flagTag),
+				"tag_setting": fmt.Sprintf("%v", flagTagSetting),
+				"archived": fmt.Sprintf("%v", flagArchived),
+				"sort_by": fmt.Sprintf("%v", flagSortBy),
+				"sort_order": fmt.Sprintf("%v", flagSortOrder),
+				"limit": fmt.Sprintf("%v", flagLimit),
+				"offset": fmt.Sprintf("%v", flagOffset),
+			}, flagAll, "offset", "", "has_more")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagName, "name", "", "Name")
+	cmd.Flags().IntVar(&flagSlop, "slop", 0, "Slop")
+	cmd.Flags().StringVar(&flagMinId, "min-id", "", "Min id")
+	cmd.Flags().StringVar(&flagMaxId, "max-id", "", "Max id")
+	cmd.Flags().StringVar(&flagTag, "tag", "", "Tag")
+	cmd.Flags().StringVar(&flagTagSetting, "tag-setting", "", "Tag setting")
+	cmd.Flags().BoolVar(&flagArchived, "archived", false, "Archived")
+	cmd.Flags().StringVar(&flagSortBy, "sort-by", "", "Sort by")
+	cmd.Flags().StringVar(&flagSortOrder, "sort-order", "", "Sort order")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().IntVar(&flagOffset, "offset", 0, "Offset")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_typing.go b/discord-cli/internal/cli/channels_typing.go
new file mode 100644
index 00000000..89e447a8
--- /dev/null
+++ b/discord-cli/internal/cli/channels_typing.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsTypingCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "typing",
+		Short: "Manage typing",
+	}
+
+	cmd.AddCommand(newChannelsTypingTriggerIndicatorCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_typing_trigger-indicator.go b/discord-cli/internal/cli/channels_typing_trigger-indicator.go
new file mode 100644
index 00000000..090eadf6
--- /dev/null
+++ b/discord-cli/internal/cli/channels_typing_trigger-indicator.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsTypingTriggerIndicatorCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "trigger-indicator <channel_id>",
+		Aliases: []string{"create"},
+		Short: "Trigger indicator",
+		Example: "  discord-cli channels typing trigger-indicator abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/typing"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_update.go b/discord-cli/internal/cli/channels_update.go
new file mode 100644
index 00000000..90574757
--- /dev/null
+++ b/discord-cli/internal/cli/channels_update.go
@@ -0,0 +1,64 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsUpdateCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update <channel_id>",
+		Short: "Update",
+		Example: "  discord-cli channels update abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_users.go b/discord-cli/internal/cli/channels_users.go
new file mode 100644
index 00000000..09a05bfb
--- /dev/null
+++ b/discord-cli/internal/cli/channels_users.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsUsersCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "users",
+		Short: "Manage users",
+	}
+
+	cmd.AddCommand(newChannelsUsersListMyPrivateArchivedThreadsCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_users_list-my-private-archived-threads.go b/discord-cli/internal/cli/channels_users_list-my-private-archived-threads.go
new file mode 100644
index 00000000..204b8411
--- /dev/null
+++ b/discord-cli/internal/cli/channels_users_list-my-private-archived-threads.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsUsersListMyPrivateArchivedThreadsCmd(flags *rootFlags) *cobra.Command {
+	var flagBefore string
+	var flagLimit int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list-my-private-archived-threads <channel_id>",
+		Aliases: []string{"get"},
+		Short: "List my private archived threads",
+		Example: "  discord-cli channels users list-my-private-archived-threads abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/users/@me/threads/archived/private"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"before": fmt.Sprintf("%v", flagBefore),
+				"limit": fmt.Sprintf("%v", flagLimit),
+			}, flagAll, "", "", "has_more")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_webhooks.go b/discord-cli/internal/cli/channels_webhooks.go
new file mode 100644
index 00000000..ccbccdcd
--- /dev/null
+++ b/discord-cli/internal/cli/channels_webhooks.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newChannelsWebhooksCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "webhooks",
+		Short: "Manage webhooks",
+	}
+
+	cmd.AddCommand(newChannelsWebhooksCreateCmd(flags))
+	cmd.AddCommand(newChannelsWebhooksListChannelCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_webhooks_create.go b/discord-cli/internal/cli/channels_webhooks_create.go
new file mode 100644
index 00000000..51f367e0
--- /dev/null
+++ b/discord-cli/internal/cli/channels_webhooks_create.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsWebhooksCreateCmd(flags *rootFlags) *cobra.Command {
+	var bodyAvatar string
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create <channel_id>",
+		Short: "Create",
+		Example: "  discord-cli channels webhooks create abc123 --name my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/webhooks"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAvatar != "" {
+					body["avatar"] = bodyAvatar
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAvatar, "avatar", "", "Avatar")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	_ = cmd.MarkFlagRequired("name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/channels_webhooks_list-channel.go b/discord-cli/internal/cli/channels_webhooks_list-channel.go
new file mode 100644
index 00000000..77bd7dd2
--- /dev/null
+++ b/discord-cli/internal/cli/channels_webhooks_list-channel.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newChannelsWebhooksListChannelCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-channel <channel_id>",
+		Aliases: []string{"get"},
+		Short: "List channel",
+		Example: "  discord-cli channels webhooks list-channel abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/channels/{channel_id}/webhooks"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/doctor.go b/discord-cli/internal/cli/doctor.go
new file mode 100644
index 00000000..86bb76ec
--- /dev/null
+++ b/discord-cli/internal/cli/doctor.go
@@ -0,0 +1,138 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"fmt"
+	"net/http"
+	"os"
+	"strings"
+	"time"
+
+	"github.com/USER/discord-cli/internal/config"
+	"github.com/spf13/cobra"
+)
+
+func newDoctorCmd(flags *rootFlags) *cobra.Command {
+	return &cobra.Command{
+		Use:   "doctor",
+		Short: "Check CLI health",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			report := map[string]any{}
+
+			// Check config
+			cfg, err := config.Load(flags.configPath)
+			if err != nil {
+				report["config"] = fmt.Sprintf("error: %s", err)
+			} else {
+				report["config"] = "ok"
+				report["config_path"] = cfg.Path
+				report["base_url"] = cfg.BaseURL
+			}
+
+			// Check auth
+			if cfg != nil {
+				header := cfg.AuthHeader()
+				if header == "" {
+					report["auth"] = "not configured"
+				} else {
+					report["auth"] = "configured"
+					report["auth_source"] = cfg.AuthSource
+				}
+			}
+
+			// Check auth environment variables
+			authEnvChecked := 0
+			authEnvSet := 0
+			authEnvChecked++
+			if os.Getenv("DISCORD_TOKEN") != "" {
+				authEnvSet++
+			}
+			if authEnvSet == 0 {
+				report["env_vars"] = fmt.Sprintf("none set (checked %d)", authEnvChecked)
+			} else {
+				report["env_vars"] = fmt.Sprintf("%d/%d set", authEnvSet, authEnvChecked)
+			}
+
+			// Check API connectivity
+			if cfg != nil && cfg.BaseURL != "" {
+				httpClient := &http.Client{Timeout: 5 * time.Second}
+
+				// Health check: HEAD request to base URL
+				headReq, _ := http.NewRequest("HEAD", cfg.BaseURL, nil)
+				headResp, headErr := httpClient.Do(headReq)
+				if headErr != nil {
+					report["api_head"] = fmt.Sprintf("unreachable: %s", headErr)
+				} else {
+					headResp.Body.Close()
+					report["api_head"] = fmt.Sprintf("HTTP %d", headResp.StatusCode)
+				}
+
+				// Health check: try common health endpoints
+				healthPaths := []string{"/health", "/healthz", "/status", "/ping", ""}
+				reached := false
+				for _, p := range healthPaths {
+					healthURL := strings.TrimRight(cfg.BaseURL, "/") + p
+					healthResp, healthErr := httpClient.Get(healthURL)
+					if healthErr != nil {
+						continue
+					}
+					healthResp.Body.Close()
+					if healthResp.StatusCode >= 200 && healthResp.StatusCode < 400 {
+						report["api"] = fmt.Sprintf("reachable (HTTP %d at %s)", healthResp.StatusCode, p)
+						reached = true
+						break
+					}
+				}
+
+				if !reached {
+					// Fall back to GET on base URL
+					fallbackResp, fallbackErr := httpClient.Get(cfg.BaseURL)
+					if fallbackErr != nil {
+						report["api"] = fmt.Sprintf("unreachable: %s", fallbackErr)
+					} else {
+						fallbackResp.Body.Close()
+						report["api"] = fmt.Sprintf("degraded (HTTP %d)", fallbackResp.StatusCode)
+					}
+				}
+			} else if cfg != nil && cfg.BaseURL == "" {
+				report["api"] = "not configured (set base_url in config file)"
+			}
+
+			report["version"] = version
+
+			if flags.asJSON {
+				return flags.printJSON(cmd, report)
+			}
+
+			// Human-readable output with color
+			w := cmd.OutOrStdout()
+			checkKeys := []struct{ key, label string }{
+				{"config", "Config"},
+				{"auth", "Auth"},
+				{"api", "API"},
+			}
+			for _, ck := range checkKeys {
+				v, ok := report[ck.key]
+				if !ok {
+					continue
+				}
+				s := fmt.Sprintf("%v", v)
+				indicator := green("OK")
+				if strings.Contains(s, "error") || strings.Contains(s, "not configured") || strings.Contains(s, "unreachable") {
+					indicator = red("FAIL")
+				} else if strings.Contains(s, "not ") {
+					indicator = yellow("WARN")
+				}
+				fmt.Fprintf(w, "  %s %s: %s\n", indicator, ck.label, s)
+			}
+			// Print info keys without status indicator
+			for _, key := range []string{"config_path", "base_url", "auth_source", "version"} {
+				if v, ok := report[key]; ok {
+					fmt.Fprintf(w, "  %s: %v\n", key, v)
+				}
+			}
+			return nil
+		},
+	}
+}
diff --git a/discord-cli/internal/cli/export.go b/discord-cli/internal/cli/export.go
new file mode 100644
index 00000000..c11998d2
--- /dev/null
+++ b/discord-cli/internal/cli/export.go
@@ -0,0 +1,106 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"bufio"
+	"encoding/json"
+	"fmt"
+	"os"
+
+	"github.com/spf13/cobra"
+)
+
+func newExportCmd(flags *rootFlags) *cobra.Command {
+	var format string
+	var outputFile string
+	var limit int
+	var noCache bool
+
+	cmd := &cobra.Command{
+		Use:   "export <resource> [id]",
+		Short: "Export data to JSONL or JSON for backup, migration, or analysis",
+		Long: `Export paginated API data to a local file. Supports JSONL (one JSON object
+per line, streaming-friendly) and JSON (array). JSONL is recommended for
+large datasets as it has no memory pressure.`,
+		Example: `  # Export all items as JSONL (streaming, recommended for large datasets)
+  discord-cli export <resource> --format jsonl --output data.jsonl
+
+  # Export with limit
+  discord-cli export <resource> --format jsonl --limit 1000
+
+  # Pipe to another tool
+  discord-cli export <resource> --format jsonl | jq '.id'`,
+		Args: cobra.MinimumNArgs(1),
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+			if noCache {
+				c.NoCache = true
+			}
+
+			resource := args[0]
+			path := "/" + resource
+			if len(args) > 1 {
+				path += "/" + args[1]
+			}
+
+			var writer *bufio.Writer
+			if outputFile != "" {
+				f, err := os.Create(outputFile)
+				if err != nil {
+					return fmt.Errorf("creating output file: %w", err)
+				}
+				defer f.Close()
+				writer = bufio.NewWriter(f)
+				defer writer.Flush()
+			} else {
+				writer = bufio.NewWriter(os.Stdout)
+				defer writer.Flush()
+			}
+
+			data, err := c.Get(path, nil)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			switch format {
+			case "jsonl":
+				var items []json.RawMessage
+				if err := json.Unmarshal(data, &items); err != nil {
+					fmt.Fprintln(writer, string(data))
+					return nil
+				}
+				count := 0
+				for _, item := range items {
+					if limit > 0 && count >= limit {
+						break
+					}
+					fmt.Fprintln(writer, string(item))
+					count++
+				}
+				if outputFile != "" {
+					fmt.Fprintf(os.Stderr, "Exported %d records to %s\n", count, outputFile)
+				}
+			default:
+				enc := json.NewEncoder(writer)
+				enc.SetIndent("", "  ")
+				var parsed any
+				if err := json.Unmarshal(data, &parsed); err != nil {
+					return err
+				}
+				return enc.Encode(parsed)
+			}
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&format, "format", "jsonl", "Output format: jsonl or json")
+	cmd.Flags().StringVarP(&outputFile, "output", "o", "", "Output file path (default: stdout)")
+	cmd.Flags().IntVar(&limit, "limit", 0, "Maximum records to export (0 = unlimited)")
+	cmd.Flags().BoolVar(&noCache, "no-cache", false, "Bypass response cache for fresh data")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/gateway.go b/discord-cli/internal/cli/gateway.go
new file mode 100644
index 00000000..2e75b428
--- /dev/null
+++ b/discord-cli/internal/cli/gateway.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGatewayCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "gateway",
+		Short: "Manage gateway",
+	}
+
+	cmd.AddCommand(newGatewayGetCmd(flags))
+	cmd.AddCommand(newGatewayGetBotCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/gateway_get-bot.go b/discord-cli/internal/cli/gateway_get-bot.go
new file mode 100644
index 00000000..c2a58ee0
--- /dev/null
+++ b/discord-cli/internal/cli/gateway_get-bot.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGatewayGetBotCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-bot",
+		Short: "Get bot",
+		Example: "  discord-cli gateway get-bot",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/gateway/bot"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/gateway_get.go b/discord-cli/internal/cli/gateway_get.go
new file mode 100644
index 00000000..7a433a47
--- /dev/null
+++ b/discord-cli/internal/cli/gateway_get.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGatewayGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get",
+		Aliases: []string{"list"},
+		Short: "Get",
+		Example: "  discord-cli gateway get",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/gateway"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds.go b/discord-cli/internal/cli/guilds.go
new file mode 100644
index 00000000..36837637
--- /dev/null
+++ b/discord-cli/internal/cli/guilds.go
@@ -0,0 +1,47 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "guilds",
+		Short: "Manage Discord guilds (servers) - members, roles, bans, channels, audit logs, and more",
+	}
+
+	cmd.AddCommand(newGuildsGetCmd(flags))
+	cmd.AddCommand(newGuildsGetTemplateCmd(flags))
+	cmd.AddCommand(newGuildsUpdateCmd(flags))
+	cmd.AddCommand(newGuildsAuditLogsCmd(flags))
+	cmd.AddCommand(newGuildsAutoModerationCmd(flags))
+	cmd.AddCommand(newGuildsBansCmd(flags))
+	cmd.AddCommand(newGuildsBulkBanCmd(flags))
+	cmd.AddCommand(newGuildsChannelsCmd(flags))
+	cmd.AddCommand(newGuildsEmojisCmd(flags))
+	cmd.AddCommand(newGuildsIntegrationsCmd(flags))
+	cmd.AddCommand(newGuildsInvitesCmd(flags))
+	cmd.AddCommand(newGuildsMembersCmd(flags))
+	cmd.AddCommand(newGuildsMessagesCmd(flags))
+	cmd.AddCommand(newGuildsNewMemberWelcomeCmd(flags))
+	cmd.AddCommand(newGuildsOnboardingCmd(flags))
+	cmd.AddCommand(newGuildsPreviewCmd(flags))
+	cmd.AddCommand(newGuildsPruneCmd(flags))
+	cmd.AddCommand(newGuildsRegionsCmd(flags))
+	cmd.AddCommand(newGuildsRolesCmd(flags))
+	cmd.AddCommand(newGuildsScheduledEventsCmd(flags))
+	cmd.AddCommand(newGuildsSoundboardSoundsCmd(flags))
+	cmd.AddCommand(newGuildsStickersCmd(flags))
+	cmd.AddCommand(newGuildsTemplatesCmd(flags))
+	cmd.AddCommand(newGuildsThreadsCmd(flags))
+	cmd.AddCommand(newGuildsVanityUrlCmd(flags))
+	cmd.AddCommand(newGuildsVoiceStatesCmd(flags))
+	cmd.AddCommand(newGuildsWebhooksCmd(flags))
+	cmd.AddCommand(newGuildsWelcomeScreenCmd(flags))
+	cmd.AddCommand(newGuildsWidgetCmd(flags))
+	cmd.AddCommand(newGuildsWidgetJsonCmd(flags))
+	cmd.AddCommand(newGuildsWidgetPngCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_audit-logs.go b/discord-cli/internal/cli/guilds_audit-logs.go
new file mode 100644
index 00000000..ae9a0f9d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_audit-logs.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsAuditLogsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "audit-logs",
+		Short: "Manage audit logs",
+	}
+
+	cmd.AddCommand(newGuildsAuditLogsListGuildEntriesCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_audit-logs_list-guild-entries.go b/discord-cli/internal/cli/guilds_audit-logs_list-guild-entries.go
new file mode 100644
index 00000000..82507356
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_audit-logs_list-guild-entries.go
@@ -0,0 +1,70 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsAuditLogsListGuildEntriesCmd(flags *rootFlags) *cobra.Command {
+	var flagUserId string
+	var flagTargetId string
+	var flagActionType int
+	var flagBefore string
+	var flagAfter string
+	var flagLimit int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list-guild-entries <guild_id>",
+		Aliases: []string{"get"},
+		Short: "List guild entries",
+		Example: "  discord-cli guilds audit-logs list-guild-entries abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/audit-logs"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"user_id": fmt.Sprintf("%v", flagUserId),
+				"target_id": fmt.Sprintf("%v", flagTargetId),
+				"action_type": fmt.Sprintf("%v", flagActionType),
+				"before": fmt.Sprintf("%v", flagBefore),
+				"after": fmt.Sprintf("%v", flagAfter),
+				"limit": fmt.Sprintf("%v", flagLimit),
+			}, flagAll, "after", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagUserId, "user-id", "", "User id")
+	cmd.Flags().StringVar(&flagTargetId, "target-id", "", "Target id")
+	cmd.Flags().IntVar(&flagActionType, "action-type", 0, "Action type")
+	cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+	cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation.go b/discord-cli/internal/cli/guilds_auto-moderation.go
new file mode 100644
index 00000000..8ad68d69
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsAutoModerationCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "auto-moderation",
+		Short: "Manage auto moderation",
+	}
+
+	cmd.AddCommand(newGuildsAutoModerationCreateRuleCmd(flags))
+	cmd.AddCommand(newGuildsAutoModerationDeleteRuleCmd(flags))
+	cmd.AddCommand(newGuildsAutoModerationGetRuleCmd(flags))
+	cmd.AddCommand(newGuildsAutoModerationListRulesCmd(flags))
+	cmd.AddCommand(newGuildsAutoModerationUpdateRuleCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation_create-rule.go b/discord-cli/internal/cli/guilds_auto-moderation_create-rule.go
new file mode 100644
index 00000000..ffabfc60
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation_create-rule.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsAutoModerationCreateRuleCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-rule <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Create rule",
+		Example: "  discord-cli guilds auto-moderation create-rule abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/auto-moderation/rules"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation_delete-rule.go b/discord-cli/internal/cli/guilds_auto-moderation_delete-rule.go
new file mode 100644
index 00000000..1fdde628
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation_delete-rule.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsAutoModerationDeleteRuleCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-rule <guild_id> <rule_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete rule",
+		Example: "  discord-cli guilds auto-moderation delete-rule abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/auto-moderation/rules/{rule_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("rule_id is required"))
+			}
+			path = replacePathParam(path, "rule_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation_get-rule.go b/discord-cli/internal/cli/guilds_auto-moderation_get-rule.go
new file mode 100644
index 00000000..6e0b0b0f
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation_get-rule.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsAutoModerationGetRuleCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-rule <guild_id> <rule_id>",
+		Aliases: []string{"get"},
+		Short: "Get rule",
+		Example: "  discord-cli guilds auto-moderation get-rule abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/auto-moderation/rules/{rule_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("rule_id is required"))
+			}
+			path = replacePathParam(path, "rule_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation_list-rules.go b/discord-cli/internal/cli/guilds_auto-moderation_list-rules.go
new file mode 100644
index 00000000..0da99dd8
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation_list-rules.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsAutoModerationListRulesCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-rules <guild_id>",
+		Short: "List rules",
+		Example: "  discord-cli guilds auto-moderation list-rules abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/auto-moderation/rules"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_auto-moderation_update-rule.go b/discord-cli/internal/cli/guilds_auto-moderation_update-rule.go
new file mode 100644
index 00000000..428e6364
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_auto-moderation_update-rule.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsAutoModerationUpdateRuleCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-rule <guild_id> <rule_id>",
+		Aliases: []string{"update"},
+		Short: "Update rule",
+		Example: "  discord-cli guilds auto-moderation update-rule abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/auto-moderation/rules/{rule_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("rule_id is required"))
+			}
+			path = replacePathParam(path, "rule_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bans.go b/discord-cli/internal/cli/guilds_bans.go
new file mode 100644
index 00000000..ae36efa3
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bans.go
@@ -0,0 +1,20 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsBansCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "bans",
+		Short: "Manage bans",
+	}
+
+	cmd.AddCommand(newGuildsBansGetGuildCmd(flags))
+	cmd.AddCommand(newGuildsBansListGuildCmd(flags))
+	cmd.AddCommand(newGuildsBansUnbanUserFromGuildCmd(flags))
+	cmd.AddCommand(newGuildsBansUserFromGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bans_get-guild.go b/discord-cli/internal/cli/guilds_bans_get-guild.go
new file mode 100644
index 00000000..b6f806fb
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bans_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsBansGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id> <user_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds bans get-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/bans/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bans_list-guild.go b/discord-cli/internal/cli/guilds_bans_list-guild.go
new file mode 100644
index 00000000..321a2400
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bans_list-guild.go
@@ -0,0 +1,60 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsBansListGuildCmd(flags *rootFlags) *cobra.Command {
+	var flagLimit int
+	var flagBefore string
+	var flagAfter string
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Short: "List guild",
+		Example: "  discord-cli guilds bans list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/bans"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"limit": fmt.Sprintf("%v", flagLimit),
+				"before": fmt.Sprintf("%v", flagBefore),
+				"after": fmt.Sprintf("%v", flagAfter),
+			}, flagAll, "after", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+	cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bans_unban-user-from-guild.go b/discord-cli/internal/cli/guilds_bans_unban-user-from-guild.go
new file mode 100644
index 00000000..dac721ec
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bans_unban-user-from-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsBansUnbanUserFromGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "unban-user-from-guild <guild_id> <user_id>",
+		Aliases: []string{"delete"},
+		Short: "Unban user from guild",
+		Example: "  discord-cli guilds bans unban-user-from-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/bans/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bans_user-from-guild.go b/discord-cli/internal/cli/guilds_bans_user-from-guild.go
new file mode 100644
index 00000000..d266abcd
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bans_user-from-guild.go
@@ -0,0 +1,79 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsBansUserFromGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyDeleteMessageDays int
+	var bodyDeleteMessageSeconds int
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "user-from-guild <guild_id> <user_id>",
+		Aliases: []string{"update"},
+		Short: "User from guild",
+		Example: "  discord-cli guilds bans user-from-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/bans/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDeleteMessageDays != 0 {
+					body["delete_message_days"] = bodyDeleteMessageDays
+				}
+				if bodyDeleteMessageSeconds != 0 {
+					body["delete_message_seconds"] = bodyDeleteMessageSeconds
+				}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyDeleteMessageDays, "delete-message-days", 0, "Delete message days")
+	cmd.Flags().IntVar(&bodyDeleteMessageSeconds, "delete-message-seconds", 0, "Delete message seconds")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bulk-ban.go b/discord-cli/internal/cli/guilds_bulk-ban.go
new file mode 100644
index 00000000..cd3f62b0
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bulk-ban.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsBulkBanCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "bulk-ban",
+		Short: "Manage bulk ban",
+	}
+
+	cmd.AddCommand(newGuildsBulkBanUsersFromGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_bulk-ban_users-from-guild.go b/discord-cli/internal/cli/guilds_bulk-ban_users-from-guild.go
new file mode 100644
index 00000000..836334ce
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_bulk-ban_users-from-guild.go
@@ -0,0 +1,70 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsBulkBanUsersFromGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyDeleteMessageSeconds int
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "users-from-guild <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Users from guild",
+		Example: "  discord-cli guilds bulk-ban users-from-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/bulk-ban"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDeleteMessageSeconds != 0 {
+					body["delete_message_seconds"] = bodyDeleteMessageSeconds
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyDeleteMessageSeconds, "delete-message-seconds", 0, "Delete message seconds")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_channels.go b/discord-cli/internal/cli/guilds_channels.go
new file mode 100644
index 00000000..95d71bb1
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_channels.go
@@ -0,0 +1,19 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsChannelsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "channels",
+		Short: "Manage channels",
+	}
+
+	cmd.AddCommand(newGuildsChannelsBulkUpdateGuildCmd(flags))
+	cmd.AddCommand(newGuildsChannelsCreateGuildCmd(flags))
+	cmd.AddCommand(newGuildsChannelsListGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_channels_bulk-update-guild.go b/discord-cli/internal/cli/guilds_channels_bulk-update-guild.go
new file mode 100644
index 00000000..9ed27fb4
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_channels_bulk-update-guild.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsChannelsBulkUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "bulk-update-guild <guild_id>",
+		Aliases: []string{"update"},
+		Short: "Bulk update guild",
+		Example: "  discord-cli guilds channels bulk-update-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/channels"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_channels_create-guild.go b/discord-cli/internal/cli/guilds_channels_create-guild.go
new file mode 100644
index 00000000..c93455dd
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_channels_create-guild.go
@@ -0,0 +1,151 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsChannelsCreateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyBitrate int
+	var bodyDefaultAutoArchiveDuration string
+	var bodyDefaultForumLayout string
+	var bodyDefaultReactionEmoji string
+	var bodyDefaultSortOrder string
+	var bodyDefaultTagSetting string
+	var bodyDefaultThreadRateLimitPerUser int
+	var bodyName string
+	var bodyNsfw bool
+	var bodyParentId string
+	var bodyPosition int
+	var bodyRateLimitPerUser int
+	var bodyRtcRegion string
+	var bodyTopic string
+	var bodyType string
+	var bodyUserLimit int
+	var bodyVideoQualityMode string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-guild <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Create guild",
+		Example: "  discord-cli guilds channels create-guild abc123 --name my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/channels"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyBitrate != 0 {
+					body["bitrate"] = bodyBitrate
+				}
+				if bodyDefaultAutoArchiveDuration != "" {
+					body["default_auto_archive_duration"] = bodyDefaultAutoArchiveDuration
+				}
+				if bodyDefaultForumLayout != "" {
+					body["default_forum_layout"] = bodyDefaultForumLayout
+				}
+				if bodyDefaultReactionEmoji != "" {
+					body["default_reaction_emoji"] = bodyDefaultReactionEmoji
+				}
+				if bodyDefaultSortOrder != "" {
+					body["default_sort_order"] = bodyDefaultSortOrder
+				}
+				if bodyDefaultTagSetting != "" {
+					body["default_tag_setting"] = bodyDefaultTagSetting
+				}
+				if bodyDefaultThreadRateLimitPerUser != 0 {
+					body["default_thread_rate_limit_per_user"] = bodyDefaultThreadRateLimitPerUser
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodyNsfw != false {
+					body["nsfw"] = bodyNsfw
+				}
+				if bodyParentId != "" {
+					body["parent_id"] = bodyParentId
+				}
+				if bodyPosition != 0 {
+					body["position"] = bodyPosition
+				}
+				if bodyRateLimitPerUser != 0 {
+					body["rate_limit_per_user"] = bodyRateLimitPerUser
+				}
+				if bodyRtcRegion != "" {
+					body["rtc_region"] = bodyRtcRegion
+				}
+				if bodyTopic != "" {
+					body["topic"] = bodyTopic
+				}
+				if bodyType != "" {
+					body["type"] = bodyType
+				}
+				if bodyUserLimit != 0 {
+					body["user_limit"] = bodyUserLimit
+				}
+				if bodyVideoQualityMode != "" {
+					body["video_quality_mode"] = bodyVideoQualityMode
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyBitrate, "bitrate", 0, "Bitrate")
+	cmd.Flags().StringVar(&bodyDefaultAutoArchiveDuration, "default-auto-archive-duration", "", "Default auto archive duration")
+	cmd.Flags().StringVar(&bodyDefaultForumLayout, "default-forum-layout", "", "Default forum layout")
+	cmd.Flags().StringVar(&bodyDefaultReactionEmoji, "default-reaction-emoji", "", "Default reaction emoji")
+	cmd.Flags().StringVar(&bodyDefaultSortOrder, "default-sort-order", "", "Default sort order")
+	cmd.Flags().StringVar(&bodyDefaultTagSetting, "default-tag-setting", "", "Default tag setting")
+	cmd.Flags().IntVar(&bodyDefaultThreadRateLimitPerUser, "default-thread-rate-limit-per-user", 0, "Default thread rate limit per user")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	_ = cmd.MarkFlagRequired("name")
+	cmd.Flags().BoolVar(&bodyNsfw, "nsfw", false, "Nsfw")
+	cmd.Flags().StringVar(&bodyParentId, "parent-id", "", "Parent id")
+	cmd.Flags().IntVar(&bodyPosition, "position", 0, "Position")
+	cmd.Flags().IntVar(&bodyRateLimitPerUser, "rate-limit-per-user", 0, "Rate limit per user")
+	cmd.Flags().StringVar(&bodyRtcRegion, "rtc-region", "", "Rtc region")
+	cmd.Flags().StringVar(&bodyTopic, "topic", "", "Topic")
+	cmd.Flags().StringVar(&bodyType, "type", "", "Type")
+	cmd.Flags().IntVar(&bodyUserLimit, "user-limit", 0, "User limit")
+	cmd.Flags().StringVar(&bodyVideoQualityMode, "video-quality-mode", "", "Video quality mode")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_channels_list-guild.go b/discord-cli/internal/cli/guilds_channels_list-guild.go
new file mode 100644
index 00000000..17fae30d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_channels_list-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsChannelsListGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "List guild",
+		Example: "  discord-cli guilds channels list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/channels"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis.go b/discord-cli/internal/cli/guilds_emojis.go
new file mode 100644
index 00000000..5c612aec
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsEmojisCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "emojis",
+		Short: "Manage emojis",
+	}
+
+	cmd.AddCommand(newGuildsEmojisCreateGuildCmd(flags))
+	cmd.AddCommand(newGuildsEmojisDeleteGuildCmd(flags))
+	cmd.AddCommand(newGuildsEmojisGetGuildCmd(flags))
+	cmd.AddCommand(newGuildsEmojisListGuildCmd(flags))
+	cmd.AddCommand(newGuildsEmojisUpdateGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis_create-guild.go b/discord-cli/internal/cli/guilds_emojis_create-guild.go
new file mode 100644
index 00000000..b0f0a957
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis_create-guild.go
@@ -0,0 +1,77 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsEmojisCreateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyImage string
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-guild <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Create guild",
+		Example: "  discord-cli guilds emojis create-guild abc123 --image value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/emojis"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyImage != "" {
+					body["image"] = bodyImage
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyImage, "image", "", "Image")
+	_ = cmd.MarkFlagRequired("image")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	_ = cmd.MarkFlagRequired("name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis_delete-guild.go b/discord-cli/internal/cli/guilds_emojis_delete-guild.go
new file mode 100644
index 00000000..ef1aa49d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsEmojisDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-guild <guild_id> <emoji_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete guild",
+		Example: "  discord-cli guilds emojis delete-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/emojis/{emoji_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("emoji_id is required"))
+			}
+			path = replacePathParam(path, "emoji_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis_get-guild.go b/discord-cli/internal/cli/guilds_emojis_get-guild.go
new file mode 100644
index 00000000..18a1e6d7
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsEmojisGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id> <emoji_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds emojis get-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/emojis/{emoji_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("emoji_id is required"))
+			}
+			path = replacePathParam(path, "emoji_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis_list-guild.go b/discord-cli/internal/cli/guilds_emojis_list-guild.go
new file mode 100644
index 00000000..d2de44d7
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis_list-guild.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsEmojisListGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Short: "List guild",
+		Example: "  discord-cli guilds emojis list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/emojis"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_emojis_update-guild.go b/discord-cli/internal/cli/guilds_emojis_update-guild.go
new file mode 100644
index 00000000..b727de21
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_emojis_update-guild.go
@@ -0,0 +1,74 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsEmojisUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-guild <guild_id> <emoji_id>",
+		Aliases: []string{"update"},
+		Short: "Update guild",
+		Example: "  discord-cli guilds emojis update-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/emojis/{emoji_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("emoji_id is required"))
+			}
+			path = replacePathParam(path, "emoji_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_get-template.go b/discord-cli/internal/cli/guilds_get-template.go
new file mode 100644
index 00000000..6244fe5b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_get-template.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsGetTemplateCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-template <code>",
+		Short: "Get template",
+		Example: "  discord-cli guilds get-template value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/templates/{code}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("code is required"))
+			}
+			path = replacePathParam(path, "code", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_get.go b/discord-cli/internal/cli/guilds_get.go
new file mode 100644
index 00000000..1898b25d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_get.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsGetCmd(flags *rootFlags) *cobra.Command {
+	var flagWithCounts bool
+
+	cmd := &cobra.Command{
+		Use:   "get <guild_id>",
+		Short: "Get",
+		Example: "  discord-cli guilds get abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			if flagWithCounts != false {
+				params["with_counts"] = fmt.Sprintf("%v", flagWithCounts)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWithCounts, "with-counts", false, "With counts")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_integrations.go b/discord-cli/internal/cli/guilds_integrations.go
new file mode 100644
index 00000000..e870fcaf
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_integrations.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsIntegrationsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "integrations",
+		Short: "Manage integrations",
+	}
+
+	cmd.AddCommand(newGuildsIntegrationsDeleteGuildCmd(flags))
+	cmd.AddCommand(newGuildsIntegrationsListGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_integrations_delete-guild.go b/discord-cli/internal/cli/guilds_integrations_delete-guild.go
new file mode 100644
index 00000000..12514257
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_integrations_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsIntegrationsDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-guild <guild_id> <integration_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete guild",
+		Example: "  discord-cli guilds integrations delete-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/integrations/{integration_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("integration_id is required"))
+			}
+			path = replacePathParam(path, "integration_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_integrations_list-guild.go b/discord-cli/internal/cli/guilds_integrations_list-guild.go
new file mode 100644
index 00000000..6e97b811
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_integrations_list-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsIntegrationsListGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "List guild",
+		Example: "  discord-cli guilds integrations list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/integrations"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_invites.go b/discord-cli/internal/cli/guilds_invites.go
new file mode 100644
index 00000000..65c10b2b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_invites.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsInvitesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "invites",
+		Short: "Manage invites",
+	}
+
+	cmd.AddCommand(newGuildsInvitesListGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_invites_list-guild.go b/discord-cli/internal/cli/guilds_invites_list-guild.go
new file mode 100644
index 00000000..4477842c
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_invites_list-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsInvitesListGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "List guild",
+		Example: "  discord-cli guilds invites list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/invites"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members.go b/discord-cli/internal/cli/guilds_members.go
new file mode 100644
index 00000000..e1016e43
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members.go
@@ -0,0 +1,25 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsMembersCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "members",
+		Short: "Manage members",
+	}
+
+	cmd.AddCommand(newGuildsMembersAddGuildCmd(flags))
+	cmd.AddCommand(newGuildsMembersAddGuildRoleCmd(flags))
+	cmd.AddCommand(newGuildsMembersDeleteGuildCmd(flags))
+	cmd.AddCommand(newGuildsMembersDeleteGuildRoleCmd(flags))
+	cmd.AddCommand(newGuildsMembersGetGuildCmd(flags))
+	cmd.AddCommand(newGuildsMembersListGuildCmd(flags))
+	cmd.AddCommand(newGuildsMembersSearchGuildCmd(flags))
+	cmd.AddCommand(newGuildsMembersUpdateGuildCmd(flags))
+	cmd.AddCommand(newGuildsMembersUpdateMyGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_add-guild-role.go b/discord-cli/internal/cli/guilds_members_add-guild-role.go
new file mode 100644
index 00000000..76aee92b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_add-guild-role.go
@@ -0,0 +1,72 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsMembersAddGuildRoleCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "add-guild-role <guild_id> <user_id> <role_id>",
+		Short: "Add guild role",
+		Example: "  discord-cli guilds members add-guild-role abc123 abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/members/{user_id}/roles/{role_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("role_id is required"))
+			}
+			path = replacePathParam(path, "role_id", args[2])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_add-guild.go b/discord-cli/internal/cli/guilds_members_add-guild.go
new file mode 100644
index 00000000..f98842c7
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_add-guild.go
@@ -0,0 +1,95 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsMembersAddGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyAccessToken string
+	var bodyDeaf bool
+	var bodyFlags int
+	var bodyMute bool
+	var bodyNick string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "add-guild <guild_id> <user_id>",
+		Aliases: []string{"update"},
+		Short: "Add guild",
+		Example: "  discord-cli guilds members add-guild abc123 abc123 --access-token value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/members/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAccessToken != "" {
+					body["access_token"] = bodyAccessToken
+				}
+				if bodyDeaf != false {
+					body["deaf"] = bodyDeaf
+				}
+				if bodyFlags != 0 {
+					body["flags"] = bodyFlags
+				}
+				if bodyMute != false {
+					body["mute"] = bodyMute
+				}
+				if bodyNick != "" {
+					body["nick"] = bodyNick
+				}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAccessToken, "access-token", "", "Access token")
+	_ = cmd.MarkFlagRequired("access-token")
+	cmd.Flags().BoolVar(&bodyDeaf, "deaf", false, "Deaf")
+	cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+	cmd.Flags().BoolVar(&bodyMute, "mute", false, "Mute")
+	cmd.Flags().StringVar(&bodyNick, "nick", "", "Nick")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_delete-guild-role.go b/discord-cli/internal/cli/guilds_members_delete-guild-role.go
new file mode 100644
index 00000000..735099a7
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_delete-guild-role.go
@@ -0,0 +1,56 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsMembersDeleteGuildRoleCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-guild-role <guild_id> <user_id> <role_id>",
+		Short: "Delete guild role",
+		Example: "  discord-cli guilds members delete-guild-role abc123 abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/members/{user_id}/roles/{role_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("role_id is required"))
+			}
+			path = replacePathParam(path, "role_id", args[2])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_delete-guild.go b/discord-cli/internal/cli/guilds_members_delete-guild.go
new file mode 100644
index 00000000..6b2971cb
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsMembersDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-guild <guild_id> <user_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete guild",
+		Example: "  discord-cli guilds members delete-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/members/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_get-guild.go b/discord-cli/internal/cli/guilds_members_get-guild.go
new file mode 100644
index 00000000..c8811aba
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsMembersGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id> <user_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds members get-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/members/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_list-guild.go b/discord-cli/internal/cli/guilds_members_list-guild.go
new file mode 100644
index 00000000..b2a09cc4
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_list-guild.go
@@ -0,0 +1,57 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsMembersListGuildCmd(flags *rootFlags) *cobra.Command {
+	var flagLimit int
+	var flagAfter int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Short: "List guild",
+		Example: "  discord-cli guilds members list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/members"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"limit": fmt.Sprintf("%v", flagLimit),
+				"after": fmt.Sprintf("%v", flagAfter),
+			}, flagAll, "after", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().IntVar(&flagAfter, "after", 0, "After")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_search-guild.go b/discord-cli/internal/cli/guilds_members_search-guild.go
new file mode 100644
index 00000000..9f9dfba5
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_search-guild.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsMembersSearchGuildCmd(flags *rootFlags) *cobra.Command {
+	var flagLimit int
+	var flagQuery string
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "search-guild <guild_id>",
+		Short: "Search guild",
+		Example: "  discord-cli guilds members search-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/members/search"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"limit": fmt.Sprintf("%v", flagLimit),
+				"query": fmt.Sprintf("%v", flagQuery),
+			}, flagAll, "", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().StringVar(&flagQuery, "query", "", "Query")
+	_ = cmd.MarkFlagRequired("query")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_update-guild.go b/discord-cli/internal/cli/guilds_members_update-guild.go
new file mode 100644
index 00000000..3bf9b8ce
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_update-guild.go
@@ -0,0 +1,98 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsMembersUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyChannelId string
+	var bodyCommunicationDisabledUntil string
+	var bodyDeaf bool
+	var bodyFlags int
+	var bodyMute bool
+	var bodyNick string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-guild <guild_id> <user_id>",
+		Short: "Update guild",
+		Example: "  discord-cli guilds members update-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/members/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyChannelId != "" {
+					body["channel_id"] = bodyChannelId
+				}
+				if bodyCommunicationDisabledUntil != "" {
+					body["communication_disabled_until"] = bodyCommunicationDisabledUntil
+				}
+				if bodyDeaf != false {
+					body["deaf"] = bodyDeaf
+				}
+				if bodyFlags != 0 {
+					body["flags"] = bodyFlags
+				}
+				if bodyMute != false {
+					body["mute"] = bodyMute
+				}
+				if bodyNick != "" {
+					body["nick"] = bodyNick
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+	cmd.Flags().StringVar(&bodyCommunicationDisabledUntil, "communication-disabled-until", "", "Communication disabled until")
+	cmd.Flags().BoolVar(&bodyDeaf, "deaf", false, "Deaf")
+	cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+	cmd.Flags().BoolVar(&bodyMute, "mute", false, "Mute")
+	cmd.Flags().StringVar(&bodyNick, "nick", "", "Nick")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_members_update-my-guild.go b/discord-cli/internal/cli/guilds_members_update-my-guild.go
new file mode 100644
index 00000000..0966cb36
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_members_update-my-guild.go
@@ -0,0 +1,84 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsMembersUpdateMyGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyAvatar string
+	var bodyBanner string
+	var bodyBio string
+	var bodyNick string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-my-guild <guild_id>",
+		Short: "Update my guild",
+		Example: "  discord-cli guilds members update-my-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/members/@me"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAvatar != "" {
+					body["avatar"] = bodyAvatar
+				}
+				if bodyBanner != "" {
+					body["banner"] = bodyBanner
+				}
+				if bodyBio != "" {
+					body["bio"] = bodyBio
+				}
+				if bodyNick != "" {
+					body["nick"] = bodyNick
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAvatar, "avatar", "", "Avatar")
+	cmd.Flags().StringVar(&bodyBanner, "banner", "", "Banner")
+	cmd.Flags().StringVar(&bodyBio, "bio", "", "Bio")
+	cmd.Flags().StringVar(&bodyNick, "nick", "", "Nick")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_messages.go b/discord-cli/internal/cli/guilds_messages.go
new file mode 100644
index 00000000..4280c8f3
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_messages.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsMessagesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "messages",
+		Short: "Manage messages",
+	}
+
+	cmd.AddCommand(newGuildsMessagesGuildSearchCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_messages_guild-search.go b/discord-cli/internal/cli/guilds_messages_guild-search.go
new file mode 100644
index 00000000..09a4a464
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_messages_guild-search.go
@@ -0,0 +1,124 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsMessagesGuildSearchCmd(flags *rootFlags) *cobra.Command {
+	var flagSortBy string
+	var flagSortOrder string
+	var flagContent string
+	var flagSlop int
+	var flagAuthorId string
+	var flagAuthorType string
+	var flagMentions string
+	var flagMentionsRoleId string
+	var flagRepliedToUserId string
+	var flagRepliedToMessageId string
+	var flagMentionEveryone bool
+	var flagMinId string
+	var flagMaxId string
+	var flagLimit int
+	var flagOffset int
+	var flagHas string
+	var flagLinkHostname string
+	var flagEmbedProvider string
+	var flagEmbedType string
+	var flagAttachmentExtension string
+	var flagAttachmentFilename string
+	var flagPinned bool
+	var flagIncludeNsfw bool
+	var flagChannelId string
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "guild-search <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Guild search",
+		Example: "  discord-cli guilds messages guild-search abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/messages/search"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"sort_by": fmt.Sprintf("%v", flagSortBy),
+				"sort_order": fmt.Sprintf("%v", flagSortOrder),
+				"content": fmt.Sprintf("%v", flagContent),
+				"slop": fmt.Sprintf("%v", flagSlop),
+				"author_id": fmt.Sprintf("%v", flagAuthorId),
+				"author_type": fmt.Sprintf("%v", flagAuthorType),
+				"mentions": fmt.Sprintf("%v", flagMentions),
+				"mentions_role_id": fmt.Sprintf("%v", flagMentionsRoleId),
+				"replied_to_user_id": fmt.Sprintf("%v", flagRepliedToUserId),
+				"replied_to_message_id": fmt.Sprintf("%v", flagRepliedToMessageId),
+				"mention_everyone": fmt.Sprintf("%v", flagMentionEveryone),
+				"min_id": fmt.Sprintf("%v", flagMinId),
+				"max_id": fmt.Sprintf("%v", flagMaxId),
+				"limit": fmt.Sprintf("%v", flagLimit),
+				"offset": fmt.Sprintf("%v", flagOffset),
+				"has": fmt.Sprintf("%v", flagHas),
+				"link_hostname": fmt.Sprintf("%v", flagLinkHostname),
+				"embed_provider": fmt.Sprintf("%v", flagEmbedProvider),
+				"embed_type": fmt.Sprintf("%v", flagEmbedType),
+				"attachment_extension": fmt.Sprintf("%v", flagAttachmentExtension),
+				"attachment_filename": fmt.Sprintf("%v", flagAttachmentFilename),
+				"pinned": fmt.Sprintf("%v", flagPinned),
+				"include_nsfw": fmt.Sprintf("%v", flagIncludeNsfw),
+				"channel_id": fmt.Sprintf("%v", flagChannelId),
+			}, flagAll, "offset", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagSortBy, "sort-by", "", "Sort by")
+	cmd.Flags().StringVar(&flagSortOrder, "sort-order", "", "Sort order")
+	cmd.Flags().StringVar(&flagContent, "content", "", "Content")
+	cmd.Flags().IntVar(&flagSlop, "slop", 0, "Slop")
+	cmd.Flags().StringVar(&flagAuthorId, "author-id", "", "Author id")
+	cmd.Flags().StringVar(&flagAuthorType, "author-type", "", "Author type")
+	cmd.Flags().StringVar(&flagMentions, "mentions", "", "Mentions")
+	cmd.Flags().StringVar(&flagMentionsRoleId, "mentions-role-id", "", "Mentions role id")
+	cmd.Flags().StringVar(&flagRepliedToUserId, "replied-to-user-id", "", "Replied to user id")
+	cmd.Flags().StringVar(&flagRepliedToMessageId, "replied-to-message-id", "", "Replied to message id")
+	cmd.Flags().BoolVar(&flagMentionEveryone, "mention-everyone", false, "Mention everyone")
+	cmd.Flags().StringVar(&flagMinId, "min-id", "", "Min id")
+	cmd.Flags().StringVar(&flagMaxId, "max-id", "", "Max id")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().IntVar(&flagOffset, "offset", 0, "Offset")
+	cmd.Flags().StringVar(&flagHas, "has", "", "Has")
+	cmd.Flags().StringVar(&flagLinkHostname, "link-hostname", "", "Link hostname")
+	cmd.Flags().StringVar(&flagEmbedProvider, "embed-provider", "", "Embed provider")
+	cmd.Flags().StringVar(&flagEmbedType, "embed-type", "", "Embed type")
+	cmd.Flags().StringVar(&flagAttachmentExtension, "attachment-extension", "", "Attachment extension")
+	cmd.Flags().StringVar(&flagAttachmentFilename, "attachment-filename", "", "Attachment filename")
+	cmd.Flags().BoolVar(&flagPinned, "pinned", false, "Pinned")
+	cmd.Flags().BoolVar(&flagIncludeNsfw, "include-nsfw", false, "Include nsfw")
+	cmd.Flags().StringVar(&flagChannelId, "channel-id", "", "Channel id")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_new-member-welcome.go b/discord-cli/internal/cli/guilds_new-member-welcome.go
new file mode 100644
index 00000000..03d2385d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_new-member-welcome.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsNewMemberWelcomeCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "new-member-welcome",
+		Short: "Manage new member welcome",
+	}
+
+	cmd.AddCommand(newGuildsNewMemberWelcomeGetGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_new-member-welcome_get-guild.go b/discord-cli/internal/cli/guilds_new-member-welcome_get-guild.go
new file mode 100644
index 00000000..9ba91f3a
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_new-member-welcome_get-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsNewMemberWelcomeGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds new-member-welcome get-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/new-member-welcome"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_onboarding.go b/discord-cli/internal/cli/guilds_onboarding.go
new file mode 100644
index 00000000..3e7ae7e6
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_onboarding.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsOnboardingCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "onboarding",
+		Short: "Manage onboarding",
+	}
+
+	cmd.AddCommand(newGuildsOnboardingGetGuildsCmd(flags))
+	cmd.AddCommand(newGuildsOnboardingPutGuildsCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_onboarding_get-guilds.go b/discord-cli/internal/cli/guilds_onboarding_get-guilds.go
new file mode 100644
index 00000000..3433b5f2
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_onboarding_get-guilds.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsOnboardingGetGuildsCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guilds <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Get guilds",
+		Example: "  discord-cli guilds onboarding get-guilds abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/onboarding"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_onboarding_put-guilds.go b/discord-cli/internal/cli/guilds_onboarding_put-guilds.go
new file mode 100644
index 00000000..e16c8c8b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_onboarding_put-guilds.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsOnboardingPutGuildsCmd(flags *rootFlags) *cobra.Command {
+	var bodyEnabled bool
+	var bodyMode string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "put-guilds <guild_id>",
+		Aliases: []string{"update"},
+		Short: "Put guilds",
+		Example: "  discord-cli guilds onboarding put-guilds abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/onboarding"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyEnabled != false {
+					body["enabled"] = bodyEnabled
+				}
+				if bodyMode != "" {
+					body["mode"] = bodyMode
+				}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&bodyEnabled, "enabled", false, "Enabled")
+	cmd.Flags().StringVar(&bodyMode, "mode", "", "Mode")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_preview.go b/discord-cli/internal/cli/guilds_preview.go
new file mode 100644
index 00000000..905433fb
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_preview.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsPreviewCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "preview",
+		Short: "Manage preview",
+	}
+
+	cmd.AddCommand(newGuildsPreviewGetGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_preview_get-guild.go b/discord-cli/internal/cli/guilds_preview_get-guild.go
new file mode 100644
index 00000000..6088919b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_preview_get-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsPreviewGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds preview get-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/preview"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_prune.go b/discord-cli/internal/cli/guilds_prune.go
new file mode 100644
index 00000000..1fa1d3f8
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_prune.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsPruneCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "prune",
+		Short: "Manage prune",
+	}
+
+	cmd.AddCommand(newGuildsPruneGuildCmd(flags))
+	cmd.AddCommand(newGuildsPrunePreviewGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_prune_guild.go b/discord-cli/internal/cli/guilds_prune_guild.go
new file mode 100644
index 00000000..3a7bfb6d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_prune_guild.go
@@ -0,0 +1,80 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsPruneGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyComputePruneCount bool
+	var bodyDays int
+	var bodyIncludeRoles string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "guild <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Guild",
+		Example: "  discord-cli guilds prune guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/prune"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyComputePruneCount != false {
+					body["compute_prune_count"] = bodyComputePruneCount
+				}
+				if bodyDays != 0 {
+					body["days"] = bodyDays
+				}
+				if bodyIncludeRoles != "" {
+					body["include_roles"] = bodyIncludeRoles
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&bodyComputePruneCount, "compute-prune-count", false, "Compute prune count")
+	cmd.Flags().IntVar(&bodyDays, "days", 0, "Days")
+	cmd.Flags().StringVar(&bodyIncludeRoles, "include-roles", "", "Include roles")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_prune_preview-guild.go b/discord-cli/internal/cli/guilds_prune_preview-guild.go
new file mode 100644
index 00000000..4f4de6a0
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_prune_preview-guild.go
@@ -0,0 +1,60 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsPrunePreviewGuildCmd(flags *rootFlags) *cobra.Command {
+	var flagDays int
+	var flagIncludeRoles string
+
+	cmd := &cobra.Command{
+		Use:   "preview-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Preview guild",
+		Example: "  discord-cli guilds prune preview-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/prune"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			if flagDays != 0 {
+				params["days"] = fmt.Sprintf("%v", flagDays)
+			}
+			if flagIncludeRoles != "" {
+				params["include_roles"] = fmt.Sprintf("%v", flagIncludeRoles)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&flagDays, "days", 0, "Days")
+	cmd.Flags().StringVar(&flagIncludeRoles, "include-roles", "", "Include roles")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_regions.go b/discord-cli/internal/cli/guilds_regions.go
new file mode 100644
index 00000000..8c7523f6
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_regions.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsRegionsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "regions",
+		Short: "Manage regions",
+	}
+
+	cmd.AddCommand(newGuildsRegionsListGuildVoiceCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_regions_list-guild-voice.go b/discord-cli/internal/cli/guilds_regions_list-guild-voice.go
new file mode 100644
index 00000000..bfd2c538
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_regions_list-guild-voice.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsRegionsListGuildVoiceCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-guild-voice <guild_id>",
+		Aliases: []string{"get"},
+		Short: "List guild voice",
+		Example: "  discord-cli guilds regions list-guild-voice abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/regions"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles.go b/discord-cli/internal/cli/guilds_roles.go
new file mode 100644
index 00000000..3bcc305d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles.go
@@ -0,0 +1,23 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsRolesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "roles",
+		Short: "Manage roles",
+	}
+
+	cmd.AddCommand(newGuildsRolesBulkUpdateGuildCmd(flags))
+	cmd.AddCommand(newGuildsRolesCreateGuildCmd(flags))
+	cmd.AddCommand(newGuildsRolesDeleteGuildCmd(flags))
+	cmd.AddCommand(newGuildsRolesGetGuildCmd(flags))
+	cmd.AddCommand(newGuildsRolesGuildMemberCountsCmd(flags))
+	cmd.AddCommand(newGuildsRolesListGuildCmd(flags))
+	cmd.AddCommand(newGuildsRolesUpdateGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_bulk-update-guild.go b/discord-cli/internal/cli/guilds_roles_bulk-update-guild.go
new file mode 100644
index 00000000..f02ef0e2
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_bulk-update-guild.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsRolesBulkUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "bulk-update-guild <guild_id>",
+		Aliases: []string{"update"},
+		Short: "Bulk update guild",
+		Example: "  discord-cli guilds roles bulk-update-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/roles"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_create-guild.go b/discord-cli/internal/cli/guilds_roles_create-guild.go
new file mode 100644
index 00000000..99544359
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_create-guild.go
@@ -0,0 +1,105 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsRolesCreateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyColor int
+	var bodyColors string
+	var bodyHoist bool
+	var bodyIcon string
+	var bodyMentionable bool
+	var bodyName string
+	var bodyPermissions int
+	var bodyUnicodeEmoji string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-guild <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Create guild",
+		Example: "  discord-cli guilds roles create-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/roles"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyColor != 0 {
+					body["color"] = bodyColor
+				}
+				if bodyColors != "" {
+					body["colors"] = bodyColors
+				}
+				if bodyHoist != false {
+					body["hoist"] = bodyHoist
+				}
+				if bodyIcon != "" {
+					body["icon"] = bodyIcon
+				}
+				if bodyMentionable != false {
+					body["mentionable"] = bodyMentionable
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodyPermissions != 0 {
+					body["permissions"] = bodyPermissions
+				}
+				if bodyUnicodeEmoji != "" {
+					body["unicode_emoji"] = bodyUnicodeEmoji
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyColor, "color", 0, "Color")
+	cmd.Flags().StringVar(&bodyColors, "colors", "", "Colors")
+	cmd.Flags().BoolVar(&bodyHoist, "hoist", false, "Hoist")
+	cmd.Flags().StringVar(&bodyIcon, "icon", "", "Icon")
+	cmd.Flags().BoolVar(&bodyMentionable, "mentionable", false, "Mentionable")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().IntVar(&bodyPermissions, "permissions", 0, "Permissions")
+	cmd.Flags().StringVar(&bodyUnicodeEmoji, "unicode-emoji", "", "Unicode emoji")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_delete-guild.go b/discord-cli/internal/cli/guilds_roles_delete-guild.go
new file mode 100644
index 00000000..ec7c6d48
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsRolesDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-guild <guild_id> <role_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete guild",
+		Example: "  discord-cli guilds roles delete-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/roles/{role_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("role_id is required"))
+			}
+			path = replacePathParam(path, "role_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_get-guild.go b/discord-cli/internal/cli/guilds_roles_get-guild.go
new file mode 100644
index 00000000..2e861e53
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsRolesGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id> <role_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds roles get-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/roles/{role_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("role_id is required"))
+			}
+			path = replacePathParam(path, "role_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_guild-member-counts.go b/discord-cli/internal/cli/guilds_roles_guild-member-counts.go
new file mode 100644
index 00000000..f29efc96
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_guild-member-counts.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsRolesGuildMemberCountsCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "guild-member-counts <guild_id>",
+		Short: "Guild member counts",
+		Example: "  discord-cli guilds roles guild-member-counts abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/roles/member-counts"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_list-guild.go b/discord-cli/internal/cli/guilds_roles_list-guild.go
new file mode 100644
index 00000000..bf85742c
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_list-guild.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsRolesListGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Short: "List guild",
+		Example: "  discord-cli guilds roles list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/roles"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_roles_update-guild.go b/discord-cli/internal/cli/guilds_roles_update-guild.go
new file mode 100644
index 00000000..bb5cf611
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_roles_update-guild.go
@@ -0,0 +1,108 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsRolesUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyColor int
+	var bodyColors string
+	var bodyHoist bool
+	var bodyIcon string
+	var bodyMentionable bool
+	var bodyName string
+	var bodyPermissions int
+	var bodyUnicodeEmoji string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-guild <guild_id> <role_id>",
+		Short: "Update guild",
+		Example: "  discord-cli guilds roles update-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/roles/{role_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("role_id is required"))
+			}
+			path = replacePathParam(path, "role_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyColor != 0 {
+					body["color"] = bodyColor
+				}
+				if bodyColors != "" {
+					body["colors"] = bodyColors
+				}
+				if bodyHoist != false {
+					body["hoist"] = bodyHoist
+				}
+				if bodyIcon != "" {
+					body["icon"] = bodyIcon
+				}
+				if bodyMentionable != false {
+					body["mentionable"] = bodyMentionable
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodyPermissions != 0 {
+					body["permissions"] = bodyPermissions
+				}
+				if bodyUnicodeEmoji != "" {
+					body["unicode_emoji"] = bodyUnicodeEmoji
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyColor, "color", 0, "Color")
+	cmd.Flags().StringVar(&bodyColors, "colors", "", "Colors")
+	cmd.Flags().BoolVar(&bodyHoist, "hoist", false, "Hoist")
+	cmd.Flags().StringVar(&bodyIcon, "icon", "", "Icon")
+	cmd.Flags().BoolVar(&bodyMentionable, "mentionable", false, "Mentionable")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().IntVar(&bodyPermissions, "permissions", 0, "Permissions")
+	cmd.Flags().StringVar(&bodyUnicodeEmoji, "unicode-emoji", "", "Unicode emoji")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events.go b/discord-cli/internal/cli/guilds_scheduled-events.go
new file mode 100644
index 00000000..fc4102e2
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events.go
@@ -0,0 +1,22 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsScheduledEventsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "scheduled-events",
+		Short: "Manage scheduled events",
+	}
+
+	cmd.AddCommand(newGuildsScheduledEventsCreateGuildCmd(flags))
+	cmd.AddCommand(newGuildsScheduledEventsDeleteGuildCmd(flags))
+	cmd.AddCommand(newGuildsScheduledEventsGetGuildCmd(flags))
+	cmd.AddCommand(newGuildsScheduledEventsListGuildCmd(flags))
+	cmd.AddCommand(newGuildsScheduledEventsListGuildUsersCmd(flags))
+	cmd.AddCommand(newGuildsScheduledEventsUpdateGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_create-guild.go b/discord-cli/internal/cli/guilds_scheduled-events_create-guild.go
new file mode 100644
index 00000000..606a413b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_create-guild.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsScheduledEventsCreateGuildCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-guild <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Create guild",
+		Example: "  discord-cli guilds scheduled-events create-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/scheduled-events"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_delete-guild.go b/discord-cli/internal/cli/guilds_scheduled-events_delete-guild.go
new file mode 100644
index 00000000..a22a6600
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsScheduledEventsDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-guild <guild_id> <guild_scheduled_event_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete guild",
+		Example: "  discord-cli guilds scheduled-events delete-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/scheduled-events/{guild_scheduled_event_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_scheduled_event_id is required"))
+			}
+			path = replacePathParam(path, "guild_scheduled_event_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_get-guild.go b/discord-cli/internal/cli/guilds_scheduled-events_get-guild.go
new file mode 100644
index 00000000..204d17f4
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_get-guild.go
@@ -0,0 +1,59 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsScheduledEventsGetGuildCmd(flags *rootFlags) *cobra.Command {
+	var flagWithUserCount bool
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id> <guild_scheduled_event_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds scheduled-events get-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/scheduled-events/{guild_scheduled_event_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_scheduled_event_id is required"))
+			}
+			path = replacePathParam(path, "guild_scheduled_event_id", args[1])
+			params := map[string]string{}
+			if flagWithUserCount != false {
+				params["with_user_count"] = fmt.Sprintf("%v", flagWithUserCount)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWithUserCount, "with-user-count", false, "With user count")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_list-guild-users.go b/discord-cli/internal/cli/guilds_scheduled-events_list-guild-users.go
new file mode 100644
index 00000000..e720b390
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_list-guild-users.go
@@ -0,0 +1,67 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsScheduledEventsListGuildUsersCmd(flags *rootFlags) *cobra.Command {
+	var flagWithMember bool
+	var flagLimit int
+	var flagBefore string
+	var flagAfter string
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list-guild-users <guild_id> <guild_scheduled_event_id>",
+		Short: "List guild users",
+		Example: "  discord-cli guilds scheduled-events list-guild-users abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/scheduled-events/{guild_scheduled_event_id}/users"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_scheduled_event_id is required"))
+			}
+			path = replacePathParam(path, "guild_scheduled_event_id", args[1])
+			data, err := paginatedGet(c, path, map[string]string{
+				"with_member": fmt.Sprintf("%v", flagWithMember),
+				"limit": fmt.Sprintf("%v", flagLimit),
+				"before": fmt.Sprintf("%v", flagBefore),
+				"after": fmt.Sprintf("%v", flagAfter),
+			}, flagAll, "after", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWithMember, "with-member", false, "With member")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+	cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_list-guild.go b/discord-cli/internal/cli/guilds_scheduled-events_list-guild.go
new file mode 100644
index 00000000..e5a74056
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_list-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsScheduledEventsListGuildCmd(flags *rootFlags) *cobra.Command {
+	var flagWithUserCount bool
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Short: "List guild",
+		Example: "  discord-cli guilds scheduled-events list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/scheduled-events"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			if flagWithUserCount != false {
+				params["with_user_count"] = fmt.Sprintf("%v", flagWithUserCount)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWithUserCount, "with-user-count", false, "With user count")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_scheduled-events_update-guild.go b/discord-cli/internal/cli/guilds_scheduled-events_update-guild.go
new file mode 100644
index 00000000..8d9c75e3
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_scheduled-events_update-guild.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsScheduledEventsUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-guild <guild_id> <guild_scheduled_event_id>",
+		Aliases: []string{"update"},
+		Short: "Update guild",
+		Example: "  discord-cli guilds scheduled-events update-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/scheduled-events/{guild_scheduled_event_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("guild_scheduled_event_id is required"))
+			}
+			path = replacePathParam(path, "guild_scheduled_event_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds.go b/discord-cli/internal/cli/guilds_soundboard-sounds.go
new file mode 100644
index 00000000..48af04ce
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsSoundboardSoundsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "soundboard-sounds",
+		Short: "Manage soundboard sounds",
+	}
+
+	cmd.AddCommand(newGuildsSoundboardSoundsCreateGuildCmd(flags))
+	cmd.AddCommand(newGuildsSoundboardSoundsDeleteGuildCmd(flags))
+	cmd.AddCommand(newGuildsSoundboardSoundsGetGuildCmd(flags))
+	cmd.AddCommand(newGuildsSoundboardSoundsListGuildCmd(flags))
+	cmd.AddCommand(newGuildsSoundboardSoundsUpdateGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds_create-guild.go b/discord-cli/internal/cli/guilds_soundboard-sounds_create-guild.go
new file mode 100644
index 00000000..50a79207
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds_create-guild.go
@@ -0,0 +1,92 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsSoundboardSoundsCreateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyEmojiId string
+	var bodyEmojiName string
+	var bodyName string
+	var bodySound string
+	var bodyVolume float64
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-guild <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Create guild",
+		Example: "  discord-cli guilds soundboard-sounds create-guild abc123 --name my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/soundboard-sounds"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyEmojiId != "" {
+					body["emoji_id"] = bodyEmojiId
+				}
+				if bodyEmojiName != "" {
+					body["emoji_name"] = bodyEmojiName
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodySound != "" {
+					body["sound"] = bodySound
+				}
+				if bodyVolume != 0.0 {
+					body["volume"] = bodyVolume
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyEmojiId, "emoji-id", "", "Emoji id")
+	cmd.Flags().StringVar(&bodyEmojiName, "emoji-name", "", "Emoji name")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	_ = cmd.MarkFlagRequired("name")
+	cmd.Flags().StringVar(&bodySound, "sound", "", "Sound")
+	_ = cmd.MarkFlagRequired("sound")
+	cmd.Flags().Float64Var(&bodyVolume, "volume", 0.0, "Volume")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds_delete-guild.go b/discord-cli/internal/cli/guilds_soundboard-sounds_delete-guild.go
new file mode 100644
index 00000000..9b76f8d9
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsSoundboardSoundsDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-guild <guild_id> <sound_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete guild",
+		Example: "  discord-cli guilds soundboard-sounds delete-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/soundboard-sounds/{sound_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("sound_id is required"))
+			}
+			path = replacePathParam(path, "sound_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds_get-guild.go b/discord-cli/internal/cli/guilds_soundboard-sounds_get-guild.go
new file mode 100644
index 00000000..f1c5ae52
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsSoundboardSoundsGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id> <sound_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds soundboard-sounds get-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/soundboard-sounds/{sound_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("sound_id is required"))
+			}
+			path = replacePathParam(path, "sound_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds_list-guild.go b/discord-cli/internal/cli/guilds_soundboard-sounds_list-guild.go
new file mode 100644
index 00000000..48965df2
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds_list-guild.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsSoundboardSoundsListGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Short: "List guild",
+		Example: "  discord-cli guilds soundboard-sounds list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/soundboard-sounds"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_soundboard-sounds_update-guild.go b/discord-cli/internal/cli/guilds_soundboard-sounds_update-guild.go
new file mode 100644
index 00000000..2fe1907a
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_soundboard-sounds_update-guild.go
@@ -0,0 +1,89 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsSoundboardSoundsUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyEmojiId string
+	var bodyEmojiName string
+	var bodyName string
+	var bodyVolume float64
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-guild <guild_id> <sound_id>",
+		Aliases: []string{"update"},
+		Short: "Update guild",
+		Example: "  discord-cli guilds soundboard-sounds update-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/soundboard-sounds/{sound_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("sound_id is required"))
+			}
+			path = replacePathParam(path, "sound_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyEmojiId != "" {
+					body["emoji_id"] = bodyEmojiId
+				}
+				if bodyEmojiName != "" {
+					body["emoji_name"] = bodyEmojiName
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodyVolume != 0.0 {
+					body["volume"] = bodyVolume
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyEmojiId, "emoji-id", "", "Emoji id")
+	cmd.Flags().StringVar(&bodyEmojiName, "emoji-name", "", "Emoji name")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().Float64Var(&bodyVolume, "volume", 0.0, "Volume")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers.go b/discord-cli/internal/cli/guilds_stickers.go
new file mode 100644
index 00000000..8f26a43b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsStickersCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "stickers",
+		Short: "Manage stickers",
+	}
+
+	cmd.AddCommand(newGuildsStickersCreateGuildCmd(flags))
+	cmd.AddCommand(newGuildsStickersDeleteGuildCmd(flags))
+	cmd.AddCommand(newGuildsStickersGetGuildCmd(flags))
+	cmd.AddCommand(newGuildsStickersListGuildCmd(flags))
+	cmd.AddCommand(newGuildsStickersUpdateGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers_create-guild.go b/discord-cli/internal/cli/guilds_stickers_create-guild.go
new file mode 100644
index 00000000..9690f973
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers_create-guild.go
@@ -0,0 +1,88 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsStickersCreateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyDescription string
+	var bodyFile string
+	var bodyName string
+	var bodyTags string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-guild <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Create guild",
+		Example: "  discord-cli guilds stickers create-guild abc123 --file value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/stickers"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDescription != "" {
+					body["description"] = bodyDescription
+				}
+				if bodyFile != "" {
+					body["file"] = bodyFile
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodyTags != "" {
+					body["tags"] = bodyTags
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+	cmd.Flags().StringVar(&bodyFile, "file", "", "File")
+	_ = cmd.MarkFlagRequired("file")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	_ = cmd.MarkFlagRequired("name")
+	cmd.Flags().StringVar(&bodyTags, "tags", "", "Tags")
+	_ = cmd.MarkFlagRequired("tags")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers_delete-guild.go b/discord-cli/internal/cli/guilds_stickers_delete-guild.go
new file mode 100644
index 00000000..3db84fa0
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsStickersDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-guild <guild_id> <sticker_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete guild",
+		Example: "  discord-cli guilds stickers delete-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/stickers/{sticker_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("sticker_id is required"))
+			}
+			path = replacePathParam(path, "sticker_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers_get-guild.go b/discord-cli/internal/cli/guilds_stickers_get-guild.go
new file mode 100644
index 00000000..31b69063
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers_get-guild.go
@@ -0,0 +1,54 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsStickersGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id> <sticker_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds stickers get-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/stickers/{sticker_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("sticker_id is required"))
+			}
+			path = replacePathParam(path, "sticker_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers_list-guild.go b/discord-cli/internal/cli/guilds_stickers_list-guild.go
new file mode 100644
index 00000000..e1230c65
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers_list-guild.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsStickersListGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Short: "List guild",
+		Example: "  discord-cli guilds stickers list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/stickers"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_stickers_update-guild.go b/discord-cli/internal/cli/guilds_stickers_update-guild.go
new file mode 100644
index 00000000..2eead623
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_stickers_update-guild.go
@@ -0,0 +1,84 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsStickersUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyDescription string
+	var bodyName string
+	var bodyTags string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-guild <guild_id> <sticker_id>",
+		Aliases: []string{"update"},
+		Short: "Update guild",
+		Example: "  discord-cli guilds stickers update-guild abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/stickers/{sticker_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("sticker_id is required"))
+			}
+			path = replacePathParam(path, "sticker_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDescription != "" {
+					body["description"] = bodyDescription
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodyTags != "" {
+					body["tags"] = bodyTags
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().StringVar(&bodyTags, "tags", "", "Tags")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates.go b/discord-cli/internal/cli/guilds_templates.go
new file mode 100644
index 00000000..754b9c38
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsTemplatesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "templates",
+		Short: "Manage templates",
+	}
+
+	cmd.AddCommand(newGuildsTemplatesCreateGuildCmd(flags))
+	cmd.AddCommand(newGuildsTemplatesDeleteGuildCmd(flags))
+	cmd.AddCommand(newGuildsTemplatesListGuildCmd(flags))
+	cmd.AddCommand(newGuildsTemplatesSyncGuildCmd(flags))
+	cmd.AddCommand(newGuildsTemplatesUpdateGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates_create-guild.go b/discord-cli/internal/cli/guilds_templates_create-guild.go
new file mode 100644
index 00000000..4479ac89
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates_create-guild.go
@@ -0,0 +1,76 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsTemplatesCreateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyDescription string
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-guild <guild_id>",
+		Aliases: []string{"create"},
+		Short: "Create guild",
+		Example: "  discord-cli guilds templates create-guild abc123 --name my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/templates"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDescription != "" {
+					body["description"] = bodyDescription
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	_ = cmd.MarkFlagRequired("name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates_delete-guild.go b/discord-cli/internal/cli/guilds_templates_delete-guild.go
new file mode 100644
index 00000000..17367ee7
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates_delete-guild.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsTemplatesDeleteGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-guild <guild_id> <code>",
+		Aliases: []string{"delete"},
+		Short: "Delete guild",
+		Example: "  discord-cli guilds templates delete-guild abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/templates/{code}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("code is required"))
+			}
+			path = replacePathParam(path, "code", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates_list-guild.go b/discord-cli/internal/cli/guilds_templates_list-guild.go
new file mode 100644
index 00000000..37e725c4
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates_list-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsTemplatesListGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "List guild",
+		Example: "  discord-cli guilds templates list-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/templates"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates_sync-guild.go b/discord-cli/internal/cli/guilds_templates_sync-guild.go
new file mode 100644
index 00000000..a77b7973
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates_sync-guild.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsTemplatesSyncGuildCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "sync-guild <guild_id> <code>",
+		Aliases: []string{"update"},
+		Short: "Sync guild",
+		Example: "  discord-cli guilds templates sync-guild abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/templates/{code}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("code is required"))
+			}
+			path = replacePathParam(path, "code", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_templates_update-guild.go b/discord-cli/internal/cli/guilds_templates_update-guild.go
new file mode 100644
index 00000000..b97606c4
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_templates_update-guild.go
@@ -0,0 +1,78 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsTemplatesUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyDescription string
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-guild <guild_id> <code>",
+		Short: "Update guild",
+		Example: "  discord-cli guilds templates update-guild abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/templates/{code}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("code is required"))
+			}
+			path = replacePathParam(path, "code", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDescription != "" {
+					body["description"] = bodyDescription
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_threads.go b/discord-cli/internal/cli/guilds_threads.go
new file mode 100644
index 00000000..2c6c9fc3
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_threads.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsThreadsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "threads",
+		Short: "Manage threads",
+	}
+
+	cmd.AddCommand(newGuildsThreadsGetActiveGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_threads_get-active-guild.go b/discord-cli/internal/cli/guilds_threads_get-active-guild.go
new file mode 100644
index 00000000..54c17684
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_threads_get-active-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsThreadsGetActiveGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-active-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Get active guild",
+		Example: "  discord-cli guilds threads get-active-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/threads/active"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_update.go b/discord-cli/internal/cli/guilds_update.go
new file mode 100644
index 00000000..7a415538
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_update.go
@@ -0,0 +1,164 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsUpdateCmd(flags *rootFlags) *cobra.Command {
+	var bodyAfkChannelId string
+	var bodyAfkTimeout string
+	var bodyBanner string
+	var bodyDefaultMessageNotifications string
+	var bodyDescription string
+	var bodyDiscoverySplash string
+	var bodyExplicitContentFilter string
+	var bodyHomeHeader string
+	var bodyIcon string
+	var bodyName string
+	var bodyPreferredLocale string
+	var bodyPremiumProgressBarEnabled bool
+	var bodyPublicUpdatesChannelId string
+	var bodyRegion string
+	var bodyRulesChannelId string
+	var bodySafetyAlertsChannelId string
+	var bodySplash string
+	var bodySystemChannelFlags int
+	var bodySystemChannelId string
+	var bodyVerificationLevel string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update <guild_id>",
+		Short: "Update",
+		Example: "  discord-cli guilds update abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAfkChannelId != "" {
+					body["afk_channel_id"] = bodyAfkChannelId
+				}
+				if bodyAfkTimeout != "" {
+					body["afk_timeout"] = bodyAfkTimeout
+				}
+				if bodyBanner != "" {
+					body["banner"] = bodyBanner
+				}
+				if bodyDefaultMessageNotifications != "" {
+					body["default_message_notifications"] = bodyDefaultMessageNotifications
+				}
+				if bodyDescription != "" {
+					body["description"] = bodyDescription
+				}
+				if bodyDiscoverySplash != "" {
+					body["discovery_splash"] = bodyDiscoverySplash
+				}
+				if bodyExplicitContentFilter != "" {
+					body["explicit_content_filter"] = bodyExplicitContentFilter
+				}
+				if bodyHomeHeader != "" {
+					body["home_header"] = bodyHomeHeader
+				}
+				if bodyIcon != "" {
+					body["icon"] = bodyIcon
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+				if bodyPreferredLocale != "" {
+					body["preferred_locale"] = bodyPreferredLocale
+				}
+				if bodyPremiumProgressBarEnabled != false {
+					body["premium_progress_bar_enabled"] = bodyPremiumProgressBarEnabled
+				}
+				if bodyPublicUpdatesChannelId != "" {
+					body["public_updates_channel_id"] = bodyPublicUpdatesChannelId
+				}
+				if bodyRegion != "" {
+					body["region"] = bodyRegion
+				}
+				if bodyRulesChannelId != "" {
+					body["rules_channel_id"] = bodyRulesChannelId
+				}
+				if bodySafetyAlertsChannelId != "" {
+					body["safety_alerts_channel_id"] = bodySafetyAlertsChannelId
+				}
+				if bodySplash != "" {
+					body["splash"] = bodySplash
+				}
+				if bodySystemChannelFlags != 0 {
+					body["system_channel_flags"] = bodySystemChannelFlags
+				}
+				if bodySystemChannelId != "" {
+					body["system_channel_id"] = bodySystemChannelId
+				}
+				if bodyVerificationLevel != "" {
+					body["verification_level"] = bodyVerificationLevel
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAfkChannelId, "afk-channel-id", "", "Afk channel id")
+	cmd.Flags().StringVar(&bodyAfkTimeout, "afk-timeout", "", "Afk timeout")
+	cmd.Flags().StringVar(&bodyBanner, "banner", "", "Banner")
+	cmd.Flags().StringVar(&bodyDefaultMessageNotifications, "default-message-notifications", "", "Default message notifications")
+	cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+	cmd.Flags().StringVar(&bodyDiscoverySplash, "discovery-splash", "", "Discovery splash")
+	cmd.Flags().StringVar(&bodyExplicitContentFilter, "explicit-content-filter", "", "Explicit content filter")
+	cmd.Flags().StringVar(&bodyHomeHeader, "home-header", "", "Home header")
+	cmd.Flags().StringVar(&bodyIcon, "icon", "", "Icon")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().StringVar(&bodyPreferredLocale, "preferred-locale", "", "Preferred locale")
+	cmd.Flags().BoolVar(&bodyPremiumProgressBarEnabled, "premium-progress-bar-enabled", false, "Premium progress bar enabled")
+	cmd.Flags().StringVar(&bodyPublicUpdatesChannelId, "public-updates-channel-id", "", "Public updates channel id")
+	cmd.Flags().StringVar(&bodyRegion, "region", "", "Region")
+	cmd.Flags().StringVar(&bodyRulesChannelId, "rules-channel-id", "", "Rules channel id")
+	cmd.Flags().StringVar(&bodySafetyAlertsChannelId, "safety-alerts-channel-id", "", "Safety alerts channel id")
+	cmd.Flags().StringVar(&bodySplash, "splash", "", "Splash")
+	cmd.Flags().IntVar(&bodySystemChannelFlags, "system-channel-flags", 0, "System channel flags")
+	cmd.Flags().StringVar(&bodySystemChannelId, "system-channel-id", "", "System channel id")
+	cmd.Flags().StringVar(&bodyVerificationLevel, "verification-level", "", "Verification level")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_vanity-url.go b/discord-cli/internal/cli/guilds_vanity-url.go
new file mode 100644
index 00000000..6664ec1b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_vanity-url.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsVanityUrlCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "vanity-url",
+		Short: "Manage vanity url",
+	}
+
+	cmd.AddCommand(newGuildsVanityUrlGetGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_vanity-url_get-guild.go b/discord-cli/internal/cli/guilds_vanity-url_get-guild.go
new file mode 100644
index 00000000..1753185e
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_vanity-url_get-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsVanityUrlGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds vanity-url get-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/vanity-url"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_voice-states.go b/discord-cli/internal/cli/guilds_voice-states.go
new file mode 100644
index 00000000..99312520
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_voice-states.go
@@ -0,0 +1,20 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsVoiceStatesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "voice-states",
+		Short: "Manage voice states",
+	}
+
+	cmd.AddCommand(newGuildsVoiceStatesGetCmd(flags))
+	cmd.AddCommand(newGuildsVoiceStatesGetSelfCmd(flags))
+	cmd.AddCommand(newGuildsVoiceStatesUpdateCmd(flags))
+	cmd.AddCommand(newGuildsVoiceStatesUpdateSelfCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_voice-states_get-self.go b/discord-cli/internal/cli/guilds_voice-states_get-self.go
new file mode 100644
index 00000000..a28b336b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_voice-states_get-self.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsVoiceStatesGetSelfCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-self <guild_id>",
+		Short: "Get self",
+		Example: "  discord-cli guilds voice-states get-self abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/voice-states/@me"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_voice-states_get.go b/discord-cli/internal/cli/guilds_voice-states_get.go
new file mode 100644
index 00000000..e67e1266
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_voice-states_get.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsVoiceStatesGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get <guild_id> <user_id>",
+		Short: "Get",
+		Example: "  discord-cli guilds voice-states get abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/voice-states/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_voice-states_update-self.go b/discord-cli/internal/cli/guilds_voice-states_update-self.go
new file mode 100644
index 00000000..1c0ab864
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_voice-states_update-self.go
@@ -0,0 +1,79 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsVoiceStatesUpdateSelfCmd(flags *rootFlags) *cobra.Command {
+	var bodyChannelId string
+	var bodyRequestToSpeakTimestamp string
+	var bodySuppress bool
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-self <guild_id>",
+		Short: "Update self",
+		Example: "  discord-cli guilds voice-states update-self abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/voice-states/@me"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyChannelId != "" {
+					body["channel_id"] = bodyChannelId
+				}
+				if bodyRequestToSpeakTimestamp != "" {
+					body["request_to_speak_timestamp"] = bodyRequestToSpeakTimestamp
+				}
+				if bodySuppress != false {
+					body["suppress"] = bodySuppress
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+	cmd.Flags().StringVar(&bodyRequestToSpeakTimestamp, "request-to-speak-timestamp", "", "Request to speak timestamp")
+	cmd.Flags().BoolVar(&bodySuppress, "suppress", false, "Suppress")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_voice-states_update.go b/discord-cli/internal/cli/guilds_voice-states_update.go
new file mode 100644
index 00000000..b80ac9f3
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_voice-states_update.go
@@ -0,0 +1,78 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsVoiceStatesUpdateCmd(flags *rootFlags) *cobra.Command {
+	var bodyChannelId string
+	var bodySuppress bool
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update <guild_id> <user_id>",
+		Short: "Update",
+		Example: "  discord-cli guilds voice-states update abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/voice-states/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyChannelId != "" {
+					body["channel_id"] = bodyChannelId
+				}
+				if bodySuppress != false {
+					body["suppress"] = bodySuppress
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+	cmd.Flags().BoolVar(&bodySuppress, "suppress", false, "Suppress")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_webhooks.go b/discord-cli/internal/cli/guilds_webhooks.go
new file mode 100644
index 00000000..8605ff24
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_webhooks.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsWebhooksCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "webhooks",
+		Short: "Manage webhooks",
+	}
+
+	cmd.AddCommand(newGuildsWebhooksGetGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_webhooks_get-guild.go b/discord-cli/internal/cli/guilds_webhooks_get-guild.go
new file mode 100644
index 00000000..98304a3c
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_webhooks_get-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsWebhooksGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds webhooks get-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/webhooks"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_welcome-screen.go b/discord-cli/internal/cli/guilds_welcome-screen.go
new file mode 100644
index 00000000..5331b76d
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_welcome-screen.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsWelcomeScreenCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "welcome-screen",
+		Short: "Manage welcome screen",
+	}
+
+	cmd.AddCommand(newGuildsWelcomeScreenGetGuildCmd(flags))
+	cmd.AddCommand(newGuildsWelcomeScreenUpdateGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_welcome-screen_get-guild.go b/discord-cli/internal/cli/guilds_welcome-screen_get-guild.go
new file mode 100644
index 00000000..f1b9da48
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_welcome-screen_get-guild.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsWelcomeScreenGetGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds welcome-screen get-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/welcome-screen"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_welcome-screen_update-guild.go b/discord-cli/internal/cli/guilds_welcome-screen_update-guild.go
new file mode 100644
index 00000000..2c11391e
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_welcome-screen_update-guild.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsWelcomeScreenUpdateGuildCmd(flags *rootFlags) *cobra.Command {
+	var bodyDescription string
+	var bodyEnabled bool
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-guild <guild_id>",
+		Aliases: []string{"update"},
+		Short: "Update guild",
+		Example: "  discord-cli guilds welcome-screen update-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/welcome-screen"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyDescription != "" {
+					body["description"] = bodyDescription
+				}
+				if bodyEnabled != false {
+					body["enabled"] = bodyEnabled
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyDescription, "description", "", "Description")
+	cmd.Flags().BoolVar(&bodyEnabled, "enabled", false, "Enabled")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget-json.go b/discord-cli/internal/cli/guilds_widget-json.go
new file mode 100644
index 00000000..4c169a3b
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget-json.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsWidgetJsonCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "widget-json",
+		Short: "Manage widget json",
+	}
+
+	cmd.AddCommand(newGuildsWidgetJsonGetGuildWidgetCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget-json_get-guild-widget.go b/discord-cli/internal/cli/guilds_widget-json_get-guild-widget.go
new file mode 100644
index 00000000..d3c66cb2
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget-json_get-guild-widget.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsWidgetJsonGetGuildWidgetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild-widget <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild widget",
+		Example: "  discord-cli guilds widget-json get-guild-widget abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/widget.json"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget-png.go b/discord-cli/internal/cli/guilds_widget-png.go
new file mode 100644
index 00000000..66bcb460
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget-png.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsWidgetPngCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "widget-png",
+		Short: "Manage widget png",
+	}
+
+	cmd.AddCommand(newGuildsWidgetPngGetGuildCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget-png_get-guild.go b/discord-cli/internal/cli/guilds_widget-png_get-guild.go
new file mode 100644
index 00000000..6ab1f0d0
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget-png_get-guild.go
@@ -0,0 +1,55 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsWidgetPngGetGuildCmd(flags *rootFlags) *cobra.Command {
+	var flagStyle string
+
+	cmd := &cobra.Command{
+		Use:   "get-guild <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild",
+		Example: "  discord-cli guilds widget-png get-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/widget.png"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			if flagStyle != "" {
+				params["style"] = fmt.Sprintf("%v", flagStyle)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagStyle, "style", "", "Style")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget.go b/discord-cli/internal/cli/guilds_widget.go
new file mode 100644
index 00000000..5f5a5eb9
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newGuildsWidgetCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "widget",
+		Short: "Manage widget",
+	}
+
+	cmd.AddCommand(newGuildsWidgetGetGuildSettingsCmd(flags))
+	cmd.AddCommand(newGuildsWidgetUpdateGuildSettingsCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget_get-guild-settings.go b/discord-cli/internal/cli/guilds_widget_get-guild-settings.go
new file mode 100644
index 00000000..de90c420
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget_get-guild-settings.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsWidgetGetGuildSettingsCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-guild-settings <guild_id>",
+		Aliases: []string{"get"},
+		Short: "Get guild settings",
+		Example: "  discord-cli guilds widget get-guild-settings abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/widget"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/guilds_widget_update-guild-settings.go b/discord-cli/internal/cli/guilds_widget_update-guild-settings.go
new file mode 100644
index 00000000..081f7816
--- /dev/null
+++ b/discord-cli/internal/cli/guilds_widget_update-guild-settings.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newGuildsWidgetUpdateGuildSettingsCmd(flags *rootFlags) *cobra.Command {
+	var bodyChannelId string
+	var bodyEnabled bool
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-guild-settings <guild_id>",
+		Aliases: []string{"update"},
+		Short: "Update guild settings",
+		Example: "  discord-cli guilds widget update-guild-settings abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/guilds/{guild_id}/widget"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyChannelId != "" {
+					body["channel_id"] = bodyChannelId
+				}
+				if bodyEnabled != false {
+					body["enabled"] = bodyEnabled
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+	cmd.Flags().BoolVar(&bodyEnabled, "enabled", false, "Enabled")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/helpers.go b/discord-cli/internal/cli/helpers.go
new file mode 100644
index 00000000..bce71523
--- /dev/null
+++ b/discord-cli/internal/cli/helpers.go
@@ -0,0 +1,385 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"os"
+	"sort"
+	"strings"
+	"text/tabwriter"
+
+	"github.com/mattn/go-isatty"
+)
+
+var As = errors.As
+
+// noColor is set by the --no-color flag
+var noColor bool
+
+// humanFriendly is set by the --human-friendly flag; colors are off by default (agent-safe)
+var humanFriendly bool
+
+func colorEnabled() bool {
+	if noColor {
+		return false
+	}
+	if !humanFriendly {
+		return false
+	}
+	if os.Getenv("NO_COLOR") != "" {
+		return false
+	}
+	if os.Getenv("TERM") == "dumb" {
+		return false
+	}
+	return isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd())
+}
+
+func bold(s string) string {
+	if !colorEnabled() {
+		return s
+	}
+	return "\033[1m" + s + "\033[0m"
+}
+
+func green(s string) string {
+	if !colorEnabled() {
+		return s
+	}
+	return "\033[32m" + s + "\033[0m"
+}
+
+func red(s string) string {
+	if !colorEnabled() {
+		return s
+	}
+	return "\033[31m" + s + "\033[0m"
+}
+
+func yellow(s string) string {
+	if !colorEnabled() {
+		return s
+	}
+	return "\033[33m" + s + "\033[0m"
+}
+
+type cliError struct {
+	code int
+	err  error
+}
+
+func (e *cliError) Error() string { return e.err.Error() }
+func (e *cliError) Unwrap() error { return e.err }
+
+func usageErr(err error) error    { return &cliError{code: 2, err: err} }
+func notFoundErr(err error) error { return &cliError{code: 3, err: err} }
+func authErr(err error) error     { return &cliError{code: 4, err: err} }
+func apiErr(err error) error      { return &cliError{code: 5, err: err} }
+func configErr(err error) error   { return &cliError{code: 10, err: err} }
+func rateLimitErr(err error) error { return &cliError{code: 7, err: err} }
+
+// classifyAPIError maps API errors to structured exit codes with actionable hints.
+func classifyAPIError(err error) error {
+	msg := err.Error()
+	switch {
+	case strings.Contains(msg, "HTTP 409"):
+		// 409 Conflict = resource already exists. For agents retrying creates, this is success.
+		fmt.Fprintln(os.Stderr, "already exists (no-op)")
+		return nil
+	case strings.Contains(msg, "HTTP 401") || strings.Contains(msg, "HTTP 403"):
+		return authErr(fmt.Errorf("%w\nhint: check your API credentials. Run 'discord-cli doctor' to verify auth, or set the required environment variable", err))
+	case strings.Contains(msg, "HTTP 404"):
+		return notFoundErr(fmt.Errorf("%w\nhint: resource not found. Run the 'list' command to see available items", err))
+	case strings.Contains(msg, "HTTP 429"):
+		return rateLimitErr(err)
+	default:
+		return apiErr(err)
+	}
+}
+
+// classifyDeleteError treats 404 as success for DELETE (already deleted = idempotent no-op).
+func classifyDeleteError(err error) error {
+	msg := err.Error()
+	if strings.Contains(msg, "HTTP 404") {
+		fmt.Fprintln(os.Stderr, "already deleted (no-op)")
+		return nil
+	}
+	return classifyAPIError(err)
+}
+
+func truncate(s string, max int) string {
+	if len(s) <= max {
+		return s
+	}
+	if max <= 3 {
+		return s[:max]
+	}
+	return s[:max-3] + "..."
+}
+
+func firstNonEmpty(items ...string) string {
+	for _, s := range items {
+		if s != "" {
+			return s
+		}
+	}
+	return ""
+}
+
+func newTabWriter(w io.Writer) *tabwriter.Writer {
+	return tabwriter.NewWriter(w, 2, 4, 2, ' ', 0)
+}
+
+func replacePathParam(path, name, value string) string {
+	return strings.ReplaceAll(path, "{"+name+"}", value)
+}
+
+// paginatedGet fetches pages and concatenates array results.
+func paginatedGet(c interface {
+	Get(path string, params map[string]string) (json.RawMessage, error)
+}, path string, params map[string]string, fetchAll bool, cursorParam, nextCursorPath, hasMoreField string) (json.RawMessage, error) {
+	// Clean zero-value params
+	clean := map[string]string{}
+	for k, v := range params {
+		if v != "" && v != "0" && v != "false" {
+			clean[k] = v
+		}
+	}
+
+	if !fetchAll {
+		return c.Get(path, clean)
+	}
+
+	// Fetch all pages
+	var allItems []json.RawMessage
+	page := 0
+	for {
+		page++
+		if humanFriendly {
+			fmt.Fprintf(os.Stderr, "fetching page %d...\n", page)
+		} else {
+			fmt.Fprintf(os.Stderr, `{"event":"page_fetch","page":%d}`+"\n", page)
+		}
+
+		data, err := c.Get(path, clean)
+		if err != nil {
+			return nil, err
+		}
+
+		// Try to extract items array
+		var items []json.RawMessage
+		if json.Unmarshal(data, &items) == nil {
+			allItems = append(allItems, items...)
+		} else {
+			// Response is an object - look for array inside
+			var obj map[string]json.RawMessage
+			if json.Unmarshal(data, &obj) == nil {
+				// Try common data fields
+				for _, field := range []string{"data", "items", "results", "messages", "members", "values"} {
+					if arr, ok := obj[field]; ok {
+						var nested []json.RawMessage
+						if json.Unmarshal(arr, &nested) == nil {
+							allItems = append(allItems, nested...)
+							break
+						}
+					}
+				}
+
+				// Check for next cursor
+				if nextCursorPath != "" {
+					if tokenRaw, ok := obj[nextCursorPath]; ok {
+						var token string
+						if json.Unmarshal(tokenRaw, &token) == nil && token != "" {
+							clean[cursorParam] = token
+							continue
+						}
+					}
+				}
+
+				// Check has_more
+				if hasMoreField != "" {
+					if moreRaw, ok := obj[hasMoreField]; ok {
+						var more bool
+						if json.Unmarshal(moreRaw, &more) == nil && more {
+							continue
+						}
+					}
+				}
+			}
+			// No more pages
+			break
+		}
+
+		// For direct arrays, can't paginate without cursor
+		break
+	}
+
+	if humanFriendly {
+		fmt.Fprintf(os.Stderr, "fetched %d items across %d pages\n", len(allItems), page)
+	} else {
+		fmt.Fprintf(os.Stderr, `{"event":"complete","total":%d,"pages":%d}`+"\n", len(allItems), page)
+	}
+	result, _ := json.Marshal(allItems)
+	return json.RawMessage(result), nil
+}
+
+// selectFields is set from the --select flag; used by printOutputFiltered.
+var selectFieldsGlobal string
+
+// printOutputFiltered applies --select field filtering before rendering.
+func printOutputFiltered(w io.Writer, data json.RawMessage, asJSON bool, selectExpr string) error {
+	if selectExpr != "" {
+		data = filterFields(data, selectExpr)
+	}
+	return printOutput(w, data, asJSON)
+}
+
+// filterFields keeps only the specified comma-separated fields from JSON objects/arrays.
+func filterFields(data json.RawMessage, fields string) json.RawMessage {
+	wanted := map[string]bool{}
+	for _, f := range strings.Split(fields, ",") {
+		f = strings.TrimSpace(f)
+		if f != "" {
+			wanted[f] = true
+		}
+	}
+	if len(wanted) == 0 {
+		return data
+	}
+
+	// Try array of objects
+	var items []map[string]json.RawMessage
+	if json.Unmarshal(data, &items) == nil {
+		filtered := make([]map[string]json.RawMessage, len(items))
+		for i, item := range items {
+			m := map[string]json.RawMessage{}
+			for k, v := range item {
+				if wanted[k] {
+					m[k] = v
+				}
+			}
+			filtered[i] = m
+		}
+		out, _ := json.Marshal(filtered)
+		return out
+	}
+
+	// Try single object
+	var obj map[string]json.RawMessage
+	if json.Unmarshal(data, &obj) == nil {
+		m := map[string]json.RawMessage{}
+		for k, v := range obj {
+			if wanted[k] {
+				m[k] = v
+			}
+		}
+		out, _ := json.Marshal(m)
+		return out
+	}
+
+	return data
+}
+
+// printOutput auto-detects arrays and renders as tables, or prints raw JSON for objects.
+func printOutput(w io.Writer, data json.RawMessage, asJSON bool) error {
+	if asJSON {
+		enc := json.NewEncoder(w)
+		enc.SetIndent("", "  ")
+		return enc.Encode(data)
+	}
+
+	// Try to detect if response is an array
+	var items []map[string]any
+	if err := json.Unmarshal(data, &items); err == nil && len(items) > 0 {
+		return printAutoTable(w, items)
+	}
+
+	// Single object - pretty print
+	var obj map[string]any
+	if err := json.Unmarshal(data, &obj); err == nil {
+		enc := json.NewEncoder(w)
+		enc.SetIndent("", "  ")
+		return enc.Encode(obj)
+	}
+
+	// Fallback: print raw
+	fmt.Fprintln(w, string(data))
+	return nil
+}
+
+func printAutoTable(w io.Writer, items []map[string]any) error {
+	if len(items) == 0 {
+		return nil
+	}
+
+	// Collect headers from first item, prioritize common fields
+	priority := []string{"id", "name", "username", "title", "status", "type", "email", "description"}
+	headerSet := map[string]struct{}{}
+	for k := range items[0] {
+		headerSet[k] = struct{}{}
+	}
+
+	var headers []string
+	for _, p := range priority {
+		if _, ok := headerSet[p]; ok {
+			headers = append(headers, p)
+			delete(headerSet, p)
+		}
+	}
+	// Add remaining headers sorted
+	var rest []string
+	for k := range headerSet {
+		rest = append(rest, k)
+	}
+	sort.Strings(rest)
+	headers = append(headers, rest...)
+
+	// Limit to 6 columns max for readability
+	if len(headers) > 6 {
+		headers = headers[:6]
+	}
+
+	// Build rows
+	rows := make([][]string, 0, len(items))
+	for _, item := range items {
+		row := make([]string, len(headers))
+		for i, h := range headers {
+			v := item[h]
+			switch val := v.(type) {
+			case string:
+				row[i] = truncate(val, 40)
+			case float64:
+				if val == float64(int64(val)) {
+					row[i] = fmt.Sprintf("%d", int64(val))
+				} else {
+					row[i] = fmt.Sprintf("%g", val)
+				}
+			case bool:
+				row[i] = fmt.Sprintf("%t", val)
+			case nil:
+				row[i] = ""
+			default:
+				b, _ := json.Marshal(val)
+				row[i] = truncate(string(b), 40)
+			}
+		}
+		rows = append(rows, row)
+	}
+
+	// Print with tab alignment using tabwriter
+	tw := newTabWriter(w)
+	upperHeaders := make([]string, len(headers))
+	for i, h := range headers {
+		upperHeaders[i] = bold(strings.ToUpper(h))
+	}
+
+	fmt.Fprintln(tw, strings.Join(upperHeaders, "\t"))
+	for _, row := range rows {
+		fmt.Fprintln(tw, strings.Join(row, "\t"))
+	}
+	return tw.Flush()
+}
diff --git a/discord-cli/internal/cli/import.go b/discord-cli/internal/cli/import.go
new file mode 100644
index 00000000..ac378a84
--- /dev/null
+++ b/discord-cli/internal/cli/import.go
@@ -0,0 +1,100 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"bufio"
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+func newImportCmd(flags *rootFlags) *cobra.Command {
+	var inputFile string
+	var dryRun bool
+	var batchSize int
+
+	cmd := &cobra.Command{
+		Use:   "import <resource>",
+		Short: "Import data from JSONL file via API create/upsert calls",
+		Long: `Import data from a JSONL file by issuing POST requests for each record.
+Each line must be a valid JSON object. Failed records are logged to stderr
+but do not stop the import.`,
+		Example: `  # Import from a JSONL file
+  discord-cli import <resource> --input data.jsonl
+
+  # Dry-run to preview without sending
+  discord-cli import <resource> --input data.jsonl --dry-run
+
+  # Import from stdin
+  cat data.jsonl | discord-cli import <resource> --input -`,
+		Args: cobra.ExactArgs(1),
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+			c.DryRun = dryRun
+
+			resource := args[0]
+			path := "/" + resource
+
+			var reader io.Reader
+			if inputFile == "-" || inputFile == "" {
+				reader = os.Stdin
+			} else {
+				f, err := os.Open(inputFile)
+				if err != nil {
+					return fmt.Errorf("opening input file: %w", err)
+				}
+				defer f.Close()
+				reader = f
+			}
+
+			scanner := bufio.NewScanner(reader)
+			scanner.Buffer(make([]byte, 1024*1024), 1024*1024) // 1MB line buffer
+
+			var success, failed, skipped int
+			for scanner.Scan() {
+				line := strings.TrimSpace(scanner.Text())
+				if line == "" || line[0] == '#' {
+					skipped++
+					continue
+				}
+
+				var body map[string]any
+				if err := json.Unmarshal([]byte(line), &body); err != nil {
+					fmt.Fprintf(os.Stderr, "warning: skipping invalid JSON line: %v\n", err)
+					failed++
+					continue
+				}
+
+				_, err := c.Post(path, body)
+				if err != nil {
+					fmt.Fprintf(os.Stderr, "warning: failed to import record: %v\n", err)
+					failed++
+					continue
+				}
+				success++
+			}
+
+			if err := scanner.Err(); err != nil {
+				return fmt.Errorf("reading input: %w", err)
+			}
+
+			fmt.Fprintf(os.Stderr, "Import complete: %d succeeded, %d failed, %d skipped\n", success, failed, skipped)
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVarP(&inputFile, "input", "i", "", "Input JSONL file path (use - for stdin)")
+	_ = cmd.MarkFlagRequired("input")
+	cmd.Flags().BoolVar(&dryRun, "dry-run", false, "Preview import without sending requests")
+	cmd.Flags().IntVar(&batchSize, "batch-size", 1, "Records per batch (future: batch API support)")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/interactions.go b/discord-cli/internal/cli/interactions.go
new file mode 100644
index 00000000..88991180
--- /dev/null
+++ b/discord-cli/internal/cli/interactions.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newInteractionsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "interactions",
+		Short: "Manage interactions",
+	}
+
+	cmd.AddCommand(newInteractionsCallbackCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/interactions_callback.go b/discord-cli/internal/cli/interactions_callback.go
new file mode 100644
index 00000000..348e6923
--- /dev/null
+++ b/discord-cli/internal/cli/interactions_callback.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newInteractionsCallbackCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "callback",
+		Short: "Manage callback",
+	}
+
+	cmd.AddCommand(newInteractionsCallbackCreateInteractionResponseCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/interactions_callback_create-interaction-response.go b/discord-cli/internal/cli/interactions_callback_create-interaction-response.go
new file mode 100644
index 00000000..f0384eff
--- /dev/null
+++ b/discord-cli/internal/cli/interactions_callback_create-interaction-response.go
@@ -0,0 +1,71 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newInteractionsCallbackCreateInteractionResponseCmd(flags *rootFlags) *cobra.Command {
+	var flagWithResponse bool
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-interaction-response <interaction_id> <interaction_token>",
+		Aliases: []string{"create"},
+		Short: "Create interaction response",
+		Example: "  discord-cli interactions callback create-interaction-response abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/interactions/{interaction_id}/{interaction_token}/callback"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("interaction_id is required"))
+			}
+			path = replacePathParam(path, "interaction_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("interaction_token is required"))
+			}
+			path = replacePathParam(path, "interaction_token", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWithResponse, "with-response", false, "With response")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/invites.go b/discord-cli/internal/cli/invites.go
new file mode 100644
index 00000000..db2f64d5
--- /dev/null
+++ b/discord-cli/internal/cli/invites.go
@@ -0,0 +1,19 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newInvitesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "invites",
+		Short: "Manage invites",
+	}
+
+	cmd.AddCommand(newInvitesResolveCmd(flags))
+	cmd.AddCommand(newInvitesRevokeCmd(flags))
+	cmd.AddCommand(newInvitesTargetUsersCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/invites_resolve.go b/discord-cli/internal/cli/invites_resolve.go
new file mode 100644
index 00000000..04c78aad
--- /dev/null
+++ b/discord-cli/internal/cli/invites_resolve.go
@@ -0,0 +1,60 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newInvitesResolveCmd(flags *rootFlags) *cobra.Command {
+	var flagWithCounts bool
+	var flagGuildScheduledEventId string
+
+	cmd := &cobra.Command{
+		Use:   "resolve <code>",
+		Aliases: []string{"get"},
+		Short: "Resolve",
+		Example: "  discord-cli invites resolve value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/invites/{code}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("code is required"))
+			}
+			path = replacePathParam(path, "code", args[0])
+			params := map[string]string{}
+			if flagWithCounts != false {
+				params["with_counts"] = fmt.Sprintf("%v", flagWithCounts)
+			}
+			if flagGuildScheduledEventId != "" {
+				params["guild_scheduled_event_id"] = fmt.Sprintf("%v", flagGuildScheduledEventId)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWithCounts, "with-counts", false, "With counts")
+	cmd.Flags().StringVar(&flagGuildScheduledEventId, "guild-scheduled-event-id", "", "Guild scheduled event id")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/invites_revoke.go b/discord-cli/internal/cli/invites_revoke.go
new file mode 100644
index 00000000..b0437165
--- /dev/null
+++ b/discord-cli/internal/cli/invites_revoke.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newInvitesRevokeCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "revoke <code>",
+		Aliases: []string{"delete"},
+		Short: "Revoke",
+		Example: "  discord-cli invites revoke value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/invites/{code}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("code is required"))
+			}
+			path = replacePathParam(path, "code", args[0])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/invites_target-users.go b/discord-cli/internal/cli/invites_target-users.go
new file mode 100644
index 00000000..76ebc1dd
--- /dev/null
+++ b/discord-cli/internal/cli/invites_target-users.go
@@ -0,0 +1,19 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newInvitesTargetUsersCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "target-users",
+		Short: "Manage target users",
+	}
+
+	cmd.AddCommand(newInvitesTargetUsersGetInviteCmd(flags))
+	cmd.AddCommand(newInvitesTargetUsersGetInviteJobStatusCmd(flags))
+	cmd.AddCommand(newInvitesTargetUsersUpdateInviteCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/invites_target-users_get-invite-job-status.go b/discord-cli/internal/cli/invites_target-users_get-invite-job-status.go
new file mode 100644
index 00000000..8f4a2757
--- /dev/null
+++ b/discord-cli/internal/cli/invites_target-users_get-invite-job-status.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newInvitesTargetUsersGetInviteJobStatusCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-invite-job-status <code>",
+		Short: "Get the target users job status for an invite.",
+		Example: "  discord-cli invites target-users get-invite-job-status value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/invites/{code}/target-users/job-status"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("code is required"))
+			}
+			path = replacePathParam(path, "code", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/invites_target-users_get-invite.go b/discord-cli/internal/cli/invites_target-users_get-invite.go
new file mode 100644
index 00000000..4798676a
--- /dev/null
+++ b/discord-cli/internal/cli/invites_target-users_get-invite.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newInvitesTargetUsersGetInviteCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-invite <code>",
+		Aliases: []string{"get"},
+		Short: "Get the target users for an invite.",
+		Example: "  discord-cli invites target-users get-invite value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/invites/{code}/target-users"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("code is required"))
+			}
+			path = replacePathParam(path, "code", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/invites_target-users_update-invite.go b/discord-cli/internal/cli/invites_target-users_update-invite.go
new file mode 100644
index 00000000..150a8e4f
--- /dev/null
+++ b/discord-cli/internal/cli/invites_target-users_update-invite.go
@@ -0,0 +1,71 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newInvitesTargetUsersUpdateInviteCmd(flags *rootFlags) *cobra.Command {
+	var bodyTargetUsersFile string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-invite <code>",
+		Aliases: []string{"update"},
+		Short: "Update the target users for an existing invite.",
+		Example: "  discord-cli invites target-users update-invite value --target-users-file value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/invites/{code}/target-users"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("code is required"))
+			}
+			path = replacePathParam(path, "code", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyTargetUsersFile != "" {
+					body["target_users_file"] = bodyTargetUsersFile
+				}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyTargetUsersFile, "target-users-file", "", "Target users file")
+	_ = cmd.MarkFlagRequired("target-users-file")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies.go b/discord-cli/internal/cli/lobbies.go
new file mode 100644
index 00000000..8ded6857
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies.go
@@ -0,0 +1,23 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newLobbiesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "lobbies",
+		Short: "Manage lobbies",
+	}
+
+	cmd.AddCommand(newLobbiesCreateLobbyCmd(flags))
+	cmd.AddCommand(newLobbiesCreateOrJoinLobbyCmd(flags))
+	cmd.AddCommand(newLobbiesEditLobbyCmd(flags))
+	cmd.AddCommand(newLobbiesGetLobbyCmd(flags))
+	cmd.AddCommand(newLobbiesChannelLinkingCmd(flags))
+	cmd.AddCommand(newLobbiesMembersCmd(flags))
+	cmd.AddCommand(newLobbiesMessagesCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_channel-linking.go b/discord-cli/internal/cli/lobbies_channel-linking.go
new file mode 100644
index 00000000..ea900e05
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_channel-linking.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newLobbiesChannelLinkingCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "channel-linking",
+		Short: "Manage channel linking",
+	}
+
+	cmd.AddCommand(newLobbiesChannelLinkingEditLobbyChannelLinkCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_channel-linking_edit-lobby-channel-link.go b/discord-cli/internal/cli/lobbies_channel-linking_edit-lobby-channel-link.go
new file mode 100644
index 00000000..b43b4a7e
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_channel-linking_edit-lobby-channel-link.go
@@ -0,0 +1,70 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesChannelLinkingEditLobbyChannelLinkCmd(flags *rootFlags) *cobra.Command {
+	var bodyChannelId string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "edit-lobby-channel-link <lobby_id>",
+		Aliases: []string{"update"},
+		Short: "Edit lobby channel link",
+		Example: "  discord-cli lobbies channel-linking edit-lobby-channel-link abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}/channel-linking"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyChannelId != "" {
+					body["channel_id"] = bodyChannelId
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_create-lobby.go b/discord-cli/internal/cli/lobbies_create-lobby.go
new file mode 100644
index 00000000..979d2a99
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_create-lobby.go
@@ -0,0 +1,76 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesCreateLobbyCmd(flags *rootFlags) *cobra.Command {
+	var bodyFlags string
+	var bodyIdleTimeoutSeconds int
+	var bodyOverrideEventWebhooksUrl string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-lobby",
+		Aliases: []string{"create"},
+		Short: "Create lobby",
+		Example: "  discord-cli lobbies create-lobby",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies"
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyFlags != "" {
+					body["flags"] = bodyFlags
+				}
+				if bodyIdleTimeoutSeconds != 0 {
+					body["idle_timeout_seconds"] = bodyIdleTimeoutSeconds
+				}
+				if bodyOverrideEventWebhooksUrl != "" {
+					body["override_event_webhooks_url"] = bodyOverrideEventWebhooksUrl
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyFlags, "flags", "", "Flags")
+	cmd.Flags().IntVar(&bodyIdleTimeoutSeconds, "idle-timeout-seconds", 0, "Idle timeout seconds")
+	cmd.Flags().StringVar(&bodyOverrideEventWebhooksUrl, "override-event-webhooks-url", "", "Override event webhooks url")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_create-or-join-lobby.go b/discord-cli/internal/cli/lobbies_create-or-join-lobby.go
new file mode 100644
index 00000000..9829a3b4
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_create-or-join-lobby.go
@@ -0,0 +1,77 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesCreateOrJoinLobbyCmd(flags *rootFlags) *cobra.Command {
+	var bodyFlags string
+	var bodyIdleTimeoutSeconds int
+	var bodySecret string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-or-join-lobby",
+		Aliases: []string{"update"},
+		Short: "Create or join lobby",
+		Example: "  discord-cli lobbies create-or-join-lobby --secret value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies"
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyFlags != "" {
+					body["flags"] = bodyFlags
+				}
+				if bodyIdleTimeoutSeconds != 0 {
+					body["idle_timeout_seconds"] = bodyIdleTimeoutSeconds
+				}
+				if bodySecret != "" {
+					body["secret"] = bodySecret
+				}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyFlags, "flags", "", "Flags")
+	cmd.Flags().IntVar(&bodyIdleTimeoutSeconds, "idle-timeout-seconds", 0, "Idle timeout seconds")
+	cmd.Flags().StringVar(&bodySecret, "secret", "", "Secret")
+	_ = cmd.MarkFlagRequired("secret")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_edit-lobby.go b/discord-cli/internal/cli/lobbies_edit-lobby.go
new file mode 100644
index 00000000..770b6f92
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_edit-lobby.go
@@ -0,0 +1,79 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesEditLobbyCmd(flags *rootFlags) *cobra.Command {
+	var bodyFlags string
+	var bodyIdleTimeoutSeconds int
+	var bodyOverrideEventWebhooksUrl string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "edit-lobby <lobby_id>",
+		Short: "Edit lobby",
+		Example: "  discord-cli lobbies edit-lobby abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyFlags != "" {
+					body["flags"] = bodyFlags
+				}
+				if bodyIdleTimeoutSeconds != 0 {
+					body["idle_timeout_seconds"] = bodyIdleTimeoutSeconds
+				}
+				if bodyOverrideEventWebhooksUrl != "" {
+					body["override_event_webhooks_url"] = bodyOverrideEventWebhooksUrl
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyFlags, "flags", "", "Flags")
+	cmd.Flags().IntVar(&bodyIdleTimeoutSeconds, "idle-timeout-seconds", 0, "Idle timeout seconds")
+	cmd.Flags().StringVar(&bodyOverrideEventWebhooksUrl, "override-event-webhooks-url", "", "Override event webhooks url")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_get-lobby.go b/discord-cli/internal/cli/lobbies_get-lobby.go
new file mode 100644
index 00000000..1423f102
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_get-lobby.go
@@ -0,0 +1,50 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesGetLobbyCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-lobby <lobby_id>",
+		Aliases: []string{"get"},
+		Short: "Get lobby",
+		Example: "  discord-cli lobbies get-lobby abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members.go b/discord-cli/internal/cli/lobbies_members.go
new file mode 100644
index 00000000..0edda2c2
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members.go
@@ -0,0 +1,22 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newLobbiesMembersCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "members",
+		Short: "Manage members",
+	}
+
+	cmd.AddCommand(newLobbiesMembersAddLobbyCmd(flags))
+	cmd.AddCommand(newLobbiesMembersBulkUpdateLobbyCmd(flags))
+	cmd.AddCommand(newLobbiesMembersCreateLinkedLobbyGuildInviteForSelfCmd(flags))
+	cmd.AddCommand(newLobbiesMembersCreateLinkedLobbyGuildInviteForUserCmd(flags))
+	cmd.AddCommand(newLobbiesMembersDeleteLobbyCmd(flags))
+	cmd.AddCommand(newLobbiesMembersLeaveLobbyCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_add-lobby.go b/discord-cli/internal/cli/lobbies_members_add-lobby.go
new file mode 100644
index 00000000..397ec72a
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_add-lobby.go
@@ -0,0 +1,74 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesMembersAddLobbyCmd(flags *rootFlags) *cobra.Command {
+	var bodyFlags string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "add-lobby <lobby_id> <user_id>",
+		Aliases: []string{"update"},
+		Short: "Add lobby",
+		Example: "  discord-cli lobbies members add-lobby abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}/members/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyFlags != "" {
+					body["flags"] = bodyFlags
+				}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyFlags, "flags", "", "Flags")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_bulk-update-lobby.go b/discord-cli/internal/cli/lobbies_members_bulk-update-lobby.go
new file mode 100644
index 00000000..5b22f5a8
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_bulk-update-lobby.go
@@ -0,0 +1,65 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesMembersBulkUpdateLobbyCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "bulk-update-lobby <lobby_id>",
+		Aliases: []string{"create"},
+		Short: "Bulk update lobby",
+		Example: "  discord-cli lobbies members bulk-update-lobby abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}/members/bulk"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-self.go b/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-self.go
new file mode 100644
index 00000000..d90ac693
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-self.go
@@ -0,0 +1,64 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesMembersCreateLinkedLobbyGuildInviteForSelfCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-linked-lobby-guild-invite-for-self <lobby_id>",
+		Short: "Create linked lobby guild invite for self",
+		Example: "  discord-cli lobbies members create-linked-lobby-guild-invite-for-self abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}/members/@me/invites"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-user.go b/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-user.go
new file mode 100644
index 00000000..17a3976d
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_create-linked-lobby-guild-invite-for-user.go
@@ -0,0 +1,68 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesMembersCreateLinkedLobbyGuildInviteForUserCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-linked-lobby-guild-invite-for-user <lobby_id> <user_id>",
+		Short: "Create linked lobby guild invite for user",
+		Example: "  discord-cli lobbies members create-linked-lobby-guild-invite-for-user abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}/members/{user_id}/invites"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_delete-lobby.go b/discord-cli/internal/cli/lobbies_members_delete-lobby.go
new file mode 100644
index 00000000..e8258e4a
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_delete-lobby.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesMembersDeleteLobbyCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-lobby <lobby_id> <user_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete lobby",
+		Example: "  discord-cli lobbies members delete-lobby abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}/members/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_members_leave-lobby.go b/discord-cli/internal/cli/lobbies_members_leave-lobby.go
new file mode 100644
index 00000000..c54e1ae7
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_members_leave-lobby.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesMembersLeaveLobbyCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "leave-lobby <lobby_id>",
+		Short: "Leave lobby",
+		Example: "  discord-cli lobbies members leave-lobby abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}/members/@me"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_messages.go b/discord-cli/internal/cli/lobbies_messages.go
new file mode 100644
index 00000000..07fab0dc
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_messages.go
@@ -0,0 +1,19 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newLobbiesMessagesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "messages",
+		Short: "Manage messages",
+	}
+
+	cmd.AddCommand(newLobbiesMessagesCreateLobbyCmd(flags))
+	cmd.AddCommand(newLobbiesMessagesGetLobbyCmd(flags))
+	cmd.AddCommand(newLobbiesMessagesUpdateLobbyExternalModerationMetadataCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_messages_create-lobby.go b/discord-cli/internal/cli/lobbies_messages_create-lobby.go
new file mode 100644
index 00000000..3790db98
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_messages_create-lobby.go
@@ -0,0 +1,110 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesMessagesCreateLobbyCmd(flags *rootFlags) *cobra.Command {
+	var bodyAllowedMentions string
+	var bodyContent string
+	var bodyEnforceNonce bool
+	var bodyFlags int
+	var bodyMessageReference string
+	var bodyNonce string
+	var bodyPoll string
+	var bodySharedClientTheme string
+	var bodyTts bool
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-lobby <lobby_id>",
+		Aliases: []string{"create"},
+		Short: "Create lobby",
+		Example: "  discord-cli lobbies messages create-lobby abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}/messages"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAllowedMentions != "" {
+					body["allowed_mentions"] = bodyAllowedMentions
+				}
+				if bodyContent != "" {
+					body["content"] = bodyContent
+				}
+				if bodyEnforceNonce != false {
+					body["enforce_nonce"] = bodyEnforceNonce
+				}
+				if bodyFlags != 0 {
+					body["flags"] = bodyFlags
+				}
+				if bodyMessageReference != "" {
+					body["message_reference"] = bodyMessageReference
+				}
+				if bodyNonce != "" {
+					body["nonce"] = bodyNonce
+				}
+				if bodyPoll != "" {
+					body["poll"] = bodyPoll
+				}
+				if bodySharedClientTheme != "" {
+					body["shared_client_theme"] = bodySharedClientTheme
+				}
+				if bodyTts != false {
+					body["tts"] = bodyTts
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAllowedMentions, "allowed-mentions", "", "Allowed mentions")
+	cmd.Flags().StringVar(&bodyContent, "content", "", "Content")
+	cmd.Flags().BoolVar(&bodyEnforceNonce, "enforce-nonce", false, "Enforce nonce")
+	cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+	cmd.Flags().StringVar(&bodyMessageReference, "message-reference", "", "Message reference")
+	cmd.Flags().StringVar(&bodyNonce, "nonce", "", "Nonce")
+	cmd.Flags().StringVar(&bodyPoll, "poll", "", "Poll")
+	cmd.Flags().StringVar(&bodySharedClientTheme, "shared-client-theme", "", "Shared client theme")
+	cmd.Flags().BoolVar(&bodyTts, "tts", false, "Tts")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_messages_get-lobby.go b/discord-cli/internal/cli/lobbies_messages_get-lobby.go
new file mode 100644
index 00000000..03d166eb
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_messages_get-lobby.go
@@ -0,0 +1,55 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesMessagesGetLobbyCmd(flags *rootFlags) *cobra.Command {
+	var flagLimit int
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "get-lobby <lobby_id>",
+		Aliases: []string{"get"},
+		Short: "Get lobby",
+		Example: "  discord-cli lobbies messages get-lobby abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}/messages"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			data, err := paginatedGet(c, path, map[string]string{
+				"limit": fmt.Sprintf("%v", flagLimit),
+			}, flagAll, "", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/lobbies_messages_update-lobby-external-moderation-metadata.go b/discord-cli/internal/cli/lobbies_messages_update-lobby-external-moderation-metadata.go
new file mode 100644
index 00000000..7fbb01b3
--- /dev/null
+++ b/discord-cli/internal/cli/lobbies_messages_update-lobby-external-moderation-metadata.go
@@ -0,0 +1,69 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newLobbiesMessagesUpdateLobbyExternalModerationMetadataCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-lobby-external-moderation-metadata <lobby_id> <message_id>",
+		Aliases: []string{"update"},
+		Short: "Update the external moderation metadata for a lobby message.",
+		Example: "  discord-cli lobbies messages update-lobby-external-moderation-metadata abc123 abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/lobbies/{lobby_id}/messages/{message_id}/moderation-metadata"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("lobby_id is required"))
+			}
+			path = replacePathParam(path, "lobby_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/oauth2.go b/discord-cli/internal/cli/oauth2.go
new file mode 100644
index 00000000..20bdb015
--- /dev/null
+++ b/discord-cli/internal/cli/oauth2.go
@@ -0,0 +1,20 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newOauth2Cmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "oauth2",
+		Short: "Manage oauth2",
+	}
+
+	cmd.AddCommand(newOauth2GetMyApplicationCmd(flags))
+	cmd.AddCommand(newOauth2GetMyAuthorizationCmd(flags))
+	cmd.AddCommand(newOauth2GetOpenidConnectUserinfoCmd(flags))
+	cmd.AddCommand(newOauth2GetPublicKeysCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/oauth2_get-my-application.go b/discord-cli/internal/cli/oauth2_get-my-application.go
new file mode 100644
index 00000000..9559fb0a
--- /dev/null
+++ b/discord-cli/internal/cli/oauth2_get-my-application.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newOauth2GetMyApplicationCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-my-application",
+		Aliases: []string{"list"},
+		Short: "Get my application",
+		Example: "  discord-cli oauth2 get-my-application",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/oauth2/applications/@me"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/oauth2_get-my-authorization.go b/discord-cli/internal/cli/oauth2_get-my-authorization.go
new file mode 100644
index 00000000..6a8acf8b
--- /dev/null
+++ b/discord-cli/internal/cli/oauth2_get-my-authorization.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newOauth2GetMyAuthorizationCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-my-authorization",
+		Short: "Get my authorization",
+		Example: "  discord-cli oauth2 get-my-authorization",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/oauth2/@me"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/oauth2_get-openid-connect-userinfo.go b/discord-cli/internal/cli/oauth2_get-openid-connect-userinfo.go
new file mode 100644
index 00000000..ba60d09f
--- /dev/null
+++ b/discord-cli/internal/cli/oauth2_get-openid-connect-userinfo.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newOauth2GetOpenidConnectUserinfoCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-openid-connect-userinfo",
+		Short: "Get openid connect userinfo",
+		Example: "  discord-cli oauth2 get-openid-connect-userinfo",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/oauth2/userinfo"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/oauth2_get-public-keys.go b/discord-cli/internal/cli/oauth2_get-public-keys.go
new file mode 100644
index 00000000..cf3c862d
--- /dev/null
+++ b/discord-cli/internal/cli/oauth2_get-public-keys.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newOauth2GetPublicKeysCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-public-keys",
+		Short: "Get public keys",
+		Example: "  discord-cli oauth2 get-public-keys",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/oauth2/keys"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk.go b/discord-cli/internal/cli/partner-sdk.go
new file mode 100644
index 00000000..e3166bc6
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk.go
@@ -0,0 +1,21 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newPartnerSdkCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "partner-sdk",
+		Short: "Manage partner sdk",
+	}
+
+	cmd.AddCommand(newPartnerSdkBotTokenCmd(flags))
+	cmd.AddCommand(newPartnerSdkBotUnmergeProvisionalAccountCmd(flags))
+	cmd.AddCommand(newPartnerSdkTokenCmd(flags))
+	cmd.AddCommand(newPartnerSdkUnmergeProvisionalAccountCmd(flags))
+	cmd.AddCommand(newPartnerSdkUpdateUserMessageExternalModerationMetadataCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk_bot-token.go b/discord-cli/internal/cli/partner-sdk_bot-token.go
new file mode 100644
index 00000000..21113583
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk_bot-token.go
@@ -0,0 +1,72 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newPartnerSdkBotTokenCmd(flags *rootFlags) *cobra.Command {
+	var bodyExternalUserId string
+	var bodyPreferredGlobalName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "bot-token",
+		Aliases: []string{"create"},
+		Short: "Bot token",
+		Example: "  discord-cli partner-sdk bot-token --external-user-id abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/partner-sdk/token/bot"
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyExternalUserId != "" {
+					body["external_user_id"] = bodyExternalUserId
+				}
+				if bodyPreferredGlobalName != "" {
+					body["preferred_global_name"] = bodyPreferredGlobalName
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyExternalUserId, "external-user-id", "", "External user id")
+	_ = cmd.MarkFlagRequired("external-user-id")
+	cmd.Flags().StringVar(&bodyPreferredGlobalName, "preferred-global-name", "", "Preferred global name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk_bot-unmerge-provisional-account.go b/discord-cli/internal/cli/partner-sdk_bot-unmerge-provisional-account.go
new file mode 100644
index 00000000..a825bf6e
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk_bot-unmerge-provisional-account.go
@@ -0,0 +1,66 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newPartnerSdkBotUnmergeProvisionalAccountCmd(flags *rootFlags) *cobra.Command {
+	var bodyExternalUserId string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "bot-unmerge-provisional-account",
+		Short: "Bot unmerge provisional account",
+		Example: "  discord-cli partner-sdk bot-unmerge-provisional-account --external-user-id abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/partner-sdk/provisional-accounts/unmerge/bot"
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyExternalUserId != "" {
+					body["external_user_id"] = bodyExternalUserId
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyExternalUserId, "external-user-id", "", "External user id")
+	_ = cmd.MarkFlagRequired("external-user-id")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk_token.go b/discord-cli/internal/cli/partner-sdk_token.go
new file mode 100644
index 00000000..fabeddf6
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk_token.go
@@ -0,0 +1,83 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newPartnerSdkTokenCmd(flags *rootFlags) *cobra.Command {
+	var bodyClientId string
+	var bodyClientSecret string
+	var bodyExternalAuthToken string
+	var bodyExternalAuthType string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "token",
+		Short: "Token",
+		Example: "  discord-cli partner-sdk token --client-id abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/partner-sdk/token"
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyClientId != "" {
+					body["client_id"] = bodyClientId
+				}
+				if bodyClientSecret != "" {
+					body["client_secret"] = bodyClientSecret
+				}
+				if bodyExternalAuthToken != "" {
+					body["external_auth_token"] = bodyExternalAuthToken
+				}
+				if bodyExternalAuthType != "" {
+					body["external_auth_type"] = bodyExternalAuthType
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyClientId, "client-id", "", "Client id")
+	_ = cmd.MarkFlagRequired("client-id")
+	cmd.Flags().StringVar(&bodyClientSecret, "client-secret", "", "Client secret")
+	cmd.Flags().StringVar(&bodyExternalAuthToken, "external-auth-token", "", "External auth token")
+	_ = cmd.MarkFlagRequired("external-auth-token")
+	cmd.Flags().StringVar(&bodyExternalAuthType, "external-auth-type", "", "External auth type")
+	_ = cmd.MarkFlagRequired("external-auth-type")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk_unmerge-provisional-account.go b/discord-cli/internal/cli/partner-sdk_unmerge-provisional-account.go
new file mode 100644
index 00000000..f8712798
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk_unmerge-provisional-account.go
@@ -0,0 +1,83 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newPartnerSdkUnmergeProvisionalAccountCmd(flags *rootFlags) *cobra.Command {
+	var bodyClientId string
+	var bodyClientSecret string
+	var bodyExternalAuthToken string
+	var bodyExternalAuthType string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "unmerge-provisional-account",
+		Short: "Unmerge provisional account",
+		Example: "  discord-cli partner-sdk unmerge-provisional-account --client-id abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/partner-sdk/provisional-accounts/unmerge"
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyClientId != "" {
+					body["client_id"] = bodyClientId
+				}
+				if bodyClientSecret != "" {
+					body["client_secret"] = bodyClientSecret
+				}
+				if bodyExternalAuthToken != "" {
+					body["external_auth_token"] = bodyExternalAuthToken
+				}
+				if bodyExternalAuthType != "" {
+					body["external_auth_type"] = bodyExternalAuthType
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyClientId, "client-id", "", "Client id")
+	_ = cmd.MarkFlagRequired("client-id")
+	cmd.Flags().StringVar(&bodyClientSecret, "client-secret", "", "Client secret")
+	cmd.Flags().StringVar(&bodyExternalAuthToken, "external-auth-token", "", "External auth token")
+	_ = cmd.MarkFlagRequired("external-auth-token")
+	cmd.Flags().StringVar(&bodyExternalAuthType, "external-auth-type", "", "External auth type")
+	_ = cmd.MarkFlagRequired("external-auth-type")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/partner-sdk_update-user-message-external-moderation-metadata.go b/discord-cli/internal/cli/partner-sdk_update-user-message-external-moderation-metadata.go
new file mode 100644
index 00000000..09803fb4
--- /dev/null
+++ b/discord-cli/internal/cli/partner-sdk_update-user-message-external-moderation-metadata.go
@@ -0,0 +1,73 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newPartnerSdkUpdateUserMessageExternalModerationMetadataCmd(flags *rootFlags) *cobra.Command {
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-user-message-external-moderation-metadata <user_id_1> <user_id_2> <message_id>",
+		Aliases: []string{"update"},
+		Short: "Update the external moderation metadata for a user message (DM).",
+		Example: "  discord-cli partner-sdk update-user-message-external-moderation-metadata value value abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/partner-sdk/dms/{user_id_1}/{user_id_2}/messages/{message_id}/moderation-metadata"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("user_id_1 is required"))
+			}
+			path = replacePathParam(path, "user_id_1", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("user_id_2 is required"))
+			}
+			path = replacePathParam(path, "user_id_2", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[2])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/root.go b/discord-cli/internal/cli/root.go
new file mode 100644
index 00000000..0eb35e98
--- /dev/null
+++ b/discord-cli/internal/cli/root.go
@@ -0,0 +1,145 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"text/tabwriter"
+	"time"
+
+	"github.com/USER/discord-cli/internal/client"
+	"github.com/USER/discord-cli/internal/config"
+	"github.com/spf13/cobra"
+)
+
+var version = "10"
+
+type rootFlags struct {
+	asJSON       bool
+	csv          bool
+	plain        bool
+	quiet        bool
+	dryRun       bool
+	noCache      bool
+	yes          bool
+	selectFields string
+	configPath   string
+	timeout      time.Duration
+}
+
+// Execute runs the CLI in non-interactive mode: never prompts, all values via flags or stdin.
+func Execute() error {
+	var flags rootFlags
+
+	rootCmd := &cobra.Command{
+		Use:           "discord-cli",
+		Short:         "Manage Discord servers, channels, messages, roles, and more from your terminal",
+		SilenceUsage:  true,
+		SilenceErrors: true,
+		Version:       version,
+	}
+	rootCmd.SetVersionTemplate("discord-cli {{ .Version }}\n")
+
+	rootCmd.PersistentFlags().BoolVar(&flags.asJSON, "json", false, "Output as JSON")
+	rootCmd.PersistentFlags().BoolVar(&flags.csv, "csv", false, "Output as CSV (table and array responses)")
+	rootCmd.PersistentFlags().BoolVar(&flags.plain, "plain", false, "Output as plain tab-separated text")
+	rootCmd.PersistentFlags().BoolVar(&flags.quiet, "quiet", false, "Bare output, one value per line")
+	rootCmd.PersistentFlags().StringVar(&flags.configPath, "config", "", "Config file path")
+	rootCmd.PersistentFlags().DurationVar(&flags.timeout, "timeout", 30*time.Second, "Request timeout")
+	rootCmd.PersistentFlags().BoolVar(&flags.dryRun, "dry-run", false, "Show request without sending")
+	rootCmd.PersistentFlags().BoolVar(&flags.noCache, "no-cache", false, "Bypass response cache")
+	rootCmd.PersistentFlags().StringVar(&flags.selectFields, "select", "", "Comma-separated fields to include in output (e.g. --select id,name,status)")
+	rootCmd.PersistentFlags().BoolVar(&flags.yes, "yes", false, "Skip confirmation prompts (for agents and scripts)")
+	rootCmd.PersistentFlags().BoolVar(&noColor, "no-color", false, "Disable colored output")
+	rootCmd.PersistentFlags().BoolVar(&humanFriendly, "human-friendly", false, "Enable colored output and rich formatting")
+	rootCmd.AddCommand(newApplicationsCmd(&flags)) 
+	rootCmd.AddCommand(newChannelsCmd(&flags)) 
+	rootCmd.AddCommand(newGatewayCmd(&flags)) 
+	rootCmd.AddCommand(newGuildsCmd(&flags)) 
+	rootCmd.AddCommand(newInteractionsCmd(&flags)) 
+	rootCmd.AddCommand(newInvitesCmd(&flags)) 
+	rootCmd.AddCommand(newLobbiesCmd(&flags)) 
+	rootCmd.AddCommand(newOauth2Cmd(&flags)) 
+	rootCmd.AddCommand(newPartnerSdkCmd(&flags)) 
+	rootCmd.AddCommand(newSoundboardDefaultSoundsCmd(&flags)) 
+	rootCmd.AddCommand(newStageInstancesCmd(&flags)) 
+	rootCmd.AddCommand(newStickerPacksCmd(&flags)) 
+	rootCmd.AddCommand(newStickersCmd(&flags)) 
+	rootCmd.AddCommand(newUsersCmd(&flags)) 
+	rootCmd.AddCommand(newVoiceCmd(&flags)) 
+	rootCmd.AddCommand(newWebhooksCmd(&flags)) 
+	rootCmd.AddCommand(newDoctorCmd(&flags))
+	rootCmd.AddCommand(newAuthCmd(&flags))
+	rootCmd.AddCommand(newExportCmd(&flags))
+	rootCmd.AddCommand(newImportCmd(&flags))
+	rootCmd.AddCommand(newSearchCmd(&flags))
+	rootCmd.AddCommand(newSyncCmd(&flags))
+	rootCmd.AddCommand(newTailCmd(&flags))
+	rootCmd.AddCommand(newAnalyticsCmd(&flags))
+	rootCmd.AddCommand(newWorkflowCmd(&flags))
+	rootCmd.AddCommand(newVersionCliCmd())
+
+	return rootCmd.Execute()
+}
+
+func ExitCode(err error) int {
+	var codeErr *cliError
+	if As(err, &codeErr) {
+		return codeErr.code
+	}
+	return 1
+}
+
+func (f *rootFlags) newClient() (*client.Client, error) {
+	cfg, err := config.Load(f.configPath)
+	if err != nil {
+		return nil, configErr(err)
+	}
+	c := client.New(cfg, f.timeout)
+	c.DryRun = f.dryRun
+	c.NoCache = f.noCache
+	return c, nil
+}
+
+func (f *rootFlags) printJSON(w *cobra.Command, v any) error {
+	enc := json.NewEncoder(w.OutOrStdout())
+	enc.SetIndent("", "  ")
+	return enc.Encode(v)
+}
+
+func (f *rootFlags) printTable(w *cobra.Command, headers []string, rows [][]string) error {
+	if f.asJSON {
+		return fmt.Errorf("use printJSON for JSON output")
+	}
+	tw := tabwriter.NewWriter(w.OutOrStdout(), 2, 4, 2, ' ', 0)
+	header := ""
+	for i, h := range headers {
+		if i > 0 {
+			header += "\t"
+		}
+		header += h
+	}
+	fmt.Fprintln(tw, header)
+	for _, row := range rows {
+		line := ""
+		for i, cell := range row {
+			if i > 0 {
+				line += "\t"
+			}
+			line += cell
+		}
+		fmt.Fprintln(tw, line)
+	}
+	return tw.Flush()
+}
+
+func newVersionCliCmd() *cobra.Command {
+	return &cobra.Command{
+		Use:   "version",
+		Short: "Print version",
+		Run: func(cmd *cobra.Command, args []string) {
+			fmt.Printf("discord-cli %s\n", version)
+		},
+	}
+}
diff --git a/discord-cli/internal/cli/search.go b/discord-cli/internal/cli/search.go
new file mode 100644
index 00000000..43d2243c
--- /dev/null
+++ b/discord-cli/internal/cli/search.go
@@ -0,0 +1,77 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"path/filepath"
+
+	"github.com/USER/discord-cli/internal/store"
+	"github.com/spf13/cobra"
+)
+
+func newSearchCmd(flags *rootFlags) *cobra.Command {
+	var resourceType string
+	var limit int
+	var dbPath string
+
+	cmd := &cobra.Command{
+		Use:   "search <query>",
+		Short: "Full-text search across locally synced data",
+		Long: `Search locally cached data using FTS5 full-text search.
+Data must be synced first with the sync command. Searches are instant
+(millisecond-fast) since they query local SQLite, not the remote API.`,
+		Example: `  # Search all synced data
+  discord-cli search "error timeout"
+
+  # Search a specific resource type
+  discord-cli search "payment failed" --type transactions
+
+  # JSON output for piping
+  discord-cli search "critical" --json --limit 20`,
+		Args: cobra.ExactArgs(1),
+		RunE: func(cmd *cobra.Command, args []string) error {
+			query := args[0]
+
+			if dbPath == "" {
+				home, _ := os.UserHomeDir()
+				dbPath = filepath.Join(home, ".local", "share", "discord-cli", "data.db")
+			}
+
+			db, err := store.Open(dbPath)
+			if err != nil {
+				return fmt.Errorf("opening local database: %w\nRun 'discord-cli sync' first to populate the local database.", err)
+			}
+			defer db.Close()
+
+			results, err := db.Search(query, limit)
+			if err != nil {
+				return fmt.Errorf("search failed: %w", err)
+			}
+
+			if len(results) == 0 {
+				fmt.Fprintf(os.Stderr, "No results for %q\n", query)
+				return nil
+			}
+
+			if flags.asJSON {
+				enc := json.NewEncoder(os.Stdout)
+				enc.SetIndent("", "  ")
+				return enc.Encode(results)
+			}
+
+			for _, r := range results {
+				fmt.Println(string(r))
+			}
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&resourceType, "type", "", "Filter by resource type")
+	cmd.Flags().IntVar(&limit, "limit", 50, "Maximum results to return")
+	cmd.Flags().StringVar(&dbPath, "db", "", "Database path (default: ~/.local/share/discord-cli/data.db)")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/soundboard-default-sounds.go b/discord-cli/internal/cli/soundboard-default-sounds.go
new file mode 100644
index 00000000..f95a6b5e
--- /dev/null
+++ b/discord-cli/internal/cli/soundboard-default-sounds.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newSoundboardDefaultSoundsCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "soundboard-default-sounds",
+		Short: "Manage soundboard default sounds",
+	}
+
+	cmd.AddCommand(newSoundboardDefaultSoundsGetCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/soundboard-default-sounds_get.go b/discord-cli/internal/cli/soundboard-default-sounds_get.go
new file mode 100644
index 00000000..fb8e9b54
--- /dev/null
+++ b/discord-cli/internal/cli/soundboard-default-sounds_get.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newSoundboardDefaultSoundsGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get",
+		Aliases: []string{"list"},
+		Short: "Get",
+		Example: "  discord-cli soundboard-default-sounds get",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/soundboard-default-sounds"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/stage-instances.go b/discord-cli/internal/cli/stage-instances.go
new file mode 100644
index 00000000..6c64f3d3
--- /dev/null
+++ b/discord-cli/internal/cli/stage-instances.go
@@ -0,0 +1,20 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newStageInstancesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "stage-instances",
+		Short: "Manage stage instances",
+	}
+
+	cmd.AddCommand(newStageInstancesCreateCmd(flags))
+	cmd.AddCommand(newStageInstancesDeleteCmd(flags))
+	cmd.AddCommand(newStageInstancesGetCmd(flags))
+	cmd.AddCommand(newStageInstancesUpdateCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/stage-instances_create.go b/discord-cli/internal/cli/stage-instances_create.go
new file mode 100644
index 00000000..505f53ed
--- /dev/null
+++ b/discord-cli/internal/cli/stage-instances_create.go
@@ -0,0 +1,87 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newStageInstancesCreateCmd(flags *rootFlags) *cobra.Command {
+	var bodyChannelId string
+	var bodyGuildScheduledEventId string
+	var bodyPrivacyLevel string
+	var bodySendStartNotification bool
+	var bodyTopic string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create",
+		Short: "Create",
+		Example: "  discord-cli stage-instances create --channel-id abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/stage-instances"
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyChannelId != "" {
+					body["channel_id"] = bodyChannelId
+				}
+				if bodyGuildScheduledEventId != "" {
+					body["guild_scheduled_event_id"] = bodyGuildScheduledEventId
+				}
+				if bodyPrivacyLevel != "" {
+					body["privacy_level"] = bodyPrivacyLevel
+				}
+				if bodySendStartNotification != false {
+					body["send_start_notification"] = bodySendStartNotification
+				}
+				if bodyTopic != "" {
+					body["topic"] = bodyTopic
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+	_ = cmd.MarkFlagRequired("channel-id")
+	cmd.Flags().StringVar(&bodyGuildScheduledEventId, "guild-scheduled-event-id", "", "Guild scheduled event id")
+	cmd.Flags().StringVar(&bodyPrivacyLevel, "privacy-level", "", "Privacy level")
+	cmd.Flags().BoolVar(&bodySendStartNotification, "send-start-notification", false, "Send start notification")
+	cmd.Flags().StringVar(&bodyTopic, "topic", "", "Topic")
+	_ = cmd.MarkFlagRequired("topic")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/stage-instances_delete.go b/discord-cli/internal/cli/stage-instances_delete.go
new file mode 100644
index 00000000..83010b10
--- /dev/null
+++ b/discord-cli/internal/cli/stage-instances_delete.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newStageInstancesDeleteCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete <channel_id>",
+		Short: "Delete",
+		Example: "  discord-cli stage-instances delete abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/stage-instances/{channel_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/stage-instances_get.go b/discord-cli/internal/cli/stage-instances_get.go
new file mode 100644
index 00000000..c9fcca69
--- /dev/null
+++ b/discord-cli/internal/cli/stage-instances_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newStageInstancesGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get <channel_id>",
+		Short: "Get",
+		Example: "  discord-cli stage-instances get abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/stage-instances/{channel_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/stage-instances_update.go b/discord-cli/internal/cli/stage-instances_update.go
new file mode 100644
index 00000000..1547c2c5
--- /dev/null
+++ b/discord-cli/internal/cli/stage-instances_update.go
@@ -0,0 +1,74 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newStageInstancesUpdateCmd(flags *rootFlags) *cobra.Command {
+	var bodyPrivacyLevel int
+	var bodyTopic string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update <channel_id>",
+		Short: "Update",
+		Example: "  discord-cli stage-instances update abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/stage-instances/{channel_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("channel_id is required"))
+			}
+			path = replacePathParam(path, "channel_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyPrivacyLevel != 0 {
+					body["privacy_level"] = bodyPrivacyLevel
+				}
+				if bodyTopic != "" {
+					body["topic"] = bodyTopic
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().IntVar(&bodyPrivacyLevel, "privacy-level", 0, "Privacy level")
+	cmd.Flags().StringVar(&bodyTopic, "topic", "", "Topic")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/sticker-packs.go b/discord-cli/internal/cli/sticker-packs.go
new file mode 100644
index 00000000..088f782f
--- /dev/null
+++ b/discord-cli/internal/cli/sticker-packs.go
@@ -0,0 +1,18 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newStickerPacksCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "sticker-packs",
+		Short: "Manage sticker packs",
+	}
+
+	cmd.AddCommand(newStickerPacksGetCmd(flags))
+	cmd.AddCommand(newStickerPacksListCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/sticker-packs_get.go b/discord-cli/internal/cli/sticker-packs_get.go
new file mode 100644
index 00000000..8ad099d8
--- /dev/null
+++ b/discord-cli/internal/cli/sticker-packs_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newStickerPacksGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get <pack_id>",
+		Short: "Get",
+		Example: "  discord-cli sticker-packs get abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/sticker-packs/{pack_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("pack_id is required"))
+			}
+			path = replacePathParam(path, "pack_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/sticker-packs_list.go b/discord-cli/internal/cli/sticker-packs_list.go
new file mode 100644
index 00000000..fc397db8
--- /dev/null
+++ b/discord-cli/internal/cli/sticker-packs_list.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newStickerPacksListCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list",
+		Short: "List",
+		Example: "  discord-cli sticker-packs list",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/sticker-packs"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/stickers.go b/discord-cli/internal/cli/stickers.go
new file mode 100644
index 00000000..9019c96e
--- /dev/null
+++ b/discord-cli/internal/cli/stickers.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newStickersCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "stickers",
+		Short: "Manage stickers",
+	}
+
+	cmd.AddCommand(newStickersGetCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/stickers_get.go b/discord-cli/internal/cli/stickers_get.go
new file mode 100644
index 00000000..2f4533fe
--- /dev/null
+++ b/discord-cli/internal/cli/stickers_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newStickersGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get <sticker_id>",
+		Short: "Get",
+		Example: "  discord-cli stickers get abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/stickers/{sticker_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("sticker_id is required"))
+			}
+			path = replacePathParam(path, "sticker_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/sync.go b/discord-cli/internal/cli/sync.go
new file mode 100644
index 00000000..2346733a
--- /dev/null
+++ b/discord-cli/internal/cli/sync.go
@@ -0,0 +1,128 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"path/filepath"
+
+	"github.com/USER/discord-cli/internal/store"
+	"github.com/spf13/cobra"
+)
+
+func newSyncCmd(flags *rootFlags) *cobra.Command {
+	var resources []string
+	var full bool
+	var dbPath string
+
+	cmd := &cobra.Command{
+		Use:   "sync",
+		Short: "Sync API data to local SQLite for offline search and analysis",
+		Long: `Sync data from the API into a local SQLite database. Supports resumable
+incremental sync (only fetches new data since last sync) and full resync.
+Once synced, use the 'search' command for instant full-text search.`,
+		Example: `  # Sync all resources
+  discord-cli sync
+
+  # Sync specific resources only
+  discord-cli sync --resources channels,messages
+
+  # Full resync (ignore previous checkpoint)
+  discord-cli sync --full`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+			c.NoCache = true
+
+			if dbPath == "" {
+				home, _ := os.UserHomeDir()
+				dbPath = filepath.Join(home, ".local", "share", "discord-cli", "data.db")
+			}
+
+			db, err := store.Open(dbPath)
+			if err != nil {
+				return fmt.Errorf("opening local database: %w", err)
+			}
+			defer db.Close()
+
+			// If no specific resources, sync top-level resources
+			if len(resources) == 0 {
+				resources = defaultSyncResources()
+			}
+
+			var totalSynced int
+			for _, resource := range resources {
+				fmt.Fprintf(os.Stderr, "Syncing %s...\n", resource)
+
+				path := "/" + resource
+				data, err := c.Get(path, nil)
+				if err != nil {
+					fmt.Fprintf(os.Stderr, "warning: failed to sync %s: %v\n", resource, err)
+					continue
+				}
+
+				var items []json.RawMessage
+				if err := json.Unmarshal(data, &items); err != nil {
+					// Single object response - store as-is
+					if err := db.Upsert(resource, resource, data); err != nil {
+						fmt.Fprintf(os.Stderr, "warning: failed to store %s: %v\n", resource, err)
+					} else {
+						totalSynced++
+					}
+					continue
+				}
+
+				count := 0
+				for _, item := range items {
+					var obj map[string]any
+					if err := json.Unmarshal(item, &obj); err != nil {
+						continue
+					}
+					id := extractID(obj)
+					if id == "" {
+						id = fmt.Sprintf("%s-%d", resource, count)
+					}
+					if err := db.Upsert(resource, id, item); err != nil {
+						fmt.Fprintf(os.Stderr, "warning: failed to store %s/%s: %v\n", resource, id, err)
+						continue
+					}
+					count++
+				}
+
+				if err := db.SaveSyncState(resource, "", count); err != nil {
+					fmt.Fprintf(os.Stderr, "warning: failed to save sync state for %s: %v\n", resource, err)
+				}
+
+				fmt.Fprintf(os.Stderr, "  %s: %d records synced\n", resource, count)
+				totalSynced += count
+			}
+
+			fmt.Fprintf(os.Stderr, "Sync complete: %d total records across %d resources\n", totalSynced, len(resources))
+			return nil
+		},
+	}
+
+	cmd.Flags().StringSliceVar(&resources, "resources", nil, "Comma-separated resource types to sync")
+	cmd.Flags().BoolVar(&full, "full", false, "Full resync (ignore previous checkpoint)")
+	cmd.Flags().StringVar(&dbPath, "db", "", "Database path (default: ~/.local/share/discord-cli/data.db)")
+
+	return cmd
+}
+
+func defaultSyncResources() []string {
+	// Override this in the generated CLI to list the API's top-level list endpoints
+	return []string{}
+}
+
+func extractID(obj map[string]any) string {
+	for _, key := range []string{"id", "ID", "uuid", "slug", "name"} {
+		if v, ok := obj[key]; ok {
+			return fmt.Sprintf("%v", v)
+		}
+	}
+	return ""
+}
diff --git a/discord-cli/internal/cli/tail.go b/discord-cli/internal/cli/tail.go
new file mode 100644
index 00000000..5da944ba
--- /dev/null
+++ b/discord-cli/internal/cli/tail.go
@@ -0,0 +1,117 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"os/signal"
+	"syscall"
+	"time"
+
+	"github.com/spf13/cobra"
+)
+
+func newTailCmd(flags *rootFlags) *cobra.Command {
+	var resource string
+	var interval time.Duration
+	var follow bool
+
+	cmd := &cobra.Command{
+		Use:   "tail [resource]",
+		Short: "Stream live changes by polling the API at regular intervals",
+		Long: `Tail streams live data changes by polling the API at configurable intervals.
+Events are emitted as NDJSON to stdout for piping to other tools.
+Gracefully shuts down on SIGTERM/SIGINT.
+
+Note: For APIs with WebSocket or SSE support, a future version will use
+native streaming instead of polling.`,
+		Example: `  # Tail all changes every 10 seconds
+  discord-cli tail --interval 10s
+
+  # Tail a specific resource
+  discord-cli tail messages --interval 5s
+
+  # Pipe to jq for filtering
+  discord-cli tail events --interval 30s | jq 'select(.type == "error")'`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+			c.NoCache = true
+
+			if len(args) > 0 {
+				resource = args[0]
+			}
+			if resource == "" {
+				return fmt.Errorf("resource name required (e.g., 'tail messages')")
+			}
+
+			path := "/" + resource
+
+			sig := make(chan os.Signal, 1)
+			signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)
+
+			ticker := time.NewTicker(interval)
+			defer ticker.Stop()
+
+			enc := json.NewEncoder(os.Stdout)
+
+			fmt.Fprintf(os.Stderr, "Tailing %s every %s (Ctrl+C to stop)\n", resource, interval)
+
+			// Initial fetch
+			if err := fetchAndEmit(c, path, enc); err != nil {
+				fmt.Fprintf(os.Stderr, "warning: initial fetch failed: %v\n", err)
+			}
+
+			for {
+				select {
+				case <-sig:
+					fmt.Fprintln(os.Stderr, "\nShutting down gracefully...")
+					return nil
+				case <-ticker.C:
+					if err := fetchAndEmit(c, path, enc); err != nil {
+						fmt.Fprintf(os.Stderr, "warning: poll failed: %v\n", err)
+					}
+				}
+			}
+		},
+	}
+
+	cmd.Flags().StringVar(&resource, "resource", "", "Resource type to tail")
+	cmd.Flags().DurationVar(&interval, "interval", 10*time.Second, "Poll interval")
+	cmd.Flags().BoolVar(&follow, "follow", true, "Keep running (set --follow=false for single poll)")
+
+	return cmd
+}
+
+func fetchAndEmit(c interface{ Get(string, map[string]string) (json.RawMessage, error) }, path string, enc *json.Encoder) error {
+	data, err := c.Get(path, nil)
+	if err != nil {
+		return err
+	}
+
+	var items []json.RawMessage
+	if err := json.Unmarshal(data, &items); err != nil {
+		event := map[string]any{
+			"event":     "data",
+			"timestamp": time.Now().UTC().Format(time.RFC3339),
+			"data":      json.RawMessage(data),
+		}
+		return enc.Encode(event)
+	}
+
+	for _, item := range items {
+		event := map[string]any{
+			"event":     "data",
+			"timestamp": time.Now().UTC().Format(time.RFC3339),
+			"data":      item,
+		}
+		if err := enc.Encode(event); err != nil {
+			return err
+		}
+	}
+	return nil
+}
diff --git a/discord-cli/internal/cli/users.go b/discord-cli/internal/cli/users.go
new file mode 100644
index 00000000..97eb9689
--- /dev/null
+++ b/discord-cli/internal/cli/users.go
@@ -0,0 +1,28 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newUsersCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "users",
+		Short: "Manage users",
+	}
+
+	cmd.AddCommand(newUsersCreateDmCmd(flags))
+	cmd.AddCommand(newUsersDeleteApplicationRoleConnectionCmd(flags))
+	cmd.AddCommand(newUsersGetCmd(flags))
+	cmd.AddCommand(newUsersGetApplicationRoleConnectionCmd(flags))
+	cmd.AddCommand(newUsersGetCurrentApplicationEntitlementsCmd(flags))
+	cmd.AddCommand(newUsersGetMyCmd(flags))
+	cmd.AddCommand(newUsersGetMyGuildMemberCmd(flags))
+	cmd.AddCommand(newUsersLeaveGuildCmd(flags))
+	cmd.AddCommand(newUsersListMyConnectionsCmd(flags))
+	cmd.AddCommand(newUsersListMyGuildsCmd(flags))
+	cmd.AddCommand(newUsersUpdateApplicationRoleConnectionCmd(flags))
+	cmd.AddCommand(newUsersUpdateMyCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_create-dm.go b/discord-cli/internal/cli/users_create-dm.go
new file mode 100644
index 00000000..889f66e0
--- /dev/null
+++ b/discord-cli/internal/cli/users_create-dm.go
@@ -0,0 +1,66 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersCreateDmCmd(flags *rootFlags) *cobra.Command {
+	var bodyRecipientId string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "create-dm",
+		Aliases: []string{"create"},
+		Short: "Create dm",
+		Example: "  discord-cli users create-dm",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me/channels"
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyRecipientId != "" {
+					body["recipient_id"] = bodyRecipientId
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyRecipientId, "recipient-id", "", "Recipient id")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_delete-application-role-connection.go b/discord-cli/internal/cli/users_delete-application-role-connection.go
new file mode 100644
index 00000000..22c48a6c
--- /dev/null
+++ b/discord-cli/internal/cli/users_delete-application-role-connection.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersDeleteApplicationRoleConnectionCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-application-role-connection <application_id>",
+		Aliases: []string{"delete"},
+		Short: "Delete application role connection",
+		Example: "  discord-cli users delete-application-role-connection abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me/applications/{application_id}/role-connection"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_get-application-role-connection.go b/discord-cli/internal/cli/users_get-application-role-connection.go
new file mode 100644
index 00000000..20231372
--- /dev/null
+++ b/discord-cli/internal/cli/users_get-application-role-connection.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersGetApplicationRoleConnectionCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-application-role-connection <application_id>",
+		Short: "Get application role connection",
+		Example: "  discord-cli users get-application-role-connection abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me/applications/{application_id}/role-connection"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_get-current-application-entitlements.go b/discord-cli/internal/cli/users_get-current-application-entitlements.go
new file mode 100644
index 00000000..ed5a050c
--- /dev/null
+++ b/discord-cli/internal/cli/users_get-current-application-entitlements.go
@@ -0,0 +1,59 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersGetCurrentApplicationEntitlementsCmd(flags *rootFlags) *cobra.Command {
+	var flagSkuIds string
+	var flagExcludeConsumed bool
+
+	cmd := &cobra.Command{
+		Use:   "get-current-application-entitlements <application_id>",
+		Short: "Get current application entitlements",
+		Example: "  discord-cli users get-current-application-entitlements abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me/applications/{application_id}/entitlements"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			params := map[string]string{}
+			if flagSkuIds != "" {
+				params["sku_ids"] = fmt.Sprintf("%v", flagSkuIds)
+			}
+			if flagExcludeConsumed != false {
+				params["exclude_consumed"] = fmt.Sprintf("%v", flagExcludeConsumed)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagSkuIds, "sku-ids", "", "Sku ids")
+	cmd.Flags().BoolVar(&flagExcludeConsumed, "exclude-consumed", false, "Exclude consumed")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_get-my-guild-member.go b/discord-cli/internal/cli/users_get-my-guild-member.go
new file mode 100644
index 00000000..dd49dbab
--- /dev/null
+++ b/discord-cli/internal/cli/users_get-my-guild-member.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersGetMyGuildMemberCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-my-guild-member <guild_id>",
+		Short: "Get my guild member",
+		Example: "  discord-cli users get-my-guild-member abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me/guilds/{guild_id}/member"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_get-my.go b/discord-cli/internal/cli/users_get-my.go
new file mode 100644
index 00000000..8cf29f57
--- /dev/null
+++ b/discord-cli/internal/cli/users_get-my.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersGetMyCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-my",
+		Aliases: []string{"list"},
+		Short: "Get my",
+		Example: "  discord-cli users get-my",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_get.go b/discord-cli/internal/cli/users_get.go
new file mode 100644
index 00000000..44f8eb8f
--- /dev/null
+++ b/discord-cli/internal/cli/users_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get <user_id>",
+		Short: "Get",
+		Example: "  discord-cli users get abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/{user_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("user_id is required"))
+			}
+			path = replacePathParam(path, "user_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_leave-guild.go b/discord-cli/internal/cli/users_leave-guild.go
new file mode 100644
index 00000000..4d6505a1
--- /dev/null
+++ b/discord-cli/internal/cli/users_leave-guild.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersLeaveGuildCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "leave-guild <guild_id>",
+		Short: "Leave guild",
+		Example: "  discord-cli users leave-guild abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me/guilds/{guild_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("guild_id is required"))
+			}
+			path = replacePathParam(path, "guild_id", args[0])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_list-my-connections.go b/discord-cli/internal/cli/users_list-my-connections.go
new file mode 100644
index 00000000..6946614b
--- /dev/null
+++ b/discord-cli/internal/cli/users_list-my-connections.go
@@ -0,0 +1,45 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersListMyConnectionsCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-my-connections",
+		Short: "List my connections",
+		Example: "  discord-cli users list-my-connections",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me/connections"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_list-my-guilds.go b/discord-cli/internal/cli/users_list-my-guilds.go
new file mode 100644
index 00000000..cd72b18a
--- /dev/null
+++ b/discord-cli/internal/cli/users_list-my-guilds.go
@@ -0,0 +1,59 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersListMyGuildsCmd(flags *rootFlags) *cobra.Command {
+	var flagBefore string
+	var flagAfter string
+	var flagLimit int
+	var flagWithCounts bool
+	var flagAll bool
+
+	cmd := &cobra.Command{
+		Use:   "list-my-guilds",
+		Short: "List my guilds",
+		Example: "  discord-cli users list-my-guilds",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me/guilds"
+			data, err := paginatedGet(c, path, map[string]string{
+				"before": fmt.Sprintf("%v", flagBefore),
+				"after": fmt.Sprintf("%v", flagAfter),
+				"limit": fmt.Sprintf("%v", flagLimit),
+				"with_counts": fmt.Sprintf("%v", flagWithCounts),
+			}, flagAll, "after", "", "")
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagBefore, "before", "", "Before")
+	cmd.Flags().StringVar(&flagAfter, "after", "", "After")
+	cmd.Flags().IntVar(&flagLimit, "limit", 0, "Limit")
+	cmd.Flags().BoolVar(&flagWithCounts, "with-counts", false, "With counts")
+	cmd.Flags().BoolVar(&flagAll, "all", false, "Fetch all pages")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_update-application-role-connection.go b/discord-cli/internal/cli/users_update-application-role-connection.go
new file mode 100644
index 00000000..a657da4a
--- /dev/null
+++ b/discord-cli/internal/cli/users_update-application-role-connection.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersUpdateApplicationRoleConnectionCmd(flags *rootFlags) *cobra.Command {
+	var bodyPlatformName string
+	var bodyPlatformUsername string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-application-role-connection <application_id>",
+		Aliases: []string{"update"},
+		Short: "Update application role connection",
+		Example: "  discord-cli users update-application-role-connection abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me/applications/{application_id}/role-connection"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("application_id is required"))
+			}
+			path = replacePathParam(path, "application_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyPlatformName != "" {
+					body["platform_name"] = bodyPlatformName
+				}
+				if bodyPlatformUsername != "" {
+					body["platform_username"] = bodyPlatformUsername
+				}
+			}
+			data, err := c.Put(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyPlatformName, "platform-name", "", "Platform name")
+	cmd.Flags().StringVar(&bodyPlatformUsername, "platform-username", "", "Platform username")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/users_update-my.go b/discord-cli/internal/cli/users_update-my.go
new file mode 100644
index 00000000..31ca0985
--- /dev/null
+++ b/discord-cli/internal/cli/users_update-my.go
@@ -0,0 +1,76 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newUsersUpdateMyCmd(flags *rootFlags) *cobra.Command {
+	var bodyAvatar string
+	var bodyBanner string
+	var bodyUsername string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-my",
+		Short: "Update my",
+		Example: "  discord-cli users update-my --username my-resource",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/users/@me"
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAvatar != "" {
+					body["avatar"] = bodyAvatar
+				}
+				if bodyBanner != "" {
+					body["banner"] = bodyBanner
+				}
+				if bodyUsername != "" {
+					body["username"] = bodyUsername
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAvatar, "avatar", "", "Avatar")
+	cmd.Flags().StringVar(&bodyBanner, "banner", "", "Banner")
+	cmd.Flags().StringVar(&bodyUsername, "username", "", "Username")
+	_ = cmd.MarkFlagRequired("username")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/voice.go b/discord-cli/internal/cli/voice.go
new file mode 100644
index 00000000..d89092fd
--- /dev/null
+++ b/discord-cli/internal/cli/voice.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newVoiceCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "voice",
+		Short: "Manage voice",
+	}
+
+	cmd.AddCommand(newVoiceListRegionsCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/voice_list-regions.go b/discord-cli/internal/cli/voice_list-regions.go
new file mode 100644
index 00000000..5c2a6056
--- /dev/null
+++ b/discord-cli/internal/cli/voice_list-regions.go
@@ -0,0 +1,46 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newVoiceListRegionsCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "list-regions",
+		Aliases: []string{"list"},
+		Short: "List regions",
+		Example: "  discord-cli voice list-regions",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/voice/regions"
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks.go b/discord-cli/internal/cli/webhooks.go
new file mode 100644
index 00000000..97ee017e
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks.go
@@ -0,0 +1,26 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newWebhooksCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "webhooks",
+		Short: "Manage webhooks",
+	}
+
+	cmd.AddCommand(newWebhooksDeleteCmd(flags))
+	cmd.AddCommand(newWebhooksDeleteByTokenCmd(flags))
+	cmd.AddCommand(newWebhooksExecuteCmd(flags))
+	cmd.AddCommand(newWebhooksGetCmd(flags))
+	cmd.AddCommand(newWebhooksGetByTokenCmd(flags))
+	cmd.AddCommand(newWebhooksUpdateCmd(flags))
+	cmd.AddCommand(newWebhooksUpdateByTokenCmd(flags))
+	cmd.AddCommand(newWebhooksGithubCmd(flags))
+	cmd.AddCommand(newWebhooksMessagesCmd(flags))
+	cmd.AddCommand(newWebhooksSlackCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_delete-by-token.go b/discord-cli/internal/cli/webhooks_delete-by-token.go
new file mode 100644
index 00000000..2d818530
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_delete-by-token.go
@@ -0,0 +1,52 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksDeleteByTokenCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete-by-token <webhook_id> <webhook_token>",
+		Short: "Delete by token",
+		Example: "  discord-cli webhooks delete-by-token abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_delete.go b/discord-cli/internal/cli/webhooks_delete.go
new file mode 100644
index 00000000..9fe532d9
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_delete.go
@@ -0,0 +1,48 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksDeleteCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "delete <webhook_id>",
+		Short: "Delete",
+		Example: "  discord-cli webhooks delete abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_execute.go b/discord-cli/internal/cli/webhooks_execute.go
new file mode 100644
index 00000000..8b5e91cf
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_execute.go
@@ -0,0 +1,75 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksExecuteCmd(flags *rootFlags) *cobra.Command {
+	var flagWait bool
+	var flagThreadId string
+	var flagWithComponents bool
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "execute <webhook_id> <webhook_token>",
+		Aliases: []string{"create"},
+		Short: "Execute",
+		Example: "  discord-cli webhooks execute abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWait, "wait", false, "Wait")
+	cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+	cmd.Flags().BoolVar(&flagWithComponents, "with-components", false, "With components")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_get-by-token.go b/discord-cli/internal/cli/webhooks_get-by-token.go
new file mode 100644
index 00000000..41a6e537
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_get-by-token.go
@@ -0,0 +1,53 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksGetByTokenCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get-by-token <webhook_id> <webhook_token>",
+		Short: "Get by token",
+		Example: "  discord-cli webhooks get-by-token abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_get.go b/discord-cli/internal/cli/webhooks_get.go
new file mode 100644
index 00000000..2b84f0ba
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_get.go
@@ -0,0 +1,49 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksGetCmd(flags *rootFlags) *cobra.Command {
+
+	cmd := &cobra.Command{
+		Use:   "get <webhook_id>",
+		Short: "Get",
+		Example: "  discord-cli webhooks get abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			params := map[string]string{}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_github.go b/discord-cli/internal/cli/webhooks_github.go
new file mode 100644
index 00000000..efe17a25
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_github.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newWebhooksGithubCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "github",
+		Short: "Manage github",
+	}
+
+	cmd.AddCommand(newWebhooksGithubExecuteCompatibleWebhookCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_github_execute-compatible-webhook.go b/discord-cli/internal/cli/webhooks_github_execute-compatible-webhook.go
new file mode 100644
index 00000000..6c2d6279
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_github_execute-compatible-webhook.go
@@ -0,0 +1,163 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksGithubExecuteCompatibleWebhookCmd(flags *rootFlags) *cobra.Command {
+	var flagWait bool
+	var flagThreadId string
+	var bodyAction string
+	var bodyAnswer string
+	var bodyCheckRun string
+	var bodyCheckSuite string
+	var bodyComment string
+	var bodyCompare string
+	var bodyDiscussion string
+	var bodyForced bool
+	var bodyForkee string
+	var bodyHeadCommit string
+	var bodyIssue string
+	var bodyMember string
+	var bodyPullRequest string
+	var bodyRef string
+	var bodyRefType string
+	var bodyRelease string
+	var bodyRepository string
+	var bodyReview string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "execute-compatible-webhook <webhook_id> <webhook_token>",
+		Aliases: []string{"create"},
+		Short: "Execute compatible webhook",
+		Example: "  discord-cli webhooks github execute-compatible-webhook abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}/github"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAction != "" {
+					body["action"] = bodyAction
+				}
+				if bodyAnswer != "" {
+					body["answer"] = bodyAnswer
+				}
+				if bodyCheckRun != "" {
+					body["check_run"] = bodyCheckRun
+				}
+				if bodyCheckSuite != "" {
+					body["check_suite"] = bodyCheckSuite
+				}
+				if bodyComment != "" {
+					body["comment"] = bodyComment
+				}
+				if bodyCompare != "" {
+					body["compare"] = bodyCompare
+				}
+				if bodyDiscussion != "" {
+					body["discussion"] = bodyDiscussion
+				}
+				if bodyForced != false {
+					body["forced"] = bodyForced
+				}
+				if bodyForkee != "" {
+					body["forkee"] = bodyForkee
+				}
+				if bodyHeadCommit != "" {
+					body["head_commit"] = bodyHeadCommit
+				}
+				if bodyIssue != "" {
+					body["issue"] = bodyIssue
+				}
+				if bodyMember != "" {
+					body["member"] = bodyMember
+				}
+				if bodyPullRequest != "" {
+					body["pull_request"] = bodyPullRequest
+				}
+				if bodyRef != "" {
+					body["ref"] = bodyRef
+				}
+				if bodyRefType != "" {
+					body["ref_type"] = bodyRefType
+				}
+				if bodyRelease != "" {
+					body["release"] = bodyRelease
+				}
+				if bodyRepository != "" {
+					body["repository"] = bodyRepository
+				}
+				if bodyReview != "" {
+					body["review"] = bodyReview
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWait, "wait", false, "Wait")
+	cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+	cmd.Flags().StringVar(&bodyAction, "action", "", "Action")
+	cmd.Flags().StringVar(&bodyAnswer, "answer", "", "Answer")
+	cmd.Flags().StringVar(&bodyCheckRun, "check-run", "", "Check run")
+	cmd.Flags().StringVar(&bodyCheckSuite, "check-suite", "", "Check suite")
+	cmd.Flags().StringVar(&bodyComment, "comment", "", "Comment")
+	cmd.Flags().StringVar(&bodyCompare, "compare", "", "Compare")
+	cmd.Flags().StringVar(&bodyDiscussion, "discussion", "", "Discussion")
+	cmd.Flags().BoolVar(&bodyForced, "forced", false, "Forced")
+	cmd.Flags().StringVar(&bodyForkee, "forkee", "", "Forkee")
+	cmd.Flags().StringVar(&bodyHeadCommit, "head-commit", "", "Head commit")
+	cmd.Flags().StringVar(&bodyIssue, "issue", "", "Issue")
+	cmd.Flags().StringVar(&bodyMember, "member", "", "Member")
+	cmd.Flags().StringVar(&bodyPullRequest, "pull-request", "", "Pull request")
+	cmd.Flags().StringVar(&bodyRef, "ref", "", "Ref")
+	cmd.Flags().StringVar(&bodyRefType, "ref-type", "", "Ref type")
+	cmd.Flags().StringVar(&bodyRelease, "release", "", "Release")
+	cmd.Flags().StringVar(&bodyRepository, "repository", "", "Repository")
+	cmd.Flags().StringVar(&bodyReview, "review", "", "Review")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages.go b/discord-cli/internal/cli/webhooks_messages.go
new file mode 100644
index 00000000..910ee238
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages.go
@@ -0,0 +1,22 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newWebhooksMessagesCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "messages",
+		Short: "Manage messages",
+	}
+
+	cmd.AddCommand(newWebhooksMessagesDeleteOriginalWebhookCmd(flags))
+	cmd.AddCommand(newWebhooksMessagesDeleteWebhookCmd(flags))
+	cmd.AddCommand(newWebhooksMessagesGetOriginalWebhookCmd(flags))
+	cmd.AddCommand(newWebhooksMessagesGetWebhookCmd(flags))
+	cmd.AddCommand(newWebhooksMessagesUpdateOriginalWebhookCmd(flags))
+	cmd.AddCommand(newWebhooksMessagesUpdateWebhookCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_delete-original-webhook.go b/discord-cli/internal/cli/webhooks_messages_delete-original-webhook.go
new file mode 100644
index 00000000..aa882aea
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_delete-original-webhook.go
@@ -0,0 +1,55 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksMessagesDeleteOriginalWebhookCmd(flags *rootFlags) *cobra.Command {
+	var flagThreadId string
+
+	cmd := &cobra.Command{
+		Use:   "delete-original-webhook <webhook_id> <webhook_token>",
+		Aliases: []string{"delete"},
+		Short: "Delete original webhook",
+		Example: "  discord-cli webhooks messages delete-original-webhook abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}/messages/@original"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_delete-webhook.go b/discord-cli/internal/cli/webhooks_messages_delete-webhook.go
new file mode 100644
index 00000000..72fad912
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_delete-webhook.go
@@ -0,0 +1,58 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksMessagesDeleteWebhookCmd(flags *rootFlags) *cobra.Command {
+	var flagThreadId string
+
+	cmd := &cobra.Command{
+		Use:   "delete-webhook <webhook_id> <webhook_token> <message_id>",
+		Short: "Delete webhook",
+		Example: "  discord-cli webhooks messages delete-webhook abc123 value abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}/messages/{message_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[2])
+			data, err := c.Delete(path)
+			if err != nil {
+				return classifyDeleteError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_get-original-webhook.go b/discord-cli/internal/cli/webhooks_messages_get-original-webhook.go
new file mode 100644
index 00000000..bbaf2d0c
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_get-original-webhook.go
@@ -0,0 +1,59 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksMessagesGetOriginalWebhookCmd(flags *rootFlags) *cobra.Command {
+	var flagThreadId string
+
+	cmd := &cobra.Command{
+		Use:   "get-original-webhook <webhook_id> <webhook_token>",
+		Aliases: []string{"get"},
+		Short: "Get original webhook",
+		Example: "  discord-cli webhooks messages get-original-webhook abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}/messages/@original"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			params := map[string]string{}
+			if flagThreadId != "" {
+				params["thread_id"] = fmt.Sprintf("%v", flagThreadId)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_get-webhook.go b/discord-cli/internal/cli/webhooks_messages_get-webhook.go
new file mode 100644
index 00000000..401f5758
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_get-webhook.go
@@ -0,0 +1,62 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksMessagesGetWebhookCmd(flags *rootFlags) *cobra.Command {
+	var flagThreadId string
+
+	cmd := &cobra.Command{
+		Use:   "get-webhook <webhook_id> <webhook_token> <message_id>",
+		Short: "Get webhook",
+		Example: "  discord-cli webhooks messages get-webhook abc123 value abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}/messages/{message_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[2])
+			params := map[string]string{}
+			if flagThreadId != "" {
+				params["thread_id"] = fmt.Sprintf("%v", flagThreadId)
+			}
+			data, err := c.Get(path, params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_update-original-webhook.go b/discord-cli/internal/cli/webhooks_messages_update-original-webhook.go
new file mode 100644
index 00000000..b424e433
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_update-original-webhook.go
@@ -0,0 +1,93 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksMessagesUpdateOriginalWebhookCmd(flags *rootFlags) *cobra.Command {
+	var flagThreadId string
+	var flagWithComponents bool
+	var bodyAllowedMentions string
+	var bodyContent string
+	var bodyFlags int
+	var bodyPoll string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-original-webhook <webhook_id> <webhook_token>",
+		Aliases: []string{"update"},
+		Short: "Update original webhook",
+		Example: "  discord-cli webhooks messages update-original-webhook abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}/messages/@original"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAllowedMentions != "" {
+					body["allowed_mentions"] = bodyAllowedMentions
+				}
+				if bodyContent != "" {
+					body["content"] = bodyContent
+				}
+				if bodyFlags != 0 {
+					body["flags"] = bodyFlags
+				}
+				if bodyPoll != "" {
+					body["poll"] = bodyPoll
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+	cmd.Flags().BoolVar(&flagWithComponents, "with-components", false, "With components")
+	cmd.Flags().StringVar(&bodyAllowedMentions, "allowed-mentions", "", "Allowed mentions")
+	cmd.Flags().StringVar(&bodyContent, "content", "", "Content")
+	cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+	cmd.Flags().StringVar(&bodyPoll, "poll", "", "Poll")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_messages_update-webhook.go b/discord-cli/internal/cli/webhooks_messages_update-webhook.go
new file mode 100644
index 00000000..2aaed736
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_messages_update-webhook.go
@@ -0,0 +1,96 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksMessagesUpdateWebhookCmd(flags *rootFlags) *cobra.Command {
+	var flagThreadId string
+	var flagWithComponents bool
+	var bodyAllowedMentions string
+	var bodyContent string
+	var bodyFlags int
+	var bodyPoll string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-webhook <webhook_id> <webhook_token> <message_id>",
+		Short: "Update webhook",
+		Example: "  discord-cli webhooks messages update-webhook abc123 value abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}/messages/{message_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			if len(args) < 3 {
+				return usageErr(fmt.Errorf("message_id is required"))
+			}
+			path = replacePathParam(path, "message_id", args[2])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAllowedMentions != "" {
+					body["allowed_mentions"] = bodyAllowedMentions
+				}
+				if bodyContent != "" {
+					body["content"] = bodyContent
+				}
+				if bodyFlags != 0 {
+					body["flags"] = bodyFlags
+				}
+				if bodyPoll != "" {
+					body["poll"] = bodyPoll
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+	cmd.Flags().BoolVar(&flagWithComponents, "with-components", false, "With components")
+	cmd.Flags().StringVar(&bodyAllowedMentions, "allowed-mentions", "", "Allowed mentions")
+	cmd.Flags().StringVar(&bodyContent, "content", "", "Content")
+	cmd.Flags().IntVar(&bodyFlags, "flags", 0, "Flags")
+	cmd.Flags().StringVar(&bodyPoll, "poll", "", "Poll")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_slack.go b/discord-cli/internal/cli/webhooks_slack.go
new file mode 100644
index 00000000..98da2834
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_slack.go
@@ -0,0 +1,17 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"github.com/spf13/cobra"
+)
+
+func newWebhooksSlackCmd(flags *rootFlags) *cobra.Command {
+	cmd := &cobra.Command{
+		Use:   "slack",
+		Short: "Manage slack",
+	}
+
+	cmd.AddCommand(newWebhooksSlackExecuteCompatibleWebhookCmd(flags))
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_slack_execute-compatible-webhook.go b/discord-cli/internal/cli/webhooks_slack_execute-compatible-webhook.go
new file mode 100644
index 00000000..6ac52c32
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_slack_execute-compatible-webhook.go
@@ -0,0 +1,88 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksSlackExecuteCompatibleWebhookCmd(flags *rootFlags) *cobra.Command {
+	var flagWait bool
+	var flagThreadId string
+	var bodyIconUrl string
+	var bodyText string
+	var bodyUsername string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "execute-compatible-webhook <webhook_id> <webhook_token>",
+		Aliases: []string{"create"},
+		Short: "Execute compatible webhook",
+		Example: "  discord-cli webhooks slack execute-compatible-webhook abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}/slack"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyIconUrl != "" {
+					body["icon_url"] = bodyIconUrl
+				}
+				if bodyText != "" {
+					body["text"] = bodyText
+				}
+				if bodyUsername != "" {
+					body["username"] = bodyUsername
+				}
+			}
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().BoolVar(&flagWait, "wait", false, "Wait")
+	cmd.Flags().StringVar(&flagThreadId, "thread-id", "", "Thread id")
+	cmd.Flags().StringVar(&bodyIconUrl, "icon-url", "", "Icon url")
+	cmd.Flags().StringVar(&bodyText, "text", "", "Text")
+	cmd.Flags().StringVar(&bodyUsername, "username", "", "Username")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_update-by-token.go b/discord-cli/internal/cli/webhooks_update-by-token.go
new file mode 100644
index 00000000..eba610e2
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_update-by-token.go
@@ -0,0 +1,78 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksUpdateByTokenCmd(flags *rootFlags) *cobra.Command {
+	var bodyAvatar string
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update-by-token <webhook_id> <webhook_token>",
+		Short: "Update by token",
+		Example: "  discord-cli webhooks update-by-token abc123 value",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}/{webhook_token}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			if len(args) < 2 {
+				return usageErr(fmt.Errorf("webhook_token is required"))
+			}
+			path = replacePathParam(path, "webhook_token", args[1])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAvatar != "" {
+					body["avatar"] = bodyAvatar
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAvatar, "avatar", "", "Avatar")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/webhooks_update.go b/discord-cli/internal/cli/webhooks_update.go
new file mode 100644
index 00000000..f43d3bd0
--- /dev/null
+++ b/discord-cli/internal/cli/webhooks_update.go
@@ -0,0 +1,79 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/spf13/cobra"
+)
+
+var _ = strings.ReplaceAll // ensure import
+var _ = fmt.Sprintf        // ensure import
+var _ = io.ReadAll         // ensure import
+var _ = os.Stdin           // ensure import
+var _ json.RawMessage      // ensure import
+
+func newWebhooksUpdateCmd(flags *rootFlags) *cobra.Command {
+	var bodyAvatar string
+	var bodyChannelId string
+	var bodyName string
+	var stdinBody bool
+
+	cmd := &cobra.Command{
+		Use:   "update <webhook_id>",
+		Short: "Update",
+		Example: "  discord-cli webhooks update abc123",
+		RunE: func(cmd *cobra.Command, args []string) error {
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			path := "/webhooks/{webhook_id}"
+			if len(args) < 1 {
+				return usageErr(fmt.Errorf("webhook_id is required"))
+			}
+			path = replacePathParam(path, "webhook_id", args[0])
+			var body map[string]any
+			if stdinBody {
+				stdinData, err := io.ReadAll(os.Stdin)
+				if err != nil {
+					return fmt.Errorf("reading stdin: %w", err)
+				}
+				var jsonBody map[string]any
+				if err := json.Unmarshal(stdinData, &jsonBody); err != nil {
+					return fmt.Errorf("parsing stdin JSON: %w", err)
+				}
+				body = jsonBody
+			} else {
+				body = map[string]any{}
+				if bodyAvatar != "" {
+					body["avatar"] = bodyAvatar
+				}
+				if bodyChannelId != "" {
+					body["channel_id"] = bodyChannelId
+				}
+				if bodyName != "" {
+					body["name"] = bodyName
+				}
+			}
+			data, err := c.Patch(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			return printOutput(cmd.OutOrStdout(), data, flags.asJSON)
+		},
+	}
+	cmd.Flags().StringVar(&bodyAvatar, "avatar", "", "Avatar")
+	cmd.Flags().StringVar(&bodyChannelId, "channel-id", "", "Channel id")
+	cmd.Flags().StringVar(&bodyName, "name", "", "Name")
+	cmd.Flags().BoolVar(&stdinBody, "stdin", false, "Read request body as JSON from stdin")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_audit_report.go b/discord-cli/internal/cli/workflow_audit_report.go
new file mode 100644
index 00000000..cdaeee58
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_audit_report.go
@@ -0,0 +1,139 @@
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"sort"
+
+	"github.com/spf13/cobra"
+)
+
+func newAuditReportCmd(flags *rootFlags) *cobra.Command {
+	var guildID string
+	var actionType string
+	var userID string
+	var limit int
+
+	cmd := &cobra.Command{
+		Use:   "audit-report",
+		Short: "Analyze audit log entries grouped by action type, user, and date",
+		Long: `Fetches the audit log for a guild and produces a summary report.
+Groups entries by action type and user, showing who did what and when.
+Useful for security reviews, moderation tracking, and compliance.
+
+Combines: GET /guilds/{id}/audit-logs with analysis and grouping.`,
+		Example: `  # Full audit report for a guild
+  discord-cli audit-report --guild 123456789012345678
+
+  # Filter by action type (e.g., MEMBER_BAN_ADD=22)
+  discord-cli audit-report --guild 123456789012345678 --action 22
+
+  # Filter by user who performed the action
+  discord-cli audit-report --guild 123456789012345678 --user 987654321098765432
+
+  # JSON output
+  discord-cli audit-report --guild 123456789012345678 --json --limit 100`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if guildID == "" {
+				return usageErr(fmt.Errorf("--guild is required"))
+			}
+
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+			c.NoCache = true
+
+			fmt.Fprintf(os.Stderr, "Fetching audit log for guild %s...\n", guildID)
+			params := map[string]string{"limit": fmt.Sprintf("%d", limit)}
+			if actionType != "" {
+				params["action_type"] = actionType
+			}
+			if userID != "" {
+				params["user_id"] = userID
+			}
+
+			data, err := c.Get(fmt.Sprintf("/guilds/%s/audit-logs", guildID), params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			var auditLog struct {
+				Entries []map[string]any `json:"audit_log_entries"`
+				Users   []map[string]any `json:"users"`
+			}
+			if err := json.Unmarshal(data, &auditLog); err != nil {
+				return fmt.Errorf("parsing audit log: %w", err)
+			}
+
+			// Build user lookup
+			userNames := map[string]string{}
+			for _, u := range auditLog.Users {
+				id := fmt.Sprintf("%v", u["id"])
+				username, _ := u["username"].(string)
+				userNames[id] = username
+			}
+
+			// Group by action type
+			actionCounts := map[string]int{}
+			userActionCounts := map[string]int{}
+			for _, entry := range auditLog.Entries {
+				action := fmt.Sprintf("%v", entry["action_type"])
+				actionCounts[action]++
+
+				uid := fmt.Sprintf("%v", entry["user_id"])
+				name := userNames[uid]
+				if name == "" {
+					name = uid
+				}
+				userActionCounts[name]++
+			}
+
+			if flags.asJSON {
+				result := map[string]any{
+					"guild_id":      guildID,
+					"total_entries": len(auditLog.Entries),
+					"by_action":     actionCounts,
+					"by_user":       userActionCounts,
+					"entries":       auditLog.Entries,
+				}
+				enc := json.NewEncoder(os.Stdout)
+				enc.SetIndent("", "  ")
+				return enc.Encode(result)
+			}
+
+			fmt.Printf("\nAudit Report (guild: %s, %d entries)\n\n", guildID, len(auditLog.Entries))
+
+			fmt.Println("By Action Type:")
+			printSortedCounts(actionCounts)
+
+			fmt.Println("\nBy User:")
+			printSortedCounts(userActionCounts)
+
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID (required)")
+	cmd.Flags().StringVar(&actionType, "action", "", "Filter by action type number")
+	cmd.Flags().StringVar(&userID, "user", "", "Filter by user ID who performed the action")
+	cmd.Flags().IntVar(&limit, "limit", 50, "Maximum audit log entries to fetch")
+
+	return cmd
+}
+
+func printSortedCounts(counts map[string]int) {
+	type kv struct {
+		Key   string
+		Count int
+	}
+	var sorted []kv
+	for k, v := range counts {
+		sorted = append(sorted, kv{k, v})
+	}
+	sort.Slice(sorted, func(i, j int) bool { return sorted[i].Count > sorted[j].Count })
+	for _, item := range sorted {
+		fmt.Printf("  %-40s %d\n", item.Key, item.Count)
+	}
+}
diff --git a/discord-cli/internal/cli/workflow_channel_health.go b/discord-cli/internal/cli/workflow_channel_health.go
new file mode 100644
index 00000000..ec6b1cb7
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_channel_health.go
@@ -0,0 +1,167 @@
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"sort"
+	"time"
+
+	"github.com/spf13/cobra"
+)
+
+type channelHealthReport struct {
+	ID          string `json:"id"`
+	Name        string `json:"name"`
+	RecentCount int    `json:"recent_messages"`
+	LastMessage string `json:"last_message_at"`
+	Stale       bool   `json:"stale"`
+	DaysSilent  int    `json:"days_silent"`
+}
+
+func newChannelHealthCmd(flags *rootFlags) *cobra.Command {
+	var guildID string
+	var days int
+
+	cmd := &cobra.Command{
+		Use:   "channel-health",
+		Short: "Detect stale channels and show activity trends across a guild",
+		Long: `Fetches all text channels in a guild, samples recent messages from each,
+and reports activity levels. Identifies stale channels (no messages in N days)
+and ranks channels by message volume. Useful for server cleanup and understanding
+where your community is most active.
+
+Combines: GET /guilds/{id}/channels + GET /channels/{id}/messages for each channel.`,
+		Example: `  # Check channel health for a guild (default: 30 days)
+  discord-cli channel-health --guild 123456789012345678
+
+  # Check with custom staleness threshold
+  discord-cli channel-health --guild 123456789012345678 --days 14
+
+  # JSON output for agent consumption
+  discord-cli channel-health --guild 123456789012345678 --json`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if guildID == "" {
+				return usageErr(fmt.Errorf("--guild is required"))
+			}
+
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+			c.NoCache = true
+
+			fmt.Fprintf(os.Stderr, "Fetching channels for guild %s...\n", guildID)
+			channelsData, err := c.Get(fmt.Sprintf("/guilds/%s/channels", guildID), nil)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			var channels []map[string]any
+			if err := json.Unmarshal(channelsData, &channels); err != nil {
+				return fmt.Errorf("parsing channels: %w", err)
+			}
+
+			var textChannels []map[string]any
+			for _, ch := range channels {
+				chType, _ := ch["type"].(float64)
+				if chType == 0 || chType == 5 {
+					textChannels = append(textChannels, ch)
+				}
+			}
+
+			fmt.Fprintf(os.Stderr, "Found %d text channels. Sampling messages...\n", len(textChannels))
+			cutoff := time.Now().AddDate(0, 0, -days)
+
+			var reports []channelHealthReport
+
+			for _, ch := range textChannels {
+				chID := fmt.Sprintf("%v", ch["id"])
+				chName, _ := ch["name"].(string)
+
+				params := map[string]string{"limit": "5"}
+				msgData, err := c.Get(fmt.Sprintf("/channels/%s/messages", chID), params)
+				if err != nil {
+					fmt.Fprintf(os.Stderr, "  #%s: skipped (access denied or error)\n", chName)
+					continue
+				}
+
+				var messages []map[string]any
+				if err := json.Unmarshal(msgData, &messages); err != nil {
+					continue
+				}
+
+				report := channelHealthReport{ID: chID, Name: chName}
+
+				if len(messages) == 0 {
+					report.Stale = true
+					report.DaysSilent = days
+				} else {
+					if ts, ok := messages[0]["timestamp"].(string); ok {
+						if t, err := time.Parse(time.RFC3339, ts); err == nil {
+							report.LastMessage = ts
+							report.DaysSilent = int(time.Since(t).Hours() / 24)
+							report.Stale = t.Before(cutoff)
+						}
+					}
+					for _, msg := range messages {
+						if ts, ok := msg["timestamp"].(string); ok {
+							if t, err := time.Parse(time.RFC3339, ts); err == nil && t.After(cutoff) {
+								report.RecentCount++
+							}
+						}
+					}
+				}
+				reports = append(reports, report)
+			}
+
+			sort.Slice(reports, func(i, j int) bool {
+				if reports[i].Stale != reports[j].Stale {
+					return !reports[i].Stale
+				}
+				return reports[i].RecentCount > reports[j].RecentCount
+			})
+
+			staleCount := 0
+			for _, r := range reports {
+				if r.Stale {
+					staleCount++
+				}
+			}
+
+			if flags.asJSON {
+				result := map[string]any{
+					"guild_id":        guildID,
+					"threshold_days":  days,
+					"total_channels":  len(reports),
+					"stale_channels":  staleCount,
+					"active_channels": len(reports) - staleCount,
+					"channels":        reports,
+				}
+				enc := json.NewEncoder(os.Stdout)
+				enc.SetIndent("", "  ")
+				return enc.Encode(result)
+			}
+
+			fmt.Printf("\nChannel Health Report (guild: %s, threshold: %d days)\n", guildID, days)
+			fmt.Printf("%-30s  %8s  %12s  %s\n", "CHANNEL", "RECENT", "DAYS SILENT", "STATUS")
+			fmt.Printf("%-30s  %8s  %12s  %s\n", "-------", "------", "-----------", "------")
+			for _, r := range reports {
+				status := green("active")
+				if r.Stale {
+					status = red("STALE")
+				}
+				fmt.Printf("%-30s  %8d  %12d  %s\n", "#"+r.Name, r.RecentCount, r.DaysSilent, status)
+			}
+			fmt.Printf("\nTotal: %d channels (%d active, %d stale)\n",
+				len(reports), len(reports)-staleCount, staleCount)
+
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID (required)")
+	cmd.Flags().IntVar(&days, "days", 30, "Number of days to consider a channel stale")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_member_report.go b/discord-cli/internal/cli/workflow_member_report.go
new file mode 100644
index 00000000..f6ee2c3d
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_member_report.go
@@ -0,0 +1,134 @@
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"sort"
+
+	"github.com/spf13/cobra"
+)
+
+func newMemberReportCmd(flags *rootFlags) *cobra.Command {
+	var guildID string
+	var maxMembers int
+
+	cmd := &cobra.Command{
+		Use:   "member-report",
+		Short: "Analyze member roles, join dates, and activity across a guild",
+		Long: `Fetches guild members and produces a report showing role distribution,
+join date timeline, and member counts per role. Useful for understanding
+your community composition and identifying role bloat.
+
+Combines: GET /guilds/{id}/members + GET /guilds/{id}/roles.`,
+		Example: `  # Member report for a guild
+  discord-cli member-report --guild 123456789012345678
+
+  # Fetch more members (default: 100)
+  discord-cli member-report --guild 123456789012345678 --max 500
+
+  # JSON output
+  discord-cli member-report --guild 123456789012345678 --json`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if guildID == "" {
+				return usageErr(fmt.Errorf("--guild is required"))
+			}
+
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+			c.NoCache = true
+
+			// Fetch roles
+			fmt.Fprintf(os.Stderr, "Fetching roles...\n")
+			rolesData, err := c.Get(fmt.Sprintf("/guilds/%s/roles", guildID), nil)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+			var roles []map[string]any
+			json.Unmarshal(rolesData, &roles)
+
+			roleNames := map[string]string{}
+			for _, r := range roles {
+				id := fmt.Sprintf("%v", r["id"])
+				name, _ := r["name"].(string)
+				roleNames[id] = name
+			}
+
+			// Fetch members
+			fmt.Fprintf(os.Stderr, "Fetching members (max %d)...\n", maxMembers)
+			params := map[string]string{"limit": fmt.Sprintf("%d", maxMembers)}
+			membersData, err := c.Get(fmt.Sprintf("/guilds/%s/members", guildID), params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			var members []map[string]any
+			if err := json.Unmarshal(membersData, &members); err != nil {
+				return fmt.Errorf("parsing members: %w", err)
+			}
+
+			// Count members per role
+			roleCounts := map[string]int{}
+			botCount := 0
+			for _, m := range members {
+				user, _ := m["user"].(map[string]any)
+				if user != nil {
+					if bot, ok := user["bot"].(bool); ok && bot {
+						botCount++
+					}
+				}
+				if roleIDs, ok := m["roles"].([]any); ok {
+					for _, rid := range roleIDs {
+						roleID := fmt.Sprintf("%v", rid)
+						name := roleNames[roleID]
+						if name == "" {
+							name = roleID
+						}
+						roleCounts[name]++
+					}
+				}
+			}
+
+			if flags.asJSON {
+				result := map[string]any{
+					"guild_id":      guildID,
+					"total_members": len(members),
+					"bot_count":     botCount,
+					"human_count":   len(members) - botCount,
+					"total_roles":   len(roles),
+					"role_counts":   roleCounts,
+				}
+				enc := json.NewEncoder(os.Stdout)
+				enc.SetIndent("", "  ")
+				return enc.Encode(result)
+			}
+
+			fmt.Printf("\nMember Report (guild: %s)\n\n", guildID)
+			fmt.Printf("Total Members: %d (%d humans, %d bots)\n", len(members), len(members)-botCount, botCount)
+			fmt.Printf("Total Roles: %d\n\n", len(roles))
+
+			fmt.Println("Members per Role:")
+			type kv struct {
+				Role  string
+				Count int
+			}
+			var sorted []kv
+			for k, v := range roleCounts {
+				sorted = append(sorted, kv{k, v})
+			}
+			sort.Slice(sorted, func(i, j int) bool { return sorted[i].Count > sorted[j].Count })
+			for _, item := range sorted {
+				fmt.Printf("  %-30s %d members\n", item.Role, item.Count)
+			}
+
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID (required)")
+	cmd.Flags().IntVar(&maxMembers, "max", 100, "Maximum members to fetch")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_message_stats.go b/discord-cli/internal/cli/workflow_message_stats.go
new file mode 100644
index 00000000..d1f6366c
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_message_stats.go
@@ -0,0 +1,173 @@
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"sort"
+	"time"
+
+	"github.com/spf13/cobra"
+)
+
+func newMessageStatsCmd(flags *rootFlags) *cobra.Command {
+	var guildID string
+	var channelID string
+	var limit int
+
+	cmd := &cobra.Command{
+		Use:   "message-stats",
+		Short: "Show message volume and top contributors for a channel or guild",
+		Long: `Fetches recent messages and calculates statistics including message
+count per author, average message length, and activity by hour of day.
+Can analyze a single channel or sample across all text channels in a guild.
+
+Combines: GET /guilds/{id}/channels + GET /channels/{id}/messages with analysis.`,
+		Example: `  # Stats for a specific channel
+  discord-cli message-stats --channel 123456789012345678 --limit 100
+
+  # Stats across all channels in a guild (samples 20 messages per channel)
+  discord-cli message-stats --guild 123456789012345678
+
+  # JSON output
+  discord-cli message-stats --channel 123456789012345678 --json`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if guildID == "" && channelID == "" {
+				return usageErr(fmt.Errorf("--guild or --channel is required"))
+			}
+
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+			c.NoCache = true
+
+			var allMessages []map[string]any
+
+			if channelID != "" {
+				// Single channel mode
+				fmt.Fprintf(os.Stderr, "Fetching messages from channel %s...\n", channelID)
+				params := map[string]string{"limit": fmt.Sprintf("%d", limit)}
+				data, err := c.Get(fmt.Sprintf("/channels/%s/messages", channelID), params)
+				if err != nil {
+					return classifyAPIError(err)
+				}
+				json.Unmarshal(data, &allMessages)
+			} else {
+				// Guild mode - sample all channels
+				fmt.Fprintf(os.Stderr, "Fetching channels for guild %s...\n", guildID)
+				chData, err := c.Get(fmt.Sprintf("/guilds/%s/channels", guildID), nil)
+				if err != nil {
+					return classifyAPIError(err)
+				}
+				var channels []map[string]any
+				json.Unmarshal(chData, &channels)
+
+				for _, ch := range channels {
+					chType, _ := ch["type"].(float64)
+					if chType != 0 && chType != 5 {
+						continue
+					}
+					chID := fmt.Sprintf("%v", ch["id"])
+					params := map[string]string{"limit": "20"}
+					data, err := c.Get(fmt.Sprintf("/channels/%s/messages", chID), params)
+					if err != nil {
+						continue
+					}
+					var msgs []map[string]any
+					json.Unmarshal(data, &msgs)
+					allMessages = append(allMessages, msgs...)
+				}
+			}
+
+			// Analyze
+			authorCounts := map[string]int{}
+			hourCounts := map[int]int{}
+			totalLen := 0
+
+			for _, msg := range allMessages {
+				if author, ok := msg["author"].(map[string]any); ok {
+					name, _ := author["username"].(string)
+					if name == "" {
+						name = fmt.Sprintf("%v", author["id"])
+					}
+					authorCounts[name]++
+				}
+				if content, ok := msg["content"].(string); ok {
+					totalLen += len(content)
+				}
+				if ts, ok := msg["timestamp"].(string); ok {
+					if t, err := time.Parse(time.RFC3339, ts); err == nil {
+						hourCounts[t.Hour()]++
+					}
+				}
+			}
+
+			avgLen := 0
+			if len(allMessages) > 0 {
+				avgLen = totalLen / len(allMessages)
+			}
+
+			if flags.asJSON {
+				result := map[string]any{
+					"total_messages": len(allMessages),
+					"avg_length":     avgLen,
+					"by_author":      authorCounts,
+					"by_hour":        hourCounts,
+				}
+				enc := json.NewEncoder(os.Stdout)
+				enc.SetIndent("", "  ")
+				return enc.Encode(result)
+			}
+
+			fmt.Printf("\nMessage Stats (%d messages)\n\n", len(allMessages))
+			fmt.Printf("Average message length: %d chars\n\n", avgLen)
+
+			fmt.Println("Top Contributors:")
+			type kv struct {
+				Name  string
+				Count int
+			}
+			var sorted []kv
+			for k, v := range authorCounts {
+				sorted = append(sorted, kv{k, v})
+			}
+			sort.Slice(sorted, func(i, j int) bool { return sorted[i].Count > sorted[j].Count })
+			topN := 15
+			if len(sorted) < topN {
+				topN = len(sorted)
+			}
+			for _, item := range sorted[:topN] {
+				fmt.Printf("  %-25s %d messages\n", item.Name, item.Count)
+			}
+
+			fmt.Println("\nActivity by Hour (UTC):")
+			for h := 0; h < 24; h++ {
+				bar := ""
+				count := hourCounts[h]
+				maxCount := 1
+				for _, v := range hourCounts {
+					if v > maxCount {
+						maxCount = v
+					}
+				}
+				barLen := 0
+				if maxCount > 0 {
+					barLen = count * 30 / maxCount
+				}
+				for i := 0; i < barLen; i++ {
+					bar += "#"
+				}
+				fmt.Printf("  %02d:00  %3d  %s\n", h, count, bar)
+			}
+
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID")
+	cmd.Flags().StringVar(&channelID, "channel", "", "Channel ID (for single-channel mode)")
+	cmd.Flags().IntVar(&limit, "limit", 50, "Maximum messages to fetch per channel")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_prune_preview.go b/discord-cli/internal/cli/workflow_prune_preview.go
new file mode 100644
index 00000000..cadee1da
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_prune_preview.go
@@ -0,0 +1,90 @@
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+
+	"github.com/spf13/cobra"
+)
+
+func newPrunePreviewCmd(flags *rootFlags) *cobra.Command {
+	var guildID string
+	var days int
+	var roles string
+
+	cmd := &cobra.Command{
+		Use:   "prune-preview",
+		Short: "Preview how many members would be pruned without executing",
+		Long: `Checks how many members would be removed by a prune operation
+without actually executing it. Shows the count of members who have not
+been active in N days. Always a dry-run - never modifies the guild.
+
+Uses: GET /guilds/{id}/prune?days=N (preview only, never POST).`,
+		Example: `  # Preview 7-day prune
+  discord-cli prune-preview --guild 123456789012345678 --days 7
+
+  # Preview 30-day prune with role filter
+  discord-cli prune-preview --guild 123456789012345678 --days 30 --roles 111222333444555666
+
+  # JSON output
+  discord-cli prune-preview --guild 123456789012345678 --days 7 --json`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if guildID == "" {
+				return usageErr(fmt.Errorf("--guild is required"))
+			}
+
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			fmt.Fprintf(os.Stderr, "Checking prune count for guild %s (inactive %d+ days)...\n", guildID, days)
+
+			params := map[string]string{"days": fmt.Sprintf("%d", days)}
+			if roles != "" {
+				params["include_roles"] = roles
+			}
+
+			data, err := c.Get(fmt.Sprintf("/guilds/%s/prune", guildID), params)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			var result struct {
+				Pruned int `json:"pruned"`
+			}
+			if err := json.Unmarshal(data, &result); err != nil {
+				return fmt.Errorf("parsing response: %w", err)
+			}
+
+			if flags.asJSON {
+				output := map[string]any{
+					"guild_id":       guildID,
+					"days_inactive":  days,
+					"would_prune":    result.Pruned,
+					"preview_only":   true,
+				}
+				enc := json.NewEncoder(os.Stdout)
+				enc.SetIndent("", "  ")
+				return enc.Encode(output)
+			}
+
+			if result.Pruned == 0 {
+				fmt.Printf("No members would be pruned (all active within %d days)\n", days)
+			} else {
+				fmt.Printf("%s %d members would be pruned (inactive %d+ days)\n",
+					yellow("WARNING:"), result.Pruned, days)
+				fmt.Println("This is a preview only. No members were removed.")
+			}
+
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID (required)")
+	cmd.Flags().IntVar(&days, "days", 7, "Number of days of inactivity")
+	cmd.Flags().StringVar(&roles, "roles", "", "Comma-separated role IDs to include in prune count")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_server_snapshot.go b/discord-cli/internal/cli/workflow_server_snapshot.go
new file mode 100644
index 00000000..91a2fe06
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_server_snapshot.go
@@ -0,0 +1,110 @@
+package cli
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"time"
+
+	"github.com/spf13/cobra"
+)
+
+func newServerSnapshotCmd(flags *rootFlags) *cobra.Command {
+	var guildID string
+	var outputFile string
+
+	cmd := &cobra.Command{
+		Use:   "server-snapshot",
+		Short: "Backup guild configuration (roles, channels, emojis) to JSON",
+		Long: `Creates a complete snapshot of a guild's configuration including roles,
+channels, emojis, and guild settings. Exports to a JSON file that can be
+used for backup, migration planning, or configuration diffing.
+
+Combines: GET /guilds/{id} + GET /guilds/{id}/channels + GET /guilds/{id}/roles + GET /guilds/{id}/emojis.`,
+		Example: `  # Snapshot to file
+  discord-cli server-snapshot --guild 123456789012345678 -o backup.json
+
+  # Snapshot to stdout as JSON
+  discord-cli server-snapshot --guild 123456789012345678 --json
+
+  # Snapshot with dry-run to see what would be fetched
+  discord-cli server-snapshot --guild 123456789012345678 --dry-run`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if guildID == "" {
+				return usageErr(fmt.Errorf("--guild is required"))
+			}
+
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+			c.NoCache = true
+
+			snapshot := map[string]any{
+				"snapshot_at": time.Now().UTC().Format(time.RFC3339),
+				"guild_id":    guildID,
+			}
+
+			// Fetch guild info
+			fmt.Fprintf(os.Stderr, "Fetching guild info...\n")
+			guildData, err := c.Get(fmt.Sprintf("/guilds/%s", guildID), map[string]string{"with_counts": "true"})
+			if err != nil {
+				return classifyAPIError(err)
+			}
+			var guild map[string]any
+			json.Unmarshal(guildData, &guild)
+			snapshot["guild"] = guild
+
+			// Fetch channels
+			fmt.Fprintf(os.Stderr, "Fetching channels...\n")
+			channelsData, err := c.Get(fmt.Sprintf("/guilds/%s/channels", guildID), nil)
+			if err != nil {
+				fmt.Fprintf(os.Stderr, "  warning: channels: %v\n", err)
+			} else {
+				var channels []any
+				json.Unmarshal(channelsData, &channels)
+				snapshot["channels"] = channels
+			}
+
+			// Fetch roles
+			fmt.Fprintf(os.Stderr, "Fetching roles...\n")
+			rolesData, err := c.Get(fmt.Sprintf("/guilds/%s/roles", guildID), nil)
+			if err != nil {
+				fmt.Fprintf(os.Stderr, "  warning: roles: %v\n", err)
+			} else {
+				var roles []any
+				json.Unmarshal(rolesData, &roles)
+				snapshot["roles"] = roles
+			}
+
+			// Fetch emojis
+			fmt.Fprintf(os.Stderr, "Fetching emojis...\n")
+			emojisData, err := c.Get(fmt.Sprintf("/guilds/%s/emojis", guildID), nil)
+			if err != nil {
+				fmt.Fprintf(os.Stderr, "  warning: emojis: %v\n", err)
+			} else {
+				var emojis []any
+				json.Unmarshal(emojisData, &emojis)
+				snapshot["emojis"] = emojis
+			}
+
+			result, _ := json.MarshalIndent(snapshot, "", "  ")
+
+			if outputFile != "" {
+				if err := os.WriteFile(outputFile, result, 0o644); err != nil {
+					return fmt.Errorf("writing file: %w", err)
+				}
+				fmt.Fprintf(os.Stderr, "Snapshot saved to %s\n", outputFile)
+				return nil
+			}
+
+			fmt.Fprintln(os.Stdout, string(result))
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&guildID, "guild", "", "Guild (server) ID (required)")
+	cmd.Flags().StringVarP(&outputFile, "output", "o", "", "Output file path (default: stdout)")
+
+	return cmd
+}
diff --git a/discord-cli/internal/cli/workflow_webhook_send.go b/discord-cli/internal/cli/workflow_webhook_send.go
new file mode 100644
index 00000000..e619b120
--- /dev/null
+++ b/discord-cli/internal/cli/workflow_webhook_send.go
@@ -0,0 +1,68 @@
+package cli
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/spf13/cobra"
+)
+
+func newWebhookTestCmd(flags *rootFlags) *cobra.Command {
+	var webhookID string
+	var webhookToken string
+	var message string
+
+	cmd := &cobra.Command{
+		Use:   "webhook-test",
+		Short: "Send a test payload to a Discord webhook",
+		Long: `Sends a test message to a webhook URL to verify it's working.
+Supports plain text and rich embeds. Useful for validating webhook
+integrations before deploying to production.
+
+Uses: POST /webhooks/{id}/{token}.`,
+		Example: `  # Send a simple test message
+  discord-cli webhook-test --id 123456789012345678 --token abcdef123456 --message "Hello from CLI!"
+
+  # Send a rich embed via stdin
+  echo '{"content":"Deploy alert","embeds":[{"title":"Build #42","description":"All tests passed","color":3066993}]}' | discord-cli webhook-test --id 123456789012345678 --token abcdef123456 --stdin
+
+  # Dry run to preview the request
+  discord-cli webhook-test --id 123456789012345678 --token abcdef123456 --message "test" --dry-run`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			if webhookID == "" || webhookToken == "" {
+				return usageErr(fmt.Errorf("--id and --token are required"))
+			}
+
+			c, err := flags.newClient()
+			if err != nil {
+				return err
+			}
+
+			body := map[string]any{"content": message}
+			if message == "" {
+				body["content"] = fmt.Sprintf("Test message from discord-cli (webhook %s)", webhookID)
+			}
+
+			fmt.Fprintf(os.Stderr, "Sending test payload to webhook %s...\n", webhookID)
+
+			path := fmt.Sprintf("/webhooks/%s/%s", webhookID, webhookToken)
+			data, err := c.Post(path, body)
+			if err != nil {
+				return classifyAPIError(err)
+			}
+
+			if flags.asJSON {
+				return printOutput(os.Stdout, data, true)
+			}
+
+			fmt.Fprintln(os.Stdout, green("Webhook test successful!"))
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVar(&webhookID, "id", "", "Webhook ID (required)")
+	cmd.Flags().StringVar(&webhookToken, "token", "", "Webhook token (required)")
+	cmd.Flags().StringVar(&message, "message", "", "Test message content")
+
+	return cmd
+}
diff --git a/discord-cli/internal/client/client.go b/discord-cli/internal/client/client.go
new file mode 100644
index 00000000..a8a91cba
--- /dev/null
+++ b/discord-cli/internal/client/client.go
@@ -0,0 +1,346 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package client
+
+import (
+	"crypto/sha256"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"io"
+	"math"
+	"net/http"
+	"net/url"
+	"os"
+	"path/filepath"
+	"strconv"
+	"strings"
+	"time"
+
+	"github.com/USER/discord-cli/internal/config"
+)
+
+type Client struct {
+	BaseURL    string
+	Config     *config.Config
+	HTTPClient *http.Client
+	DryRun     bool
+	NoCache    bool
+	cacheDir   string
+}
+
+// APIError carries HTTP status information for structured exit codes.
+type APIError struct {
+	Method     string
+	Path       string
+	StatusCode int
+	Body       string
+}
+
+func (e *APIError) Error() string {
+	return fmt.Sprintf("%s %s returned HTTP %d: %s", e.Method, e.Path, e.StatusCode, e.Body)
+}
+
+func New(cfg *config.Config, timeout time.Duration) *Client {
+	homeDir, _ := os.UserHomeDir()
+	cacheDir := filepath.Join(homeDir, ".cache", "discord-cli")
+	return &Client{
+		BaseURL:    strings.TrimRight(cfg.BaseURL, "/"),
+		Config:     cfg,
+		HTTPClient: &http.Client{Timeout: timeout},
+		cacheDir:   cacheDir,
+	}
+}
+
+func (c *Client) Get(path string, params map[string]string) (json.RawMessage, error) {
+	// Check cache for GET requests
+	if !c.NoCache && c.cacheDir != "" {
+		if cached, ok := c.readCache(path, params); ok {
+			return cached, nil
+		}
+	}
+	result, err := c.do("GET", path, params, nil)
+	if err == nil && !c.NoCache && c.cacheDir != "" {
+		c.writeCache(path, params, result)
+	}
+	return result, err
+}
+
+func (c *Client) cacheKey(path string, params map[string]string) string {
+	key := path
+	for k, v := range params {
+		key += k + "=" + v
+	}
+	h := sha256.Sum256([]byte(key))
+	return hex.EncodeToString(h[:8])
+}
+
+func (c *Client) readCache(path string, params map[string]string) (json.RawMessage, bool) {
+	cacheFile := filepath.Join(c.cacheDir, c.cacheKey(path, params)+".json")
+	info, err := os.Stat(cacheFile)
+	if err != nil || time.Since(info.ModTime()) > 5*time.Minute {
+		return nil, false
+	}
+	data, err := os.ReadFile(cacheFile)
+	if err != nil {
+		return nil, false
+	}
+	return json.RawMessage(data), true
+}
+
+func (c *Client) writeCache(path string, params map[string]string, data json.RawMessage) {
+	os.MkdirAll(c.cacheDir, 0o755)
+	cacheFile := filepath.Join(c.cacheDir, c.cacheKey(path, params)+".json")
+	os.WriteFile(cacheFile, []byte(data), 0o644)
+}
+
+func (c *Client) Post(path string, body any) (json.RawMessage, error) {
+	return c.do("POST", path, nil, body)
+}
+
+func (c *Client) Delete(path string) (json.RawMessage, error) {
+	return c.do("DELETE", path, nil, nil)
+}
+
+func (c *Client) Put(path string, body any) (json.RawMessage, error) {
+	return c.do("PUT", path, nil, body)
+}
+
+func (c *Client) Patch(path string, body any) (json.RawMessage, error) {
+	return c.do("PATCH", path, nil, body)
+}
+
+func (c *Client) do(method, path string, params map[string]string, body any) (json.RawMessage, error) {
+	url := c.BaseURL + path
+
+	var bodyBytes []byte
+	if body != nil {
+		b, err := json.Marshal(body)
+		if err != nil {
+			return nil, fmt.Errorf("marshaling body: %w", err)
+		}
+		bodyBytes = b
+	}
+
+	// Build the request for dry-run display or actual execution
+	if c.DryRun {
+		return c.dryRun(method, url, params, bodyBytes)
+	}
+
+	const maxRetries = 3
+	var lastErr error
+
+	for attempt := 0; attempt <= maxRetries; attempt++ {
+		var bodyReader io.Reader
+		if bodyBytes != nil {
+			bodyReader = strings.NewReader(string(bodyBytes))
+		}
+
+		req, err := http.NewRequest(method, url, bodyReader)
+		if err != nil {
+			return nil, fmt.Errorf("creating request: %w", err)
+		}
+
+		authHeader, err := c.authHeader()
+		if err != nil {
+			return nil, err
+		}
+		if authHeader != "" {
+			req.Header.Set("Authorization", authHeader)
+		}
+		if bodyBytes != nil {
+			req.Header.Set("Content-Type", "application/json")
+		}
+		req.Header.Set("User-Agent", "discord-cli/10")
+
+		if params != nil {
+			q := req.URL.Query()
+			for k, v := range params {
+				if v != "" {
+					q.Set(k, v)
+				}
+			}
+			req.URL.RawQuery = q.Encode()
+		}
+
+		resp, err := c.HTTPClient.Do(req)
+		if err != nil {
+			lastErr = fmt.Errorf("%s %s: %w", method, path, err)
+			continue
+		}
+
+		respBody, err := io.ReadAll(resp.Body)
+		resp.Body.Close()
+		if err != nil {
+			return nil, fmt.Errorf("reading response: %w", err)
+		}
+
+		// Success
+		if resp.StatusCode < 400 {
+			return json.RawMessage(respBody), nil
+		}
+
+		apiErr := &APIError{
+			Method:     method,
+			Path:       path,
+			StatusCode: resp.StatusCode,
+			Body:       truncateBody(respBody),
+		}
+
+		// Rate limited - wait and retry
+		if resp.StatusCode == 429 && attempt < maxRetries {
+			wait := retryAfter(resp)
+			fmt.Fprintf(os.Stderr, "rate limited, waiting %s (attempt %d/%d)\n", wait, attempt+1, maxRetries)
+			time.Sleep(wait)
+			lastErr = apiErr
+			continue
+		}
+
+		// Server error - retry with backoff
+		if resp.StatusCode >= 500 && attempt < maxRetries {
+			wait := time.Duration(math.Pow(2, float64(attempt))) * time.Second
+			fmt.Fprintf(os.Stderr, "server error %d, retrying in %s (attempt %d/%d)\n", resp.StatusCode, wait, attempt+1, maxRetries)
+			time.Sleep(wait)
+			lastErr = apiErr
+			continue
+		}
+
+		// Client error or retries exhausted - return the error
+		return nil, apiErr
+	}
+
+	return nil, lastErr
+}
+
+func (c *Client) dryRun(method, url string, params map[string]string, body []byte) (json.RawMessage, error) {
+	fmt.Fprintf(os.Stderr, "%s %s\n", method, url)
+	if params != nil {
+		for k, v := range params {
+			if v != "" {
+				fmt.Fprintf(os.Stderr, "  ?%s=%s\n", k, v)
+			}
+		}
+	}
+	authHeader, err := c.authHeader()
+	if err != nil {
+		return nil, err
+	}
+	if authHeader != "" {
+		// Mask token for safety
+		auth := authHeader
+		if len(auth) > 20 {
+			auth = auth[:15] + "..."
+		}
+		fmt.Fprintf(os.Stderr, "  Authorization: %s\n", auth)
+	}
+	if body != nil {
+		var pretty json.RawMessage
+		if json.Unmarshal(body, &pretty) == nil {
+			enc := json.NewEncoder(os.Stderr)
+			enc.SetIndent("  ", "  ")
+			fmt.Fprintf(os.Stderr, "  Body:\n")
+			enc.Encode(pretty)
+		}
+	}
+	fmt.Fprintf(os.Stderr, "\n(dry run - no request sent)\n")
+	return json.RawMessage(`{"dry_run": true}`), nil
+}
+
+func (c *Client) authHeader() (string, error) {
+	if c.Config == nil {
+		return "", nil
+	}
+	if c.Config.AccessToken != "" && !c.Config.TokenExpiry.IsZero() && time.Now().After(c.Config.TokenExpiry) && c.Config.RefreshToken != "" {
+		if err := c.refreshAccessToken(); err != nil {
+			return "", err
+		}
+	}
+	return c.Config.AuthHeader(), nil
+}
+
+func (c *Client) refreshAccessToken() error {
+	if c.Config == nil {
+		return nil
+	}
+	if c.Config.RefreshToken == "" {
+		return nil
+	}
+
+	tokenURL := "https://discord.com/api/oauth2/token"
+	if tokenURL == "" {
+		return nil
+	}
+
+	params := url.Values{
+		"grant_type":    {"refresh_token"},
+		"refresh_token": {c.Config.RefreshToken},
+		"client_id":     {c.Config.ClientID},
+	}
+	if c.Config.ClientSecret != "" {
+		params.Set("client_secret", c.Config.ClientSecret)
+	}
+
+	resp, err := c.HTTPClient.PostForm(tokenURL, params)
+	if err != nil {
+		return fmt.Errorf("refreshing access token: %w", err)
+	}
+	defer resp.Body.Close()
+
+	if resp.StatusCode >= 400 {
+		body, _ := io.ReadAll(resp.Body)
+		return fmt.Errorf("refreshing access token: HTTP %d: %s", resp.StatusCode, truncateBody(body))
+	}
+
+	var tokenResp struct {
+		AccessToken  string `json:"access_token"`
+		RefreshToken string `json:"refresh_token"`
+		ExpiresIn    int    `json:"expires_in"`
+	}
+	if err := json.NewDecoder(resp.Body).Decode(&tokenResp); err != nil {
+		return fmt.Errorf("parsing refresh response: %w", err)
+	}
+	if tokenResp.AccessToken == "" {
+		return fmt.Errorf("refreshing access token: no access token in response")
+	}
+
+	refreshToken := c.Config.RefreshToken
+	if tokenResp.RefreshToken != "" {
+		refreshToken = tokenResp.RefreshToken
+	}
+
+	expiry := time.Time{}
+	if tokenResp.ExpiresIn > 0 {
+		expiry = time.Now().Add(time.Duration(tokenResp.ExpiresIn) * time.Second)
+	}
+
+	if err := c.Config.SaveTokens(c.Config.ClientID, c.Config.ClientSecret, tokenResp.AccessToken, refreshToken, expiry); err != nil {
+		return fmt.Errorf("saving refreshed token: %w", err)
+	}
+
+	return nil
+}
+
+func retryAfter(resp *http.Response) time.Duration {
+	header := resp.Header.Get("Retry-After")
+	if header == "" {
+		return 5 * time.Second
+	}
+	if seconds, err := strconv.Atoi(header); err == nil {
+		return time.Duration(seconds) * time.Second
+	}
+	if t, err := http.ParseTime(header); err == nil {
+		wait := time.Until(t)
+		if wait > 0 {
+			return wait
+		}
+	}
+	return 5 * time.Second
+}
+
+func truncateBody(b []byte) string {
+	s := string(b)
+	if len(s) > 200 {
+		return s[:200] + "..."
+	}
+	return s
+}
diff --git a/discord-cli/internal/config/config.go b/discord-cli/internal/config/config.go
new file mode 100644
index 00000000..d3c544a8
--- /dev/null
+++ b/discord-cli/internal/config/config.go
@@ -0,0 +1,104 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package config
+
+import (
+	"fmt"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
+
+	"github.com/pelletier/go-toml/v2"
+)
+
+type Config struct {
+	BaseURL        string `toml:"base_url"`
+	AuthHeaderVal  string `toml:"auth_header"`
+	AuthSource     string `toml:"-"`
+	AccessToken    string `toml:"access_token"`
+	RefreshToken   string `toml:"refresh_token"`
+	TokenExpiry    time.Time `toml:"token_expiry"`
+	ClientID       string `toml:"client_id"`
+	ClientSecret   string `toml:"client_secret"`
+	Path           string `toml:"-"`
+	DiscordToken string `toml:"token"`
+}
+
+func Load(configPath string) (*Config, error) {
+	cfg := &Config{
+		BaseURL: "https://discord.com/api/v10",
+	}
+
+	// Resolve config path
+	path := configPath
+	if path == "" {
+		path = os.Getenv("DISCORD_CONFIG")
+	}
+	if path == "" {
+		home, _ := os.UserHomeDir()
+		path = filepath.Join(home, ".config", "discord-cli", "config.toml")
+	}
+	cfg.Path = path
+
+	// Try to load config file
+	data, err := os.ReadFile(path)
+	if err == nil {
+		if err := toml.Unmarshal(data, cfg); err != nil {
+			return nil, fmt.Errorf("parsing config %s: %w", path, err)
+		}
+	}
+
+	// Env var overrides
+	if v := os.Getenv("DISCORD_TOKEN"); v != "" {
+		cfg.DiscordToken = v
+		cfg.AuthSource = "env:DISCORD_TOKEN"
+	}
+
+	return cfg, nil
+}
+
+func (c *Config) AuthHeader() string {
+	if c.AuthHeaderVal != "" {
+		return c.AuthHeaderVal
+	}
+	if c.AccessToken != "" {
+		c.AuthSource = "oauth2"
+		return "Bearer " + c.AccessToken
+	}
+	if c.DiscordToken != "" {
+		return "Bearer " + c.DiscordToken
+	}
+	return ""
+}
+
+func (c *Config) SaveTokens(clientID, clientSecret, accessToken, refreshToken string, expiry time.Time) error {
+	c.ClientID = clientID
+	c.ClientSecret = clientSecret
+	c.AccessToken = accessToken
+	c.RefreshToken = refreshToken
+	c.TokenExpiry = expiry
+	return c.save()
+}
+
+func (c *Config) ClearTokens() error {
+	c.AccessToken = ""
+	c.RefreshToken = ""
+	c.TokenExpiry = time.Time{}
+	return c.save()
+}
+
+func (c *Config) save() error {
+	dir := filepath.Dir(c.Path)
+	if err := os.MkdirAll(dir, 0o700); err != nil {
+		return fmt.Errorf("creating config dir: %w", err)
+	}
+	data, err := toml.Marshal(c)
+	if err != nil {
+		return fmt.Errorf("marshaling config: %w", err)
+	}
+	return os.WriteFile(c.Path, data, 0o600)
+}
+
+// Ensure strings import is used
+var _ = strings.ReplaceAll
diff --git a/discord-cli/internal/store/store.go b/discord-cli/internal/store/store.go
new file mode 100644
index 00000000..6d24278f
--- /dev/null
+++ b/discord-cli/internal/store/store.go
@@ -0,0 +1,277 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+// Package store provides local SQLite persistence for discord-cli.
+// Uses modernc.org/sqlite (pure Go, no CGO) for zero-dependency cross-compilation.
+// FTS5 full-text search indexes are created for searchable content.
+package store
+
+import (
+	"database/sql"
+	"encoding/json"
+	"fmt"
+	"os"
+	"path/filepath"
+	"time"
+
+	_ "modernc.org/sqlite"
+)
+
+type Store struct {
+	db   *sql.DB
+	path string
+}
+
+func Open(dbPath string) (*Store, error) {
+	if err := os.MkdirAll(filepath.Dir(dbPath), 0o755); err != nil {
+		return nil, fmt.Errorf("creating db directory: %w", err)
+	}
+
+	db, err := sql.Open("sqlite", dbPath+"?_journal_mode=WAL&_busy_timeout=5000&_foreign_keys=ON")
+	if err != nil {
+		return nil, fmt.Errorf("opening database: %w", err)
+	}
+
+	db.SetMaxOpenConns(1)
+
+	s := &Store{db: db, path: dbPath}
+	if err := s.migrate(); err != nil {
+		db.Close()
+		return nil, fmt.Errorf("running migrations: %w", err)
+	}
+
+	return s, nil
+}
+
+func (s *Store) Close() error {
+	return s.db.Close()
+}
+
+func (s *Store) migrate() error {
+	migrations := []string{
+		`CREATE TABLE IF NOT EXISTS resources (
+			id TEXT PRIMARY KEY,
+			resource_type TEXT NOT NULL,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+			updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+		`CREATE INDEX IF NOT EXISTS idx_resources_type ON resources(resource_type)`,
+		`CREATE INDEX IF NOT EXISTS idx_resources_synced ON resources(synced_at)`,
+		`CREATE TABLE IF NOT EXISTS sync_state (
+			resource_type TEXT PRIMARY KEY,
+			last_cursor TEXT,
+			last_synced_at DATETIME,
+			total_count INTEGER DEFAULT 0
+		)`,
+		`CREATE VIRTUAL TABLE IF NOT EXISTS resources_fts USING fts5(
+			id, resource_type, content, tokenize='porter unicode61'
+		)`,
+		`CREATE TABLE IF NOT EXISTS audit-logs (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+		`CREATE TABLE IF NOT EXISTS bans (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+		`CREATE TABLE IF NOT EXISTS entitlements (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+		`CREATE TABLE IF NOT EXISTS members (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+		`CREATE TABLE IF NOT EXISTS messages (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+		`CREATE TABLE IF NOT EXISTS polls (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+		`CREATE TABLE IF NOT EXISTS scheduled-events (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+		`CREATE TABLE IF NOT EXISTS thread-members (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+		`CREATE TABLE IF NOT EXISTS threads (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+		`CREATE TABLE IF NOT EXISTS users (
+			id TEXT PRIMARY KEY,
+			data JSON NOT NULL,
+			synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+		)`,
+	}
+
+	for _, m := range migrations {
+		if _, err := s.db.Exec(m); err != nil {
+			return fmt.Errorf("migration failed: %w", err)
+		}
+	}
+	return nil
+}
+
+func (s *Store) Upsert(resourceType, id string, data json.RawMessage) error {
+	tx, err := s.db.Begin()
+	if err != nil {
+		return err
+	}
+	defer tx.Rollback()
+
+	_, err = tx.Exec(
+		`INSERT INTO resources (id, resource_type, data, synced_at, updated_at)
+		 VALUES (?, ?, ?, ?, ?)
+		 ON CONFLICT(id) DO UPDATE SET data = excluded.data, synced_at = excluded.synced_at, updated_at = excluded.updated_at`,
+		id, resourceType, string(data), time.Now(), time.Now(),
+	)
+	if err != nil {
+		return err
+	}
+
+	_, err = tx.Exec(
+		`INSERT INTO resources_fts (id, resource_type, content)
+		 VALUES (?, ?, ?)
+		 ON CONFLICT DO NOTHING`,
+		id, resourceType, string(data),
+	)
+	if err != nil {
+		// FTS insert failure is non-fatal
+		fmt.Fprintf(os.Stderr, "warning: FTS index update failed: %v\n", err)
+	}
+
+	return tx.Commit()
+}
+
+func (s *Store) Get(resourceType, id string) (json.RawMessage, error) {
+	var data string
+	err := s.db.QueryRow(
+		`SELECT data FROM resources WHERE resource_type = ? AND id = ?`,
+		resourceType, id,
+	).Scan(&data)
+	if err == sql.ErrNoRows {
+		return nil, nil
+	}
+	if err != nil {
+		return nil, err
+	}
+	return json.RawMessage(data), nil
+}
+
+func (s *Store) List(resourceType string, limit int) ([]json.RawMessage, error) {
+	if limit <= 0 {
+		limit = 200
+	}
+	rows, err := s.db.Query(
+		`SELECT data FROM resources WHERE resource_type = ? ORDER BY updated_at DESC LIMIT ?`,
+		resourceType, limit,
+	)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+
+	var results []json.RawMessage
+	for rows.Next() {
+		var data string
+		if err := rows.Scan(&data); err != nil {
+			return nil, err
+		}
+		results = append(results, json.RawMessage(data))
+	}
+	return results, rows.Err()
+}
+
+func (s *Store) Search(query string, limit int) ([]json.RawMessage, error) {
+	if limit <= 0 {
+		limit = 50
+	}
+	rows, err := s.db.Query(
+		`SELECT r.data FROM resources r
+		 JOIN resources_fts f ON r.id = f.id
+		 WHERE resources_fts MATCH ?
+		 ORDER BY rank
+		 LIMIT ?`,
+		query, limit,
+	)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+
+	var results []json.RawMessage
+	for rows.Next() {
+		var data string
+		if err := rows.Scan(&data); err != nil {
+			return nil, err
+		}
+		results = append(results, json.RawMessage(data))
+	}
+	return results, rows.Err()
+}
+
+func (s *Store) SaveSyncState(resourceType, cursor string, count int) error {
+	_, err := s.db.Exec(
+		`INSERT INTO sync_state (resource_type, last_cursor, last_synced_at, total_count)
+		 VALUES (?, ?, ?, ?)
+		 ON CONFLICT(resource_type) DO UPDATE SET last_cursor = excluded.last_cursor,
+		 last_synced_at = excluded.last_synced_at, total_count = excluded.total_count`,
+		resourceType, cursor, time.Now(), count,
+	)
+	return err
+}
+
+func (s *Store) GetSyncState(resourceType string) (cursor string, lastSynced time.Time, count int, err error) {
+	err = s.db.QueryRow(
+		`SELECT last_cursor, last_synced_at, total_count FROM sync_state WHERE resource_type = ?`,
+		resourceType,
+	).Scan(&cursor, &lastSynced, &count)
+	if err == sql.ErrNoRows {
+		return "", time.Time{}, 0, nil
+	}
+	return
+}
+
+func (s *Store) Count(resourceType string) (int, error) {
+	var count int
+	err := s.db.QueryRow(
+		`SELECT COUNT(*) FROM resources WHERE resource_type = ?`,
+		resourceType,
+	).Scan(&count)
+	return count, err
+}
+
+func (s *Store) Status() (map[string]int, error) {
+	rows, err := s.db.Query(
+		`SELECT resource_type, COUNT(*) FROM resources GROUP BY resource_type ORDER BY resource_type`,
+	)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+
+	status := make(map[string]int)
+	for rows.Next() {
+		var rt string
+		var count int
+		if err := rows.Scan(&rt, &count); err != nil {
+			return nil, err
+		}
+		status[rt] = count
+	}
+	return status, rows.Err()
+}
diff --git a/discord-cli/internal/types/types.go b/discord-cli/internal/types/types.go
new file mode 100644
index 00000000..9e6a9a25
--- /dev/null
+++ b/discord-cli/internal/types/types.go
@@ -0,0 +1,3877 @@
+// Code generated by CLI Printing Press. DO NOT EDIT.
+
+package types
+
+type AccountResponse struct {
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type ActionRowComponentForMessageRequest struct {
+	Components string `json:"components"`
+	Id int `json:"id"`
+	Type int `json:"type"`
+}
+
+type ActionRowComponentForModalRequest struct {
+	Components string `json:"components"`
+	Id int `json:"id"`
+	Type int `json:"type"`
+}
+
+type ActionRowComponentResponse struct {
+	Components string `json:"components"`
+	Id int `json:"id"`
+	Type int `json:"type"`
+}
+
+type ActivitiesAttachmentResponse struct {
+	Attachment string `json:"attachment"`
+}
+
+type ApplicationCommandAttachmentOption struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandAttachmentOptionResponse struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandAutocompleteCallbackRequest struct {
+	Data string `json:"data"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandBooleanOption struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandBooleanOptionResponse struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandChannelOption struct {
+	ChannelTypes string `json:"channel_types"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandChannelOptionResponse struct {
+	ChannelTypes string `json:"channel_types"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandCreateRequest struct {
+	Contexts string `json:"contexts"`
+	DefaultMemberPermissions int `json:"default_member_permissions"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DmPermission bool `json:"dm_permission"`
+	Handler string `json:"handler"`
+	IntegrationTypes string `json:"integration_types"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Options string `json:"options"`
+	Type string `json:"type"`
+}
+
+type ApplicationCommandIntegerOption struct {
+	Autocomplete bool `json:"autocomplete"`
+	Choices string `json:"choices"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	MaxValue string `json:"max_value"`
+	MinValue string `json:"min_value"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandIntegerOptionResponse struct {
+	Autocomplete bool `json:"autocomplete"`
+	Choices string `json:"choices"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	MaxValue int `json:"max_value"`
+	MinValue int `json:"min_value"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandInteractionMetadataResponse struct {
+	AuthorizingIntegrationOwners string `json:"authorizing_integration_owners"`
+	Id string `json:"id"`
+	OriginalResponseMessageId string `json:"original_response_message_id"`
+	TargetMessageId string `json:"target_message_id"`
+	TargetUser string `json:"target_user"`
+	Type int `json:"type"`
+	User string `json:"user"`
+}
+
+type ApplicationCommandMentionableOption struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandMentionableOptionResponse struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandNumberOption struct {
+	Autocomplete bool `json:"autocomplete"`
+	Choices string `json:"choices"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	MaxValue float64 `json:"max_value"`
+	MinValue float64 `json:"min_value"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandNumberOptionResponse struct {
+	Autocomplete bool `json:"autocomplete"`
+	Choices string `json:"choices"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	MaxValue float64 `json:"max_value"`
+	MinValue float64 `json:"min_value"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandOptionIntegerChoice struct {
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Value int `json:"value"`
+}
+
+type ApplicationCommandOptionIntegerChoiceResponse struct {
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Value int `json:"value"`
+}
+
+type ApplicationCommandOptionNumberChoice struct {
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Value float64 `json:"value"`
+}
+
+type ApplicationCommandOptionNumberChoiceResponse struct {
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Value float64 `json:"value"`
+}
+
+type ApplicationCommandOptionStringChoice struct {
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Value string `json:"value"`
+}
+
+type ApplicationCommandOptionStringChoiceResponse struct {
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Value string `json:"value"`
+}
+
+type ApplicationCommandPatchRequestPartial struct {
+	Contexts string `json:"contexts"`
+	DefaultMemberPermissions int `json:"default_member_permissions"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DmPermission bool `json:"dm_permission"`
+	Handler string `json:"handler"`
+	IntegrationTypes string `json:"integration_types"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Options string `json:"options"`
+}
+
+type ApplicationCommandPermission struct {
+	Id string `json:"id"`
+	Permission bool `json:"permission"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandResponse struct {
+	ApplicationId string `json:"application_id"`
+	Contexts string `json:"contexts"`
+	DefaultMemberPermissions string `json:"default_member_permissions"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	DmPermission bool `json:"dm_permission"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	IntegrationTypes string `json:"integration_types"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Nsfw bool `json:"nsfw"`
+	Options string `json:"options"`
+	Type int `json:"type"`
+	Version string `json:"version"`
+}
+
+type ApplicationCommandRoleOption struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandRoleOptionResponse struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandStringOption struct {
+	Autocomplete bool `json:"autocomplete"`
+	Choices string `json:"choices"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	MaxLength int `json:"max_length"`
+	MinLength int `json:"min_length"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandStringOptionResponse struct {
+	Autocomplete bool `json:"autocomplete"`
+	Choices string `json:"choices"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	MaxLength int `json:"max_length"`
+	MinLength int `json:"min_length"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandSubcommandGroupOption struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Options string `json:"options"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandSubcommandGroupOptionResponse struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Options string `json:"options"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandSubcommandOption struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Options string `json:"options"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandSubcommandOptionResponse struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Options string `json:"options"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandUpdateRequest struct {
+	Contexts string `json:"contexts"`
+	DefaultMemberPermissions int `json:"default_member_permissions"`
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DmPermission bool `json:"dm_permission"`
+	Handler string `json:"handler"`
+	Id string `json:"id"`
+	IntegrationTypes string `json:"integration_types"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Options string `json:"options"`
+	Type string `json:"type"`
+}
+
+type ApplicationCommandUserOption struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationCommandUserOptionResponse struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	DescriptionLocalized string `json:"description_localized"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	NameLocalized string `json:"name_localized"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ApplicationFormPartial struct {
+	CoverImage string `json:"cover_image"`
+	CustomInstallUrl string `json:"custom_install_url"`
+	Description string `json:"description"`
+	ExplicitContentFilter string `json:"explicit_content_filter"`
+	Flags int `json:"flags"`
+	Icon string `json:"icon"`
+	InstallParams string `json:"install_params"`
+	IntegrationTypesConfig string `json:"integration_types_config"`
+	InteractionsEndpointUrl string `json:"interactions_endpoint_url"`
+	MaxParticipants int `json:"max_participants"`
+	RoleConnectionsVerificationUrl string `json:"role_connections_verification_url"`
+	Tags string `json:"tags"`
+	TeamId string `json:"team_id"`
+	Type string `json:"type"`
+}
+
+type ApplicationIncomingWebhookResponse struct {
+	ApplicationId string `json:"application_id"`
+	Avatar string `json:"avatar"`
+	ChannelId string `json:"channel_id"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Type int `json:"type"`
+	User string `json:"user"`
+}
+
+type ApplicationIntegrationTypeConfiguration struct {
+	Oauth2InstallParams string `json:"oauth2_install_params"`
+}
+
+type ApplicationIntegrationTypeConfigurationResponse struct {
+	Oauth2InstallParams string `json:"oauth2_install_params"`
+}
+
+type ApplicationOAuth2InstallParams struct {
+	Permissions int `json:"permissions"`
+	Scopes string `json:"scopes"`
+}
+
+type ApplicationOAuth2InstallParamsResponse struct {
+	Permissions string `json:"permissions"`
+	Scopes string `json:"scopes"`
+}
+
+type ApplicationResponse struct {
+	Bot string `json:"bot"`
+	BotPublic bool `json:"bot_public"`
+	BotRequireCodeGrant bool `json:"bot_require_code_grant"`
+	CoverImage string `json:"cover_image"`
+	CustomInstallUrl string `json:"custom_install_url"`
+	Description string `json:"description"`
+	Flags int `json:"flags"`
+	GuildId string `json:"guild_id"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	InstallParams string `json:"install_params"`
+	IntegrationTypesConfig string `json:"integration_types_config"`
+	MaxParticipants int `json:"max_participants"`
+	Name string `json:"name"`
+	PrimarySkuId string `json:"primary_sku_id"`
+	PrivacyPolicyUrl string `json:"privacy_policy_url"`
+	RpcOrigins string `json:"rpc_origins"`
+	Slug string `json:"slug"`
+	Tags string `json:"tags"`
+	TermsOfServiceUrl string `json:"terms_of_service_url"`
+	Type string `json:"type"`
+	VerifyKey string `json:"verify_key"`
+}
+
+type ApplicationRoleConnectionsMetadataItemRequest struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	Key string `json:"key"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Type int `json:"type"`
+}
+
+type ApplicationRoleConnectionsMetadataItemResponse struct {
+	Description string `json:"description"`
+	DescriptionLocalizations string `json:"description_localizations"`
+	Key string `json:"key"`
+	Name string `json:"name"`
+	NameLocalizations string `json:"name_localizations"`
+	Type int `json:"type"`
+}
+
+type ApplicationUserRoleConnectionResponse struct {
+	Metadata string `json:"metadata"`
+	PlatformName string `json:"platform_name"`
+	PlatformUsername string `json:"platform_username"`
+}
+
+type AttachmentResponse struct {
+	Application string `json:"application"`
+	ClipCreatedAt string `json:"clip_created_at"`
+	ClipParticipants string `json:"clip_participants"`
+	ContentType string `json:"content_type"`
+	Description string `json:"description"`
+	DurationSecs float64 `json:"duration_secs"`
+	Ephemeral bool `json:"ephemeral"`
+	Filename string `json:"filename"`
+	Height int `json:"height"`
+	Id string `json:"id"`
+	ProxyUrl string `json:"proxy_url"`
+	Size int `json:"size"`
+	Title string `json:"title"`
+	Url string `json:"url"`
+	Waveform string `json:"waveform"`
+	Width int `json:"width"`
+}
+
+type AuditLogEntryResponse struct {
+	ActionType int `json:"action_type"`
+	Changes string `json:"changes"`
+	Id string `json:"id"`
+	Options string `json:"options"`
+	Reason string `json:"reason"`
+	TargetId string `json:"target_id"`
+	UserId string `json:"user_id"`
+}
+
+type AuditLogObjectChangeResponse struct {
+	Key string `json:"key"`
+	NewValue string `json:"new_value"`
+	OldValue string `json:"old_value"`
+}
+
+type BanUserFromGuildRequest struct {
+	DeleteMessageDays int `json:"delete_message_days"`
+	DeleteMessageSeconds int `json:"delete_message_seconds"`
+}
+
+type BaseCreateMessageCreateRequest struct {
+	AllowedMentions string `json:"allowed_mentions"`
+	Attachments string `json:"attachments"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	Embeds string `json:"embeds"`
+	Flags int `json:"flags"`
+	Poll string `json:"poll"`
+	SharedClientTheme string `json:"shared_client_theme"`
+	StickerIds string `json:"sticker_ids"`
+}
+
+type BasicApplicationResponse struct {
+	Bot string `json:"bot"`
+	CoverImage string `json:"cover_image"`
+	Description string `json:"description"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	PrimarySkuId string `json:"primary_sku_id"`
+	Type string `json:"type"`
+}
+
+type BasicGuildMemberResponse struct {
+	Avatar string `json:"avatar"`
+	AvatarDecorationData string `json:"avatar_decoration_data"`
+	Banner string `json:"banner"`
+	Collectibles string `json:"collectibles"`
+	CommunicationDisabledUntil string `json:"communication_disabled_until"`
+	Flags int `json:"flags"`
+	JoinedAt string `json:"joined_at"`
+	Nick string `json:"nick"`
+	Pending bool `json:"pending"`
+	PremiumSince string `json:"premium_since"`
+	Roles string `json:"roles"`
+}
+
+type BasicMessageResponse struct {
+	Activity string `json:"activity"`
+	Application string `json:"application"`
+	ApplicationId string `json:"application_id"`
+	Attachments string `json:"attachments"`
+	Author string `json:"author"`
+	Call string `json:"call"`
+	ChannelId string `json:"channel_id"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	EditedTimestamp string `json:"edited_timestamp"`
+	Embeds string `json:"embeds"`
+	Flags int `json:"flags"`
+	Id string `json:"id"`
+	Interaction string `json:"interaction"`
+	InteractionMetadata string `json:"interaction_metadata"`
+	MentionChannels string `json:"mention_channels"`
+	MentionEveryone bool `json:"mention_everyone"`
+	MentionRoles string `json:"mention_roles"`
+	Mentions string `json:"mentions"`
+	MessageReference string `json:"message_reference"`
+	MessageSnapshots string `json:"message_snapshots"`
+	Nonce string `json:"nonce"`
+	Pinned bool `json:"pinned"`
+	Poll string `json:"poll"`
+	Position int `json:"position"`
+	PurchaseNotification string `json:"purchase_notification"`
+	Resolved string `json:"resolved"`
+	RoleSubscriptionData string `json:"role_subscription_data"`
+	SharedClientTheme string `json:"shared_client_theme"`
+	StickerItems string `json:"sticker_items"`
+	Stickers string `json:"stickers"`
+	Thread string `json:"thread"`
+	Timestamp string `json:"timestamp"`
+	Tts bool `json:"tts"`
+	Type int `json:"type"`
+	WebhookId string `json:"webhook_id"`
+}
+
+type BlockMessageAction struct {
+	Metadata string `json:"metadata"`
+	Type int `json:"type"`
+}
+
+type BlockMessageActionMetadata struct {
+	CustomMessage string `json:"custom_message"`
+}
+
+type BlockMessageActionMetadataResponse struct {
+	CustomMessage string `json:"custom_message"`
+}
+
+type BlockMessageActionResponse struct {
+	Metadata string `json:"metadata"`
+	Type int `json:"type"`
+}
+
+type BotAccountPatchRequest struct {
+	Avatar string `json:"avatar"`
+	Banner string `json:"banner"`
+	Username string `json:"username"`
+}
+
+type BotAddGuildMemberRequest struct {
+	AccessToken string `json:"access_token"`
+	Deaf bool `json:"deaf"`
+	Flags int `json:"flags"`
+	Mute bool `json:"mute"`
+	Nick string `json:"nick"`
+	Roles string `json:"roles"`
+}
+
+type BulkBanUsersRequest struct {
+	DeleteMessageSeconds int `json:"delete_message_seconds"`
+	UserIds string `json:"user_ids"`
+}
+
+type BulkBanUsersResponse struct {
+	BannedUsers string `json:"banned_users"`
+	FailedUsers string `json:"failed_users"`
+}
+
+type BulkLobbyMemberRequest struct {
+	Flags string `json:"flags"`
+	Id string `json:"id"`
+	Metadata string `json:"metadata"`
+	RemoveMember bool `json:"remove_member"`
+}
+
+type ButtonComponentForMessageRequest struct {
+	CustomId string `json:"custom_id"`
+	Disabled bool `json:"disabled"`
+	Emoji string `json:"emoji"`
+	Id int `json:"id"`
+	Label string `json:"label"`
+	SkuId string `json:"sku_id"`
+	Style int `json:"style"`
+	Type int `json:"type"`
+	Url string `json:"url"`
+}
+
+type ButtonComponentResponse struct {
+	CustomId string `json:"custom_id"`
+	Disabled bool `json:"disabled"`
+	Emoji string `json:"emoji"`
+	Id int `json:"id"`
+	Label string `json:"label"`
+	SkuId string `json:"sku_id"`
+	Style int `json:"style"`
+	Type int `json:"type"`
+	Url string `json:"url"`
+}
+
+type ChannelFollowerResponse struct {
+	ChannelId string `json:"channel_id"`
+	WebhookId string `json:"webhook_id"`
+}
+
+type ChannelFollowerWebhookResponse struct {
+	ApplicationId string `json:"application_id"`
+	Avatar string `json:"avatar"`
+	ChannelId string `json:"channel_id"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	SourceChannel string `json:"source_channel"`
+	SourceGuild string `json:"source_guild"`
+	Type int `json:"type"`
+	User string `json:"user"`
+}
+
+type ChannelPermissionOverwriteRequest struct {
+	Allow int `json:"allow"`
+	Deny int `json:"deny"`
+	Id string `json:"id"`
+	Type string `json:"type"`
+}
+
+type ChannelPermissionOverwriteResponse struct {
+	Allow string `json:"allow"`
+	Deny string `json:"deny"`
+	Id string `json:"id"`
+	Type int `json:"type"`
+}
+
+type ChannelSelectComponentForMessageRequest struct {
+	ChannelTypes string `json:"channel_types"`
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ChannelSelectComponentForModalRequest struct {
+	ChannelTypes string `json:"channel_types"`
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type ChannelSelectComponentResponse struct {
+	ChannelTypes string `json:"channel_types"`
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Type int `json:"type"`
+}
+
+type ChannelSelectDefaultValue struct {
+	Id string `json:"id"`
+	Type string `json:"type"`
+}
+
+type ChannelSelectDefaultValueResponse struct {
+	Id string `json:"id"`
+	Type string `json:"type"`
+}
+
+type CheckboxComponentForModalRequest struct {
+	CustomId string `json:"custom_id"`
+	Default bool `json:"default"`
+	Id int `json:"id"`
+	Type int `json:"type"`
+}
+
+type CheckboxGroupComponentForModalRequest struct {
+	CustomId string `json:"custom_id"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Options string `json:"options"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type CheckboxGroupOptionForRequest struct {
+	Default bool `json:"default"`
+	Description string `json:"description"`
+	Label string `json:"label"`
+	Value string `json:"value"`
+}
+
+type CommandPermissionResponse struct {
+	Id string `json:"id"`
+	Permission bool `json:"permission"`
+	Type int `json:"type"`
+}
+
+type CommandPermissionsResponse struct {
+	ApplicationId string `json:"application_id"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Permissions string `json:"permissions"`
+}
+
+type ComponentEmojiForRequest struct {
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type ComponentEmojiResponse struct {
+	Animated bool `json:"animated"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type ConnectedAccountGuildResponse struct {
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type ConnectedAccountIntegrationResponse struct {
+	Account string `json:"account"`
+	Guild string `json:"guild"`
+	Id string `json:"id"`
+	Type string `json:"type"`
+}
+
+type ConnectedAccountResponse struct {
+	FriendSync bool `json:"friend_sync"`
+	Id string `json:"id"`
+	Integrations string `json:"integrations"`
+	Name string `json:"name"`
+	Revoked bool `json:"revoked"`
+	ShowActivity bool `json:"show_activity"`
+	TwoWayLink bool `json:"two_way_link"`
+	Type string `json:"type"`
+	Verified bool `json:"verified"`
+	Visibility int `json:"visibility"`
+}
+
+type ContainerComponentForMessageRequest struct {
+	AccentColor int `json:"accent_color"`
+	Components string `json:"components"`
+	Id int `json:"id"`
+	Spoiler bool `json:"spoiler"`
+	Type int `json:"type"`
+}
+
+type ContainerComponentResponse struct {
+	AccentColor int `json:"accent_color"`
+	Components string `json:"components"`
+	Id int `json:"id"`
+	Spoiler bool `json:"spoiler"`
+	Type int `json:"type"`
+}
+
+type CreateEntitlementRequestData struct {
+	OwnerId string `json:"owner_id"`
+	OwnerType int `json:"owner_type"`
+	SkuId string `json:"sku_id"`
+}
+
+type CreateForumThreadRequest struct {
+	AppliedTags string `json:"applied_tags"`
+	AutoArchiveDuration string `json:"auto_archive_duration"`
+	Message string `json:"message"`
+	Name string `json:"name"`
+	RateLimitPerUser int `json:"rate_limit_per_user"`
+}
+
+type CreateGroupDMInviteRequest struct {
+	MaxAge int `json:"max_age"`
+}
+
+type CreateGuildChannelRequest struct {
+	AvailableTags string `json:"available_tags"`
+	Bitrate int `json:"bitrate"`
+	DefaultAutoArchiveDuration string `json:"default_auto_archive_duration"`
+	DefaultForumLayout string `json:"default_forum_layout"`
+	DefaultReactionEmoji string `json:"default_reaction_emoji"`
+	DefaultSortOrder string `json:"default_sort_order"`
+	DefaultTagSetting string `json:"default_tag_setting"`
+	DefaultThreadRateLimitPerUser int `json:"default_thread_rate_limit_per_user"`
+	Name string `json:"name"`
+	Nsfw bool `json:"nsfw"`
+	ParentId string `json:"parent_id"`
+	PermissionOverwrites string `json:"permission_overwrites"`
+	Position int `json:"position"`
+	RateLimitPerUser int `json:"rate_limit_per_user"`
+	RtcRegion string `json:"rtc_region"`
+	Topic string `json:"topic"`
+	Type string `json:"type"`
+	UserLimit int `json:"user_limit"`
+	VideoQualityMode string `json:"video_quality_mode"`
+}
+
+type CreateGuildInviteRequest struct {
+	MaxAge int `json:"max_age"`
+	MaxUses int `json:"max_uses"`
+	TargetApplicationId string `json:"target_application_id"`
+	TargetType string `json:"target_type"`
+	TargetUserId string `json:"target_user_id"`
+	Temporary bool `json:"temporary"`
+	Unique bool `json:"unique"`
+}
+
+type CreateMessageInteractionCallbackRequest struct {
+	Data string `json:"data"`
+	Type int `json:"type"`
+}
+
+type CreateMessageInteractionCallbackResponse struct {
+	Message string `json:"message"`
+	Type int `json:"type"`
+}
+
+type CreateOrUpdateThreadTagRequest struct {
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+	Moderated bool `json:"moderated"`
+	Name string `json:"name"`
+}
+
+type CreatePrivateChannelRequest struct {
+	AccessTokens string `json:"access_tokens"`
+	Nicks string `json:"nicks"`
+	RecipientId string `json:"recipient_id"`
+}
+
+type CreateRoleRequest struct {
+	Color int `json:"color"`
+	Colors string `json:"colors"`
+	Hoist bool `json:"hoist"`
+	Icon string `json:"icon"`
+	Mentionable bool `json:"mentionable"`
+	Name string `json:"name"`
+	Permissions int `json:"permissions"`
+	UnicodeEmoji string `json:"unicode_emoji"`
+}
+
+type CreateTextThreadWithMessageRequest struct {
+	AutoArchiveDuration string `json:"auto_archive_duration"`
+	Name string `json:"name"`
+	RateLimitPerUser int `json:"rate_limit_per_user"`
+}
+
+type CreateTextThreadWithoutMessageRequest struct {
+	AutoArchiveDuration string `json:"auto_archive_duration"`
+	Invitable bool `json:"invitable"`
+	Name string `json:"name"`
+	RateLimitPerUser int `json:"rate_limit_per_user"`
+	Type string `json:"type"`
+}
+
+type CreatedThreadResponse struct {
+	AppliedTags string `json:"applied_tags"`
+	Bitrate int `json:"bitrate"`
+	Flags int `json:"flags"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	LastMessageId string `json:"last_message_id"`
+	LastPinTimestamp string `json:"last_pin_timestamp"`
+	Member string `json:"member"`
+	MemberCount int `json:"member_count"`
+	MessageCount int `json:"message_count"`
+	Name string `json:"name"`
+	OwnerId string `json:"owner_id"`
+	ParentId string `json:"parent_id"`
+	Permissions string `json:"permissions"`
+	RateLimitPerUser int `json:"rate_limit_per_user"`
+	RtcRegion string `json:"rtc_region"`
+	ThreadMetadata string `json:"thread_metadata"`
+	TotalMessageSent int `json:"total_message_sent"`
+	Type int `json:"type"`
+	UserLimit int `json:"user_limit"`
+	VideoQualityMode int `json:"video_quality_mode"`
+}
+
+type CustomClientThemeResponse struct {
+	BaseMix int `json:"base_mix"`
+	BaseTheme int `json:"base_theme"`
+	Colors string `json:"colors"`
+	GradientAngle int `json:"gradient_angle"`
+}
+
+type CustomClientThemeShareRequest struct {
+	BaseMix int `json:"base_mix"`
+	BaseTheme string `json:"base_theme"`
+	Colors string `json:"colors"`
+	GradientAngle int `json:"gradient_angle"`
+}
+
+type DefaultKeywordListTriggerMetadata struct {
+	AllowList string `json:"allow_list"`
+	Presets string `json:"presets"`
+}
+
+type DefaultKeywordListTriggerMetadataResponse struct {
+	AllowList string `json:"allow_list"`
+	Presets string `json:"presets"`
+}
+
+type DefaultKeywordListUpsertRequest struct {
+	Actions string `json:"actions"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type DefaultKeywordListUpsertRequestPartial struct {
+	Actions string `json:"actions"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type DefaultKeywordRuleResponse struct {
+	Actions string `json:"actions"`
+	CreatorId string `json:"creator_id"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type DefaultReactionEmojiResponse struct {
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+}
+
+type DiscordIntegrationResponse struct {
+	Account string `json:"account"`
+	Application string `json:"application"`
+	Enabled bool `json:"enabled"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Scopes string `json:"scopes"`
+	Type string `json:"type"`
+	User string `json:"user"`
+}
+
+type EmbeddedActivityInstance struct {
+	ApplicationId string `json:"application_id"`
+	InstanceId string `json:"instance_id"`
+	LaunchId string `json:"launch_id"`
+	Location string `json:"location"`
+	Users string `json:"users"`
+}
+
+type EmojiResponse struct {
+	Animated bool `json:"animated"`
+	Available bool `json:"available"`
+	Id string `json:"id"`
+	Managed bool `json:"managed"`
+	Name string `json:"name"`
+	RequireColons bool `json:"require_colons"`
+	Roles string `json:"roles"`
+	User string `json:"user"`
+}
+
+type EntitlementResponse struct {
+	ApplicationId string `json:"application_id"`
+	Consumed bool `json:"consumed"`
+	Deleted bool `json:"deleted"`
+	EndsAt string `json:"ends_at"`
+	FulfilledAt string `json:"fulfilled_at"`
+	FulfillmentStatus string `json:"fulfillment_status"`
+	GifterUserId string `json:"gifter_user_id"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	ParentId string `json:"parent_id"`
+	SkuId string `json:"sku_id"`
+	StartsAt string `json:"starts_at"`
+	Type int `json:"type"`
+	UserId string `json:"user_id"`
+}
+
+type EntityMetadataExternal struct {
+	Location string `json:"location"`
+}
+
+type EntityMetadataExternalResponse struct {
+	Location string `json:"location"`
+}
+
+type EntityMetadataStageInstance struct {
+}
+
+type EntityMetadataStageInstanceResponse struct {
+}
+
+type EntityMetadataVoice struct {
+}
+
+type EntityMetadataVoiceResponse struct {
+}
+
+type Error struct {
+	Code int `json:"code"`
+	Message string `json:"message"`
+}
+
+type ErrorResponse struct {
+	Code int `json:"code"`
+	Errors string `json:"errors"`
+	Message string `json:"message"`
+}
+
+type ExternalConnectionIntegrationResponse struct {
+	Account string `json:"account"`
+	EnableEmoticons bool `json:"enable_emoticons"`
+	Enabled bool `json:"enabled"`
+	ExpireBehavior int `json:"expire_behavior"`
+	ExpireGracePeriod int `json:"expire_grace_period"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Revoked bool `json:"revoked"`
+	RoleId string `json:"role_id"`
+	SubscriberCount int `json:"subscriber_count"`
+	SyncedAt string `json:"synced_at"`
+	Syncing bool `json:"syncing"`
+	Type string `json:"type"`
+	User string `json:"user"`
+}
+
+type ExternalScheduledEventCreateRequest struct {
+	ChannelId string `json:"channel_id"`
+	Description string `json:"description"`
+	EntityMetadata string `json:"entity_metadata"`
+	EntityType int `json:"entity_type"`
+	Image string `json:"image"`
+	Name string `json:"name"`
+	PrivacyLevel int `json:"privacy_level"`
+	ScheduledEndTime string `json:"scheduled_end_time"`
+	ScheduledStartTime string `json:"scheduled_start_time"`
+}
+
+type ExternalScheduledEventPatchRequestPartial struct {
+	ChannelId string `json:"channel_id"`
+	Description string `json:"description"`
+	EntityMetadata string `json:"entity_metadata"`
+	EntityType string `json:"entity_type"`
+	Image string `json:"image"`
+	Name string `json:"name"`
+	PrivacyLevel int `json:"privacy_level"`
+	ScheduledEndTime string `json:"scheduled_end_time"`
+	ScheduledStartTime string `json:"scheduled_start_time"`
+	Status string `json:"status"`
+}
+
+type ExternalScheduledEventResponse struct {
+	ChannelId string `json:"channel_id"`
+	Creator string `json:"creator"`
+	CreatorId string `json:"creator_id"`
+	Description string `json:"description"`
+	EntityId string `json:"entity_id"`
+	EntityMetadata string `json:"entity_metadata"`
+	EntityType int `json:"entity_type"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Image string `json:"image"`
+	Name string `json:"name"`
+	PrivacyLevel int `json:"privacy_level"`
+	ScheduledEndTime string `json:"scheduled_end_time"`
+	ScheduledStartTime string `json:"scheduled_start_time"`
+	Status int `json:"status"`
+	UserCount int `json:"user_count"`
+	UserRsvp string `json:"user_rsvp"`
+}
+
+type FileComponentForMessageRequest struct {
+	File string `json:"file"`
+	Id int `json:"id"`
+	Spoiler bool `json:"spoiler"`
+	Type int `json:"type"`
+}
+
+type FileComponentResponse struct {
+	File string `json:"file"`
+	Id int `json:"id"`
+	Name string `json:"name"`
+	Size int `json:"size"`
+	Spoiler bool `json:"spoiler"`
+	Type int `json:"type"`
+}
+
+type FileUploadComponentForModalRequest struct {
+	CustomId string `json:"custom_id"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type FlagToChannelAction struct {
+	Metadata string `json:"metadata"`
+	Type int `json:"type"`
+}
+
+type FlagToChannelActionMetadata struct {
+	ChannelId string `json:"channel_id"`
+}
+
+type FlagToChannelActionMetadataResponse struct {
+	ChannelId string `json:"channel_id"`
+}
+
+type FlagToChannelActionResponse struct {
+	Metadata string `json:"metadata"`
+	Type int `json:"type"`
+}
+
+type ForumTagResponse struct {
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+	Id string `json:"id"`
+	Moderated bool `json:"moderated"`
+	Name string `json:"name"`
+}
+
+type FriendInviteResponse struct {
+	Channel string `json:"channel"`
+	Code string `json:"code"`
+	CreatedAt string `json:"created_at"`
+	ExpiresAt string `json:"expires_at"`
+	Flags int `json:"flags"`
+	FriendsCount int `json:"friends_count"`
+	Inviter string `json:"inviter"`
+	IsContact bool `json:"is_contact"`
+	MaxAge int `json:"max_age"`
+	MaxUses int `json:"max_uses"`
+	Type int `json:"type"`
+	Uses int `json:"uses"`
+}
+
+type GatewayBotResponse struct {
+	SessionStartLimit string `json:"session_start_limit"`
+	Shards int `json:"shards"`
+	Url string `json:"url"`
+}
+
+type GatewayBotSessionStartLimitResponse struct {
+	MaxConcurrency int `json:"max_concurrency"`
+	Remaining int `json:"remaining"`
+	ResetAfter int `json:"reset_after"`
+	Total int `json:"total"`
+}
+
+type GatewayResponse struct {
+	Url string `json:"url"`
+}
+
+type GithubAuthor struct {
+	Name string `json:"name"`
+	Username string `json:"username"`
+}
+
+type GithubCheckApp struct {
+	Name string `json:"name"`
+}
+
+type GithubCheckPullRequest struct {
+	Number int `json:"number"`
+}
+
+type GithubCheckRun struct {
+	CheckSuite string `json:"check_suite"`
+	Conclusion string `json:"conclusion"`
+	DetailsUrl string `json:"details_url"`
+	HtmlUrl string `json:"html_url"`
+	Name string `json:"name"`
+	Output string `json:"output"`
+	PullRequests string `json:"pull_requests"`
+}
+
+type GithubCheckRunOutput struct {
+	Summary string `json:"summary"`
+	Title string `json:"title"`
+}
+
+type GithubCheckSuite struct {
+	App string `json:"app"`
+	Conclusion string `json:"conclusion"`
+	HeadBranch string `json:"head_branch"`
+	HeadSha string `json:"head_sha"`
+	PullRequests string `json:"pull_requests"`
+}
+
+type GithubComment struct {
+	Body string `json:"body"`
+	CommitId string `json:"commit_id"`
+	HtmlUrl string `json:"html_url"`
+	Id int `json:"id"`
+	User string `json:"user"`
+}
+
+type GithubCommit struct {
+	Author string `json:"author"`
+	Id string `json:"id"`
+	Message string `json:"message"`
+	Url string `json:"url"`
+}
+
+type GithubDiscussion struct {
+	AnswerHtmlUrl string `json:"answer_html_url"`
+	Body string `json:"body"`
+	HtmlUrl string `json:"html_url"`
+	Number int `json:"number"`
+	Title string `json:"title"`
+	User string `json:"user"`
+}
+
+type GithubIssue struct {
+	Body string `json:"body"`
+	HtmlUrl string `json:"html_url"`
+	Id int `json:"id"`
+	Number int `json:"number"`
+	PullRequest string `json:"pull_request"`
+	Title string `json:"title"`
+	User string `json:"user"`
+}
+
+type GithubRelease struct {
+	Author string `json:"author"`
+	HtmlUrl string `json:"html_url"`
+	Id int `json:"id"`
+	TagName string `json:"tag_name"`
+}
+
+type GithubRepository struct {
+	FullName string `json:"full_name"`
+	HtmlUrl string `json:"html_url"`
+	Id int `json:"id"`
+	Name string `json:"name"`
+}
+
+type GithubReview struct {
+	Body string `json:"body"`
+	HtmlUrl string `json:"html_url"`
+	State string `json:"state"`
+	User string `json:"user"`
+}
+
+type GithubUser struct {
+	AvatarUrl string `json:"avatar_url"`
+	HtmlUrl string `json:"html_url"`
+	Id int `json:"id"`
+	Login string `json:"login"`
+}
+
+type GithubWebhook struct {
+	Action string `json:"action"`
+	Answer string `json:"answer"`
+	CheckRun string `json:"check_run"`
+	CheckSuite string `json:"check_suite"`
+	Comment string `json:"comment"`
+	Commits string `json:"commits"`
+	Compare string `json:"compare"`
+	Discussion string `json:"discussion"`
+	Forced bool `json:"forced"`
+	Forkee string `json:"forkee"`
+	HeadCommit string `json:"head_commit"`
+	Issue string `json:"issue"`
+	Member string `json:"member"`
+	PullRequest string `json:"pull_request"`
+	Ref string `json:"ref"`
+	RefType string `json:"ref_type"`
+	Release string `json:"release"`
+	Repository string `json:"repository"`
+	Review string `json:"review"`
+	Sender string `json:"sender"`
+}
+
+type GroupDMInviteResponse struct {
+	ApproximateMemberCount int `json:"approximate_member_count"`
+	Channel string `json:"channel"`
+	Code string `json:"code"`
+	CreatedAt string `json:"created_at"`
+	ExpiresAt string `json:"expires_at"`
+	Inviter string `json:"inviter"`
+	MaxAge int `json:"max_age"`
+	Type int `json:"type"`
+}
+
+type GuildAuditLogResponse struct {
+	ApplicationCommands string `json:"application_commands"`
+	AuditLogEntries string `json:"audit_log_entries"`
+	AutoModerationRules string `json:"auto_moderation_rules"`
+	GuildScheduledEvents string `json:"guild_scheduled_events"`
+	Integrations string `json:"integrations"`
+	Threads string `json:"threads"`
+	Users string `json:"users"`
+	Webhooks string `json:"webhooks"`
+}
+
+type GuildBanResponse struct {
+	Reason string `json:"reason"`
+	User string `json:"user"`
+}
+
+type GuildChannelLocation struct {
+	ChannelId string `json:"channel_id"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Kind string `json:"kind"`
+}
+
+type GuildChannelResponse struct {
+	AvailableTags string `json:"available_tags"`
+	Bitrate int `json:"bitrate"`
+	DefaultAutoArchiveDuration int `json:"default_auto_archive_duration"`
+	DefaultForumLayout string `json:"default_forum_layout"`
+	DefaultReactionEmoji string `json:"default_reaction_emoji"`
+	DefaultSortOrder string `json:"default_sort_order"`
+	DefaultTagSetting string `json:"default_tag_setting"`
+	DefaultThreadRateLimitPerUser int `json:"default_thread_rate_limit_per_user"`
+	Flags int `json:"flags"`
+	GuildId string `json:"guild_id"`
+	HdStreamingBuyerId string `json:"hd_streaming_buyer_id"`
+	HdStreamingUntil string `json:"hd_streaming_until"`
+	Id string `json:"id"`
+	LastMessageId string `json:"last_message_id"`
+	LastPinTimestamp string `json:"last_pin_timestamp"`
+	Name string `json:"name"`
+	Nsfw bool `json:"nsfw"`
+	ParentId string `json:"parent_id"`
+	PermissionOverwrites string `json:"permission_overwrites"`
+	Permissions string `json:"permissions"`
+	Position int `json:"position"`
+	RateLimitPerUser int `json:"rate_limit_per_user"`
+	RtcRegion string `json:"rtc_region"`
+	Topic string `json:"topic"`
+	Type int `json:"type"`
+	UserLimit int `json:"user_limit"`
+	VideoQualityMode int `json:"video_quality_mode"`
+}
+
+type GuildHomeSettingsResponse struct {
+	Enabled bool `json:"enabled"`
+	GuildId string `json:"guild_id"`
+	NewMemberActions string `json:"new_member_actions"`
+	ResourceChannels string `json:"resource_channels"`
+	WelcomeMessage string `json:"welcome_message"`
+}
+
+type GuildIncomingWebhookResponse struct {
+	ApplicationId string `json:"application_id"`
+	Avatar string `json:"avatar"`
+	ChannelId string `json:"channel_id"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Token string `json:"token"`
+	Type int `json:"type"`
+	Url string `json:"url"`
+	User string `json:"user"`
+}
+
+type GuildInviteResponse struct {
+	ApproximateMemberCount int `json:"approximate_member_count"`
+	ApproximatePresenceCount int `json:"approximate_presence_count"`
+	Channel string `json:"channel"`
+	Code string `json:"code"`
+	CreatedAt string `json:"created_at"`
+	ExpiresAt string `json:"expires_at"`
+	Flags int `json:"flags"`
+	Guild string `json:"guild"`
+	GuildId string `json:"guild_id"`
+	GuildScheduledEvent string `json:"guild_scheduled_event"`
+	Inviter string `json:"inviter"`
+	IsContact bool `json:"is_contact"`
+	IsNicknameChangeable bool `json:"is_nickname_changeable"`
+	MaxAge int `json:"max_age"`
+	MaxUses int `json:"max_uses"`
+	Roles string `json:"roles"`
+	TargetApplication string `json:"target_application"`
+	TargetType int `json:"target_type"`
+	TargetUser string `json:"target_user"`
+	Temporary bool `json:"temporary"`
+	Type int `json:"type"`
+	Uses int `json:"uses"`
+}
+
+type GuildMemberResponse struct {
+	Avatar string `json:"avatar"`
+	AvatarDecorationData string `json:"avatar_decoration_data"`
+	Banner string `json:"banner"`
+	Collectibles string `json:"collectibles"`
+	CommunicationDisabledUntil string `json:"communication_disabled_until"`
+	Deaf bool `json:"deaf"`
+	Flags int `json:"flags"`
+	JoinedAt string `json:"joined_at"`
+	Mute bool `json:"mute"`
+	Nick string `json:"nick"`
+	Pending bool `json:"pending"`
+	PremiumSince string `json:"premium_since"`
+	Roles string `json:"roles"`
+	User string `json:"user"`
+}
+
+type GuildOnboardingResponse struct {
+	DefaultChannelIds string `json:"default_channel_ids"`
+	Enabled bool `json:"enabled"`
+	GuildId string `json:"guild_id"`
+	Prompts string `json:"prompts"`
+}
+
+type GuildPatchRequestPartial struct {
+	AfkChannelId string `json:"afk_channel_id"`
+	AfkTimeout string `json:"afk_timeout"`
+	Banner string `json:"banner"`
+	DefaultMessageNotifications string `json:"default_message_notifications"`
+	Description string `json:"description"`
+	DiscoverySplash string `json:"discovery_splash"`
+	ExplicitContentFilter string `json:"explicit_content_filter"`
+	Features string `json:"features"`
+	HomeHeader string `json:"home_header"`
+	Icon string `json:"icon"`
+	Name string `json:"name"`
+	PreferredLocale string `json:"preferred_locale"`
+	PremiumProgressBarEnabled bool `json:"premium_progress_bar_enabled"`
+	PublicUpdatesChannelId string `json:"public_updates_channel_id"`
+	Region string `json:"region"`
+	RulesChannelId string `json:"rules_channel_id"`
+	SafetyAlertsChannelId string `json:"safety_alerts_channel_id"`
+	Splash string `json:"splash"`
+	SystemChannelFlags int `json:"system_channel_flags"`
+	SystemChannelId string `json:"system_channel_id"`
+	VerificationLevel string `json:"verification_level"`
+}
+
+type GuildPreviewResponse struct {
+	ApproximateMemberCount int `json:"approximate_member_count"`
+	ApproximatePresenceCount int `json:"approximate_presence_count"`
+	Description string `json:"description"`
+	DiscoverySplash string `json:"discovery_splash"`
+	Emojis string `json:"emojis"`
+	Features string `json:"features"`
+	HomeHeader string `json:"home_header"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Splash string `json:"splash"`
+	Stickers string `json:"stickers"`
+}
+
+type GuildProductPurchaseResponse struct {
+	ListingId string `json:"listing_id"`
+	ProductName string `json:"product_name"`
+}
+
+type GuildPruneResponse struct {
+	Pruned int `json:"pruned"`
+}
+
+type GuildResponse struct {
+	AfkChannelId string `json:"afk_channel_id"`
+	AfkTimeout int `json:"afk_timeout"`
+	ApplicationId string `json:"application_id"`
+	Banner string `json:"banner"`
+	DefaultMessageNotifications int `json:"default_message_notifications"`
+	Description string `json:"description"`
+	DiscoverySplash string `json:"discovery_splash"`
+	Emojis string `json:"emojis"`
+	ExplicitContentFilter int `json:"explicit_content_filter"`
+	Features string `json:"features"`
+	HomeHeader string `json:"home_header"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	MaxMembers int `json:"max_members"`
+	MaxPresences int `json:"max_presences"`
+	MaxStageVideoChannelUsers int `json:"max_stage_video_channel_users"`
+	MaxVideoChannelUsers int `json:"max_video_channel_users"`
+	MfaLevel int `json:"mfa_level"`
+	Name string `json:"name"`
+	Nsfw bool `json:"nsfw"`
+	NsfwLevel int `json:"nsfw_level"`
+	OwnerId string `json:"owner_id"`
+	PreferredLocale string `json:"preferred_locale"`
+	PremiumProgressBarEnabled bool `json:"premium_progress_bar_enabled"`
+	PremiumProgressBarEnabledUserUpdatedAt string `json:"premium_progress_bar_enabled_user_updated_at"`
+	PremiumSubscriptionCount int `json:"premium_subscription_count"`
+	PremiumTier int `json:"premium_tier"`
+	PublicUpdatesChannelId string `json:"public_updates_channel_id"`
+	Region string `json:"region"`
+	Roles string `json:"roles"`
+	RulesChannelId string `json:"rules_channel_id"`
+	SafetyAlertsChannelId string `json:"safety_alerts_channel_id"`
+	Splash string `json:"splash"`
+	Stickers string `json:"stickers"`
+	SystemChannelFlags int `json:"system_channel_flags"`
+	SystemChannelId string `json:"system_channel_id"`
+	VanityUrlCode string `json:"vanity_url_code"`
+	VerificationLevel int `json:"verification_level"`
+	WidgetChannelId string `json:"widget_channel_id"`
+	WidgetEnabled bool `json:"widget_enabled"`
+}
+
+type GuildRoleColorsResponse struct {
+	PrimaryColor int `json:"primary_color"`
+	SecondaryColor int `json:"secondary_color"`
+	TertiaryColor int `json:"tertiary_color"`
+}
+
+type GuildRoleResponse struct {
+	Color int `json:"color"`
+	Colors string `json:"colors"`
+	Description string `json:"description"`
+	Flags int `json:"flags"`
+	Hoist bool `json:"hoist"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Managed bool `json:"managed"`
+	Mentionable bool `json:"mentionable"`
+	Name string `json:"name"`
+	Permissions string `json:"permissions"`
+	Position int `json:"position"`
+	Tags string `json:"tags"`
+	UnicodeEmoji string `json:"unicode_emoji"`
+}
+
+type GuildRoleTagsResponse struct {
+	AvailableForPurchase string `json:"available_for_purchase"`
+	BotId string `json:"bot_id"`
+	GuildConnections string `json:"guild_connections"`
+	IntegrationId string `json:"integration_id"`
+	PremiumSubscriber string `json:"premium_subscriber"`
+	SubscriptionListingId string `json:"subscription_listing_id"`
+}
+
+type GuildSearchResponse struct {
+	DocumentsIndexed int `json:"documents_indexed"`
+	DoingDeepHistoricalIndex bool `json:"doing_deep_historical_index"`
+	Members string `json:"members"`
+	Messages string `json:"messages"`
+	Threads string `json:"threads"`
+	TotalResults int `json:"total_results"`
+}
+
+type GuildStickerResponse struct {
+	Available bool `json:"available"`
+	Description string `json:"description"`
+	FormatType string `json:"format_type"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Tags string `json:"tags"`
+	Type int `json:"type"`
+	User string `json:"user"`
+}
+
+type GuildSubscriptionIntegrationResponse struct {
+	Account string `json:"account"`
+	Enabled bool `json:"enabled"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Type string `json:"type"`
+}
+
+type GuildTemplateChannelResponse struct {
+	AvailableTags string `json:"available_tags"`
+	Bitrate int `json:"bitrate"`
+	DefaultAutoArchiveDuration string `json:"default_auto_archive_duration"`
+	DefaultForumLayout string `json:"default_forum_layout"`
+	DefaultReactionEmoji string `json:"default_reaction_emoji"`
+	DefaultSortOrder string `json:"default_sort_order"`
+	DefaultTagSetting string `json:"default_tag_setting"`
+	DefaultThreadRateLimitPerUser int `json:"default_thread_rate_limit_per_user"`
+	IconEmoji string `json:"icon_emoji"`
+	Id int `json:"id"`
+	Name string `json:"name"`
+	Nsfw bool `json:"nsfw"`
+	ParentId string `json:"parent_id"`
+	PermissionOverwrites string `json:"permission_overwrites"`
+	Position int `json:"position"`
+	RateLimitPerUser int `json:"rate_limit_per_user"`
+	Template string `json:"template"`
+	ThemeColor int `json:"theme_color"`
+	Topic string `json:"topic"`
+	Type int `json:"type"`
+	UserLimit int `json:"user_limit"`
+}
+
+type GuildTemplateChannelTags struct {
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+	Id int `json:"id"`
+	Moderated bool `json:"moderated"`
+	Name string `json:"name"`
+}
+
+type GuildTemplateResponse struct {
+	Code string `json:"code"`
+	CreatedAt string `json:"created_at"`
+	Creator string `json:"creator"`
+	CreatorId string `json:"creator_id"`
+	Description string `json:"description"`
+	IsDirty bool `json:"is_dirty"`
+	Name string `json:"name"`
+	SerializedSourceGuild string `json:"serialized_source_guild"`
+	SourceGuildId string `json:"source_guild_id"`
+	UpdatedAt string `json:"updated_at"`
+	UsageCount int `json:"usage_count"`
+}
+
+type GuildTemplateRoleColorsResponse struct {
+	PrimaryColor int `json:"primary_color"`
+	SecondaryColor int `json:"secondary_color"`
+	TertiaryColor int `json:"tertiary_color"`
+}
+
+type GuildTemplateRoleResponse struct {
+	Color int `json:"color"`
+	Colors string `json:"colors"`
+	Hoist bool `json:"hoist"`
+	Icon string `json:"icon"`
+	Id int `json:"id"`
+	Mentionable bool `json:"mentionable"`
+	Name string `json:"name"`
+	Permissions string `json:"permissions"`
+	UnicodeEmoji string `json:"unicode_emoji"`
+}
+
+type GuildTemplateSnapshotResponse struct {
+	AfkChannelId string `json:"afk_channel_id"`
+	AfkTimeout int `json:"afk_timeout"`
+	Channels string `json:"channels"`
+	DefaultMessageNotifications int `json:"default_message_notifications"`
+	Description string `json:"description"`
+	ExplicitContentFilter int `json:"explicit_content_filter"`
+	Name string `json:"name"`
+	PreferredLocale string `json:"preferred_locale"`
+	Region string `json:"region"`
+	Roles string `json:"roles"`
+	SystemChannelFlags int `json:"system_channel_flags"`
+	SystemChannelId string `json:"system_channel_id"`
+	VerificationLevel int `json:"verification_level"`
+}
+
+type GuildWelcomeChannel struct {
+	ChannelId string `json:"channel_id"`
+	Description string `json:"description"`
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+}
+
+type GuildWelcomeScreenChannelResponse struct {
+	ChannelId string `json:"channel_id"`
+	Description string `json:"description"`
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+}
+
+type GuildWelcomeScreenResponse struct {
+	Description string `json:"description"`
+	WelcomeChannels string `json:"welcome_channels"`
+}
+
+type GuildWithCountsResponse struct {
+	AfkChannelId string `json:"afk_channel_id"`
+	AfkTimeout int `json:"afk_timeout"`
+	ApplicationId string `json:"application_id"`
+	ApproximateMemberCount int `json:"approximate_member_count"`
+	ApproximatePresenceCount int `json:"approximate_presence_count"`
+	Banner string `json:"banner"`
+	DefaultMessageNotifications int `json:"default_message_notifications"`
+	Description string `json:"description"`
+	DiscoverySplash string `json:"discovery_splash"`
+	Emojis string `json:"emojis"`
+	ExplicitContentFilter int `json:"explicit_content_filter"`
+	Features string `json:"features"`
+	HomeHeader string `json:"home_header"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	MaxMembers int `json:"max_members"`
+	MaxPresences int `json:"max_presences"`
+	MaxStageVideoChannelUsers int `json:"max_stage_video_channel_users"`
+	MaxVideoChannelUsers int `json:"max_video_channel_users"`
+	MfaLevel int `json:"mfa_level"`
+	Name string `json:"name"`
+	Nsfw bool `json:"nsfw"`
+	NsfwLevel int `json:"nsfw_level"`
+	OwnerId string `json:"owner_id"`
+	PreferredLocale string `json:"preferred_locale"`
+	PremiumProgressBarEnabled bool `json:"premium_progress_bar_enabled"`
+	PremiumProgressBarEnabledUserUpdatedAt string `json:"premium_progress_bar_enabled_user_updated_at"`
+	PremiumSubscriptionCount int `json:"premium_subscription_count"`
+	PremiumTier int `json:"premium_tier"`
+	PublicUpdatesChannelId string `json:"public_updates_channel_id"`
+	Region string `json:"region"`
+	Roles string `json:"roles"`
+	RulesChannelId string `json:"rules_channel_id"`
+	SafetyAlertsChannelId string `json:"safety_alerts_channel_id"`
+	Splash string `json:"splash"`
+	Stickers string `json:"stickers"`
+	SystemChannelFlags int `json:"system_channel_flags"`
+	SystemChannelId string `json:"system_channel_id"`
+	VanityUrlCode string `json:"vanity_url_code"`
+	VerificationLevel int `json:"verification_level"`
+	WidgetChannelId string `json:"widget_channel_id"`
+	WidgetEnabled bool `json:"widget_enabled"`
+}
+
+type IconEmojiResponse struct {
+}
+
+type IncomingWebhookInteractionRequest struct {
+	AllowedMentions string `json:"allowed_mentions"`
+	Attachments string `json:"attachments"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	Embeds string `json:"embeds"`
+	Flags int `json:"flags"`
+	Poll string `json:"poll"`
+	Tts bool `json:"tts"`
+}
+
+type IncomingWebhookRequestPartial struct {
+	AllowedMentions string `json:"allowed_mentions"`
+	AppliedTags string `json:"applied_tags"`
+	Attachments string `json:"attachments"`
+	AvatarUrl string `json:"avatar_url"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	Embeds string `json:"embeds"`
+	Flags int `json:"flags"`
+	Poll string `json:"poll"`
+	ThreadName string `json:"thread_name"`
+	Tts bool `json:"tts"`
+	Username string `json:"username"`
+}
+
+type IncomingWebhookUpdateForInteractionCallbackRequestPartial struct {
+	AllowedMentions string `json:"allowed_mentions"`
+	Attachments string `json:"attachments"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	Embeds string `json:"embeds"`
+	Flags int `json:"flags"`
+}
+
+type IncomingWebhookUpdateRequestPartial struct {
+	AllowedMentions string `json:"allowed_mentions"`
+	Attachments string `json:"attachments"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	Embeds string `json:"embeds"`
+	Flags int `json:"flags"`
+	Poll string `json:"poll"`
+}
+
+type InnerErrors struct {
+}
+
+type IntegrationApplicationResponse struct {
+	Bot string `json:"bot"`
+	CoverImage string `json:"cover_image"`
+	Description string `json:"description"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	PrimarySkuId string `json:"primary_sku_id"`
+	Type string `json:"type"`
+}
+
+type InteractionApplicationCommandAutocompleteCallbackIntegerData struct {
+	Choices string `json:"choices"`
+}
+
+type InteractionApplicationCommandAutocompleteCallbackNumberData struct {
+	Choices string `json:"choices"`
+}
+
+type InteractionApplicationCommandAutocompleteCallbackStringData struct {
+	Choices string `json:"choices"`
+}
+
+type InteractionCallbackResponse struct {
+	Interaction string `json:"interaction"`
+	Resource string `json:"resource"`
+}
+
+type InteractionResponse struct {
+	ChannelId string `json:"channel_id"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	ResponseMessageEphemeral bool `json:"response_message_ephemeral"`
+	ResponseMessageId string `json:"response_message_id"`
+	ResponseMessageLoading bool `json:"response_message_loading"`
+	Type int `json:"type"`
+}
+
+type InviteApplicationResponse struct {
+	Bot string `json:"bot"`
+	BotPublic bool `json:"bot_public"`
+	BotRequireCodeGrant bool `json:"bot_require_code_grant"`
+	CoverImage string `json:"cover_image"`
+	CustomInstallUrl string `json:"custom_install_url"`
+	Description string `json:"description"`
+	Flags int `json:"flags"`
+	GuildId string `json:"guild_id"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	InstallParams string `json:"install_params"`
+	IntegrationTypesConfig string `json:"integration_types_config"`
+	MaxParticipants int `json:"max_participants"`
+	Name string `json:"name"`
+	PrimarySkuId string `json:"primary_sku_id"`
+	PrivacyPolicyUrl string `json:"privacy_policy_url"`
+	RpcOrigins string `json:"rpc_origins"`
+	Slug string `json:"slug"`
+	Tags string `json:"tags"`
+	TermsOfServiceUrl string `json:"terms_of_service_url"`
+	Type string `json:"type"`
+	VerifyKey string `json:"verify_key"`
+}
+
+type InviteChannelRecipientResponse struct {
+	Username string `json:"username"`
+}
+
+type InviteChannelResponse struct {
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Recipients string `json:"recipients"`
+	Type int `json:"type"`
+}
+
+type InviteGuildResponse struct {
+	Banner string `json:"banner"`
+	Description string `json:"description"`
+	Features string `json:"features"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Nsfw bool `json:"nsfw"`
+	NsfwLevel string `json:"nsfw_level"`
+	PremiumSubscriptionCount int `json:"premium_subscription_count"`
+	Splash string `json:"splash"`
+	VanityUrlCode string `json:"vanity_url_code"`
+	VerificationLevel string `json:"verification_level"`
+}
+
+type InviteGuildRoleResponse struct {
+	Color int `json:"color"`
+	Colors string `json:"colors"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Permissions string `json:"permissions"`
+	Position int `json:"position"`
+	UnicodeEmoji string `json:"unicode_emoji"`
+}
+
+type KeywordRuleResponse struct {
+	Actions string `json:"actions"`
+	CreatorId string `json:"creator_id"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type KeywordTriggerMetadata struct {
+	AllowList string `json:"allow_list"`
+	KeywordFilter string `json:"keyword_filter"`
+	RegexPatterns string `json:"regex_patterns"`
+}
+
+type KeywordTriggerMetadataResponse struct {
+	AllowList string `json:"allow_list"`
+	KeywordFilter string `json:"keyword_filter"`
+	RegexPatterns string `json:"regex_patterns"`
+}
+
+type KeywordUpsertRequest struct {
+	Actions string `json:"actions"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type KeywordUpsertRequestPartial struct {
+	Actions string `json:"actions"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type LabelComponentForModalRequest struct {
+	Component string `json:"component"`
+	Description string `json:"description"`
+	Id int `json:"id"`
+	Label string `json:"label"`
+	Type int `json:"type"`
+}
+
+type LaunchActivityInteractionCallbackRequest struct {
+	Type int `json:"type"`
+}
+
+type LaunchActivityInteractionCallbackResponse struct {
+	Type int `json:"type"`
+}
+
+type ListApplicationEmojisResponse struct {
+	Items string `json:"items"`
+}
+
+type ListGuildSoundboardSoundsResponse struct {
+	Items string `json:"items"`
+}
+
+type LobbyGuildInviteResponse struct {
+	Code string `json:"code"`
+}
+
+type LobbyMemberRequest struct {
+	Flags string `json:"flags"`
+	Id string `json:"id"`
+	Metadata string `json:"metadata"`
+}
+
+type LobbyMemberResponse struct {
+	Flags int `json:"flags"`
+	Id string `json:"id"`
+	Metadata string `json:"metadata"`
+}
+
+type LobbyMessageResponse struct {
+	ApplicationId string `json:"application_id"`
+	Author string `json:"author"`
+	ChannelId string `json:"channel_id"`
+	Content string `json:"content"`
+	Flags int `json:"flags"`
+	Id string `json:"id"`
+	LobbyId string `json:"lobby_id"`
+	Metadata string `json:"metadata"`
+	ModerationMetadata string `json:"moderation_metadata"`
+	Type int `json:"type"`
+}
+
+type LobbyResponse struct {
+	ApplicationId string `json:"application_id"`
+	Flags int `json:"flags"`
+	Id string `json:"id"`
+	LinkedChannel string `json:"linked_channel"`
+	Members string `json:"members"`
+	Metadata string `json:"metadata"`
+	OverrideEventWebhooksUrl string `json:"override_event_webhooks_url"`
+}
+
+type MLSpamRuleResponse struct {
+	Actions string `json:"actions"`
+	CreatorId string `json:"creator_id"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type MLSpamTriggerMetadata struct {
+}
+
+type MLSpamTriggerMetadataResponse struct {
+}
+
+type MLSpamUpsertRequest struct {
+	Actions string `json:"actions"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type MLSpamUpsertRequestPartial struct {
+	Actions string `json:"actions"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type MediaGalleryComponentForMessageRequest struct {
+	Id int `json:"id"`
+	Items string `json:"items"`
+	Type int `json:"type"`
+}
+
+type MediaGalleryComponentResponse struct {
+	Id int `json:"id"`
+	Items string `json:"items"`
+	Type int `json:"type"`
+}
+
+type MediaGalleryItemRequest struct {
+	Description string `json:"description"`
+	Media string `json:"media"`
+	Spoiler bool `json:"spoiler"`
+}
+
+type MediaGalleryItemResponse struct {
+	Description string `json:"description"`
+	Media string `json:"media"`
+	Spoiler bool `json:"spoiler"`
+}
+
+type MentionSpamRuleResponse struct {
+	Actions string `json:"actions"`
+	CreatorId string `json:"creator_id"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type MentionSpamTriggerMetadata struct {
+	MentionRaidProtectionEnabled bool `json:"mention_raid_protection_enabled"`
+	MentionTotalLimit int `json:"mention_total_limit"`
+}
+
+type MentionSpamTriggerMetadataResponse struct {
+	MentionRaidProtectionEnabled bool `json:"mention_raid_protection_enabled"`
+	MentionTotalLimit int `json:"mention_total_limit"`
+}
+
+type MentionSpamUpsertRequest struct {
+	Actions string `json:"actions"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type MentionSpamUpsertRequestPartial struct {
+	Actions string `json:"actions"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type MentionableSelectComponentForMessageRequest struct {
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type MentionableSelectComponentForModalRequest struct {
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type MentionableSelectComponentResponse struct {
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Type int `json:"type"`
+}
+
+type MessageActivityResponse struct {
+}
+
+type MessageAllowedMentionsRequest struct {
+	Parse string `json:"parse"`
+	RepliedUser bool `json:"replied_user"`
+	Roles string `json:"roles"`
+	Users string `json:"users"`
+}
+
+type MessageAttachmentRequest struct {
+	Description string `json:"description"`
+	DurationSecs float64 `json:"duration_secs"`
+	Filename string `json:"filename"`
+	Id string `json:"id"`
+	IsRemix bool `json:"is_remix"`
+	Title string `json:"title"`
+	Waveform string `json:"waveform"`
+}
+
+type MessageAttachmentResponse struct {
+	Application string `json:"application"`
+	ClipCreatedAt string `json:"clip_created_at"`
+	ClipParticipants string `json:"clip_participants"`
+	ContentType string `json:"content_type"`
+	Description string `json:"description"`
+	DurationSecs float64 `json:"duration_secs"`
+	Ephemeral bool `json:"ephemeral"`
+	Filename string `json:"filename"`
+	Height int `json:"height"`
+	Id string `json:"id"`
+	ProxyUrl string `json:"proxy_url"`
+	Size int `json:"size"`
+	Title string `json:"title"`
+	Url string `json:"url"`
+	Waveform string `json:"waveform"`
+	Width int `json:"width"`
+}
+
+type MessageCallResponse struct {
+	EndedTimestamp string `json:"ended_timestamp"`
+	Participants string `json:"participants"`
+}
+
+type MessageComponentInteractionMetadataResponse struct {
+	AuthorizingIntegrationOwners string `json:"authorizing_integration_owners"`
+	Id string `json:"id"`
+	InteractedMessageId string `json:"interacted_message_id"`
+	OriginalResponseMessageId string `json:"original_response_message_id"`
+	Type int `json:"type"`
+	User string `json:"user"`
+}
+
+type MessageCreateRequest struct {
+	AllowedMentions string `json:"allowed_mentions"`
+	Attachments string `json:"attachments"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	Embeds string `json:"embeds"`
+	EnforceNonce bool `json:"enforce_nonce"`
+	Flags int `json:"flags"`
+	MessageReference string `json:"message_reference"`
+	Nonce string `json:"nonce"`
+	Poll string `json:"poll"`
+	SharedClientTheme string `json:"shared_client_theme"`
+	StickerIds string `json:"sticker_ids"`
+	Tts bool `json:"tts"`
+}
+
+type MessageEditRequestPartial struct {
+	AllowedMentions string `json:"allowed_mentions"`
+	Attachments string `json:"attachments"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	Embeds string `json:"embeds"`
+	Flags int `json:"flags"`
+	StickerIds string `json:"sticker_ids"`
+}
+
+type MessageEmbedAuthorResponse struct {
+	IconUrl string `json:"icon_url"`
+	Name string `json:"name"`
+	ProxyIconUrl string `json:"proxy_icon_url"`
+	Url string `json:"url"`
+}
+
+type MessageEmbedFieldResponse struct {
+	Inline bool `json:"inline"`
+	Name string `json:"name"`
+	Value string `json:"value"`
+}
+
+type MessageEmbedFooterResponse struct {
+	IconUrl string `json:"icon_url"`
+	ProxyIconUrl string `json:"proxy_icon_url"`
+	Text string `json:"text"`
+}
+
+type MessageEmbedImageResponse struct {
+	ContentType string `json:"content_type"`
+	Description string `json:"description"`
+	Flags int `json:"flags"`
+	Height int `json:"height"`
+	Placeholder string `json:"placeholder"`
+	PlaceholderVersion int `json:"placeholder_version"`
+	ProxyUrl string `json:"proxy_url"`
+	Url string `json:"url"`
+	Width int `json:"width"`
+}
+
+type MessageEmbedProviderResponse struct {
+	Name string `json:"name"`
+	Url string `json:"url"`
+}
+
+type MessageEmbedResponse struct {
+	Author string `json:"author"`
+	Color int `json:"color"`
+	Description string `json:"description"`
+	Fields string `json:"fields"`
+	Footer string `json:"footer"`
+	Image string `json:"image"`
+	Provider string `json:"provider"`
+	Thumbnail string `json:"thumbnail"`
+	Timestamp string `json:"timestamp"`
+	Title string `json:"title"`
+	Type string `json:"type"`
+	Url string `json:"url"`
+	Video string `json:"video"`
+}
+
+type MessageEmbedVideoResponse struct {
+	ContentType string `json:"content_type"`
+	Description string `json:"description"`
+	Flags int `json:"flags"`
+	Height int `json:"height"`
+	Placeholder string `json:"placeholder"`
+	PlaceholderVersion int `json:"placeholder_version"`
+	ProxyUrl string `json:"proxy_url"`
+	Url string `json:"url"`
+	Width int `json:"width"`
+}
+
+type MessageInteractionResponse struct {
+	Id string `json:"id"`
+	Name string `json:"name"`
+	NameLocalized string `json:"name_localized"`
+	Type int `json:"type"`
+	User string `json:"user"`
+}
+
+type MessageMentionChannelResponse struct {
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Type int `json:"type"`
+}
+
+type MessageReactionCountDetailsResponse struct {
+	Burst int `json:"burst"`
+	Normal int `json:"normal"`
+}
+
+type MessageReactionEmojiResponse struct {
+	Animated bool `json:"animated"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type MessageReactionResponse struct {
+	BurstColors string `json:"burst_colors"`
+	Count int `json:"count"`
+	CountDetails string `json:"count_details"`
+	Emoji string `json:"emoji"`
+	Me bool `json:"me"`
+	MeBurst bool `json:"me_burst"`
+}
+
+type MessageReferenceRequest struct {
+	ChannelId string `json:"channel_id"`
+	FailIfNotExists bool `json:"fail_if_not_exists"`
+	GuildId string `json:"guild_id"`
+	MessageId string `json:"message_id"`
+	Type string `json:"type"`
+}
+
+type MessageReferenceResponse struct {
+	ChannelId string `json:"channel_id"`
+	GuildId string `json:"guild_id"`
+	MessageId string `json:"message_id"`
+	Type int `json:"type"`
+}
+
+type MessageResponse struct {
+	Activity string `json:"activity"`
+	Application string `json:"application"`
+	ApplicationId string `json:"application_id"`
+	Attachments string `json:"attachments"`
+	Author string `json:"author"`
+	Call string `json:"call"`
+	ChannelId string `json:"channel_id"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	EditedTimestamp string `json:"edited_timestamp"`
+	Embeds string `json:"embeds"`
+	Flags int `json:"flags"`
+	Id string `json:"id"`
+	Interaction string `json:"interaction"`
+	InteractionMetadata string `json:"interaction_metadata"`
+	MentionChannels string `json:"mention_channels"`
+	MentionEveryone bool `json:"mention_everyone"`
+	MentionRoles string `json:"mention_roles"`
+	Mentions string `json:"mentions"`
+	MessageReference string `json:"message_reference"`
+	MessageSnapshots string `json:"message_snapshots"`
+	Nonce string `json:"nonce"`
+	Pinned bool `json:"pinned"`
+	Poll string `json:"poll"`
+	Position int `json:"position"`
+	PurchaseNotification string `json:"purchase_notification"`
+	Reactions string `json:"reactions"`
+	ReferencedMessage string `json:"referenced_message"`
+	Resolved string `json:"resolved"`
+	RoleSubscriptionData string `json:"role_subscription_data"`
+	SharedClientTheme string `json:"shared_client_theme"`
+	StickerItems string `json:"sticker_items"`
+	Stickers string `json:"stickers"`
+	Thread string `json:"thread"`
+	Timestamp string `json:"timestamp"`
+	Tts bool `json:"tts"`
+	Type int `json:"type"`
+	WebhookId string `json:"webhook_id"`
+}
+
+type MessageRoleSubscriptionDataResponse struct {
+	IsRenewal bool `json:"is_renewal"`
+	RoleSubscriptionListingId string `json:"role_subscription_listing_id"`
+	TierName string `json:"tier_name"`
+	TotalMonthsSubscribed int `json:"total_months_subscribed"`
+}
+
+type MessageSnapshotResponse struct {
+	Message string `json:"message"`
+}
+
+type MessageStickerItemResponse struct {
+	FormatType int `json:"format_type"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type MinimalContentMessageResponse struct {
+	Attachments string `json:"attachments"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	EditedTimestamp string `json:"edited_timestamp"`
+	Embeds string `json:"embeds"`
+	Flags int `json:"flags"`
+	MentionRoles string `json:"mention_roles"`
+	Mentions string `json:"mentions"`
+	StickerItems string `json:"sticker_items"`
+	Stickers string `json:"stickers"`
+	Timestamp string `json:"timestamp"`
+	Type int `json:"type"`
+}
+
+type ModalInteractionCallbackRequest struct {
+	Data string `json:"data"`
+	Type int `json:"type"`
+}
+
+type ModalInteractionCallbackRequestData struct {
+	Components string `json:"components"`
+	CustomId string `json:"custom_id"`
+	Title string `json:"title"`
+}
+
+type ModalSubmitInteractionMetadataResponse struct {
+	AuthorizingIntegrationOwners string `json:"authorizing_integration_owners"`
+	Id string `json:"id"`
+	OriginalResponseMessageId string `json:"original_response_message_id"`
+	TriggeringInteractionMetadata string `json:"triggering_interaction_metadata"`
+	Type int `json:"type"`
+	User string `json:"user"`
+}
+
+type MyGuildResponse struct {
+	ApproximateMemberCount int `json:"approximate_member_count"`
+	ApproximatePresenceCount int `json:"approximate_presence_count"`
+	Banner string `json:"banner"`
+	Features string `json:"features"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Owner bool `json:"owner"`
+	Permissions string `json:"permissions"`
+}
+
+type NewMemberActionResponse struct {
+	ActionType int `json:"action_type"`
+	ChannelId string `json:"channel_id"`
+	Description string `json:"description"`
+	Emoji string `json:"emoji"`
+	Icon string `json:"icon"`
+	Title string `json:"title"`
+}
+
+type OAuth2GetAuthorizationResponse struct {
+	Application string `json:"application"`
+	Expires string `json:"expires"`
+	Scopes string `json:"scopes"`
+	User string `json:"user"`
+}
+
+type OAuth2GetKeys struct {
+	Keys string `json:"keys"`
+}
+
+type OAuth2GetOpenIDConnectUserInfoResponse struct {
+	Email string `json:"email"`
+	EmailVerified bool `json:"email_verified"`
+	Locale string `json:"locale"`
+	Nickname string `json:"nickname"`
+	Picture string `json:"picture"`
+	PreferredUsername string `json:"preferred_username"`
+	Sub string `json:"sub"`
+}
+
+type OAuth2Key struct {
+	Alg string `json:"alg"`
+	E string `json:"e"`
+	Kid string `json:"kid"`
+	Kty string `json:"kty"`
+	N string `json:"n"`
+	Use string `json:"use"`
+}
+
+type OnboardingPromptOptionRequest struct {
+	ChannelIds string `json:"channel_ids"`
+	Description string `json:"description"`
+	EmojiAnimated bool `json:"emoji_animated"`
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+	Id string `json:"id"`
+	RoleIds string `json:"role_ids"`
+	Title string `json:"title"`
+}
+
+type OnboardingPromptOptionResponse struct {
+	ChannelIds string `json:"channel_ids"`
+	Description string `json:"description"`
+	Emoji string `json:"emoji"`
+	Id string `json:"id"`
+	RoleIds string `json:"role_ids"`
+	Title string `json:"title"`
+}
+
+type OnboardingPromptResponse struct {
+	Id string `json:"id"`
+	InOnboarding bool `json:"in_onboarding"`
+	Options string `json:"options"`
+	Required bool `json:"required"`
+	SingleSelect bool `json:"single_select"`
+	Title string `json:"title"`
+	Type int `json:"type"`
+}
+
+type PartialDiscordIntegrationResponse struct {
+	Account string `json:"account"`
+	ApplicationId string `json:"application_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Type string `json:"type"`
+}
+
+type PartialExternalConnectionIntegrationResponse struct {
+	Account string `json:"account"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Type string `json:"type"`
+}
+
+type PartialGuildSubscriptionIntegrationResponse struct {
+	Account string `json:"account"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Type string `json:"type"`
+}
+
+type PinnedMessageResponse struct {
+	Message string `json:"message"`
+	PinnedAt string `json:"pinned_at"`
+}
+
+type PinnedMessagesResponse struct {
+	HasMore bool `json:"has_more"`
+	Items string `json:"items"`
+}
+
+type PollAnswerCreateRequest struct {
+	PollMedia string `json:"poll_media"`
+}
+
+type PollAnswerDetailsResponse struct {
+	Users string `json:"users"`
+}
+
+type PollAnswerResponse struct {
+	AnswerId int `json:"answer_id"`
+	PollMedia string `json:"poll_media"`
+}
+
+type PollCreateRequest struct {
+	AllowMultiselect bool `json:"allow_multiselect"`
+	Answers string `json:"answers"`
+	Duration int `json:"duration"`
+	LayoutType string `json:"layout_type"`
+	Question string `json:"question"`
+}
+
+type PollEmoji struct {
+	Animated bool `json:"animated"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type PollEmojiCreateRequest struct {
+	Animated bool `json:"animated"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type PollMedia struct {
+	Emoji string `json:"emoji"`
+	Text string `json:"text"`
+}
+
+type PollMediaCreateRequest struct {
+	Emoji string `json:"emoji"`
+	Text string `json:"text"`
+}
+
+type PollMediaResponse struct {
+	Emoji string `json:"emoji"`
+	Text string `json:"text"`
+}
+
+type PollResponse struct {
+	AllowMultiselect bool `json:"allow_multiselect"`
+	Answers string `json:"answers"`
+	Expiry string `json:"expiry"`
+	LayoutType int `json:"layout_type"`
+	Question string `json:"question"`
+	Results string `json:"results"`
+}
+
+type PollResultsEntryResponse struct {
+	Count int `json:"count"`
+	Id int `json:"id"`
+	MeVoted bool `json:"me_voted"`
+}
+
+type PollResultsResponse struct {
+	AnswerCounts string `json:"answer_counts"`
+	IsFinalized bool `json:"is_finalized"`
+}
+
+type PongInteractionCallbackRequest struct {
+	Type int `json:"type"`
+}
+
+type PrivateApplicationResponse struct {
+	ApproximateGuildCount int `json:"approximate_guild_count"`
+	ApproximateUserAuthorizationCount int `json:"approximate_user_authorization_count"`
+	ApproximateUserInstallCount int `json:"approximate_user_install_count"`
+	Bot string `json:"bot"`
+	BotPublic bool `json:"bot_public"`
+	BotRequireCodeGrant bool `json:"bot_require_code_grant"`
+	CoverImage string `json:"cover_image"`
+	CustomInstallUrl string `json:"custom_install_url"`
+	Description string `json:"description"`
+	ExplicitContentFilter int `json:"explicit_content_filter"`
+	Flags int `json:"flags"`
+	GuildId string `json:"guild_id"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	InstallParams string `json:"install_params"`
+	IntegrationTypesConfig string `json:"integration_types_config"`
+	InteractionsEndpointUrl string `json:"interactions_endpoint_url"`
+	MaxParticipants int `json:"max_participants"`
+	Name string `json:"name"`
+	Owner string `json:"owner"`
+	PrimarySkuId string `json:"primary_sku_id"`
+	PrivacyPolicyUrl string `json:"privacy_policy_url"`
+	RedirectUris string `json:"redirect_uris"`
+	RoleConnectionsVerificationUrl string `json:"role_connections_verification_url"`
+	RpcOrigins string `json:"rpc_origins"`
+	Slug string `json:"slug"`
+	Tags string `json:"tags"`
+	Team string `json:"team"`
+	TermsOfServiceUrl string `json:"terms_of_service_url"`
+	Type string `json:"type"`
+	VerifyKey string `json:"verify_key"`
+}
+
+type PrivateChannelLocation struct {
+	ChannelId string `json:"channel_id"`
+	Id string `json:"id"`
+	Kind string `json:"kind"`
+}
+
+type PrivateChannelResponse struct {
+	Flags int `json:"flags"`
+	Id string `json:"id"`
+	LastMessageId string `json:"last_message_id"`
+	LastPinTimestamp string `json:"last_pin_timestamp"`
+	Recipients string `json:"recipients"`
+	Type int `json:"type"`
+}
+
+type PrivateGroupChannelResponse struct {
+	ApplicationId string `json:"application_id"`
+	Flags int `json:"flags"`
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	LastMessageId string `json:"last_message_id"`
+	LastPinTimestamp string `json:"last_pin_timestamp"`
+	Managed bool `json:"managed"`
+	Name string `json:"name"`
+	OwnerId string `json:"owner_id"`
+	Recipients string `json:"recipients"`
+	Type int `json:"type"`
+}
+
+type PrivateGuildMemberResponse struct {
+	Avatar string `json:"avatar"`
+	AvatarDecorationData string `json:"avatar_decoration_data"`
+	Banner string `json:"banner"`
+	Collectibles string `json:"collectibles"`
+	CommunicationDisabledUntil string `json:"communication_disabled_until"`
+	Deaf bool `json:"deaf"`
+	Flags int `json:"flags"`
+	JoinedAt string `json:"joined_at"`
+	Mute bool `json:"mute"`
+	Nick string `json:"nick"`
+	Pending bool `json:"pending"`
+	Permissions string `json:"permissions"`
+	PremiumSince string `json:"premium_since"`
+	Roles string `json:"roles"`
+	User string `json:"user"`
+}
+
+type ProvisionalTokenResponse struct {
+	AccessToken string `json:"access_token"`
+	ExpiresAtS int `json:"expires_at_s"`
+	ExpiresIn int `json:"expires_in"`
+	IdToken string `json:"id_token"`
+	RefreshToken string `json:"refresh_token"`
+	Scope string `json:"scope"`
+	Scopes string `json:"scopes"`
+	TokenType string `json:"token_type"`
+}
+
+type PruneGuildRequest struct {
+	ComputePruneCount bool `json:"compute_prune_count"`
+	Days int `json:"days"`
+	IncludeRoles string `json:"include_roles"`
+}
+
+type PurchaseNotificationResponse struct {
+	GuildProductPurchase string `json:"guild_product_purchase"`
+	Type int `json:"type"`
+}
+
+type QuarantineUserAction struct {
+	Metadata string `json:"metadata"`
+	Type int `json:"type"`
+}
+
+type QuarantineUserActionMetadata struct {
+}
+
+type QuarantineUserActionMetadataResponse struct {
+}
+
+type QuarantineUserActionResponse struct {
+	Metadata string `json:"metadata"`
+	Type int `json:"type"`
+}
+
+type RadioGroupComponentForModalRequest struct {
+	CustomId string `json:"custom_id"`
+	Id int `json:"id"`
+	Options string `json:"options"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type RadioGroupOptionForRequest struct {
+	Default bool `json:"default"`
+	Description string `json:"description"`
+	Label string `json:"label"`
+	Value string `json:"value"`
+}
+
+type RatelimitedResponse struct {
+	Code int `json:"code"`
+	Global bool `json:"global"`
+	Message string `json:"message"`
+	RetryAfter float64 `json:"retry_after"`
+}
+
+type ResolvedObjectsResponse struct {
+	Channels string `json:"channels"`
+	Members string `json:"members"`
+	Roles string `json:"roles"`
+	Users string `json:"users"`
+}
+
+type ResourceChannelResponse struct {
+	ChannelId string `json:"channel_id"`
+	Description string `json:"description"`
+	Emoji string `json:"emoji"`
+	Icon string `json:"icon"`
+	Title string `json:"title"`
+}
+
+type RichEmbed struct {
+	Author string `json:"author"`
+	Color int `json:"color"`
+	Description string `json:"description"`
+	Fields string `json:"fields"`
+	Footer string `json:"footer"`
+	Image string `json:"image"`
+	Provider string `json:"provider"`
+	Thumbnail string `json:"thumbnail"`
+	Timestamp string `json:"timestamp"`
+	Title string `json:"title"`
+	Type string `json:"type"`
+	Url string `json:"url"`
+	Video string `json:"video"`
+}
+
+type RichEmbedAuthor struct {
+	IconUrl string `json:"icon_url"`
+	Name string `json:"name"`
+	Url string `json:"url"`
+}
+
+type RichEmbedField struct {
+	Inline bool `json:"inline"`
+	Name string `json:"name"`
+	Value string `json:"value"`
+}
+
+type RichEmbedFooter struct {
+	IconUrl string `json:"icon_url"`
+	Text string `json:"text"`
+}
+
+type RichEmbedImage struct {
+	Description string `json:"description"`
+	Height int `json:"height"`
+	IsAnimated bool `json:"is_animated"`
+	Placeholder string `json:"placeholder"`
+	PlaceholderVersion int `json:"placeholder_version"`
+	Url string `json:"url"`
+	Width int `json:"width"`
+}
+
+type RichEmbedProvider struct {
+	Name string `json:"name"`
+	Url string `json:"url"`
+}
+
+type RichEmbedThumbnail struct {
+	Description string `json:"description"`
+	Height int `json:"height"`
+	IsAnimated bool `json:"is_animated"`
+	Placeholder string `json:"placeholder"`
+	PlaceholderVersion int `json:"placeholder_version"`
+	Url string `json:"url"`
+	Width int `json:"width"`
+}
+
+type RichEmbedVideo struct {
+	Description string `json:"description"`
+	Height int `json:"height"`
+	IsAnimated bool `json:"is_animated"`
+	Placeholder string `json:"placeholder"`
+	PlaceholderVersion int `json:"placeholder_version"`
+	Url string `json:"url"`
+	Width int `json:"width"`
+}
+
+type RoleColors struct {
+	PrimaryColor int `json:"primary_color"`
+	SecondaryColor int `json:"secondary_color"`
+	TertiaryColor int `json:"tertiary_color"`
+}
+
+type RoleSelectComponentForMessageRequest struct {
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type RoleSelectComponentForModalRequest struct {
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type RoleSelectComponentResponse struct {
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Type int `json:"type"`
+}
+
+type RoleSelectDefaultValue struct {
+	Id string `json:"id"`
+	Type string `json:"type"`
+}
+
+type RoleSelectDefaultValueResponse struct {
+	Id string `json:"id"`
+	Type string `json:"type"`
+}
+
+type SDKMessageRequest struct {
+	AllowedMentions string `json:"allowed_mentions"`
+	Attachments string `json:"attachments"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	Embeds string `json:"embeds"`
+	EnforceNonce bool `json:"enforce_nonce"`
+	Flags int `json:"flags"`
+	MessageReference string `json:"message_reference"`
+	Nonce string `json:"nonce"`
+	Poll string `json:"poll"`
+	SharedClientTheme string `json:"shared_client_theme"`
+	StickerIds string `json:"sticker_ids"`
+	Tts bool `json:"tts"`
+}
+
+type ScheduledEventResponse struct {
+	ChannelId string `json:"channel_id"`
+	Creator string `json:"creator"`
+	CreatorId string `json:"creator_id"`
+	Description string `json:"description"`
+	EntityId string `json:"entity_id"`
+	EntityType int `json:"entity_type"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Image string `json:"image"`
+	Name string `json:"name"`
+	PrivacyLevel int `json:"privacy_level"`
+	ScheduledEndTime string `json:"scheduled_end_time"`
+	ScheduledStartTime string `json:"scheduled_start_time"`
+	Status int `json:"status"`
+	UserCount int `json:"user_count"`
+	UserRsvp string `json:"user_rsvp"`
+}
+
+type ScheduledEventUserResponse struct {
+	GuildScheduledEventId string `json:"guild_scheduled_event_id"`
+	Member string `json:"member"`
+	User string `json:"user"`
+	UserId string `json:"user_id"`
+}
+
+type SearchIndexNotReadyResponse struct {
+	Code int `json:"code"`
+	DocumentsIndexed int `json:"documents_indexed"`
+	Message string `json:"message"`
+	RetryAfter int `json:"retry_after"`
+}
+
+type SearchMessageResponse struct {
+	Activity string `json:"activity"`
+	Application string `json:"application"`
+	ApplicationId string `json:"application_id"`
+	Attachments string `json:"attachments"`
+	Author string `json:"author"`
+	Call string `json:"call"`
+	ChannelId string `json:"channel_id"`
+	Components string `json:"components"`
+	Content string `json:"content"`
+	EditedTimestamp string `json:"edited_timestamp"`
+	Embeds string `json:"embeds"`
+	Flags int `json:"flags"`
+	Hit bool `json:"hit"`
+	Id string `json:"id"`
+	Interaction string `json:"interaction"`
+	InteractionMetadata string `json:"interaction_metadata"`
+	MentionChannels string `json:"mention_channels"`
+	MentionEveryone bool `json:"mention_everyone"`
+	MentionRoles string `json:"mention_roles"`
+	Mentions string `json:"mentions"`
+	MessageReference string `json:"message_reference"`
+	MessageSnapshots string `json:"message_snapshots"`
+	Nonce string `json:"nonce"`
+	Pinned bool `json:"pinned"`
+	Poll string `json:"poll"`
+	Position int `json:"position"`
+	PurchaseNotification string `json:"purchase_notification"`
+	Reactions string `json:"reactions"`
+	ReferencedMessage string `json:"referenced_message"`
+	Resolved string `json:"resolved"`
+	RoleSubscriptionData string `json:"role_subscription_data"`
+	SharedClientTheme string `json:"shared_client_theme"`
+	StickerItems string `json:"sticker_items"`
+	Stickers string `json:"stickers"`
+	Thread string `json:"thread"`
+	Timestamp string `json:"timestamp"`
+	Tts bool `json:"tts"`
+	Type int `json:"type"`
+	WebhookId string `json:"webhook_id"`
+}
+
+type SectionComponentForMessageRequest struct {
+	Accessory string `json:"accessory"`
+	Components string `json:"components"`
+	Id int `json:"id"`
+	Type int `json:"type"`
+}
+
+type SectionComponentResponse struct {
+	Accessory string `json:"accessory"`
+	Components string `json:"components"`
+	Id int `json:"id"`
+	Type int `json:"type"`
+}
+
+type SeparatorComponentForMessageRequest struct {
+	Divider bool `json:"divider"`
+	Id int `json:"id"`
+	Spacing string `json:"spacing"`
+	Type int `json:"type"`
+}
+
+type SeparatorComponentResponse struct {
+	Divider bool `json:"divider"`
+	Id int `json:"id"`
+	Spacing int `json:"spacing"`
+	Type int `json:"type"`
+}
+
+type SettingsEmojiResponse struct {
+	Animated bool `json:"animated"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type SlackWebhook struct {
+	Attachments string `json:"attachments"`
+	IconUrl string `json:"icon_url"`
+	Text string `json:"text"`
+	Username string `json:"username"`
+}
+
+type SocialLayerSKUPurchaseEligibilityCallbackData struct {
+	Eligible bool `json:"eligible"`
+	IneligibleReason string `json:"ineligible_reason"`
+	IneligibleReasonDescription string `json:"ineligible_reason_description"`
+}
+
+type SocialLayerSKUPurchaseEligibilityInteractionCallbackRequest struct {
+	Data string `json:"data"`
+	Type int `json:"type"`
+}
+
+type SoundboardCreateRequest struct {
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+	Name string `json:"name"`
+	Sound string `json:"sound"`
+	Volume float64 `json:"volume"`
+}
+
+type SoundboardPatchRequestPartial struct {
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+	Name string `json:"name"`
+	Volume float64 `json:"volume"`
+}
+
+type SoundboardSoundResponse struct {
+	Available bool `json:"available"`
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+	GuildId string `json:"guild_id"`
+	Name string `json:"name"`
+	SoundId string `json:"sound_id"`
+	User string `json:"user"`
+	Volume float64 `json:"volume"`
+}
+
+type SoundboardSoundSendRequest struct {
+	SoundId string `json:"sound_id"`
+	SourceGuildId string `json:"source_guild_id"`
+}
+
+type SpamLinkRuleResponse struct {
+	Actions string `json:"actions"`
+	CreatorId string `json:"creator_id"`
+	Enabled bool `json:"enabled"`
+	EventType int `json:"event_type"`
+	ExemptChannels string `json:"exempt_channels"`
+	ExemptRoles string `json:"exempt_roles"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	TriggerMetadata string `json:"trigger_metadata"`
+	TriggerType int `json:"trigger_type"`
+}
+
+type SpamLinkTriggerMetadataResponse struct {
+}
+
+type StageInstanceResponse struct {
+	ChannelId string `json:"channel_id"`
+	DiscoverableDisabled bool `json:"discoverable_disabled"`
+	GuildId string `json:"guild_id"`
+	GuildScheduledEventId string `json:"guild_scheduled_event_id"`
+	Id string `json:"id"`
+	PrivacyLevel int `json:"privacy_level"`
+	Topic string `json:"topic"`
+}
+
+type StageScheduledEventCreateRequest struct {
+	ChannelId string `json:"channel_id"`
+	Description string `json:"description"`
+	EntityMetadata string `json:"entity_metadata"`
+	EntityType int `json:"entity_type"`
+	Image string `json:"image"`
+	Name string `json:"name"`
+	PrivacyLevel int `json:"privacy_level"`
+	ScheduledEndTime string `json:"scheduled_end_time"`
+	ScheduledStartTime string `json:"scheduled_start_time"`
+}
+
+type StageScheduledEventPatchRequestPartial struct {
+	ChannelId string `json:"channel_id"`
+	Description string `json:"description"`
+	EntityMetadata string `json:"entity_metadata"`
+	EntityType string `json:"entity_type"`
+	Image string `json:"image"`
+	Name string `json:"name"`
+	PrivacyLevel int `json:"privacy_level"`
+	ScheduledEndTime string `json:"scheduled_end_time"`
+	ScheduledStartTime string `json:"scheduled_start_time"`
+	Status string `json:"status"`
+}
+
+type StageScheduledEventResponse struct {
+	ChannelId string `json:"channel_id"`
+	Creator string `json:"creator"`
+	CreatorId string `json:"creator_id"`
+	Description string `json:"description"`
+	EntityId string `json:"entity_id"`
+	EntityMetadata string `json:"entity_metadata"`
+	EntityType int `json:"entity_type"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Image string `json:"image"`
+	Name string `json:"name"`
+	PrivacyLevel int `json:"privacy_level"`
+	ScheduledEndTime string `json:"scheduled_end_time"`
+	ScheduledStartTime string `json:"scheduled_start_time"`
+	Status int `json:"status"`
+	UserCount int `json:"user_count"`
+	UserRsvp string `json:"user_rsvp"`
+}
+
+type StandardStickerResponse struct {
+	Description string `json:"description"`
+	FormatType string `json:"format_type"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	PackId string `json:"pack_id"`
+	SortValue int `json:"sort_value"`
+	Tags string `json:"tags"`
+	Type int `json:"type"`
+}
+
+type StickerPackCollectionResponse struct {
+	StickerPacks string `json:"sticker_packs"`
+}
+
+type StickerPackResponse struct {
+	BannerAssetId string `json:"banner_asset_id"`
+	CoverStickerId string `json:"cover_sticker_id"`
+	Description string `json:"description"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	SkuId string `json:"sku_id"`
+	Stickers string `json:"stickers"`
+}
+
+type StringSelectComponentForMessageRequest struct {
+	CustomId string `json:"custom_id"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Options string `json:"options"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type StringSelectComponentForModalRequest struct {
+	CustomId string `json:"custom_id"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Options string `json:"options"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type StringSelectComponentResponse struct {
+	CustomId string `json:"custom_id"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Options string `json:"options"`
+	Placeholder string `json:"placeholder"`
+	Type int `json:"type"`
+}
+
+type StringSelectOptionForRequest struct {
+	Default bool `json:"default"`
+	Description string `json:"description"`
+	Emoji string `json:"emoji"`
+	Label string `json:"label"`
+	Value string `json:"value"`
+}
+
+type StringSelectOptionResponse struct {
+	Default bool `json:"default"`
+	Description string `json:"description"`
+	Emoji string `json:"emoji"`
+	Label string `json:"label"`
+	Value string `json:"value"`
+}
+
+type TargetUsersJobStatusResponse struct {
+	CompletedAt string `json:"completed_at"`
+	CreatedAt string `json:"created_at"`
+	ErrorMessage string `json:"error_message"`
+	ProcessedUsers int `json:"processed_users"`
+	Status int `json:"status"`
+	TotalUsers int `json:"total_users"`
+}
+
+type TeamMemberResponse struct {
+	MembershipState int `json:"membership_state"`
+	TeamId string `json:"team_id"`
+	User string `json:"user"`
+}
+
+type TeamResponse struct {
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Members string `json:"members"`
+	Name string `json:"name"`
+	OwnerUserId string `json:"owner_user_id"`
+}
+
+type TextDisplayComponentForMessageRequest struct {
+	Content string `json:"content"`
+	Id int `json:"id"`
+	Type int `json:"type"`
+}
+
+type TextDisplayComponentForModalRequest struct {
+	Content string `json:"content"`
+	Id int `json:"id"`
+	Type int `json:"type"`
+}
+
+type TextDisplayComponentResponse struct {
+	Content string `json:"content"`
+	Id int `json:"id"`
+	Type int `json:"type"`
+}
+
+type TextInputComponentForModalRequest struct {
+	CustomId string `json:"custom_id"`
+	Id int `json:"id"`
+	Label string `json:"label"`
+	MaxLength int `json:"max_length"`
+	MinLength int `json:"min_length"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Style int `json:"style"`
+	Type int `json:"type"`
+	Value string `json:"value"`
+}
+
+type TextInputComponentResponse struct {
+	CustomId string `json:"custom_id"`
+	Id int `json:"id"`
+	Label string `json:"label"`
+	MaxLength int `json:"max_length"`
+	MinLength int `json:"min_length"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Style int `json:"style"`
+	Type int `json:"type"`
+	Value string `json:"value"`
+}
+
+type ThreadMemberResponse struct {
+	Flags int `json:"flags"`
+	Id string `json:"id"`
+	JoinTimestamp string `json:"join_timestamp"`
+	Member string `json:"member"`
+	UserId string `json:"user_id"`
+}
+
+type ThreadMetadataResponse struct {
+	ArchiveTimestamp string `json:"archive_timestamp"`
+	Archived bool `json:"archived"`
+	AutoArchiveDuration int `json:"auto_archive_duration"`
+	CreateTimestamp string `json:"create_timestamp"`
+	Invitable bool `json:"invitable"`
+	Locked bool `json:"locked"`
+}
+
+type ThreadResponse struct {
+	AppliedTags string `json:"applied_tags"`
+	Bitrate int `json:"bitrate"`
+	Flags int `json:"flags"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	LastMessageId string `json:"last_message_id"`
+	LastPinTimestamp string `json:"last_pin_timestamp"`
+	Member string `json:"member"`
+	MemberCount int `json:"member_count"`
+	MessageCount int `json:"message_count"`
+	Name string `json:"name"`
+	OwnerId string `json:"owner_id"`
+	ParentId string `json:"parent_id"`
+	Permissions string `json:"permissions"`
+	RateLimitPerUser int `json:"rate_limit_per_user"`
+	RtcRegion string `json:"rtc_region"`
+	ThreadMetadata string `json:"thread_metadata"`
+	TotalMessageSent int `json:"total_message_sent"`
+	Type int `json:"type"`
+	UserLimit int `json:"user_limit"`
+	VideoQualityMode int `json:"video_quality_mode"`
+}
+
+type ThreadSearchResponse struct {
+	FirstMessages string `json:"first_messages"`
+	HasMore bool `json:"has_more"`
+	Members string `json:"members"`
+	Threads string `json:"threads"`
+	TotalResults int `json:"total_results"`
+}
+
+type ThreadsResponse struct {
+	FirstMessages string `json:"first_messages"`
+	HasMore bool `json:"has_more"`
+	Members string `json:"members"`
+	Threads string `json:"threads"`
+}
+
+type ThumbnailComponentForMessageRequest struct {
+	Description string `json:"description"`
+	Id int `json:"id"`
+	Media string `json:"media"`
+	Spoiler bool `json:"spoiler"`
+	Type int `json:"type"`
+}
+
+type ThumbnailComponentResponse struct {
+	Description string `json:"description"`
+	Id int `json:"id"`
+	Media string `json:"media"`
+	Spoiler bool `json:"spoiler"`
+	Type int `json:"type"`
+}
+
+type TypingIndicatorResponse struct {
+}
+
+type UnbanUserFromGuildRequest struct {
+}
+
+type UnfurledMediaRequest struct {
+	Url string `json:"url"`
+}
+
+type UnfurledMediaRequestWithAttachmentReferenceRequired struct {
+	Url string `json:"url"`
+}
+
+type UnfurledMediaResponse struct {
+	AttachmentId string `json:"attachment_id"`
+	ContentType string `json:"content_type"`
+	Height int `json:"height"`
+	Id string `json:"id"`
+	ProxyUrl string `json:"proxy_url"`
+	Url string `json:"url"`
+	Width int `json:"width"`
+}
+
+type UpdateApplicationUserRoleConnectionRequest struct {
+	Metadata string `json:"metadata"`
+	PlatformName string `json:"platform_name"`
+	PlatformUsername string `json:"platform_username"`
+}
+
+type UpdateDMRequestPartial struct {
+	Name string `json:"name"`
+}
+
+type UpdateDefaultReactionEmojiRequest struct {
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+}
+
+type UpdateGroupDMRequestPartial struct {
+	Icon string `json:"icon"`
+	Name string `json:"name"`
+}
+
+type UpdateGuildChannelRequestPartial struct {
+	AvailableTags string `json:"available_tags"`
+	Bitrate int `json:"bitrate"`
+	DefaultAutoArchiveDuration string `json:"default_auto_archive_duration"`
+	DefaultForumLayout string `json:"default_forum_layout"`
+	DefaultReactionEmoji string `json:"default_reaction_emoji"`
+	DefaultSortOrder string `json:"default_sort_order"`
+	DefaultTagSetting string `json:"default_tag_setting"`
+	DefaultThreadRateLimitPerUser int `json:"default_thread_rate_limit_per_user"`
+	Flags int `json:"flags"`
+	Name string `json:"name"`
+	Nsfw bool `json:"nsfw"`
+	ParentId string `json:"parent_id"`
+	PermissionOverwrites string `json:"permission_overwrites"`
+	Position int `json:"position"`
+	RateLimitPerUser int `json:"rate_limit_per_user"`
+	RtcRegion string `json:"rtc_region"`
+	Topic string `json:"topic"`
+	Type string `json:"type"`
+	UserLimit int `json:"user_limit"`
+	VideoQualityMode string `json:"video_quality_mode"`
+}
+
+type UpdateGuildOnboardingRequest struct {
+	DefaultChannelIds string `json:"default_channel_ids"`
+	Enabled bool `json:"enabled"`
+	Mode string `json:"mode"`
+	Prompts string `json:"prompts"`
+}
+
+type UpdateMessageInteractionCallbackRequest struct {
+	Data string `json:"data"`
+	Type int `json:"type"`
+}
+
+type UpdateMessageInteractionCallbackResponse struct {
+	Message string `json:"message"`
+	Type int `json:"type"`
+}
+
+type UpdateOnboardingPromptRequest struct {
+	Id string `json:"id"`
+	InOnboarding bool `json:"in_onboarding"`
+	Options string `json:"options"`
+	Required bool `json:"required"`
+	SingleSelect bool `json:"single_select"`
+	Title string `json:"title"`
+	Type string `json:"type"`
+}
+
+type UpdateRolePositionsRequest struct {
+	Id string `json:"id"`
+	Position int `json:"position"`
+}
+
+type UpdateRoleRequestPartial struct {
+	Color int `json:"color"`
+	Colors string `json:"colors"`
+	Hoist bool `json:"hoist"`
+	Icon string `json:"icon"`
+	Mentionable bool `json:"mentionable"`
+	Name string `json:"name"`
+	Permissions int `json:"permissions"`
+	UnicodeEmoji string `json:"unicode_emoji"`
+}
+
+type UpdateSelfVoiceStateRequestPartial struct {
+	ChannelId string `json:"channel_id"`
+	RequestToSpeakTimestamp string `json:"request_to_speak_timestamp"`
+	Suppress bool `json:"suppress"`
+}
+
+type UpdateThreadRequestPartial struct {
+	AppliedTags string `json:"applied_tags"`
+	Archived bool `json:"archived"`
+	AutoArchiveDuration string `json:"auto_archive_duration"`
+	Bitrate int `json:"bitrate"`
+	Flags int `json:"flags"`
+	Invitable bool `json:"invitable"`
+	Locked bool `json:"locked"`
+	Name string `json:"name"`
+	RateLimitPerUser int `json:"rate_limit_per_user"`
+	RtcRegion string `json:"rtc_region"`
+	UserLimit int `json:"user_limit"`
+	VideoQualityMode string `json:"video_quality_mode"`
+}
+
+type UpdateThreadTagRequest struct {
+	EmojiId string `json:"emoji_id"`
+	EmojiName string `json:"emoji_name"`
+	Id string `json:"id"`
+	Moderated bool `json:"moderated"`
+	Name string `json:"name"`
+}
+
+type UpdateVoiceStateRequestPartial struct {
+	ChannelId string `json:"channel_id"`
+	Suppress bool `json:"suppress"`
+}
+
+type UserAvatarDecorationResponse struct {
+	Asset string `json:"asset"`
+	SkuId string `json:"sku_id"`
+}
+
+type UserCollectiblesResponse struct {
+	Nameplate string `json:"nameplate"`
+}
+
+type UserCommunicationDisabledAction struct {
+	Metadata string `json:"metadata"`
+	Type int `json:"type"`
+}
+
+type UserCommunicationDisabledActionMetadata struct {
+	DurationSeconds int `json:"duration_seconds"`
+}
+
+type UserCommunicationDisabledActionMetadataResponse struct {
+	DurationSeconds int `json:"duration_seconds"`
+}
+
+type UserCommunicationDisabledActionResponse struct {
+	Metadata string `json:"metadata"`
+	Type int `json:"type"`
+}
+
+type UserGuildOnboardingResponse struct {
+	DefaultChannelIds string `json:"default_channel_ids"`
+	Enabled bool `json:"enabled"`
+	GuildId string `json:"guild_id"`
+	Prompts string `json:"prompts"`
+}
+
+type UserNameplateResponse struct {
+	Asset string `json:"asset"`
+	Label string `json:"label"`
+	Palette string `json:"palette"`
+	SkuId string `json:"sku_id"`
+}
+
+type UserPIIResponse struct {
+	AccentColor int `json:"accent_color"`
+	Avatar string `json:"avatar"`
+	AvatarDecorationData string `json:"avatar_decoration_data"`
+	Banner string `json:"banner"`
+	Bot bool `json:"bot"`
+	Collectibles string `json:"collectibles"`
+	Discriminator string `json:"discriminator"`
+	Email string `json:"email"`
+	Flags int `json:"flags"`
+	GlobalName string `json:"global_name"`
+	Id string `json:"id"`
+	Locale string `json:"locale"`
+	MfaEnabled bool `json:"mfa_enabled"`
+	PremiumType int `json:"premium_type"`
+	PrimaryGuild string `json:"primary_guild"`
+	PublicFlags int `json:"public_flags"`
+	System bool `json:"system"`
+	Username string `json:"username"`
+	Verified bool `json:"verified"`
+}
+
+type UserPrimaryGuildResponse struct {
+	Badge string `json:"badge"`
+	IdentityEnabled bool `json:"identity_enabled"`
+	IdentityGuildId string `json:"identity_guild_id"`
+	Tag string `json:"tag"`
+}
+
+type UserResponse struct {
+	AccentColor int `json:"accent_color"`
+	Avatar string `json:"avatar"`
+	AvatarDecorationData string `json:"avatar_decoration_data"`
+	Banner string `json:"banner"`
+	Bot bool `json:"bot"`
+	Collectibles string `json:"collectibles"`
+	Discriminator string `json:"discriminator"`
+	Flags int `json:"flags"`
+	GlobalName string `json:"global_name"`
+	Id string `json:"id"`
+	PrimaryGuild string `json:"primary_guild"`
+	PublicFlags int `json:"public_flags"`
+	System bool `json:"system"`
+	Username string `json:"username"`
+}
+
+type UserSelectComponentForMessageRequest struct {
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type UserSelectComponentForModalRequest struct {
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Required bool `json:"required"`
+	Type int `json:"type"`
+}
+
+type UserSelectComponentResponse struct {
+	CustomId string `json:"custom_id"`
+	DefaultValues string `json:"default_values"`
+	Disabled bool `json:"disabled"`
+	Id int `json:"id"`
+	MaxValues int `json:"max_values"`
+	MinValues int `json:"min_values"`
+	Placeholder string `json:"placeholder"`
+	Type int `json:"type"`
+}
+
+type UserSelectDefaultValue struct {
+	Id string `json:"id"`
+	Type string `json:"type"`
+}
+
+type UserSelectDefaultValueResponse struct {
+	Id string `json:"id"`
+	Type string `json:"type"`
+}
+
+type VanityURLErrorResponse struct {
+	Code int `json:"code"`
+	Message string `json:"message"`
+}
+
+type VanityURLResponse struct {
+	Code string `json:"code"`
+	Error string `json:"error"`
+	Uses int `json:"uses"`
+}
+
+type VoiceRegionResponse struct {
+	Custom bool `json:"custom"`
+	Deprecated bool `json:"deprecated"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Optimal bool `json:"optimal"`
+}
+
+type VoiceScheduledEventCreateRequest struct {
+	ChannelId string `json:"channel_id"`
+	Description string `json:"description"`
+	EntityMetadata string `json:"entity_metadata"`
+	EntityType int `json:"entity_type"`
+	Image string `json:"image"`
+	Name string `json:"name"`
+	PrivacyLevel int `json:"privacy_level"`
+	ScheduledEndTime string `json:"scheduled_end_time"`
+	ScheduledStartTime string `json:"scheduled_start_time"`
+}
+
+type VoiceScheduledEventPatchRequestPartial struct {
+	ChannelId string `json:"channel_id"`
+	Description string `json:"description"`
+	EntityMetadata string `json:"entity_metadata"`
+	EntityType string `json:"entity_type"`
+	Image string `json:"image"`
+	Name string `json:"name"`
+	PrivacyLevel int `json:"privacy_level"`
+	ScheduledEndTime string `json:"scheduled_end_time"`
+	ScheduledStartTime string `json:"scheduled_start_time"`
+	Status string `json:"status"`
+}
+
+type VoiceScheduledEventResponse struct {
+	ChannelId string `json:"channel_id"`
+	Creator string `json:"creator"`
+	CreatorId string `json:"creator_id"`
+	Description string `json:"description"`
+	EntityId string `json:"entity_id"`
+	EntityMetadata string `json:"entity_metadata"`
+	EntityType int `json:"entity_type"`
+	GuildId string `json:"guild_id"`
+	Id string `json:"id"`
+	Image string `json:"image"`
+	Name string `json:"name"`
+	PrivacyLevel int `json:"privacy_level"`
+	ScheduledEndTime string `json:"scheduled_end_time"`
+	ScheduledStartTime string `json:"scheduled_start_time"`
+	Status int `json:"status"`
+	UserCount int `json:"user_count"`
+	UserRsvp string `json:"user_rsvp"`
+}
+
+type VoiceStateResponse struct {
+	ChannelId string `json:"channel_id"`
+	Deaf bool `json:"deaf"`
+	GuildId string `json:"guild_id"`
+	Member string `json:"member"`
+	Mute bool `json:"mute"`
+	RequestToSpeakTimestamp string `json:"request_to_speak_timestamp"`
+	SelfDeaf bool `json:"self_deaf"`
+	SelfMute bool `json:"self_mute"`
+	SelfStream bool `json:"self_stream"`
+	SelfVideo bool `json:"self_video"`
+	SessionId string `json:"session_id"`
+	Suppress bool `json:"suppress"`
+	UserId string `json:"user_id"`
+}
+
+type WebhookSlackEmbed struct {
+	AuthorIcon string `json:"author_icon"`
+	AuthorLink string `json:"author_link"`
+	AuthorName string `json:"author_name"`
+	Color string `json:"color"`
+	Fields string `json:"fields"`
+	Footer string `json:"footer"`
+	FooterIcon string `json:"footer_icon"`
+	ImageUrl string `json:"image_url"`
+	Pretext string `json:"pretext"`
+	Text string `json:"text"`
+	ThumbUrl string `json:"thumb_url"`
+	Title string `json:"title"`
+	TitleLink string `json:"title_link"`
+	Ts int `json:"ts"`
+}
+
+type WebhookSlackEmbedField struct {
+	Inline bool `json:"inline"`
+	Name string `json:"name"`
+	Value string `json:"value"`
+}
+
+type WebhookSourceChannelResponse struct {
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type WebhookSourceGuildResponse struct {
+	Icon string `json:"icon"`
+	Id string `json:"id"`
+	Name string `json:"name"`
+}
+
+type WelcomeMessageResponse struct {
+	AuthorIds string `json:"author_ids"`
+	Message string `json:"message"`
+}
+
+type WelcomeScreenPatchRequestPartial struct {
+	Description string `json:"description"`
+	Enabled bool `json:"enabled"`
+	WelcomeChannels string `json:"welcome_channels"`
+}
+
+type WidgetActivity struct {
+	Name string `json:"name"`
+}
+
+type WidgetChannel struct {
+	Id string `json:"id"`
+	Name string `json:"name"`
+	Position int `json:"position"`
+}
+
+type WidgetMember struct {
+	Activity string `json:"activity"`
+	Avatar string `json:"avatar"`
+	AvatarUrl string `json:"avatar_url"`
+	ChannelId string `json:"channel_id"`
+	Deaf bool `json:"deaf"`
+	Discriminator string `json:"discriminator"`
+	Id string `json:"id"`
+	Mute bool `json:"mute"`
+	SelfDeaf bool `json:"self_deaf"`
+	SelfMute bool `json:"self_mute"`
+	Status string `json:"status"`
+	Suppress bool `json:"suppress"`
+	Username string `json:"username"`
+}
+
+type WidgetResponse struct {
+	Channels string `json:"channels"`
+	Id string `json:"id"`
+	InstantInvite string `json:"instant_invite"`
+	Members string `json:"members"`
+	Name string `json:"name"`
+	PresenceCount int `json:"presence_count"`
+}
+
+type WidgetSettingsResponse struct {
+	ChannelId string `json:"channel_id"`
+	Enabled bool `json:"enabled"`
+}
+
diff --git a/docs/plans/2026-03-25-feat-discord-cli-research.md b/docs/plans/2026-03-25-feat-discord-cli-research.md
index f896f995..9dff301e 100644
--- a/docs/plans/2026-03-25-feat-discord-cli-research.md
+++ b/docs/plans/2026-03-25-feat-discord-cli-research.md
@@ -9,48 +9,60 @@ date: 2026-03-25
 
 ## Spec Discovery
 - Official OpenAPI spec: https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json
-- Source: Known-specs registry (discord/discord-api-spec GitHub repo)
-- Format: JSON, OpenAPI 3.1.0
-- Endpoint count: 200+ (Discord's full REST API)
+- Source: Known-specs registry (verified)
+- Format: OpenAPI 3.1.0 (JSON)
+- Endpoint count: 200+ (22 resource categories)
 
 ## Competitors (Deep Analysis)
 
-### discli (ibbybuilds/discli) - 6 stars
-- Repo: https://github.com/ibbybuilds/discli
-- Language: TypeScript/JavaScript (Node.js)
-- Commands: ~51 across 9 resource groups (server, invites, channels, roles, members, permissions, messages, emojis, audit)
-- Last commit: Recent (2026)
-- Open issues: 0
-- Maintained: Yes (new project)
-- Notable features: YAML output by default (token-efficient for AI), --confirm for destructive ops, SOUL.md personality customization, no WebSocket needed
-- Weaknesses: Only 6 stars, limited to subset of Discord API (no webhooks, slash commands, scheduled events, threads, auto-mod, stickers, stage instances, voice regions), TypeScript (requires Node.js runtime)
-
-### discordo (ayn2op/discordo) - 5,400 stars
+### DiscordChatExporter (10,700 stars)
+- Repo: https://github.com/Tyrrrz/DiscordChatExporter
+- Language: C# (91.3%)
+- Commands: ~10 (export-focused: exportdm, exportchannel, exportguild, exportall)
+- Last commit: March 21, 2026 (v2.47.1)
+- Open issues: 10
+- Contributors: 63
+- Maintained: YES (actively)
+- Notable features: GUI + CLI, HTML/JSON/CSV/TXT export, date range filtering, file partitioning, Docker
+- Weaknesses: Export-only (no search, no sync, no management), C# binary (large), no agent-native features (--json/--select/--dry-run), no server management, no audit log analysis
+
+### jackwener/discord-cli (78 stars)
+- Repo: https://github.com/jackwener/discord-cli
+- Language: Python (100%)
+- Commands: ~15 (sync, search, tail, export, stats, timeline, top, recent, today, purge, guilds, channels, members, info)
+- Last commit: January 2026
+- Open issues: unknown (new repo)
+- Maintained: YES (new, active)
+- Notable features: SQLite + FTS5 search, incremental sync, tail -f, YAML/JSON output, AI agent integration (SCHEMA.md), activity timeline
+- Weaknesses: Python (slow startup), uses user tokens (TOS-violating), no server management (no role/channel CRUD), no audit log, no webhooks, no --dry-run, no doctor command
+
+### discordo (5,400 stars)
 - Repo: https://github.com/ayn2op/discordo
-- Language: Go
-- Commands: N/A (TUI chat client, not API management CLI)
-- Last commit: Active
-- Open issues: 45
-- Maintained: Yes, 40 contributors
-- Notable features: Terminal Discord chat client, QR code login, TOML config
-- Weaknesses: Different category entirely - interactive chat TUI, not an API management CLI. Violates Discord ToS (automated user accounts). Not comparable.
+- Language: Go (100%)
+- Purpose: TUI client (NOT a management CLI - different category)
+- Maintained: YES
+- Not a direct competitor - it's a chat client, not an API management tool
 
 ## User Pain Points
-> "Using external clients were against Discord's wish and terms of service" - discord-cli README (highlights the need for bot-token-based API CLIs that are ToS-compliant)
-> "Official plugin support and third party client" discussion on discord-api-docs shows demand for programmatic Discord access beyond the web UI - Discussion #3857
+> "Communities are moving en-masse to information blackholes like Discord that cannot be indexed by search engines." - discord-dl README
+> "Automated user accounts violate Discord's Terms of Service" - discordo README (applies to user-token tools)
+> Rate limiting is the #1 pain point - 429 errors, per-route limits not communicated through headers, IP bans after 10k failed requests
 
 ## Auth Method
-- Type: Bot token (Bearer) via Authorization header
-- Env var convention: DISCORD_BOT_TOKEN (discli uses this)
+- Type: Bot token (primary, TOS-compliant)
+- Env var convention: DISCORD_TOKEN or DISCORD_BOT_TOKEN
+- OAuth2 also supported for user-level access
 
 ## Demand Signals
-- discord/discord-api-docs Discussion #3857: users requesting official third-party client support
-- discli's "for AI agents and humans" framing shows the agent-native CLI demand is recognized but underserved (6 stars = early, not widely adopted)
+- HN: discordo (5.4k stars) shows strong demand for terminal Discord tools
+- HN: Discoding (2026) - AI CLI relay to Discord shows developer workflow integration demand
+- AnswerOverflow: Making Discord searchable is a validated business (Y Combinator backed)
+- n8n integration: Shows automation/workflow demand for Discord API
 
 ## Strategic Justification
-**Why this CLI should exist:** discli is the only API management CLI and has just 6 stars with ~51 commands covering a fraction of Discord's 200+ endpoint API. It requires Node.js runtime. Our CLI will be a single Go binary covering the full Discord API spec, with --json/--select/--dry-run/--stdin for agent workflows, and proper doctor/cache/auth patterns. We'll beat discli on breadth (full API coverage vs partial) and distribution (single binary vs npm install).
+**Why this CLI should exist:** No Go CLI exists that combines API management (full REST coverage) + data tool (SQLite sync/search/export) + workflow commands (audit-report, channel-health). DiscordChatExporter has 10.7k stars but is export-only with no search/sync/management. jackwener/discord-cli (78 stars) validates the data-tool approach but uses TOS-violating user tokens and is Python (slow). Our CLI is Go (fast binary), uses bot tokens (TOS-compliant), covers 200+ API endpoints, AND includes discrawl-class workflow commands. It's the first tool that combines all three: API wrapper + data tool + workflow engine.
 
 ## Target
-- Command count: 80+ (match full API spec coverage, beat discli's 51)
-- Key differentiator: Full API coverage in a single Go binary with agent-native features (--json, --select, --dry-run, --stdin, doctor, cache)
-- Quality bar: Steinberger Grade A (72+/90)
+- Command count: 50+ (beat jackwener at 15, match API breadth + 7 workflow commands)
+- Key differentiator: Go binary + bot-token compliant + SQLite sync/search + audit/health workflow commands
+- Quality bar: Steinberger Grade A (80+/100)
diff --git a/docs/plans/2026-03-25-feat-discord-cli-visionary-research.md b/docs/plans/2026-03-25-feat-discord-cli-visionary-research.md
new file mode 100644
index 00000000..1ebbfe34
--- /dev/null
+++ b/docs/plans/2026-03-25-feat-discord-cli-visionary-research.md
@@ -0,0 +1,69 @@
+---
+title: "Visionary Research: Discord CLI"
+type: feat
+status: active
+date: 2026-03-25
+---
+
+## Visionary Research: Discord CLI
+
+### API Identity
+- Domain: Communication (messaging, voice, communities)
+- Primary users: Bot developers, server admins, community managers, data analysts
+- Core entities: Guilds, Channels, Messages, Users, Roles, Emojis, Webhooks, Invites, Audit Log, Auto Moderation, Stage Instances, Scheduled Events, Polls, Stickers, Soundboard, SKUs, Entitlements, Subscriptions, Guild Templates, Lobbies
+- Data profile:
+  - Write pattern: Append-only (messages), mutable (guilds, channels, roles, members)
+  - Volume: HIGH (millions of messages across servers)
+  - Real-time: YES (Gateway/WebSocket for events, webhooks for notifications)
+  - Search need: HIGH (users constantly need to find messages, members, audit events)
+- Auth: Bot token (primary), OAuth2 (user auth)
+- Base URL: https://discord.com/api/v10
+- Rate limits: Per-route + global (10,000 req/10min = 429 ban for 1hr+)
+
+### Usage Patterns (Top 5 by Evidence)
+
+1. **Message export/archive** (Evidence: 10/10) - DiscordChatExporter 10.7k stars, multiple archive tools
+2. **Server backup/restore** (Evidence: 7/10) - discord-backup, discopy, discord-server-backup
+3. **Message search/analytics** (Evidence: 7/10) - AnswerOverflow, discord-analytics, discord-cli FTS5
+4. **Real-time channel monitoring** (Evidence: 5/10) - discord-dl, discord-cli tail, keyword alerting
+5. **Server management automation** (Evidence: 5/10) - Bot management, role CRUD, audit log review
+
+### Tool Landscape (Beyond API Wrappers)
+
+| Tool | Stars | Type | What it does |
+|------|-------|------|-------------|
+| DiscordChatExporter | 10,700 | Data Tool | Export messages to HTML/JSON/CSV/TXT |
+| discordo | 5,400 | Environment Tool | TUI Discord client |
+| jackwener/discord-cli | 78 | Data Tool | SQLite sync + FTS5 search + tail + export |
+| discord-dl | 26 | Data Tool | Archive to SQLite with web UI |
+| discord-migrate | 0 | Data Tool | Export to SQLite for Matrix migration |
+| Copycord | N/A | Integration Tool | Real-time server mirroring |
+| discopy | N/A | Data Tool | Server config backup/restore |
+
+### Workflows
+
+1. **Archive and Search**: sync messages -> SQLite -> FTS5 search -> export
+2. **Server Audit**: fetch audit log -> filter by action/user/date -> export report
+3. **Channel Health**: list channels -> message volume -> stale detection -> report
+4. **Member Analytics**: list members -> role grouping -> activity analysis -> export
+5. **Bulk Role Management**: list roles -> compare template -> bulk assign -> dry-run
+
+### Architecture Decisions
+
+| Decision | Choice | Rationale |
+|----------|--------|-----------|
+| Persistence | SQLite + FTS5 | High volume + high search need. Validated by discord-cli. |
+| Real-time | REST polling (tail) | Simpler than Gateway WebSocket for CLI use. |
+| Search | FTS5 local | Offline search, zero rate limit exposure. |
+| Bulk | Pagination + rate-limit | Transparent handling of Discord's per-route limits. |
+| Cache | SQLite IS the cache | Sync once, query many. --no-cache bypasses. |
+
+### Top 5 Features for the World
+
+| # | Feature | Score | Description |
+|---|---------|-------|-------------|
+| 1 | Local sync + FTS5 search | 14/16 | Sync to SQLite, search offline. |
+| 2 | Channel health detection | 12/16 | Inactive channels, volume trends. |
+| 3 | Audit log analysis + export | 12/16 | Query by action/user/date, export JSON. |
+| 4 | Server config backup/restore | 11/16 | Roles, channels, permissions to JSON. |
+| 5 | Message tail (real-time follow) | 10/16 | tail -f for Discord channels. |
diff --git a/docs/plans/2026-03-25-fix-discord-cli-audit.md b/docs/plans/2026-03-25-fix-discord-cli-audit.md
index 0a837989..4931176e 100644
--- a/docs/plans/2026-03-25-fix-discord-cli-audit.md
+++ b/docs/plans/2026-03-25-fix-discord-cli-audit.md
@@ -1,73 +1,73 @@
 ---
-title: "Audit: Discord CLI"
+title: "Steinberger Audit: Discord CLI"
 type: fix
 status: active
 date: 2026-03-25
 ---
 
-# Audit: Discord CLI
-
-## Automated Scorecard Baseline
-90/90 (100%) - Grade A. All dimensions at 10/10.
-
-## Manual Code Review Findings
-
-### 1. Example values are placeholder garbage
-All examples use "abc123" instead of realistic Discord snowflake IDs (18-digit numbers like "1234567890123456789"). Webhook tokens should also be realistic.
-
-### 2. Short descriptions are too terse
-"Create" should be "Send a message to a channel". "Get" should be "Get a channel by ID". The descriptions are just the HTTP verb, not developer-friendly.
-
-### 3. Root command description is raw spec text
-"Preview of the Discord v10 HTTP API specification" - should be "Manage Discord servers, channels, messages, and more from the command line"
-
-### 4. Complex body fields lack --stdin examples
-79 complex fields were skipped. Key endpoints that NEED --stdin examples:
-- `channels messages create` - embeds, components, attachments, sticker_ids
-- `webhooks execute` - embeds, components, attachments
-- `guilds channels create` - permission_overwrites
-- `applications commands create` - options, integration_types
-
-### 5. Flag descriptions are raw spec jargon
-"Tts" should be "Send as text-to-speech message". "Enforce nonce" should be "Enforce nonce uniqueness for this message".
+# Steinberger Audit: Discord CLI
+
+## Command Comparison
+- Generated: 316 commands across 16 resource groups
+- Target: 50+ (beat jackwener/discord-cli at 15)
+- Result: 316 commands - massively exceeds target breadth
+
+## Help Text Quality Assessment
+- Root description: "Preview of the Discord v10 HTTP API specification" - NEEDS FIX (raw spec title, should describe what the CLI does)
+- Command descriptions: Many are lazy 1-word ("Create", "Get", "Delete") - NEEDS FIX
+- Examples: Placeholder values ("abc123") - NEEDS FIX with realistic Discord IDs
+- Resource group descriptions: Generic ("Manage channels") - OK but could be better
+
+## Agent-Native Checklist
+- [x] --json
+- [x] --select
+- [x] --dry-run
+- [x] --stdin
+- [x] --yes
+- [x] --no-cache
+- [x] doctor
+- [x] Typed exit codes (0,2,3,4,5,7,10)
+- [x] --csv, --plain, --quiet
+- [ ] --stdin example in help text for complex body fields
+
+## Complex Body Fields Plan
+Top 3 endpoints needing --stdin examples:
+1. **channels messages create** - embeds, components, attachments, sticker_ids skipped. Example: `echo '{"content":"Hello","embeds":[{"title":"Test","color":5814783}]}' | discord-cli channels messages create CHANNEL_ID --stdin`
+2. **guilds channels create** - permission_overwrites, available_tags skipped. Example: `echo '{"name":"new-channel","type":0,"permission_overwrites":[{"id":"ROLE_ID","type":0,"allow":"1024"}]}' | discord-cli guilds channels create GUILD_ID --stdin`
+3. **webhooks execute** - embeds, components, attachments skipped. Example: `echo '{"content":"Deploy complete","embeds":[{"title":"Build #123","color":3066993}]}' | discord-cli webhooks execute WEBHOOK_ID WEBHOOK_TOKEN --stdin`
 
 ## First Steinberger Analysis (Baseline)
 
 | Dimension | Score | What 10 Looks Like | How to Get There |
 |-----------|-------|-------------------|-----------------|
-| Output modes | 10/10 | gogcli: --json, --csv, --plain, --quiet, --select | Already has all output modes |
-| Auth | 10/10 | gogcli: env var, config file, doctor validates | Present |
-| Error handling | 10/10 | gogcli: typed exits, classifyAPIError | Present |
-| Terminal UX | 10/10 | gogcli: colors, tabwriter, no-color flag | Present but descriptions are terse |
-| README | 10/10 | gogcli: install, quickstart, every command, agent usage | Structure good, examples weak |
-| Doctor | 10/10 | gogcli: validates auth, version, config | Present |
-| Agent-native | 10/10 | gogcli: --json, --select, --dry-run, --stdin, --yes, typed exits | Complete |
-| Local Cache | 10/10 | gogcli: 5-min cache, --no-cache bypass | Present |
-| Breadth | 10/10 | gogcli: covers full API | 307 commands from full spec |
-
-**Baseline Total: 90/90 (Grade A)**
-
-## GOAT Improvement Plan (UX Polish - Not Scorecard-Measured)
-
-1. Fix root command description to be developer-friendly
-2. Fix all example values from "abc123" to realistic Discord snowflake IDs
-3. Add --stdin examples for top 3 complex body field endpoints
-4. Improve README with realistic examples and a cookbook section
-5. Fix terse flag descriptions for the most important commands
-
-## Complex Body Field Plan
-
-### channels messages create
-```bash
-echo '{"content":"Hello!","embeds":[{"title":"My Embed","description":"Rich content","color":5814783}]}' | discord-cli channels messages create 1234567890123456789 --stdin
-```
-
-### webhooks execute
-```bash
-echo '{"content":"Deploy complete","embeds":[{"title":"Status","color":3066993,"fields":[{"name":"Version","value":"v2.1.0"}]}]}' | discord-cli webhooks execute 1234567890123456789 WEBHOOK_TOKEN --stdin
-```
-
-### applications commands create
-```bash
-echo '{"name":"greet","description":"Say hello","options":[{"name":"user","type":6,"description":"User to greet","required":true}]}' | discord-cli applications commands create 1234567890123456789 --stdin
-```
+| Output modes | 10/10 | --json, --csv, --plain, --quiet, --select | Already at 10 |
+| Auth | 10/10 | Token via env var, doctor validates, config file | Already at 10 |
+| Error handling | 10/10 | Typed exits, retry with backoff, classifyAPIError | Already at 10 |
+| Terminal UX | 8/10 | Progress spinners, color themes, pager for long output | Add progress indicator for sync/tail |
+| README | 4/10 | Install, quickstart, every command with example, cookbook, FAQ | Add cookbook section with Discord-specific examples, realistic IDs, complex body examples |
+| Doctor | 10/10 | Validates auth, API version, config health | Already at 10 |
+| Agent-native | 8/10 | --json, --select, --dry-run, --stdin, idempotent, typed exits | Add --stdin examples in help text |
+| Local Cache | 10/10 | SQLite sync + search + FTS5 | Already at 10 |
+| Breadth | 6/10 | 100+ commands covering every endpoint + convenience wrappers | 316 commands but descriptions are lazy. Fix Short fields. |
+| Vision | 9/10 | Sync + search + tail + export + analytics | Already strong. Add workflow commands to reach 10. |
+| Workflows | 4/10 | Compound commands combining 2+ API calls | Build Phase 0.5 workflows |
+
+**Baseline Total: 89/110 (80%) - Grade A**
+
+## GOAT Improvement Plan
+
+### Top 5 Highest-Impact Improvements
+1. **Build 7 workflow commands** (Phase 0.5) - channel-health, audit-report, member-report, server-snapshot, prune-preview, webhook-test, message-stats
+2. **Fix README** - Add cookbook with Discord-specific examples, complex body --stdin examples, FAQ
+3. **Fix root description** - "Discord API CLI - manage servers, channels, messages, roles, and more from your terminal"
+4. **Fix lazy Short fields** - "Create" -> "Send a message to a channel", "Get" -> "Get channel details by ID"
+5. **Add --stdin examples** - Top 3 complex body endpoints in help text
+
+### Commands to ADD (Workflow commands)
+1. `discord-cli channel-health` - Stale channel detection + activity histogram
+2. `discord-cli audit-report` - Audit log analysis grouped by action/user/date
+3. `discord-cli member-report` - Member activity, role distribution, top contributors
+4. `discord-cli server-snapshot` - Backup guild config to JSON
+5. `discord-cli prune-preview` - Preview member prune before executing
+6. `discord-cli webhook-test` - Send test payloads to webhooks
+7. `discord-cli message-stats` - Per-channel message volume and activity trends
diff --git a/docs/plans/2026-03-26-feat-discord-cli-vs-discrawl-gap-analysis-plan.md b/docs/plans/2026-03-26-feat-discord-cli-vs-discrawl-gap-analysis-plan.md
new file mode 100644
index 00000000..0e3c48d2
--- /dev/null
+++ b/docs/plans/2026-03-26-feat-discord-cli-vs-discrawl-gap-analysis-plan.md
@@ -0,0 +1,318 @@
+---
+title: "discord-cli vs discrawl: Gap Analysis and Upgrade Plan"
+type: feat
+status: active
+date: 2026-03-26
+---
+
+# discord-cli vs discrawl: Gap Analysis and Upgrade Plan
+
+## Overview
+
+discrawl (540 stars, steipete/discrawl) is a Go CLI that mirrors Discord guild data into local SQLite with FTS5 search. It has 12 commands but each one is deeply purpose-built for Discord. The generated discord-cli has 330+ commands but its data layer is generic. This plan compares them feature-by-feature and identifies what discord-cli needs to steal from discrawl's playbook.
+
+**Bottom line:** discrawl is a far superior data tool. discord-cli is a far superior API wrapper. The ideal CLI combines both.
+
+---
+
+## Feature-by-Feature Comparison
+
+### Data Layer
+
+| Capability | discrawl | discord-cli | Winner |
+|---|---|---|---|
+| **Schema** | Discord-native: separate tables for messages, members, channels with proper columns | Generic `resources` table with JSON blobs | discrawl by a mile |
+| **FTS5 indexing** | Extracts message content, attachment text, embed text, filenames | Indexes raw JSON blobs | discrawl |
+| **Sync** | `--guild`, `--channels`, `--since`, `--concurrency` (auto-sized), `--with-embeddings` | Generic `--resources` flag, no Discord-specific filtering | discrawl |
+| **Tail** | Gateway WebSocket with repair loops (real-time, misses nothing) | REST polling at intervals (slow, misses events, rate-limited) | discrawl |
+| **Search** | `--guild`, `--channel`, `--author`, `--limit`, `--include-empty` | `--type`, `--limit` only (no Discord-specific filters) | discrawl |
+| **Messages** | Filter by channel, author, time range (`--days`/`--hours`/`--since`), `--sync` on-demand, `--all`, `--last N` | No equivalent command | discrawl |
+| **Mentions** | Structured user/role mention tracking with time filters | No equivalent | discrawl |
+| **Members** | list, show (with message history), search (username, bio, pronouns, social handles, URLs) | member-report (role counts only) | discrawl |
+| **Channels** | list, show (metadata inspection) | Via API commands only (no local query) | discrawl |
+| **SQL** | Raw read-only SQL access to the database | No equivalent | discrawl |
+| **Status** | Archive statistics and sync progress | No equivalent | discrawl |
+| **Init** | Multi-guild discovery with OpenClaw integration, config file generation | No equivalent | discrawl |
+| **Embeddings** | Optional OpenAI semantic search, batch-processed in background | No equivalent | discrawl |
+
+**Score: discrawl 13/13 on data capabilities.**
+
+### API Management
+
+| Capability | discrawl | discord-cli | Winner |
+|---|---|---|---|
+| **REST API coverage** | 0 commands | 316 commands across 20 resource groups | discord-cli |
+| **Guild management** | None (read-only crawler) | Create, update, delete guilds | discord-cli |
+| **Channel management** | None | Full CRUD + permissions | discord-cli |
+| **Role management** | None | Full CRUD + bulk operations | discord-cli |
+| **Ban management** | None | Ban, unban, list bans | discord-cli |
+| **Webhook management** | None | Full CRUD + execute | discord-cli |
+| **Application commands** | None | Full slash command management | discord-cli |
+| **Auto moderation** | None | Full rule management | discord-cli |
+| **Scheduled events** | None | Full CRUD | discord-cli |
+| **Stage instances** | None | Full management | discord-cli |
+
+**Score: discord-cli 10/10 on API management. discrawl has zero.**
+
+### Workflow Commands
+
+| Capability | discrawl | discord-cli | Winner |
+|---|---|---|---|
+| **channel-health** | Nothing | Stale channel detection + activity report | discord-cli |
+| **audit-report** | Nothing | Audit log analysis by action/user/date | discord-cli |
+| **member-report** | Nothing (members search is close) | Role distribution, bot/human counts | discord-cli |
+| **server-snapshot** | Nothing | Backup guild config to JSON | discord-cli |
+| **message-stats** | Nothing | Message volume, top contributors, hourly activity | discord-cli |
+| **webhook-test** | Nothing | Send test payloads to webhooks | discord-cli |
+| **prune-preview** | Nothing | Preview prune without executing | discord-cli |
+
+**Score: discord-cli 7/0. discrawl has no workflow commands.**
+
+### Agent-Native Features
+
+| Feature | discrawl | discord-cli | Winner |
+|---|---|---|---|
+| **--json** | Yes | Yes | Tie |
+| **--select** | No | Yes | discord-cli |
+| **--dry-run** | No | Yes | discord-cli |
+| **--stdin** | No | Yes | discord-cli |
+| **--yes** | No | Yes | discord-cli |
+| **--no-cache** | No | Yes | discord-cli |
+| **--csv** | No | Yes | discord-cli |
+| **--plain** | No | Yes | discord-cli |
+| **--quiet** | No | Yes | discord-cli |
+| **Typed exit codes** | Unknown | 0,2,3,4,5,7,10 | discord-cli |
+
+**Score: discord-cli 8/1.**
+
+---
+
+## The Verdict
+
+| Dimension | discrawl | discord-cli |
+|---|---|---|
+| Data tool | 13/13 | 0/13 |
+| API management | 0/10 | 10/10 |
+| Workflow commands | 0/7 | 7/7 |
+| Agent-native | 1/9 | 9/9 |
+| **Total** | **14/39** | **26/39** |
+
+discord-cli wins on breadth. discrawl wins on depth where it matters most - the data layer.
+
+The printing-press skill itself says it: **"discrawl has 12 commands and 539 stars. Depth beats breadth."** The 316 API wrapper commands are table stakes. The 7 workflow commands are differentiation. But the data layer - sync, search, tail, messages, mentions, members, SQL - is where discrawl demolishes us.
+
+---
+
+## What discord-cli Must Steal from discrawl
+
+### Priority 1: Discord-Native Schema (Critical)
+
+Replace the generic `resources` table with Discord-specific tables:
+
+```sql
+-- Messages table with proper columns
+CREATE TABLE messages (
+    id TEXT PRIMARY KEY,
+    channel_id TEXT NOT NULL,
+    guild_id TEXT,
+    author_id TEXT NOT NULL,
+    content TEXT,
+    timestamp DATETIME NOT NULL,
+    edited_timestamp DATETIME,
+    type INTEGER DEFAULT 0,
+    data JSON NOT NULL,
+    synced_at DATETIME DEFAULT CURRENT_TIMESTAMP
+);
+CREATE INDEX idx_messages_channel ON messages(channel_id);
+CREATE INDEX idx_messages_author ON messages(author_id);
+CREATE INDEX idx_messages_timestamp ON messages(timestamp);
+
+-- FTS on extracted content (not JSON blobs)
+CREATE VIRTUAL TABLE messages_fts USING fts5(
+    id, channel_id, author_id, content,
+    tokenize='porter unicode61'
+);
+
+-- Members table
+CREATE TABLE members (
+    user_id TEXT NOT NULL,
+    guild_id TEXT NOT NULL,
+    username TEXT,
+    display_name TEXT,
+    bio TEXT,
+    joined_at DATETIME,
+    roles JSON,
+    data JSON NOT NULL,
+    PRIMARY KEY (user_id, guild_id)
+);
+
+-- Mentions table
+CREATE TABLE mentions (
+    message_id TEXT NOT NULL,
+    target_id TEXT NOT NULL,
+    target_type TEXT NOT NULL, -- 'user' or 'role'
+    guild_id TEXT,
+    channel_id TEXT,
+    timestamp DATETIME,
+    FOREIGN KEY (message_id) REFERENCES messages(id)
+);
+```
+
+**Why:** Without this, search returns JSON blobs. With this, search returns `#channel-name @author: message content` with filters.
+
+### Priority 2: Discord-Aware Sync
+
+Replace the generic sync with Discord-specific backfill:
+
+- `discord-cli sync --guild GUILD_ID` - sync one guild
+- `discord-cli sync --channels CHANNEL_ID,CHANNEL_ID` - sync specific channels
+- `discord-cli sync --since 2026-01-01` - sync from date
+- `discord-cli sync --full` - full historical backfill
+- `discord-cli sync --concurrency 16` - auto-sized by default
+- Incremental: track last message ID per channel as cursor
+- Paginate with `GET /channels/{id}/messages?before=OLDEST_ID&limit=100`
+
+### Priority 3: Messages Command
+
+Add a `messages` command that queries the local database:
+
+```bash
+# Messages from a channel in the last 7 days
+discord-cli messages --channel general --days 7
+
+# Messages from a specific author
+discord-cli messages --author steipete --days 30
+
+# All messages, syncing on-demand if needed
+discord-cli messages --channel help --all --sync
+
+# Last 100 messages
+discord-cli messages --channel dev --last 100 --json
+```
+
+### Priority 4: Search Filtering
+
+Add Discord-specific filters to search:
+
+```bash
+# Search within a guild
+discord-cli search "error" --guild 123456789012345678
+
+# Search within a channel
+discord-cli search "timeout" --channel help
+
+# Search by author
+discord-cli search "fix" --author steipete
+
+# Combine filters
+discord-cli search "deploy" --guild 123 --channel releases --json
+```
+
+### Priority 5: SQL Command
+
+Expose raw read-only SQL access:
+
+```bash
+# Run a query
+discord-cli sql 'SELECT channel_id, COUNT(*) as cnt FROM messages GROUP BY channel_id ORDER BY cnt DESC LIMIT 10'
+
+# From stdin
+echo 'SELECT * FROM members WHERE bio LIKE "%rust%"' | discord-cli sql -
+```
+
+### Priority 6: Mentions Command
+
+Track and query structured mentions:
+
+```bash
+# Who mentioned me?
+discord-cli mentions --target @mybot --days 7
+
+# Role mentions in a channel
+discord-cli mentions --channel announcements --type role
+
+# JSON for agent consumption
+discord-cli mentions --target USER_ID --json
+```
+
+### Priority 7: Gateway Tail (Future)
+
+Replace REST polling with Gateway WebSocket:
+
+- Connect to `wss://gateway.discord.gg/` with bot token
+- Subscribe to MESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE events
+- Write events to SQLite in real-time
+- Periodic repair syncs to catch missed events
+- Graceful reconnection with resume
+
+This is the hardest change (Gateway protocol is complex) but gives true real-time vs polling delay.
+
+---
+
+## What discord-cli Already Does Better
+
+These are advantages to preserve and highlight:
+
+1. **316 API wrapper commands** - discrawl can't create channels, manage roles, ban users, or execute webhooks
+2. **7 workflow commands** - channel-health, audit-report, server-snapshot are unique value
+3. **Agent-native features** - --select, --dry-run, --stdin, --yes, --csv, --plain, typed exits
+4. **Complex body support** - --stdin for embeds, components, attachments
+5. **Doctor with full diagnostics** - Both have this, parity
+
+---
+
+## Implementation Phases
+
+### Phase 1: Schema Migration (2-3 hours)
+- Replace generic `resources` table with Discord-specific tables
+- Update `store.go` with `UpsertMessage`, `UpsertMember`, `UpsertChannel` methods
+- Migrate FTS5 to index extracted content, not JSON blobs
+- Add mention extraction during message upsert
+
+### Phase 2: Discord-Aware Sync (3-4 hours)
+- Rewrite `sync.go` with Discord-specific logic
+- Paginate through channels using `?before=` cursor
+- Track per-channel sync state
+- Add `--guild`, `--channels`, `--since`, `--concurrency` flags
+- Auto-discover guilds from bot token
+
+### Phase 3: Messages + Search Filtering (2-3 hours)
+- New `messages` command with local database queries
+- Add `--guild`, `--channel`, `--author` filters to search
+- Add `--days`, `--hours`, `--since` time filters
+
+### Phase 4: SQL + Mentions (1-2 hours)
+- Read-only SQL command
+- Mentions command with structured queries
+
+### Phase 5: Gateway Tail (4-6 hours, optional)
+- WebSocket client for Discord Gateway
+- Event-to-SQLite pipeline
+- Repair loops
+- Resume on reconnect
+
+**Total estimated work: 8-12 hours for Phases 1-4, plus 4-6 hours for Gateway.**
+
+---
+
+## Acceptance Criteria
+
+- [ ] Discord-specific schema with messages, members, channels, mentions tables
+- [ ] FTS5 indexes extracted content (not JSON blobs)
+- [ ] Sync supports `--guild`, `--channels`, `--since`, `--concurrency`
+- [ ] `messages` command with channel/author/time filters
+- [ ] `search` supports `--guild`, `--channel`, `--author` filters
+- [ ] `sql` command for raw read-only queries
+- [ ] `mentions` command for structured mention queries
+- [ ] All existing 316 API commands still work
+- [ ] All 7 workflow commands still work
+- [ ] `go build ./...` and `go vet ./...` pass
+
+---
+
+## Sources
+
+- [steipete/discrawl](https://github.com/steipete/discrawl) - 540 stars, the reference implementation
+- [jackwener/discord-cli](https://github.com/jackwener/discord-cli) - 78 stars, Python alternative with similar approach
+- [Tyrrrz/DiscordChatExporter](https://github.com/Tyrrrz/DiscordChatExporter) - 10.7k stars, export-only (no search/sync)
+- [Discord API Docs](https://docs.discord.com/developers/intro) - Official REST + Gateway documentation
diff --git a/docs/plans/2026-03-26-feat-power-user-prediction-engine-plan.md b/docs/plans/2026-03-26-feat-power-user-prediction-engine-plan.md
new file mode 100644
index 00000000..dde38846
--- /dev/null
+++ b/docs/plans/2026-03-26-feat-power-user-prediction-engine-plan.md
@@ -0,0 +1,620 @@
+---
+title: "Power User Prediction Engine for Printing Press"
+type: feat
+status: completed
+date: 2026-03-26
+---
+
+# Power User Prediction Engine for Printing Press
+
+## Overview
+
+The printing-press generates Grade A API wrappers (Discord: 316 commands, 94/110 Steinberger). But it can't predict what a power user would build *on top* of those APIs - the domain-specific SQLite schema, incremental sync, full-text search with domain filters, real-time tail, structured mention tracking, and raw SQL access that make discrawl (12 commands, 540 stars) more valuable than a 316-command wrapper.
+
+This plan adds **Phase 0.7: Power User Prediction Engine** to the SKILL.md. It runs after Phase 0.5 (Power User Workflows) and before Phase 1 (Deep Research). It uses API surface analysis + social signal mining + data gravity scoring to generate a **Data Layer Specification** - a concrete blueprint for building discrawl-class features without knowing discrawl exists.
+
+## Problem Statement
+
+Phase 0.5 thinks in *commands* ("what compound CLI commands would a power user want?"). But power users don't just want commands - they want a **local data layer** that enables all of them. discrawl's killer feature isn't any single command - it's the SQLite database with domain-native tables.
+
+**Evidence from the Discord run (2026-03-25):**
+
+| What we predicted (Phase 0.5) | What we missed (discrawl has) |
+|---|---|
+| channel-health workflow | Discord-native schema (messages/members/channels tables) |
+| audit-report workflow | Gateway WebSocket tail (not REST polling) |
+| member-report workflow | `messages` command with --channel/--author/--days filters |
+| server-snapshot workflow | `mentions` command with structured mention tracking |
+| message-stats workflow | `members search` across bio, pronouns, social handles |
+| webhook-test workflow | `sql` command for raw read-only queries |
+| prune-preview workflow | FTS5 on extracted content (not JSON blobs) |
+
+The workflows we predicted are good - discrawl doesn't have them. But the data layer underneath is where discrawl wins 13/13 on capabilities.
+
+**Root cause:** The generator creates a generic `resources` table with JSON blobs and a generic FTS5 index on those blobs. It should create domain-specific tables with proper columns and FTS5 on extracted text fields.
+
+## Proposed Solution
+
+### New Phase: 0.7 - Power User Prediction Engine
+
+Insert between Phase 0.5 and Phase 1 in the SKILL.md. Five prediction steps, 15-25 minutes total.
+
+```
+Phase 0   -> Phase 0.5 -> [Phase 0.7] -> Phase 1 -> Phase 2 -> Phase 3 -> Phase 4 -> Phase 5
+Visionary    Workflows    Prediction     Research    Generate    Audit      Build      Score
+Research     (commands)   Engine         (specs)     (code)      (review)   (fixes)    (final)
+                          (data layer)
+```
+
+---
+
+## Technical Approach
+
+### Step 0.7a: Entity Classification
+
+**Goal:** Map every API resource into one of four types.
+
+Read the OpenAPI spec (or use Phase 0's entity list) and classify each resource:
+
+| Type | Signal | Example | Persistence Need |
+|---|---|---|---|
+| **Accumulating** | Grows over time, has timestamps, paginated lists | Messages, Issues, Audit Logs, Commits | SQLite table + incremental sync |
+| **Reference** | Changes rarely, small cardinality, referenced by other entities | Users, Teams, Roles, Labels, Channels | SQLite table + periodic refresh |
+| **Append-only** | Never edited, only created | Events, Webhooks, Notifications | SQLite table + tail command |
+| **Ephemeral** | Short-lived, not worth persisting | OAuth tokens, Rate limit status, Gateway info | API-only, no persistence |
+
+**Output:** Entity classification table with type, estimated volume, update frequency, and key temporal field.
+
+**Heuristics for classification:**
+- Has `created_at`/`timestamp` + paginated list endpoint -> Accumulating
+- Referenced by 3+ other entities via `_id` fields -> Reference
+- Has no UPDATE/PATCH endpoint -> Append-only
+- No list endpoint or < 100 expected records -> Ephemeral
+- Has `updated_at` or `modified_at` -> needs incremental sync cursor
+
+### Step 0.7b: Social Signal Mining for Data Patterns
+
+**Goal:** Find evidence of what data power users actually store locally.
+
+Run 7 parallel WebSearches:
+
+```
+1. "<API name>" export OR backup OR archive site:github.com
+2. "<API name>" SQLite OR database OR local site:github.com
+3. "<API name>" analytics OR dashboard OR metrics site:github.com
+4. "<API name>" "I wish" OR "would be nice" OR "feature request" data
+5. "<API name>" offline OR search OR "full text" site:reddit.com OR site:news.ycombinator.com
+6. "<API name>" trend OR pattern OR anomaly detection
+7. "<API name>" graph OR visualization OR dependency
+```
+
+**For each finding, extract:**
+- What entities they store locally
+- What queries they run (joins, aggregations, time filters)
+- What temporal patterns they track
+- What cross-entity relationships they need
+
+**Score using Phase 0 evidence framework.** Anything with score >= 6 informs the data layer.
+
+### Step 0.7c: Data Gravity Scoring
+
+**Goal:** Rank entities by how much value they'd have in a local SQLite database.
+
+**Formula:** `DataGravity = Volume(0-3) + QueryFrequency(0-3) + JoinDemand(0-2) + SearchNeed(0-2) + TemporalValue(0-2)`
+
+| Factor | 0 | 1 | 2 | 3 |
+|---|---|---|---|---|
+| **Volume** | < 100 records | 100-10k | 10k-1M | > 1M |
+| **QueryFrequency** | Rarely queried | Monthly | Weekly | Daily |
+| **JoinDemand** | No references | 1-2 entities reference it | 3-4 | 5+ |
+| **SearchNeed** | No text fields | 1 text field | 2-3 text fields | Primary text content |
+| **TemporalValue** | No time dimension | Created date only | Updated + trends | Core to time-series analysis |
+
+**Thresholds:**
+- Score >= 8: **Primary entity** - gets its own SQLite table with proper columns
+- Score 5-7: **Support entity** - gets a table but simpler schema
+- Score < 5: **API-only** - no local persistence
+
+**Example scores that would have predicted discrawl:**
+
+| Entity | Volume | QueryFreq | JoinDemand | SearchNeed | TemporalValue | Total | Decision |
+|---|---|---|---|---|---|---|---|
+| Messages | 3 | 3 | 2 | 3 | 2 | **13** | Primary |
+| Members | 2 | 2 | 2 | 2 | 1 | **9** | Primary |
+| Channels | 1 | 2 | 2 | 1 | 0 | **6** | Support |
+| Roles | 1 | 1 | 2 | 0 | 0 | **4** | API-only |
+| Audit Logs | 2 | 2 | 1 | 1 | 2 | **8** | Primary |
+
+This scoring would have correctly predicted that messages, members, and audit logs need dedicated SQLite tables - exactly what discrawl builds.
+
+### Step 0.7d: Schema + Sync + Search Specification
+
+**Goal:** Write the concrete data layer specification.
+
+For each Primary entity (score >= 8):
+
+**1. SQLite Schema:**
+- Extract columns from the API's response schema (not just id + JSON blob)
+- Include foreign key columns for joins (e.g., `channel_id`, `author_id`)
+- Include the temporal field for sync cursors
+- Add indexes on foreign keys and temporal fields
+- Create FTS5 virtual table on text fields
+
+**2. Sync Strategy:**
+- Identify the incremental sync cursor (timestamp field, snowflake ID, cursor pagination)
+- Verify the API supports filtering by this cursor (check query params for `since`, `after`, `updated_after`)
+- Determine batch size from API's max `limit` parameter
+- Check if API has WebSocket/SSE/Gateway - if yes, note for tail command
+- **VALIDATE:** If the API doesn't support filtering by the cursor field, fall back to full sync + local dedup
+
+**3. Search Specification:**
+- List which text fields to extract into FTS5 (title, description, content, body, name)
+- Define domain-specific search filters as SQL WHERE clauses
+- Map CLI flags to SQL: `--channel` -> `WHERE channel_id = ?`, `--author` -> `WHERE author_id = ?`
+- **VALIDATE:** Check that the API actually returns these fields in list/get responses
+
+**4. Compound Queries:**
+- Define 3-5 useful cross-entity queries (e.g., "messages by author in channel in last N days")
+- Validate that the join columns exist in both tables
+- These become the basis for workflow commands that use the local database instead of live API calls
+
+### Step 0.7e: Write the Data Layer Specification Artifact
+
+Write to `~/cli-printing-press/docs/plans/<today>-feat-<api>-cli-data-layer-spec.md`:
+
+```markdown
+## Data Layer Specification: <API> CLI
+
+### Entity Classification
+[Table from Step 0.7a]
+
+### Data Gravity Scores
+[Table from Step 0.7c]
+
+### SQLite Schema
+[CREATE TABLE statements for each Primary/Support entity]
+[CREATE INDEX statements]
+[CREATE VIRTUAL TABLE ... USING fts5(...) for text-heavy entities]
+
+### Sync Strategy
+| Entity | Cursor Field | API Filter Param | Batch Size | Frequency |
+[Table]
+
+### Domain-Specific Search Filters
+| CLI Flag | SQL Mapping | Entities |
+[Table]
+
+### Compound Queries (for Phase 4 Workflows)
+| Query Name | SQL | Use Case |
+[Table]
+
+### Commands to Build in Phase 4
+| Command | Description | Uses Local DB? | API Calls |
+| sync | Incremental sync to SQLite | Yes (writes) | GET /entities?since=cursor |
+| search | FTS5 search with domain filters | Yes (reads) | None (local only) |
+| sql | Raw read-only SQL access | Yes (reads) | None (local only) |
+| messages/issues/etc | Entity-specific listing with filters | Yes (reads) | None (local only) |
+[Table]
+
+### Tail Strategy
+| Method | When to Use | Implementation |
+| WebSocket/Gateway | API has it (Discord, Slack) | Connect + event handler |
+| SSE | API has it (Linear, GitHub) | EventSource reader |
+| REST Polling | Fallback | GET with ?since= cursor |
+[Decision for this specific API]
+```
+
+### Phase Gate 0.7
+
+**STOP.** Verify ALL of these before proceeding:
+1. Entity classification table with type and volume estimates for every API resource
+2. At least 3 social signals with evidence scores >= 6
+3. Data gravity scores computed, with >= 1 primary entity (score >= 8)
+4. SQLite schema with proper columns (NOT generic JSON blobs) for each primary entity
+5. FTS5 virtual tables for entities with text fields
+6. Sync strategy with cursor fields validated against actual API filter params
+7. Domain-specific search filters mapped to SQL WHERE clauses
+8. At least 3 compound queries validated (joins work, columns exist)
+
+Tell the user: "Phase 0.7 complete: [N] primary entities for SQLite ([list]), [M] compound queries validated. Sync via [cursor type]. FTS5 on [fields]. Key prediction: [most valuable data-layer feature]. Proceeding to deep research."
+
+---
+
+## Artifact Pipeline: 6 Plans Per Run (via /ce:plan or Built-in)
+
+Every printing-press run should ship **6 comprehensive .md plans** in `docs/plans/`. Each phase pauses at its gate, **runs /ce:plan** (or its built-in equivalent) to write the artifact, then resumes. The artifacts ARE the product - the generated CLI is a side effect.
+
+### How artifact writing works:
+
+At the end of each phase, the skill runs a **plan generation step**. It detects whether the user has compound-engineering installed and routes accordingly:
+
+**Detection logic (add to SKILL.md at the top, before Phase 0):**
+
+```markdown
+### Artifact Writing: Plan Generation
+
+At the end of each phase, write a comprehensive plan document. Use this priority:
+
+**Option A: /ce:plan is available (compound-engineering installed)**
+
+Check if the `compound-engineering:ce:plan` skill exists. If yes, invoke it:
+
+    Skill tool: compound-engineering:ce:plan
+    Args: "<phase description with all research gathered so far>"
+
+This produces a full plan document with frontmatter, acceptance criteria, technical analysis, and sources. The skill handles the depth - just pass it all the research from this phase as the feature description.
+
+**Option B: Built-in plan writer (fallback when compound-engineering is NOT installed)**
+
+If /ce:plan is not available, write the artifact yourself using this structure:
+
+    ---
+    title: "<Phase Name>: <API> CLI"
+    type: feat
+    status: active
+    date: <today>
+    phase: "<phase number>"
+    api: "<api name>"
+    ---
+
+    # <Phase Name>: <API> CLI
+
+    ## Overview
+    [2-3 paragraph executive summary of what this phase discovered/decided]
+
+    ## Analysis
+    [Full analysis with tables, scores, evidence URLs, and reasoning]
+    [Every claim backed by evidence - WebSearch URLs, star counts, API docs]
+    [Scoring breakdowns showing how each number was computed]
+
+    ## Decisions
+    [What was decided and WHY - rationale for each decision]
+    [What was rejected and WHY]
+
+    ## Concrete Outputs
+    [SQL schemas, command definitions, sync strategies - real code, not pseudocode]
+    [Every output validated against the actual API]
+
+    ## Acceptance Criteria
+    - [ ] [Measurable criteria for this phase's outputs]
+
+    ## Sources
+    - [URLs, file paths, competitor repos with star counts]
+
+CRITICAL: The built-in writer must match /ce:plan depth. This means:
+- Full analysis, not bullet summaries
+- Evidence with source URLs, not assertions
+- Scoring breakdowns, not just final numbers
+- Concrete SQL/code examples, not pseudocode
+- Validation proof ("I verified the API supports ?after= filtering"), not assumptions
+- 200+ lines minimum per artifact
+```
+
+### The 6 artifacts and when to generate them:
+
+```
+Phase 0   -> [run plan writer] -> <today>-feat-<api>-cli-visionary-research.md
+Phase 0.5 -> [run plan writer] -> <today>-feat-<api>-cli-power-user-workflows.md
+Phase 0.7 -> [run plan writer] -> <today>-feat-<api>-cli-data-layer-spec.md
+Phase 1   -> [run plan writer] -> <today>-feat-<api>-cli-research.md
+Phase 3   -> [run plan writer] -> <today>-fix-<api>-cli-audit.md
+Phase 4   -> [run plan writer] -> <today>-fix-<api>-cli-goat-build-log.md
+```
+
+### What each plan must contain:
+
+**1. Visionary Research** (Phase 0):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a visionary research plan for the <API> CLI. Include:
+- API identity with data profile (write pattern, volume, real-time, search need)
+- Top 5 usage patterns with evidence scores and source URLs
+- Complete tool landscape with star counts and tool type classification
+- Architecture decisions with rationale
+- Top 5 features scored on 8 dimensions (evidence, impact, feasibility, uniqueness,
+  composability, data profile fit, maintainability, competitive moat)
+Use the research gathered in Phase 0 steps 0a-0g as input."
+```
+
+**2. Power User Workflows** (Phase 0.5):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a power user workflow plan for the <API> CLI. Include:
+- API archetype classification with justification
+- All 10-15 brainstormed workflow ideas with descriptions
+- Validation results per workflow (which API endpoints support each one)
+- Full scoring table (Frequency x Pain x Feasibility x Uniqueness)
+- Top 7 selected with implementation notes
+- Which workflows need local data vs live API calls
+Use the research from Phase 0 artifact + Phase 0.5 analysis as input."
+```
+
+**3. Data Layer Specification** (Phase 0.7):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a data layer specification for the <API> CLI. Include:
+- Entity classification table (Accumulating/Reference/Append-only/Ephemeral)
+- Social signal mining results with evidence scores
+- Data gravity scores with full breakdown (Volume + QueryFreq + JoinDemand + SearchNeed + TemporalValue)
+- Complete SQLite schema (CREATE TABLE + CREATE INDEX + CREATE VIRTUAL TABLE FTS5)
+- Sync strategy with cursor field validation (verified against API filter params)
+- Domain-specific search filters mapped to SQL WHERE clauses
+- 3-5 compound cross-entity queries
+- Tail strategy decision (WebSocket vs SSE vs REST polling with justification)
+Use the entity analysis from Phase 0.7 steps 0.7a-0.7d as input."
+```
+
+**4. Research** (Phase 1):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a deep research plan for the <API> CLI. Include:
+- Spec discovery (URL, format, version, endpoint count)
+- Deep competitor analysis for top 2 competitors (README, stars, maintenance status,
+  user complaints with quotes, open issues)
+- At least 2 user quotes with source URLs
+- Strategic justification answering 'why should this CLI exist when [competitor] has [N] stars?'
+- Target command count and key differentiators
+Use the competitor research from Phase 1 steps 1.1-1.5 as input."
+```
+
+**5. Steinberger Audit** (Phase 3):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a Steinberger audit plan for the <API> CLI. Include:
+- Automated scorecard baseline numbers (from running `printing-press scorecard`)
+- Hand-scored 11-dimension table with: current score, 'what 10/10 looks like', 'how to get there'
+- GOAT improvement plan with top 5 highest-impact fixes
+- Complex body field plan (top 3 endpoints needing --stdin examples)
+- Data layer integration notes (from Phase 0.7 spec - what schema changes to make)
+- Commands to ADD (new functionality, not just fixes)
+Use the code review from Phase 3 steps 3.1-3.8 as input."
+```
+
+**6. GOAT Build Log** (Phase 4):
+
+Pass to /ce:plan or built-in writer:
+```
+"Write a build log for the <API> CLI Phase 4. Include:
+- Data layer: what schema was implemented, which tables, which FTS5 indexes
+- Workflow commands: list of new commands with descriptions and which use local DB
+- Scorecard fixes: what was changed and which dimensions improved
+- What was skipped: features deferred to future work with reasons
+- Compilation verification: go build + go vet results
+- Before/after scorecard comparison
+Use the actual code changes made in Phase 4 as input."
+```
+
+### The chain pattern:
+
+Each artifact feeds the next. The LLM **reads** the previous artifact before writing the next one:
+```
+Phase 0 artifact  -> read before Phase 0.5 (what workflows match this API?)
+Phase 0.5 artifact -> read before Phase 0.7 (what data layer supports these workflows?)
+Phase 0.7 artifact -> read before Phase 2   (what schema to generate?)
+Phase 0.7 artifact -> read before Phase 4   (what to build in Priority 0: Data Layer)
+Phase 3 artifact   -> read before Phase 4   (what scorecard gaps to fix)
+```
+
+**IMPORTANT:** Before each phase, the SKILL.md should instruct: "Read the previous phase's artifact file before proceeding. The artifact contains decisions and analysis you need."
+
+---
+
+## Implementation Plan
+
+### Session 1: Update SKILL.md (1-2 hours)
+
+**File:** `~/.claude/skills/printing-press/SKILL.md`
+
+**Key principle:** Each phase artifact is produced by actually running `/ce:plan` (if compound-engineering is installed) or a built-in equivalent. The SKILL.md instructs the LLM to invoke the Skill tool at each phase gate.
+
+**Changes:**
+
+0. **Add Artifact Writing section** at the top of SKILL.md (before Phase 0):
+   - Detection logic: check if `compound-engineering:ce:plan` skill is available
+   - Option A: invoke `/ce:plan` with phase research as feature description
+   - Option B: built-in plan writer with 200+ line minimum, same depth as /ce:plan
+   - Both options produce the same artifact structure (frontmatter, analysis, decisions, outputs, acceptance criteria, sources)
+
+1. **Update phase flow diagram** at the top:
+```
+PHASE 0 -> PHASE 0.5 -> PHASE 0.7 -> PHASE 1 -> PHASE 2 -> PHASE 3 -> PHASE 4 -> PHASE 5
+(3-5 min)   (2-3 min)    (15-25 min)  (5-8 min)  (1-2 min)  (5-8 min)  (5-10 min) (2-3 min)
+```
+
+2. **Insert Phase 0.7 section** between Phase 0.5 and Phase 1 with:
+   - Steps 0.7a through 0.7e (full text from this plan)
+   - Phase Gate 0.7 checklist
+   - Data Layer Specification template
+
+3. **Update Phase 4 priority order:**
+
+Current:
+```
+Priority 1: Power User Workflows (from Phase 0.5)
+Priority 2: Scorecard-Gap Fixes
+Priority 3: Polish
+```
+
+New:
+```
+Priority 0: Data Layer Foundation (from Phase 0.7)
+  - Replace generic store.go with domain-specific schema
+  - Implement domain-aware sync with proper cursors
+  - Add domain-specific search filters
+  - Add `sql` command for raw read-only queries
+  - Add entity-specific list commands (e.g., `messages --channel --author --days`)
+Priority 1: Power User Workflows (from Phase 0.5) - NOW powered by local DB
+Priority 2: Scorecard-Gap Fixes
+Priority 3: Polish
+```
+
+4. **Add to Anti-Shortcut Rules:**
+```
+- "The API doesn't need local persistence" (Check data gravity scores. If any entity >= 8, it needs SQLite.)
+- "FTS5 is overkill for this API" (If entity has 2+ text fields and score >= 8, it needs FTS5.)
+- "REST polling is fine for tail" (Check if API has WebSocket/SSE/Gateway. If yes, use it.)
+- "The generic store is good enough" (Domain-native tables always beat JSON blobs. Write the schema.)
+- "I'll build the data layer later" (Phase 0.7 runs BEFORE generation. The spec informs the schema.)
+```
+
+5. **Update Phase 2 to use Phase 0.7 output:**
+
+After generation, the data layer spec should be used to:
+- Override the generic store.go.tmpl output with domain-specific tables
+- Or: Phase 4 Priority 0 replaces the generated store.go
+
+### Session 2: Test on Discord (1-2 hours)
+
+Run `/printing-press Discord` with the updated SKILL.md and verify:
+
+**Expected Phase 0.7 output for Discord:**
+
+Entity Classification:
+- Messages: Accumulating, Very High volume, Continuous updates, `timestamp` (snowflake)
+- Members: Accumulating, High volume, Weekly updates, `joined_at`
+- Channels: Reference, Low volume, Monthly updates, N/A
+- Audit Logs: Append-only, High volume, Continuous, `id`
+- Roles: Reference, Low volume, Monthly, N/A
+- Emojis: Reference, Low volume, Monthly, N/A
+
+Data Gravity Scores:
+- Messages: 13/12 -> Primary
+- Members: 9/12 -> Primary
+- Audit Logs: 8/12 -> Primary
+- Channels: 6/12 -> Support
+
+Schema should include:
+```sql
+CREATE TABLE messages (
+    id TEXT PRIMARY KEY,
+    channel_id TEXT NOT NULL,
+    guild_id TEXT,
+    author_id TEXT NOT NULL,
+    content TEXT NOT NULL DEFAULT '',
+    timestamp TEXT NOT NULL,
+    edited_timestamp TEXT,
+    type INTEGER DEFAULT 0,
+    data JSON NOT NULL,
+    synced_at TEXT NOT NULL
+);
+CREATE INDEX idx_messages_channel ON messages(channel_id);
+CREATE INDEX idx_messages_author ON messages(author_id);
+CREATE INDEX idx_messages_timestamp ON messages(timestamp);
+CREATE VIRTUAL TABLE messages_fts USING fts5(content, tokenize='porter unicode61');
+```
+
+Sync should use snowflake ID pagination (`?before=OLDEST_ID`).
+
+Search should support `--guild`, `--channel`, `--author` filters.
+
+**Compare against discrawl features (12 commands):**
+- [x] init -> guild discovery during sync
+- [x] sync -> incremental sync with snowflake cursors
+- [x] tail -> Gateway WebSocket (predicted from API surface)
+- [x] search -> FTS5 with domain filters
+- [x] messages -> channel/author/time filtering
+- [x] mentions -> extracted from message content during sync
+- [x] members -> list/show/search across profiles
+- [x] channels -> list/show from local DB
+- [x] sql -> raw read-only SQLite access
+- [x] status -> archive statistics
+- [x] doctor -> already generated
+- [ ] embeddings -> optional, not predicted (acceptable miss)
+
+**Success criteria:** Engine predicts 10/12 discrawl features without seeing discrawl.
+
+### Session 3: Test on a Third API (1-2 hours)
+
+Run on Stripe to verify generalization:
+
+Expected predictions:
+- Charges/PaymentIntents: Primary (high volume, temporal, searchable)
+- Customers: Primary (reference but high join demand)
+- Subscriptions: Primary (lifecycle tracking)
+- Events: Append-only (tail command)
+- Schema: charges table with amount, currency, customer_id, status, created columns
+- Sync: cursor-based pagination via `starting_after`
+- Search: FTS5 on charge description, customer name/email
+
+---
+
+## Acceptance Criteria
+
+### SKILL.md Changes
+- [ ] Phase 0.7 section inserted between Phase 0.5 and Phase 1
+- [ ] Phase flow diagram updated with Phase 0.7 (15-25 min)
+- [ ] Steps 0.7a-0.7e documented with clear instructions
+- [ ] Phase Gate 0.7 with 8 verification items
+- [ ] Entity classification heuristics (Accumulating/Reference/Append-only/Ephemeral)
+- [ ] Data gravity scoring formula with weights and thresholds
+- [ ] Data Layer Specification template with all required sections
+- [ ] Phase 4 priorities reordered (data layer first)
+- [ ] 5 new anti-shortcut rules added
+- [ ] Total time estimate updated to 35-65 minutes
+
+### Validation
+- [ ] Discord re-run predicts messages/members/audit_logs as Primary entities
+- [ ] Discord re-run generates domain-specific SQLite schema (not JSON blobs)
+- [ ] Discord re-run predicts Gateway WebSocket for tail
+- [ ] Discord re-run generates --guild/--channel/--author search filters
+- [ ] 10/12 discrawl features predicted without knowing discrawl exists
+- [ ] Third API (Stripe) produces sensible predictions (not hallucinated)
+
+### Quality Gates
+- [ ] Every predicted feature validates against actual API capabilities (grounding step in 0.7d)
+- [ ] Sync cursors verified to be filterable via API query params
+- [ ] FTS5 fields verified to contain meaningful text in API responses
+- [ ] No hallucinated columns - every column maps to an actual API response field
+
+---
+
+## Risk Analysis
+
+| Risk | Likelihood | Impact | Mitigation |
+|---|---|---|---|
+| Over-prediction for simple APIs | Medium | Low | Data gravity threshold (>= 8) prevents unnecessary SQLite for small APIs |
+| Hallucinated schema columns | Medium | High | Step 0.7d validates every column against API response schema |
+| 15-25 min adds too much to pipeline | Low | Low | Only runs web searches + analysis, no code generation |
+| Sync cursor doesn't work | Medium | Medium | Fallback to full sync + local dedup if API lacks filter params |
+| GraphQL APIs lack OpenAPI spec | Medium | Medium | Phase 0.7a works from any schema source (OpenAPI, GraphQL introspection, docs) |
+
+---
+
+## What This Enables
+
+**Before:**
+```
+OpenAPI Spec -> Generator -> 316 commands + generic JSON blob store
+             -> Phase 4  -> 7 workflow commands (API calls only)
+             = Good API client, weak data tool
+```
+
+**After:**
+```
+OpenAPI Spec -> Generator -> 316 commands
+             -> Phase 0.7 -> Data Layer Specification
+             -> Phase 4   -> Domain SQLite schema + sync + search + sql
+                          -> 7 workflow commands (powered by local DB)
+             = Strong API client + strong data tool
+             = discrawl-class without knowing discrawl exists
+```
+
+The prediction engine doesn't replace Phase 0.5's workflow ideation. It ADDS a data layer underneath. `discord-cli workflow channel-health` goes from "make N API calls per channel" to "query local SQLite with one JOIN, instant results."
+
+---
+
+## Sources
+
+- Discord CLI generation run (2026-03-25): `docs/plans/2026-03-25-feat-discord-cli-visionary-research.md`
+- discrawl gap analysis (2026-03-26): `docs/plans/2026-03-26-feat-discord-cli-vs-discrawl-gap-analysis-plan.md`
+- [steipete/discrawl](https://github.com/steipete/discrawl) - 540 stars, the reference data-tool CLI
+- Printing-press SKILL.md: `~/.claude/skills/printing-press/SKILL.md`
+- Generator templates: `~/cli-printing-press/internal/generator/templates/`
+- Profiler: `~/cli-printing-press/internal/profiler/profiler.go`
+- Vision templates: `~/cli-printing-press/internal/generator/vision_templates.go`
+- Scorecard: `~/cli-printing-press/internal/pipeline/scorecard.go`
diff --git a/skills/printing-press/SKILL.md b/skills/printing-press/SKILL.md
index d90466d5..034dcbce 100644
--- a/skills/printing-press/SKILL.md
+++ b/skills/printing-press/SKILL.md
@@ -33,14 +33,29 @@ Generate the best CLI that has ever existed for any API. Five mandatory phases.
 
 ## How This Works
 
-Every run produces the GOAT CLI through 6 mandatory phases:
+Every run produces the GOAT CLI through 7 mandatory phases + 6 comprehensive plan documents:
 
 ```
-PHASE 0: VISIONARY RESEARCH  ->  PHASE 0.5: POWER USER WORKFLOWS  ->  PHASE 1: DEEP RESEARCH  ->  PHASE 2: GENERATE  ->  PHASE 3: STEINBERGER AUDIT  ->  PHASE 4: GOAT BUILD  ->  PHASE 5: FINAL STEINBERGER
-        (3-5 min)                        (2-3 min)                        (5-8 min)                  (1-2 min)               (5-8 min)                     (5-10 min)                (2-3 min)
+PHASE 0: VISIONARY RESEARCH  ->  PHASE 0.5: POWER USER WORKFLOWS  ->  PHASE 0.7: PREDICTION ENGINE  ->  PHASE 1: DEEP RESEARCH  ->  PHASE 2: GENERATE  ->  PHASE 3: STEINBERGER AUDIT  ->  PHASE 4: GOAT BUILD  ->  PHASE 5: FINAL STEINBERGER
+        (3-5 min)                        (2-3 min)                          (15-25 min)                      (5-8 min)                  (1-2 min)               (5-8 min)                     (5-10 min)                (2-3 min)
 ```
 
-Total expected time: 20-40 minutes. Phase 4 is longer now because it builds real workflow commands, not just polishes READMEs.
+Total expected time: 35-65 minutes. Phase 0.7 adds 15-25 minutes for the prediction engine. Phase 4 is longer because it builds data layer + workflow commands.
+
+**6 Plan Artifacts Per Run:**
+
+Every phase gate produces a comprehensive plan document in `~/cli-printing-press/docs/plans/`:
+
+```
+Phase 0   -> <today>-feat-<api>-cli-visionary-research.md
+Phase 0.5 -> <today>-feat-<api>-cli-power-user-workflows.md
+Phase 0.7 -> <today>-feat-<api>-cli-data-layer-spec.md
+Phase 1   -> <today>-feat-<api>-cli-research.md
+Phase 3   -> <today>-fix-<api>-cli-audit.md
+Phase 4   -> <today>-fix-<api>-cli-goat-build-log.md
+```
+
+Each artifact chains into the next. **Read the previous phase's artifact before starting the next phase.**
 
 **The Steinberger bar:** Peter Steinberger's gogcli is the 10/10 reference. Every generated CLI is scored against it TWICE - once during audit to find gaps, once after fixes to prove improvement. The delta is the proof of work.
 
@@ -51,6 +66,70 @@ Total expected time: 20-40 minutes. Phase 4 is longer now because it builds real
 
 ---
 
+## Artifact Writing: Plan Generation at Each Phase Gate
+
+At the end of each phase, write a comprehensive plan document. This is NOT optional - the artifacts ARE the product.
+
+**Option A: /ce:plan is available (compound-engineering plugin installed)**
+
+Try to invoke the `compound-engineering:ce:plan` skill. If it exists, use it:
+
+```
+Skill tool: compound-engineering:ce:plan
+Args: "<phase description with all research gathered so far>"
+```
+
+The /ce:plan skill produces a full plan document with frontmatter, analysis, acceptance criteria, and sources. Pass it all the research from this phase as the feature description.
+
+**Option B: Built-in plan writer (fallback when compound-engineering is NOT installed)**
+
+If /ce:plan is not available, write the artifact yourself with this structure:
+
+```markdown
+---
+title: "<Phase Name>: <API> CLI"
+type: feat
+status: active
+date: <today>
+phase: "<phase number>"
+api: "<api name>"
+---
+
+# <Phase Name>: <API> CLI
+
+## Overview
+[2-3 paragraph executive summary of what this phase discovered/decided]
+
+## Analysis
+[Full analysis with tables, scores, evidence URLs, and reasoning]
+[Every claim backed by evidence - WebSearch URLs, star counts, API docs]
+[Scoring breakdowns showing how each number was computed]
+
+## Decisions
+[What was decided and WHY - rationale for each decision]
+[What was rejected and WHY]
+
+## Concrete Outputs
+[SQL schemas, command definitions, sync strategies - real code, not pseudocode]
+[Every output validated against the actual API]
+
+## Acceptance Criteria
+- [ ] [Measurable criteria for this phase's outputs]
+
+## Sources
+- [URLs, file paths, competitor repos with star counts]
+```
+
+**CRITICAL:** The built-in writer must match /ce:plan depth:
+- Full analysis, not bullet summaries
+- Evidence with source URLs, not assertions
+- Scoring breakdowns, not just final numbers
+- Concrete SQL/code examples, not pseudocode
+- Validation proof ("I verified the API supports ?after= filtering"), not assumptions
+- 200+ lines minimum per artifact
+
+---
+
 ## Workflow: `--spec` shortcut
 
 When the user provides `--spec <path-or-url>`, skip Phase 1 spec search (spec is provided). STILL run competitor research (Steps 1.2-1.5). Run all other phases.
@@ -240,7 +319,9 @@ Score < 8: **Won't-have.** Skip or future work.
 5. Architecture decisions match data profile
 6. Top 5 features scored and ranked
 
-Tell the user: "Phase 0 complete: Domain: [category]. Data profile: [volume]/[realtime]/[search]. Found [N] non-wrapper tools. Top feature: [name] (score [X]/16). Architecture: [key decision]. Proceeding to deep research."
+**Write Phase 0 Artifact:** Run the Artifact Writing plan generator (see top of skill) with all Phase 0 research as input. Write to `~/cli-printing-press/docs/plans/<today>-feat-<api>-cli-visionary-research.md`. Include: API identity, data profile, usage patterns with evidence, tool landscape, architecture decisions, top 5 features with full scoring.
+
+Tell the user: "Phase 0 complete: Domain: [category]. Data profile: [volume]/[realtime]/[search]. Found [N] non-wrapper tools. Top feature: [name] (score [X]/16). Architecture: [key decision]. Proceeding to power user workflows."
 
 ---
 
@@ -306,6 +387,147 @@ These become **mandatory Phase 4 work items**. They are NOT optional polish. The
 2. ...
 These will be built as real commands in Phase 4, alongside the API wrapper."
 
+**Write Phase 0.5 Artifact:** Run the Artifact Writing plan generator (see top of skill) with all Phase 0.5 analysis as input. Write to `~/cli-printing-press/docs/plans/<today>-feat-<api>-cli-power-user-workflows.md`. Include: API archetype, all 10-15 workflow ideas, validation results, full scoring table, top 7 with implementation notes.
+
+---
+
+# PHASE 0.7: POWER USER PREDICTION ENGINE
+
+## THIS PHASE IS MANDATORY. DO NOT SKIP IT.
+
+The generator produces API wrappers. Power users want a local data layer - domain-specific SQLite tables, incremental sync, full-text search with domain filters, raw SQL access, and trend detection. This phase predicts that data layer from the API surface + social signals, WITHOUT looking at competitors (that's Phase 1's job).
+
+**Read the Phase 0 and Phase 0.5 artifacts before starting this phase.**
+
+### Step 0.7a: Entity Classification
+
+Map every API resource into one of four types by reading the OpenAPI spec or Phase 0's entity list:
+
+| Type | Signal | Example | Persistence Need |
+|---|---|---|---|
+| **Accumulating** | Grows over time, has timestamps, paginated lists | Messages, Issues, Audit Logs, Commits | SQLite table + incremental sync |
+| **Reference** | Changes rarely, small cardinality, referenced by other entities | Users, Teams, Roles, Labels, Channels | SQLite table + periodic refresh |
+| **Append-only** | Never edited, only created | Events, Webhooks, Notifications | SQLite table + tail command |
+| **Ephemeral** | Short-lived, not worth persisting | OAuth tokens, Rate limit status, Gateway info | API-only, no persistence |
+
+**Heuristics:**
+- Has `created_at`/`timestamp` + paginated list endpoint -> Accumulating
+- Referenced by 3+ other entities via `_id` fields -> Reference
+- Has no UPDATE/PATCH endpoint -> Append-only
+- No list endpoint or < 100 expected records -> Ephemeral
+- Has `updated_at` or `modified_at` -> needs incremental sync cursor
+
+**Output:** Entity classification table with type, estimated volume, update frequency, and key temporal field for ALL API resources.
+
+### Step 0.7b: Social Signal Mining for Data Patterns
+
+Find evidence of what data power users actually store locally. Run 7 parallel WebSearches:
+
+1. **WebSearch**: `"<API name>" export OR backup OR archive site:github.com`
+2. **WebSearch**: `"<API name>" SQLite OR database OR local site:github.com`
+3. **WebSearch**: `"<API name>" analytics OR dashboard OR metrics site:github.com`
+4. **WebSearch**: `"<API name>" "I wish" OR "would be nice" OR "feature request" data`
+5. **WebSearch**: `"<API name>" offline OR search OR "full text" site:reddit.com OR site:news.ycombinator.com`
+6. **WebSearch**: `"<API name>" trend OR pattern OR anomaly detection`
+7. **WebSearch**: `"<API name>" graph OR visualization OR dependency`
+
+**For each finding, extract:**
+- What entities they store locally
+- What queries they run (joins, aggregations, time filters)
+- What temporal patterns they track (trends, anomalies, velocity)
+- What cross-entity relationships they need
+
+**Score using Phase 0 evidence framework.** Anything with score >= 6 informs the data layer.
+
+### Step 0.7c: Data Gravity Scoring
+
+Rank entities by how much value they'd have in a local SQLite database.
+
+**Formula:** `DataGravity = Volume(0-3) + QueryFrequency(0-3) + JoinDemand(0-2) + SearchNeed(0-2) + TemporalValue(0-2)`
+
+| Factor | 0 | 1 | 2 | 3 |
+|---|---|---|---|---|
+| **Volume** | < 100 records | 100-10k | 10k-1M | > 1M |
+| **QueryFrequency** | Rarely queried | Monthly | Weekly | Daily |
+| **JoinDemand** | No references | 1-2 entities reference it | 3-4 | 5+ |
+| **SearchNeed** | No text fields | 1 text field | 2-3 text fields | Primary text content |
+| **TemporalValue** | No time dimension | Created date only | Updated + trends | Core to time-series analysis |
+
+**Thresholds:**
+- Score >= 8: **Primary entity** - gets its own SQLite table with proper columns, FTS5 if text-heavy
+- Score 5-7: **Support entity** - gets a simpler table
+- Score < 5: **API-only** - no local persistence
+
+Score EVERY entity from Step 0.7a. Show the full breakdown.
+
+### Step 0.7d: Schema + Sync + Search Specification
+
+For each Primary entity (score >= 8), produce:
+
+**1. SQLite Schema:**
+- Extract columns from the API's response schema (NOT just id + JSON blob)
+- Include foreign key columns for joins (e.g., `channel_id`, `author_id`)
+- Include the temporal field for sync cursors
+- Add indexes on foreign keys and temporal fields
+- Create FTS5 virtual table on text fields (title, description, content, body, name)
+- Keep a `data JSON NOT NULL` column for the full API response
+
+**2. Sync Strategy:**
+- Identify the incremental sync cursor (timestamp field, snowflake ID, cursor pagination)
+- **VALIDATE:** Check that the API supports filtering by this cursor - look for `since`, `after`, `updated_after`, `before` query params in the spec
+- Determine batch size from API's max `limit` parameter
+- Check if API has WebSocket/SSE/Gateway - note for tail command
+- If the API doesn't support cursor filtering, fall back to full sync + local dedup
+
+**3. Search Specification:**
+- List which text fields to extract into FTS5
+- Define domain-specific search filters as SQL WHERE clauses
+- Map CLI flags to SQL: `--channel` -> `WHERE channel_id = ?`, `--author` -> `WHERE author_id = ?`
+- **VALIDATE:** Confirm these fields actually appear in API list/get responses
+
+**4. Compound Queries:**
+- Define 3-5 cross-entity queries (e.g., "messages by author in channel in last N days")
+- Validate join columns exist in both tables
+- These become Phase 4 workflow commands that use local DB instead of live API
+
+**5. Tail Strategy:**
+
+| Method | When to Use |
+|---|---|
+| WebSocket/Gateway | API has it (Discord Gateway, Slack RTM) |
+| SSE | API has it (GitHub, Linear webhooks) |
+| REST Polling | Fallback - GET with ?since= cursor |
+
+Decide which method this API supports. If WebSocket/SSE, the tail command should use it instead of REST polling.
+
+### Step 0.7e: Write the Data Layer Specification Artifact
+
+**Run the Artifact Writing plan generator** (see top of skill) with all Phase 0.7 analysis as input. Write to `~/cli-printing-press/docs/plans/<today>-feat-<api>-cli-data-layer-spec.md`.
+
+The artifact MUST include:
+- Entity classification table for every API resource
+- Data gravity scores with full breakdown per entity
+- Complete SQLite schema (CREATE TABLE + CREATE INDEX + FTS5)
+- Sync strategy with cursor validation proof
+- Domain-specific search filters mapped to SQL WHERE clauses
+- 3-5 compound cross-entity queries
+- Tail strategy decision with justification
+- Commands to build in Phase 4 Priority 0
+
+### PHASE GATE 0.7
+
+**STOP.** Verify ALL of these before proceeding:
+1. Entity classification table with type and volume estimates for every API resource
+2. At least 3 social signals with evidence scores >= 6
+3. Data gravity scores computed, with >= 1 primary entity (score >= 8)
+4. SQLite schema with proper columns (NOT generic JSON blobs) for each primary entity
+5. FTS5 virtual tables for entities with text fields
+6. Sync strategy with cursor fields validated against actual API filter params
+7. Domain-specific search filters mapped to SQL WHERE clauses
+8. At least 3 compound queries validated (joins work, columns exist)
+
+Tell the user: "Phase 0.7 complete: [N] primary entities for SQLite ([list]), [M] compound queries validated. Sync via [cursor type]. FTS5 on [fields]. Key prediction: [most valuable data-layer feature]. Proceeding to deep research."
+
 ---
 
 # PHASE 1: DEEP RESEARCH
@@ -428,6 +650,8 @@ date: <today>
 4. Strategic justification answers "why should this exist?"
 5. Target command count is set
 
+**Write Phase 1 Artifact:** Run the Artifact Writing plan generator with all Phase 1 research as input. Write to `~/cli-printing-press/docs/plans/<today>-feat-<api>-cli-research.md`. Include: spec discovery, deep competitor analysis with quotes, demand signals, strategic justification, target command count.
+
 Tell the user: "Phase 1 complete: Found [spec/no spec], [N] competitors. Best: [name] ([stars] stars, [commands] commands, last commit [date]). Strategic angle: [1-sentence justification]. Proceeding to generation."
 
 ---
@@ -619,7 +843,9 @@ Include ALL of:
 4. Complex body fields have a plan (not just "limitation")
 5. Baseline total score is recorded
 
-Tell the user: "Phase 3 complete: Baseline Steinberger Score: [X]/100 (Grade [X]). Found [N] tactical fixes + [M] GOAT improvements. Top improvement: [description]. Proceeding to fixes."
+**Write Phase 3 Artifact:** Run the Artifact Writing plan generator with all Phase 3 analysis as input. Write to `~/cli-printing-press/docs/plans/<today>-fix-<api>-cli-audit.md`. Include: scorecard baseline, full 11-dimension hand-scored table, GOAT improvement plan, complex body field plan, data layer integration notes from Phase 0.7.
+
+Tell the user: "Phase 3 complete: Baseline Steinberger Score: [X]/100 (Grade [X]). Found [N] tactical fixes + [M] GOAT improvements. Top improvement: [description]. Proceeding to GOAT build."
 
 ---
 
@@ -627,13 +853,59 @@ Tell the user: "Phase 3 complete: Baseline Steinberger Score: [X]/100 (Grade [X]
 
 ## THIS PHASE IS MANDATORY.
 
-**The generator output is scaffolding, not the product. The workflows are the product.**
+**The generator output is scaffolding, not the product. The data layer + workflows are the product.**
+
+**Read the Phase 0.7 Data Layer Specification and Phase 3 Audit artifacts before starting.**
+
+Execute in this priority order. Do NOT skip Priority 0 to go straight to workflows.
+
+### Priority 0: Data Layer Foundation (from Phase 0.7)
+
+**This is the most important work in the entire pipeline.** Replace the generic store with domain-specific tables.
+
+1. **Replace `internal/store/store.go`** with domain-specific schema from Phase 0.7 spec:
+   - CREATE TABLE with proper columns for each Primary entity (not JSON blobs)
+   - CREATE INDEX on foreign keys and temporal fields
+   - CREATE VIRTUAL TABLE ... USING fts5() on text fields
+   - UpsertMessage/UpsertMember/etc methods that extract fields from JSON
 
-Execute in this priority order. Do NOT skip Priority 1 to polish the README.
+2. **Rewrite `sync` command** with domain-aware sync:
+   - Use the cursor field identified in Phase 0.7 (e.g., snowflake ID, updatedAt)
+   - Add `--guild`/`--team`/`--project` scoping flags (domain-specific)
+   - Add `--since` time filter
+   - Paginate with the validated cursor params
 
-### Priority 1: Power User Workflows (from Phase 0.5)
+3. **Add domain-specific search filters:**
+   - Map Phase 0.7's filter table into search command flags
+   - `--channel`, `--author`, `--team`, etc -> SQL WHERE clauses
+   - FTS5 on extracted text content, not raw JSON
 
-This is the most important work in the entire pipeline. Implement the top 5-7 workflows identified in Phase 0.5 as real, hand-written Go commands.
+4. **Add `sql` command** for raw read-only queries:
+   ```go
+   func newSqlCmd(flags *rootFlags) *cobra.Command {
+       cmd := &cobra.Command{
+           Use:   "sql <query>",
+           Short: "Run read-only SQL queries against the local database",
+           RunE: func(cmd *cobra.Command, args []string) error {
+               // Open DB, execute query, print results as table or JSON
+           },
+       }
+   }
+   ```
+
+5. **Add entity-specific list commands** (e.g., `messages`, `members`):
+   - Query local SQLite, not the API
+   - Support `--channel`, `--author`, `--days`, `--hours`, `--since` filters
+   - Support `--sync` flag to trigger on-demand sync before querying
+
+6. **Update tail command** based on Phase 0.7's tail strategy:
+   - If WebSocket/Gateway: implement real-time connection
+   - If SSE: implement EventSource reader
+   - If REST polling: keep current implementation but use domain-aware cursors
+
+### Priority 1: Power User Workflows (from Phase 0.5) - NOW powered by local DB
+
+Implement the top 5-7 workflows identified in Phase 0.5 as real, hand-written Go commands. **Where possible, query the local SQLite database instead of making live API calls.** This makes workflows instant and avoids rate limits.
 
 For each workflow:
 1. **Create a dedicated command file** (e.g., `internal/cli/stale.go`, `internal/cli/velocity.go`)
@@ -695,13 +967,19 @@ cd ~/cli-printing-press/<api>-cli && go build ./... && go vet ./... && echo "ALL
 ### PHASE GATE 4
 
 **STOP.** Verify:
-1. At least 3 workflow commands implemented (from Phase 0.5)
-2. Workflow commands combine 2+ API calls each
-3. Scorecard gaps addressed
-4. `go build ./...` and `go vet ./...` pass
-5. README cookbook includes workflow examples
+1. Data layer implemented: domain-specific SQLite tables (NOT generic JSON blobs)
+2. Sync command uses domain-aware cursors (validated in Phase 0.7)
+3. Search supports domain-specific filters (--channel, --author, --team, etc.)
+4. `sql` command exists for raw read-only queries
+5. At least 3 workflow commands implemented (from Phase 0.5)
+6. Workflow commands use local DB where possible (not just live API calls)
+7. Scorecard gaps addressed
+8. `go build ./...` and `go vet ./...` pass
+9. README cookbook includes data layer + workflow examples
+
+**Write Phase 4 Artifact:** Run the Artifact Writing plan generator with all Phase 4 work as input. Write to `~/cli-printing-press/docs/plans/<today>-fix-<api>-cli-goat-build-log.md`. Include: data layer implementation details, workflow commands built, scorecard fixes, what was skipped, before/after scorecard comparison.
 
-Tell the user: "Phase 4 complete: Built [N] workflow commands, applied [M] scorecard fixes. Top workflow: [name]. Compilation verified. Proceeding to final scoring."
+Tell the user: "Phase 4 complete: Built [N] data layer tables + [M] workflow commands, applied [K] scorecard fixes. Data layer: [list tables]. Top workflow: [name]. Compilation verified. Proceeding to final scoring."
 
 ---
 
@@ -836,3 +1114,9 @@ These phrases indicate a phase was shortcut. If you catch yourself writing them,
 - "I'll polish the README instead of building workflows" (Phase 4 Priority 1 is workflows. README is Priority 3. Do not skip ahead.)
 - "The Phase 0.5 workflows are future work" (They are the product. Build them now or the CLI is just an API wrapper.)
 - "316 commands is better than 12" (discrawl has 12 commands and 539 stars. Depth beats breadth. Build the workflows.)
+- "The API doesn't need local persistence" (Check data gravity scores from Phase 0.7. If any entity scores >= 8, it needs SQLite with proper columns.)
+- "FTS5 is overkill for this API" (If any entity has 2+ text fields AND data gravity >= 8, it needs FTS5. That's how search works.)
+- "REST polling is fine for tail" (Check if the API has WebSocket/SSE/Gateway. If yes, use it. REST polling misses events and wastes rate limit budget.)
+- "The generic store is good enough" (Domain-native tables ALWAYS beat JSON blob tables. A `messages` table with `channel_id`, `author_id`, `content` columns enables joins and filters that JSON blobs can't. Write the schema.)
+- "I'll build the data layer later" (Phase 0.7 runs BEFORE generation. The data layer spec informs Phase 4 Priority 0. Build it first, then workflows use it.)
+- "The artifact is just documentation" (The 6 plan artifacts ARE the product. They capture reasoning, evidence, and decisions. The generated CLI is a side effect.)

← 13860ec0 feat(press): v2 - depth over breadth, creativity over mechan  ·  back to Cli Printing Press  ·  feat(press): add Phase 4.5 Dogfood Emulation - spec-derived 7b5ce383 →