wxcli 1.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wxcli/__init__.py +4 -0
- wxcli/_playbook/.claude/agents/migration-advisor.md +239 -0
- wxcli/_playbook/.claude/agents/wxc-calling-builder.md +946 -0
- wxcli/_playbook/.claude/rules/cleanup.md +29 -0
- wxcli/_playbook/.claude/rules/cucm-migration.md +58 -0
- wxcli/_playbook/.claude/rules/org-health.md +14 -0
- wxcli/_playbook/.claude/settings.json +8 -0
- wxcli/_playbook/.claude/skills/audit-compliance/SKILL.md +515 -0
- wxcli/_playbook/.claude/skills/call-control/SKILL.md +747 -0
- wxcli/_playbook/.claude/skills/configure-features/SKILL.md +623 -0
- wxcli/_playbook/.claude/skills/configure-routing/SKILL.md +627 -0
- wxcli/_playbook/.claude/skills/contact-center/SKILL.md +1181 -0
- wxcli/_playbook/.claude/skills/cucm-migrate/SKILL.md +820 -0
- wxcli/_playbook/.claude/skills/customer-assist/SKILL.md +443 -0
- wxcli/_playbook/.claude/skills/device-platform/SKILL.md +407 -0
- wxcli/_playbook/.claude/skills/manage-call-settings/SKILL.md +757 -0
- wxcli/_playbook/.claude/skills/manage-devices/SKILL.md +790 -0
- wxcli/_playbook/.claude/skills/manage-identity/SKILL.md +638 -0
- wxcli/_playbook/.claude/skills/manage-licensing/SKILL.md +528 -0
- wxcli/_playbook/.claude/skills/manage-meetings/SKILL.md +708 -0
- wxcli/_playbook/.claude/skills/messaging-bots/SKILL.md +365 -0
- wxcli/_playbook/.claude/skills/messaging-spaces/SKILL.md +520 -0
- wxcli/_playbook/.claude/skills/org-health/SKILL.md +159 -0
- wxcli/_playbook/.claude/skills/provision-calling/SKILL.md +421 -0
- wxcli/_playbook/.claude/skills/query-live/SKILL.md +183 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-flow-trace.md +223 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-history.md +44 -0
- wxcli/_playbook/.claude/skills/query-live/domains/features.md +169 -0
- wxcli/_playbook/.claude/skills/query-live/domains/numbers.md +93 -0
- wxcli/_playbook/.claude/skills/query-live/domains/people-and-settings.md +146 -0
- wxcli/_playbook/.claude/skills/query-live/domains/routing.md +124 -0
- wxcli/_playbook/.claude/skills/reporting/SKILL.md +501 -0
- wxcli/_playbook/.claude/skills/reporting/references/cdr-recipes.md +1628 -0
- wxcli/_playbook/.claude/skills/reporting-cc/SKILL.md +251 -0
- wxcli/_playbook/.claude/skills/reporting-meetings/SKILL.md +290 -0
- wxcli/_playbook/.claude/skills/teardown/SKILL.md +214 -0
- wxcli/_playbook/.claude/skills/video-mesh/SKILL.md +379 -0
- wxcli/_playbook/.claude/skills/wxc-calling-debug/SKILL.md +475 -0
- wxcli/_playbook/CLAUDE.md +373 -0
- wxcli/_playbook/docs/reference/CLAUDE.md +25 -0
- wxcli/_playbook/docs/reference/admin-apps-data.md +643 -0
- wxcli/_playbook/docs/reference/admin-audit-security.md +322 -0
- wxcli/_playbook/docs/reference/admin-hybrid.md +383 -0
- wxcli/_playbook/docs/reference/admin-identity-scim.md +1007 -0
- wxcli/_playbook/docs/reference/admin-licensing.md +414 -0
- wxcli/_playbook/docs/reference/admin-org-management.md +586 -0
- wxcli/_playbook/docs/reference/admin-partner.md +357 -0
- wxcli/_playbook/docs/reference/archive/wxc-sdk-patterns.md +1229 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-advanced.md +835 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-core.md +743 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-devices-workspaces.md +1305 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-features.md +849 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-locations.md +938 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-person.md +1255 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-routing.md +1262 -0
- wxcli/_playbook/docs/reference/authentication.md +965 -0
- wxcli/_playbook/docs/reference/call-control.md +1205 -0
- wxcli/_playbook/docs/reference/call-features-additional.md +2541 -0
- wxcli/_playbook/docs/reference/call-features-major.md +1320 -0
- wxcli/_playbook/docs/reference/call-routing.md +2304 -0
- wxcli/_playbook/docs/reference/contact-center-analytics.md +1049 -0
- wxcli/_playbook/docs/reference/contact-center-core.md +1614 -0
- wxcli/_playbook/docs/reference/contact-center-journey.md +457 -0
- wxcli/_playbook/docs/reference/contact-center-routing.md +1138 -0
- wxcli/_playbook/docs/reference/devices-core.md +1869 -0
- wxcli/_playbook/docs/reference/devices-dect.md +1150 -0
- wxcli/_playbook/docs/reference/devices-platform.md +467 -0
- wxcli/_playbook/docs/reference/devices-workspaces.md +1426 -0
- wxcli/_playbook/docs/reference/emergency-services.md +1122 -0
- wxcli/_playbook/docs/reference/location-calling-core.md +2037 -0
- wxcli/_playbook/docs/reference/location-calling-media.md +1334 -0
- wxcli/_playbook/docs/reference/location-recording-advanced.md +1482 -0
- wxcli/_playbook/docs/reference/meetings-content.md +473 -0
- wxcli/_playbook/docs/reference/meetings-core.md +903 -0
- wxcli/_playbook/docs/reference/meetings-infrastructure.md +899 -0
- wxcli/_playbook/docs/reference/meetings-settings.md +850 -0
- wxcli/_playbook/docs/reference/messaging-bots.md +1091 -0
- wxcli/_playbook/docs/reference/messaging-spaces.md +695 -0
- wxcli/_playbook/docs/reference/person-call-settings-behavior.md +1639 -0
- wxcli/_playbook/docs/reference/person-call-settings-handling.md +1394 -0
- wxcli/_playbook/docs/reference/person-call-settings-media.md +1898 -0
- wxcli/_playbook/docs/reference/person-call-settings-permissions.md +1329 -0
- wxcli/_playbook/docs/reference/provisioning.md +1366 -0
- wxcli/_playbook/docs/reference/reporting-analytics.md +1318 -0
- wxcli/_playbook/docs/reference/self-service-call-settings.md +1020 -0
- wxcli/_playbook/docs/reference/virtual-lines.md +1132 -0
- wxcli/_playbook/docs/reference/webhooks-events.md +1444 -0
- wxcli/_playbook/docs/reference/wxcadm-xsi-realtime.md +953 -0
- wxcli/_version.py +24 -0
- wxcli/auth.py +137 -0
- wxcli/commands/__init__.py +0 -0
- wxcli/commands/_registry.py +181 -0
- wxcli/commands/activation_email.py +103 -0
- wxcli/commands/admin_recordings.py +585 -0
- wxcli/commands/analytics.py +105 -0
- wxcli/commands/announcement_playlists.py +219 -0
- wxcli/commands/announcements.py +519 -0
- wxcli/commands/archive_users.py +36 -0
- wxcli/commands/attachment_actions.py +60 -0
- wxcli/commands/audit_events.py +83 -0
- wxcli/commands/authorizations.py +113 -0
- wxcli/commands/auto_attendant.py +642 -0
- wxcli/commands/broadworks_billing_reports.py +126 -0
- wxcli/commands/broadworks_enterprises.py +160 -0
- wxcli/commands/broadworks_subscribers.py +319 -0
- wxcli/commands/broadworks_workspaces.py +108 -0
- wxcli/commands/call_controls.py +1304 -0
- wxcli/commands/call_park.py +494 -0
- wxcli/commands/call_pickup.py +229 -0
- wxcli/commands/call_queue.py +1878 -0
- wxcli/commands/call_recording.py +707 -0
- wxcli/commands/call_routing.py +1610 -0
- wxcli/commands/call_settings_for_me_phase_5.py +212 -0
- wxcli/commands/caller_reputation.py +169 -0
- wxcli/commands/calling_service.py +305 -0
- wxcli/commands/cc_address_book.py +770 -0
- wxcli/commands/cc_agent_greetings.py +242 -0
- wxcli/commands/cc_agent_summaries.py +39 -0
- wxcli/commands/cc_agent_wellbeing.py +216 -0
- wxcli/commands/cc_agents.py +425 -0
- wxcli/commands/cc_ai_assistant.py +55 -0
- wxcli/commands/cc_ai_feature.py +294 -0
- wxcli/commands/cc_audio_files.py +149 -0
- wxcli/commands/cc_auto_csat.py +311 -0
- wxcli/commands/cc_aux_code.py +458 -0
- wxcli/commands/cc_business_hour.py +353 -0
- wxcli/commands/cc_call_monitoring.py +228 -0
- wxcli/commands/cc_callbacks.py +194 -0
- wxcli/commands/cc_campaign.py +212 -0
- wxcli/commands/cc_captures.py +39 -0
- wxcli/commands/cc_contact_list.py +169 -0
- wxcli/commands/cc_contact_number.py +295 -0
- wxcli/commands/cc_data_sources.py +235 -0
- wxcli/commands/cc_desktop_layout.py +380 -0
- wxcli/commands/cc_desktop_profile.py +322 -0
- wxcli/commands/cc_dial_number.py +511 -0
- wxcli/commands/cc_dial_plan.py +347 -0
- wxcli/commands/cc_dnc.py +101 -0
- wxcli/commands/cc_entry_point.py +545 -0
- wxcli/commands/cc_ewt.py +51 -0
- wxcli/commands/cc_flow.py +477 -0
- wxcli/commands/cc_global_vars.py +430 -0
- wxcli/commands/cc_holiday_list.py +335 -0
- wxcli/commands/cc_journey.py +1261 -0
- wxcli/commands/cc_legacy_flows.py +49 -0
- wxcli/commands/cc_multimedia_profile.py +436 -0
- wxcli/commands/cc_notification.py +51 -0
- wxcli/commands/cc_outdial_ani.py +604 -0
- wxcli/commands/cc_overrides.py +341 -0
- wxcli/commands/cc_queue.py +1083 -0
- wxcli/commands/cc_queue_stats.py +55 -0
- wxcli/commands/cc_realtime.py +51 -0
- wxcli/commands/cc_resource_collection.py +312 -0
- wxcli/commands/cc_search.py +46 -0
- wxcli/commands/cc_site.py +400 -0
- wxcli/commands/cc_skill.py +350 -0
- wxcli/commands/cc_skill_profile.py +289 -0
- wxcli/commands/cc_subscriptions.py +426 -0
- wxcli/commands/cc_summaries.py +130 -0
- wxcli/commands/cc_tasks.py +844 -0
- wxcli/commands/cc_team.py +325 -0
- wxcli/commands/cc_user_profiles.py +349 -0
- wxcli/commands/cc_users.py +701 -0
- wxcli/commands/cc_work_types.py +363 -0
- wxcli/commands/cdr.py +89 -0
- wxcli/commands/classifications.py +38 -0
- wxcli/commands/cleanup.py +1427 -0
- wxcli/commands/client_settings.py +72 -0
- wxcli/commands/conference.py +328 -0
- wxcli/commands/configure.py +72 -0
- wxcli/commands/converged_recordings.py +347 -0
- wxcli/commands/converged_recordings_export.py +310 -0
- wxcli/commands/cq_playlists.py +42 -0
- wxcli/commands/cucm.py +2794 -0
- wxcli/commands/cucm_config.py +129 -0
- wxcli/commands/customer_assist.py +373 -0
- wxcli/commands/data_sources.py +227 -0
- wxcli/commands/dect_devices.py +787 -0
- wxcli/commands/device_configurations.py +77 -0
- wxcli/commands/device_dynamic_settings.py +320 -0
- wxcli/commands/device_settings.py +1489 -0
- wxcli/commands/devices.py +280 -0
- wxcli/commands/domains.py +142 -0
- wxcli/commands/ecm.py +178 -0
- wxcli/commands/emergency_services.py +827 -0
- wxcli/commands/events.py +83 -0
- wxcli/commands/external_voicemail.py +52 -0
- wxcli/commands/groups.py +206 -0
- wxcli/commands/guest_management.py +76 -0
- wxcli/commands/hds.py +340 -0
- wxcli/commands/hot_desk.py +67 -0
- wxcli/commands/hot_desking_members.py +118 -0
- wxcli/commands/hot_desking_portal.py +124 -0
- wxcli/commands/hunt_group.py +577 -0
- wxcli/commands/hybrid_clusters.py +71 -0
- wxcli/commands/hybrid_connectors.py +67 -0
- wxcli/commands/identity_org.py +159 -0
- wxcli/commands/init_playbook.py +155 -0
- wxcli/commands/licenses.py +106 -0
- wxcli/commands/live_monitoring.py +40 -0
- wxcli/commands/location_call_handling.py +577 -0
- wxcli/commands/location_schedules.py +341 -0
- wxcli/commands/location_settings.py +1297 -0
- wxcli/commands/location_voicemail.py +494 -0
- wxcli/commands/locations.py +336 -0
- wxcli/commands/meeting_captions.py +110 -0
- wxcli/commands/meeting_chats.py +63 -0
- wxcli/commands/meeting_invitees.py +234 -0
- wxcli/commands/meeting_messages.py +28 -0
- wxcli/commands/meeting_participants.py +278 -0
- wxcli/commands/meeting_polls.py +111 -0
- wxcli/commands/meeting_preferences.py +515 -0
- wxcli/commands/meeting_qa.py +78 -0
- wxcli/commands/meeting_qualities.py +43 -0
- wxcli/commands/meeting_reports.py +101 -0
- wxcli/commands/meeting_session_types.py +105 -0
- wxcli/commands/meeting_site.py +57 -0
- wxcli/commands/meeting_slido.py +44 -0
- wxcli/commands/meeting_summaries.py +92 -0
- wxcli/commands/meeting_tracking_codes.py +233 -0
- wxcli/commands/meeting_transcripts.py +230 -0
- wxcli/commands/meetings.py +1997 -0
- wxcli/commands/memberships.py +164 -0
- wxcli/commands/messages.py +213 -0
- wxcli/commands/mode_management.py +244 -0
- wxcli/commands/my_call_settings.py +3577 -0
- wxcli/commands/numbers.py +405 -0
- wxcli/commands/operating_modes.py +410 -0
- wxcli/commands/org_contacts.py +284 -0
- wxcli/commands/org_health_cli.py +55 -0
- wxcli/commands/org_settings.py +71 -0
- wxcli/commands/organizations.py +83 -0
- wxcli/commands/paging_group.py +257 -0
- wxcli/commands/partner_admins.py +141 -0
- wxcli/commands/partner_reports.py +188 -0
- wxcli/commands/partner_tags.py +216 -0
- wxcli/commands/people.py +279 -0
- wxcli/commands/person_call_settings.py +71 -0
- wxcli/commands/pstn.py +280 -0
- wxcli/commands/recording_report.py +154 -0
- wxcli/commands/report_templates.py +38 -0
- wxcli/commands/reports.py +144 -0
- wxcli/commands/resource_group_memberships.py +160 -0
- wxcli/commands/resource_groups.py +67 -0
- wxcli/commands/roles.py +63 -0
- wxcli/commands/room_tabs.py +160 -0
- wxcli/commands/rooms.py +225 -0
- wxcli/commands/scim_bulk.py +46 -0
- wxcli/commands/scim_groups.py +246 -0
- wxcli/commands/scim_schemas.py +82 -0
- wxcli/commands/scim_users.py +283 -0
- wxcli/commands/security_audit.py +54 -0
- wxcli/commands/service_apps.py +51 -0
- wxcli/commands/single_number_reach.py +209 -0
- wxcli/commands/team_memberships.py +155 -0
- wxcli/commands/teams.py +153 -0
- wxcli/commands/ucm_profile.py +42 -0
- wxcli/commands/update.py +219 -0
- wxcli/commands/user_settings.py +5116 -0
- wxcli/commands/video_mesh.py +1090 -0
- wxcli/commands/virtual_extensions.py +502 -0
- wxcli/commands/virtual_line_settings.py +2072 -0
- wxcli/commands/webhooks.py +176 -0
- wxcli/commands/wholesale_billing_reports.py +147 -0
- wxcli/commands/wholesale_provisioning.py +523 -0
- wxcli/commands/workspace_locations.py +339 -0
- wxcli/commands/workspace_metrics.py +103 -0
- wxcli/commands/workspace_personalization.py +70 -0
- wxcli/commands/workspace_settings.py +3347 -0
- wxcli/commands/workspaces.py +279 -0
- wxcli/commands/xapi.py +114 -0
- wxcli/config.py +139 -0
- wxcli/errors.py +77 -0
- wxcli/main.py +210 -0
- wxcli/migration/CLAUDE.md +106 -0
- wxcli/migration/__init__.py +1 -0
- wxcli/migration/advisory/CLAUDE.md +196 -0
- wxcli/migration/advisory/__init__.py +46 -0
- wxcli/migration/advisory/advisor.py +107 -0
- wxcli/migration/advisory/advisory_patterns.py +2552 -0
- wxcli/migration/advisory/recommendation_rules.py +835 -0
- wxcli/migration/cucm/CLAUDE.md +74 -0
- wxcli/migration/cucm/__init__.py +5 -0
- wxcli/migration/cucm/connection.py +265 -0
- wxcli/migration/cucm/discovery.py +225 -0
- wxcli/migration/cucm/extractors/__init__.py +1 -0
- wxcli/migration/cucm/extractors/announcements.py +92 -0
- wxcli/migration/cucm/extractors/base.py +90 -0
- wxcli/migration/cucm/extractors/device_profiles.py +98 -0
- wxcli/migration/cucm/extractors/devices.py +193 -0
- wxcli/migration/cucm/extractors/e911.py +103 -0
- wxcli/migration/cucm/extractors/features.py +309 -0
- wxcli/migration/cucm/extractors/helpers.py +73 -0
- wxcli/migration/cucm/extractors/informational.py +295 -0
- wxcli/migration/cucm/extractors/locations.py +221 -0
- wxcli/migration/cucm/extractors/moh.py +100 -0
- wxcli/migration/cucm/extractors/remote_destinations.py +96 -0
- wxcli/migration/cucm/extractors/routing.py +493 -0
- wxcli/migration/cucm/extractors/shared_lines.py +146 -0
- wxcli/migration/cucm/extractors/templates.py +229 -0
- wxcli/migration/cucm/extractors/tier4.py +173 -0
- wxcli/migration/cucm/extractors/users.py +240 -0
- wxcli/migration/cucm/extractors/voicemail.py +243 -0
- wxcli/migration/cucm/extractors/workspaces.py +88 -0
- wxcli/migration/cucm/unity_connection.py +304 -0
- wxcli/migration/execute/CLAUDE.md +372 -0
- wxcli/migration/execute/__init__.py +303 -0
- wxcli/migration/execute/batch.py +277 -0
- wxcli/migration/execute/dependency.py +483 -0
- wxcli/migration/execute/engine.py +964 -0
- wxcli/migration/execute/handlers.py +2232 -0
- wxcli/migration/execute/planner.py +1939 -0
- wxcli/migration/execute/runtime.py +571 -0
- wxcli/migration/export/CLAUDE.md +49 -0
- wxcli/migration/export/__init__.py +8 -0
- wxcli/migration/export/csv_export.py +126 -0
- wxcli/migration/export/deployment_plan.py +479 -0
- wxcli/migration/export/json_export.py +60 -0
- wxcli/migration/models.py +941 -0
- wxcli/migration/phone_models.py +50 -0
- wxcli/migration/preflight/CLAUDE.md +52 -0
- wxcli/migration/preflight/__init__.py +89 -0
- wxcli/migration/preflight/checks.py +911 -0
- wxcli/migration/preflight/runner.py +293 -0
- wxcli/migration/rate_limiter.py +144 -0
- wxcli/migration/report/CLAUDE.md +245 -0
- wxcli/migration/report/__init__.py +7 -0
- wxcli/migration/report/appendix.py +2437 -0
- wxcli/migration/report/assembler.py +183 -0
- wxcli/migration/report/charts.py +263 -0
- wxcli/migration/report/executive.py +776 -0
- wxcli/migration/report/explainer.py +704 -0
- wxcli/migration/report/helpers.py +74 -0
- wxcli/migration/report/ingest.py +152 -0
- wxcli/migration/report/notice_templates.py +192 -0
- wxcli/migration/report/score.py +375 -0
- wxcli/migration/report/styles.py +1052 -0
- wxcli/migration/report/user_diff.py +1052 -0
- wxcli/migration/report/user_notice.py +425 -0
- wxcli/migration/state.py +139 -0
- wxcli/migration/store.py +860 -0
- wxcli/migration/transform/CLAUDE.md +107 -0
- wxcli/migration/transform/__init__.py +12 -0
- wxcli/migration/transform/analysis_pipeline.py +453 -0
- wxcli/migration/transform/analyzers/__init__.py +142 -0
- wxcli/migration/transform/analyzers/css_permission.py +189 -0
- wxcli/migration/transform/analyzers/css_routing.py +335 -0
- wxcli/migration/transform/analyzers/device_compatibility.py +122 -0
- wxcli/migration/transform/analyzers/dn_ambiguity.py +131 -0
- wxcli/migration/transform/analyzers/duplicate_user.py +221 -0
- wxcli/migration/transform/analyzers/extension_conflict.py +173 -0
- wxcli/migration/transform/analyzers/feature_approximation.py +227 -0
- wxcli/migration/transform/analyzers/layout_overflow.py +174 -0
- wxcli/migration/transform/analyzers/location_ambiguity.py +184 -0
- wxcli/migration/transform/analyzers/missing_data.py +300 -0
- wxcli/migration/transform/analyzers/selective_call_handling.py +394 -0
- wxcli/migration/transform/analyzers/shared_line.py +170 -0
- wxcli/migration/transform/analyzers/voicemail_compatibility.py +267 -0
- wxcli/migration/transform/analyzers/workspace_license.py +212 -0
- wxcli/migration/transform/cross_reference.py +1136 -0
- wxcli/migration/transform/cucm_pattern.py +246 -0
- wxcli/migration/transform/decisions.py +301 -0
- wxcli/migration/transform/e164.py +145 -0
- wxcli/migration/transform/engine.py +256 -0
- wxcli/migration/transform/mappers/CLAUDE.md +123 -0
- wxcli/migration/transform/mappers/__init__.py +76 -0
- wxcli/migration/transform/mappers/announcement_mapper.py +122 -0
- wxcli/migration/transform/mappers/base.py +190 -0
- wxcli/migration/transform/mappers/button_template_mapper.py +186 -0
- wxcli/migration/transform/mappers/call_forwarding_mapper.py +228 -0
- wxcli/migration/transform/mappers/call_settings_mapper.py +144 -0
- wxcli/migration/transform/mappers/css_mapper.py +868 -0
- wxcli/migration/transform/mappers/dect_mapper.py +367 -0
- wxcli/migration/transform/mappers/device_layout_mapper.py +289 -0
- wxcli/migration/transform/mappers/device_mapper.py +227 -0
- wxcli/migration/transform/mappers/device_profile_mapper.py +190 -0
- wxcli/migration/transform/mappers/device_settings_mapper.py +464 -0
- wxcli/migration/transform/mappers/e911_mapper.py +129 -0
- wxcli/migration/transform/mappers/ecbn_mapper.py +263 -0
- wxcli/migration/transform/mappers/executive_assistant_mapper.py +156 -0
- wxcli/migration/transform/mappers/feature_mapper.py +1179 -0
- wxcli/migration/transform/mappers/line_mapper.py +310 -0
- wxcli/migration/transform/mappers/location_mapper.py +235 -0
- wxcli/migration/transform/mappers/moh_mapper.py +114 -0
- wxcli/migration/transform/mappers/monitoring_mapper.py +221 -0
- wxcli/migration/transform/mappers/receptionist_mapper.py +245 -0
- wxcli/migration/transform/mappers/routing_mapper.py +821 -0
- wxcli/migration/transform/mappers/snr_mapper.py +201 -0
- wxcli/migration/transform/mappers/softkey_mapper.py +205 -0
- wxcli/migration/transform/mappers/user_mapper.py +264 -0
- wxcli/migration/transform/mappers/voicemail_group_mapper.py +286 -0
- wxcli/migration/transform/mappers/voicemail_mapper.py +514 -0
- wxcli/migration/transform/mappers/workspace_mapper.py +464 -0
- wxcli/migration/transform/normalizers.py +2008 -0
- wxcli/migration/transform/pattern_converter.py +106 -0
- wxcli/migration/transform/pipeline.py +271 -0
- wxcli/migration/transform/rules.py +255 -0
- wxcli/org_health/CLAUDE.md +63 -0
- wxcli/org_health/__init__.py +7 -0
- wxcli/org_health/analyze.py +93 -0
- wxcli/org_health/checks.py +458 -0
- wxcli/org_health/collector.py +62 -0
- wxcli/org_health/models.py +78 -0
- wxcli/org_health/report.py +300 -0
- wxcli/output.py +101 -0
- wxcli-1.2.0.dist-info/METADATA +505 -0
- wxcli-1.2.0.dist-info/RECORD +413 -0
- wxcli-1.2.0.dist-info/WHEEL +5 -0
- wxcli-1.2.0.dist-info/entry_points.txt +2 -0
- wxcli-1.2.0.dist-info/licenses/LICENSE +191 -0
- wxcli-1.2.0.dist-info/scm_file_list.json +751 -0
- wxcli-1.2.0.dist-info/scm_version.json +8 -0
- wxcli-1.2.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,695 @@
|
|
|
1
|
+
# Messaging: Spaces, Messages, Teams, ECM, and HDS
|
|
2
|
+
|
|
3
|
+
Reference for Webex messaging infrastructure management. Covers the 40 commands across 7 CLI groups that an IT admin or space manager uses to create and manage spaces, messages, memberships, teams, and enterprise content. Sourced from the Webex Messaging API (OpenAPI spec: `specs/webex-messaging.json`).
|
|
4
|
+
|
|
5
|
+
## Sources
|
|
6
|
+
|
|
7
|
+
- OpenAPI spec: `specs/webex-messaging.json`
|
|
8
|
+
- [developer.webex.com Messaging APIs](https://developer.webex.com/docs/api/v1/messages)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Token Type Matrix
|
|
13
|
+
|
|
14
|
+
This matrix is the most important thing to check before running any messaging command. The wrong token type will produce a 403 or unexpected empty results.
|
|
15
|
+
|
|
16
|
+
| Operation | User Token | Bot Token | Admin Token |
|
|
17
|
+
|-----------|-----------|-----------|-------------|
|
|
18
|
+
| Space CRUD | Yes | Yes (bot must be member) | Yes |
|
|
19
|
+
| Send/list messages | Yes | Yes (bot must be member) | No (admin can list via compliance, not send) |
|
|
20
|
+
| Membership CRUD | Yes (if moderator or creator) | Limited (can't add self) | Yes |
|
|
21
|
+
| Team CRUD | Yes | No | Yes |
|
|
22
|
+
| Team membership CRUD | Yes | No | Yes |
|
|
23
|
+
| ECM folder linking | No | No | Yes (requires `spark-admin:` scopes) |
|
|
24
|
+
| HDS monitoring | No | No | Yes (requires `spark-admin:` scopes) |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Table of Contents
|
|
29
|
+
|
|
30
|
+
1. [Messaging Model Overview](#1-messaging-model-overview)
|
|
31
|
+
2. [Spaces](#2-spaces)
|
|
32
|
+
3. [Messages](#3-messages)
|
|
33
|
+
4. [Memberships](#4-memberships)
|
|
34
|
+
5. [Teams](#5-teams)
|
|
35
|
+
6. [ECM — Enterprise Content Management](#6-ecm--enterprise-content-management)
|
|
36
|
+
7. [HDS — Hybrid Data Security](#7-hds--hybrid-data-security)
|
|
37
|
+
8. [Common Patterns](#8-common-patterns)
|
|
38
|
+
9. [See Also](#9-see-also)
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 1. Messaging Model Overview
|
|
43
|
+
|
|
44
|
+
Webex messaging is organized around spaces (also called rooms). Teams are an optional grouping layer.
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Organization
|
|
48
|
+
└── Teams (optional grouping)
|
|
49
|
+
└── Team Spaces (rooms belonging to a team)
|
|
50
|
+
└── Spaces (rooms — the core unit)
|
|
51
|
+
├── Members (memberships — who is in the space)
|
|
52
|
+
├── Messages (text, files, cards)
|
|
53
|
+
└── Tabs (embedded apps — not covered here)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Terminology:**
|
|
57
|
+
- **"room"** is the API term. **"space"** is what the Webex App shows users. They are the same thing.
|
|
58
|
+
- **Space types:** `direct` (1:1 between two people) or `group` (multi-person).
|
|
59
|
+
- **Team relationship:** a team groups multiple spaces under one umbrella. Creating a team auto-creates a "General" space. Adding a member to a team auto-adds them to all team spaces.
|
|
60
|
+
|
|
61
|
+
**CLI groups in this doc:**
|
|
62
|
+
|
|
63
|
+
| CLI Group | Resource | Commands |
|
|
64
|
+
|-----------|----------|---------|
|
|
65
|
+
| `rooms` | Spaces | 6 |
|
|
66
|
+
| `messages` | Messages | 6 |
|
|
67
|
+
| `memberships` | Space memberships | 5 |
|
|
68
|
+
| `teams` | Teams | 5 |
|
|
69
|
+
| `team-memberships` | Team memberships | 5 |
|
|
70
|
+
| `ecm` | ECM folder links | 5 |
|
|
71
|
+
| `hds` | HDS monitoring | 7 (read-only) |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 2. Spaces
|
|
76
|
+
|
|
77
|
+
**CLI group:** `rooms`
|
|
78
|
+
**API base:** `https://webexapis.com/v1/rooms`
|
|
79
|
+
|
|
80
|
+
### Commands
|
|
81
|
+
|
|
82
|
+
| Command | CLI | HTTP Method | What It Does |
|
|
83
|
+
|---------|-----|------------|-------------|
|
|
84
|
+
| List spaces | `wxcli rooms list` | GET /rooms | List spaces the caller belongs to |
|
|
85
|
+
| Create space | `wxcli rooms create --title "Name"` | POST /rooms | Create a new group space |
|
|
86
|
+
| Show space | `wxcli rooms show ROOM_ID` | GET /rooms/{roomId} | Get space details |
|
|
87
|
+
| Update space | `wxcli rooms update ROOM_ID --title "New Name"` | PUT /rooms/{roomId} | Rename, lock, set read-only |
|
|
88
|
+
| Delete space | `wxcli rooms delete ROOM_ID --force` | DELETE /rooms/{roomId} | Delete space and all content |
|
|
89
|
+
| Meeting info | `wxcli rooms show-meeting-info ROOM_ID` | GET /rooms/{roomId}/meetingInfo | Get SIP/meeting URI for space |
|
|
90
|
+
|
|
91
|
+
### Key Parameters
|
|
92
|
+
|
|
93
|
+
#### `rooms list`
|
|
94
|
+
|
|
95
|
+
| Option | Description |
|
|
96
|
+
|--------|-------------|
|
|
97
|
+
| `--type direct\|group` | Filter by space type |
|
|
98
|
+
| `--team-id TEAM_ID` | List spaces belonging to a specific team |
|
|
99
|
+
| `--sort-by id\|lastactivity\|created` | Sort order |
|
|
100
|
+
| `--org-public-spaces` | Show org's public spaces (joined and unjoined) |
|
|
101
|
+
| `--from` | Filter public spaces made public after this time (ISO 8601) |
|
|
102
|
+
| `--to` | Filter public spaces made public before this time (ISO 8601) |
|
|
103
|
+
| `--max N` | API-level page size |
|
|
104
|
+
| `--limit N` | CLI-level result cap |
|
|
105
|
+
| `--output table\|json` | Output format (default: table) |
|
|
106
|
+
|
|
107
|
+
#### `rooms create`
|
|
108
|
+
|
|
109
|
+
| Option | Required | Description |
|
|
110
|
+
|--------|:--------:|-------------|
|
|
111
|
+
| `--title TEXT` | Yes | Display name for the space |
|
|
112
|
+
| `--team-id TEAM_ID` | No | Associate with an existing team |
|
|
113
|
+
| `--is-locked/--no-is-locked` | No | Locked (moderated): creator becomes moderator, others cannot add members |
|
|
114
|
+
| `--is-public/--no-is-public` | No | Make space discoverable within the org |
|
|
115
|
+
| `--is-announcement-only/--no-is-announcement-only` | No | Only moderators can post |
|
|
116
|
+
| `--description TEXT` | No | Space description |
|
|
117
|
+
| `--classification-id ID` | No | Data classification label |
|
|
118
|
+
| `--json-body JSON` | No | Full JSON body (overrides all other options) |
|
|
119
|
+
|
|
120
|
+
#### `rooms update`
|
|
121
|
+
|
|
122
|
+
| Option | Description |
|
|
123
|
+
|--------|-------------|
|
|
124
|
+
| `--title TEXT` | Rename the space |
|
|
125
|
+
| `--is-locked/--no-is-locked` | Lock or unlock the space |
|
|
126
|
+
| `--is-public/--no-is-public` | Change public visibility |
|
|
127
|
+
| `--is-announcement-only/--no-is-announcement-only` | Set/clear announcement mode |
|
|
128
|
+
| `--is-read-only/--no-is-read-only` | Compliance officer can set direct room as read-only (archive pattern) |
|
|
129
|
+
| `--description TEXT` | Update description |
|
|
130
|
+
| `--team-id TEAM_ID` | Move unowned space to a team |
|
|
131
|
+
| `--classification-id ID` | Change classification |
|
|
132
|
+
|
|
133
|
+
### Raw HTTP
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
BASE = "https://webexapis.com/v1"
|
|
137
|
+
|
|
138
|
+
# List spaces
|
|
139
|
+
result = api.session.rest_get(f"{BASE}/rooms", params={"type": "group", "sortBy": "lastactivity"})
|
|
140
|
+
spaces = result.get("items", [])
|
|
141
|
+
# Each item: {"id", "title", "type", "isLocked", "teamId", "lastActivity", "created", ...}
|
|
142
|
+
|
|
143
|
+
# Create space
|
|
144
|
+
body = {"title": "Project Alpha", "teamId": team_id}
|
|
145
|
+
result = api.session.rest_post(f"{BASE}/rooms", json=body)
|
|
146
|
+
room_id = result.get("id")
|
|
147
|
+
|
|
148
|
+
# Get meeting info (SIP URI + meeting link)
|
|
149
|
+
info = api.session.rest_get(f"{BASE}/rooms/{room_id}/meetingInfo")
|
|
150
|
+
# Returns: {"roomId", "meetingLink", "sipAddress", "meetingNumber", "callInTollFreeNumber", ...}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Gotchas
|
|
154
|
+
|
|
155
|
+
- **Deleting a space is permanent** — no recycle bin. Always confirm with `--force` or the CLI will prompt.
|
|
156
|
+
- **`list` only returns spaces the authenticated user or bot is a member of.** To list all org spaces, use an admin token or the compliance API.
|
|
157
|
+
- **Direct spaces (1:1) cannot be deleted via API.** The delete endpoint will return an error.
|
|
158
|
+
- **Space titles are optional for direct spaces** — the Webex App uses participant names instead. The `title` field may be empty or absent for direct spaces.
|
|
159
|
+
- **`show-meeting-info` returns the SIP address and meeting link for a space** — useful for bridging Webex Calling + Messaging (e.g., dialing into a space from a desk phone).
|
|
160
|
+
- **`--is-read-only` is a compliance officer capability.** Regular users and admins without the compliance role cannot set this flag.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 3. Messages
|
|
165
|
+
|
|
166
|
+
**CLI group:** `messages`
|
|
167
|
+
**API base:** `https://webexapis.com/v1/messages`
|
|
168
|
+
|
|
169
|
+
For adaptive card payloads (`attachments` field), use `--json-body`. See `messaging-bots.md` for card recipes.
|
|
170
|
+
|
|
171
|
+
### Commands
|
|
172
|
+
|
|
173
|
+
| Command | CLI | HTTP Method | What It Does |
|
|
174
|
+
|---------|-----|------------|-------------|
|
|
175
|
+
| List messages | `wxcli messages list --room-id ROOM_ID` | GET /messages | List messages in a space |
|
|
176
|
+
| Send message | `wxcli messages create --room-id ROOM_ID --text "Hello"` | POST /messages | Send a message to a space |
|
|
177
|
+
| List direct | `wxcli messages list-direct --person-email user@example.com` | GET /messages/direct | List 1:1 messages with a person |
|
|
178
|
+
| Show message | `wxcli messages show MESSAGE_ID` | GET /messages/{messageId} | Get message details |
|
|
179
|
+
| Edit message | `wxcli messages update MESSAGE_ID --text "Updated"` | PUT /messages/{messageId} | Edit an existing message |
|
|
180
|
+
| Delete message | `wxcli messages delete MESSAGE_ID --force` | DELETE /messages/{messageId} | Delete a message |
|
|
181
|
+
|
|
182
|
+
### Key Parameters
|
|
183
|
+
|
|
184
|
+
#### `messages list`
|
|
185
|
+
|
|
186
|
+
| Option | Description |
|
|
187
|
+
|--------|-------------|
|
|
188
|
+
| `--room-id ROOM_ID` | Required — list messages in this space |
|
|
189
|
+
| `--parent-id MESSAGE_ID` | List threaded replies to a message |
|
|
190
|
+
| `--mentioned-people PERSON_ID` | Filter to messages mentioning this person (use `me` for self) |
|
|
191
|
+
| `--before DATETIME` | Messages sent before this time (ISO 8601) |
|
|
192
|
+
| `--before-message MESSAGE_ID` | Messages sent before this message (pagination) |
|
|
193
|
+
| `--max N` | API-level page size |
|
|
194
|
+
| `--limit N` | CLI-level result cap |
|
|
195
|
+
| `--output table\|json` | Output format (default: table; columns: ID, Person Email, Text) |
|
|
196
|
+
|
|
197
|
+
#### `messages create`
|
|
198
|
+
|
|
199
|
+
| Option | Notes |
|
|
200
|
+
|--------|-------|
|
|
201
|
+
| `--room-id ROOM_ID` | Send to a group or direct space |
|
|
202
|
+
| `--to-person-id PERSON_ID` | Send a 1:1 direct message by person ID |
|
|
203
|
+
| `--to-person-email EMAIL` | Send a 1:1 direct message by email |
|
|
204
|
+
| `--text TEXT` | Plain text content |
|
|
205
|
+
| `--markdown TEXT` | Markdown content (bold, italic, links, @mentions, code blocks) |
|
|
206
|
+
| `--parent-id MESSAGE_ID` | Reply to a specific message (creates a thread) |
|
|
207
|
+
| `--json-body JSON` | Full JSON body — required for `files`, `attachments` (adaptive cards) |
|
|
208
|
+
|
|
209
|
+
Use exactly one of `--room-id`, `--to-person-id`, or `--to-person-email` to specify the destination.
|
|
210
|
+
|
|
211
|
+
#### `messages list-direct`
|
|
212
|
+
|
|
213
|
+
| Option | Description |
|
|
214
|
+
|--------|-------------|
|
|
215
|
+
| `--person-id PERSON_ID` | List 1:1 messages with this person (by ID) |
|
|
216
|
+
| `--person-email EMAIL` | List 1:1 messages with this person (by email) |
|
|
217
|
+
| `--parent-id MESSAGE_ID` | Filter to a thread |
|
|
218
|
+
|
|
219
|
+
#### `messages update`
|
|
220
|
+
|
|
221
|
+
| Option | Notes |
|
|
222
|
+
|--------|-------|
|
|
223
|
+
| `--room-id ROOM_ID` | Room ID of the message (required in body for edit) |
|
|
224
|
+
| `--text TEXT` | Updated plain text |
|
|
225
|
+
| `--markdown TEXT` | Updated markdown text |
|
|
226
|
+
|
|
227
|
+
### Raw HTTP
|
|
228
|
+
|
|
229
|
+
```python
|
|
230
|
+
BASE = "https://webexapis.com/v1"
|
|
231
|
+
|
|
232
|
+
# Send a plain text message
|
|
233
|
+
body = {"roomId": room_id, "text": "Hello from wxcli"}
|
|
234
|
+
result = api.session.rest_post(f"{BASE}/messages", json=body)
|
|
235
|
+
|
|
236
|
+
# Send a markdown message
|
|
237
|
+
body = {"roomId": room_id, "markdown": "**Alert:** Configuration complete for _Location Alpha_."}
|
|
238
|
+
result = api.session.rest_post(f"{BASE}/messages", json=body)
|
|
239
|
+
|
|
240
|
+
# Send a file attachment (URL must be publicly accessible)
|
|
241
|
+
body = {"roomId": room_id, "text": "Here is the report", "files": ["https://example.com/report.pdf"]}
|
|
242
|
+
result = api.session.rest_post(f"{BASE}/messages", json=body)
|
|
243
|
+
|
|
244
|
+
# Send adaptive card (see messaging-bots.md for card schema)
|
|
245
|
+
body = {
|
|
246
|
+
"roomId": room_id,
|
|
247
|
+
"text": "Fallback text for clients that don't support cards",
|
|
248
|
+
"attachments": [{"contentType": "application/vnd.microsoft.card.adaptive", "content": {...}}]
|
|
249
|
+
}
|
|
250
|
+
result = api.session.rest_post(f"{BASE}/messages", json=body)
|
|
251
|
+
|
|
252
|
+
# List messages with pagination
|
|
253
|
+
result = api.session.rest_get(f"{BASE}/messages", params={"roomId": room_id, "max": 50})
|
|
254
|
+
messages = result.get("items", [])
|
|
255
|
+
# Each item: {"id", "roomId", "personId", "personEmail", "text", "markdown", "created", "updated", ...}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Gotchas
|
|
259
|
+
|
|
260
|
+
- **`--room-id` is required for `list`** — there is no global messages endpoint. You must specify a room.
|
|
261
|
+
- **`--files` accepts a URL, not a local file path.** The URL must be publicly accessible or a Webex content URL. For local file uploads, use `--json-body` with a multipart approach or upload first via another mechanism.
|
|
262
|
+
- **Bots can only read messages where they are @mentioned**, except in 1:1 direct spaces where they see all messages.
|
|
263
|
+
- **Edit only works on messages sent by the authenticated user or bot.** Editing someone else's message will return 403.
|
|
264
|
+
- **`--before` and `--before-message` are pagination tools** — use `--before-message` with the ID of the oldest message in the last page to walk backward through history.
|
|
265
|
+
- **Adaptive card payloads require `--json-body`** — the `attachments` array cannot be set via `--text` or `--markdown`. See `messaging-bots.md` for adaptive card recipes.
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## 4. Memberships
|
|
270
|
+
|
|
271
|
+
**CLI group:** `memberships`
|
|
272
|
+
**API base:** `https://webexapis.com/v1/memberships`
|
|
273
|
+
|
|
274
|
+
A membership is the relationship between a person and a space. The membership ID is distinct from the person ID.
|
|
275
|
+
|
|
276
|
+
### Commands
|
|
277
|
+
|
|
278
|
+
| Command | CLI | HTTP Method | What It Does |
|
|
279
|
+
|---------|-----|------------|-------------|
|
|
280
|
+
| List members | `wxcli memberships list --room-id ROOM_ID` | GET /memberships | List space members |
|
|
281
|
+
| Add member | `wxcli memberships create --room-id ROOM_ID --person-email user@example.com` | POST /memberships | Add person to space |
|
|
282
|
+
| Show membership | `wxcli memberships show MEMBERSHIP_ID` | GET /memberships/{membershipId} | Get membership details |
|
|
283
|
+
| Update membership | `wxcli memberships update MEMBERSHIP_ID --is-moderator` | PUT /memberships/{membershipId} | Change moderator status or hide space |
|
|
284
|
+
| Remove member | `wxcli memberships delete MEMBERSHIP_ID --force` | DELETE /memberships/{membershipId} | Remove person from space |
|
|
285
|
+
|
|
286
|
+
### Key Parameters
|
|
287
|
+
|
|
288
|
+
#### `memberships list`
|
|
289
|
+
|
|
290
|
+
| Option | Description |
|
|
291
|
+
|--------|-------------|
|
|
292
|
+
| `--room-id ROOM_ID` | List all members of a specific space |
|
|
293
|
+
| `--person-id PERSON_ID` | List all spaces a specific person belongs to |
|
|
294
|
+
| `--person-email EMAIL` | List all spaces a specific person belongs to (by email) |
|
|
295
|
+
| `--max N` | Page size |
|
|
296
|
+
| `--output table\|json` | Output format (default: table; columns: ID, Name) |
|
|
297
|
+
|
|
298
|
+
#### `memberships create`
|
|
299
|
+
|
|
300
|
+
| Option | Required | Description |
|
|
301
|
+
|--------|:--------:|-------------|
|
|
302
|
+
| `--room-id ROOM_ID` | Yes | Space to add the person to |
|
|
303
|
+
| `--person-id PERSON_ID` | One of these | Person to add (by ID) |
|
|
304
|
+
| `--person-email EMAIL` | One of these | Person to add (by email) |
|
|
305
|
+
| `--is-moderator/--no-is-moderator` | No | Grant moderator role on add |
|
|
306
|
+
|
|
307
|
+
#### `memberships update`
|
|
308
|
+
|
|
309
|
+
| Option | Description |
|
|
310
|
+
|--------|-------------|
|
|
311
|
+
| `--is-moderator/--no-is-moderator` | Grant or revoke moderator role |
|
|
312
|
+
| `--is-room-hidden/--no-is-room-hidden` | Hide/show the space in the member's space list (Teams client only) |
|
|
313
|
+
|
|
314
|
+
### Raw HTTP
|
|
315
|
+
|
|
316
|
+
```python
|
|
317
|
+
BASE = "https://webexapis.com/v1"
|
|
318
|
+
|
|
319
|
+
# List members of a space
|
|
320
|
+
result = api.session.rest_get(f"{BASE}/memberships", params={"roomId": room_id})
|
|
321
|
+
members = result.get("items", [])
|
|
322
|
+
# Each item: {"id", "roomId", "personId", "personEmail", "personDisplayName", "isModerator", "created", ...}
|
|
323
|
+
|
|
324
|
+
# Add a member
|
|
325
|
+
body = {"roomId": room_id, "personEmail": "user@example.com", "isModerator": False}
|
|
326
|
+
result = api.session.rest_post(f"{BASE}/memberships", json=body)
|
|
327
|
+
membership_id = result.get("id")
|
|
328
|
+
|
|
329
|
+
# Promote to moderator
|
|
330
|
+
body = {"isModerator": True}
|
|
331
|
+
api.session.rest_put(f"{BASE}/memberships/{membership_id}", json=body)
|
|
332
|
+
|
|
333
|
+
# Remove member
|
|
334
|
+
api.session.rest_delete(f"{BASE}/memberships/{membership_id}")
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Gotchas
|
|
338
|
+
|
|
339
|
+
- **The membership ID is NOT the person ID.** It is a separate identifier for the person-in-space relationship. You need the membership ID to update or delete a membership. Use `memberships list --room-id ROOM_ID` to find it.
|
|
340
|
+
- **Removing the last moderator from a locked space makes it unmodifiable.** Always ensure at least one moderator remains before removing others.
|
|
341
|
+
- **Bots cannot add themselves to spaces.** Bots must be added by a user or via an integration OAuth flow.
|
|
342
|
+
- **`list` requires at least `--room-id` or `--person-id`.** A bare `memberships list` with no filter will return memberships for the authenticated user only.
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## 5. Teams
|
|
347
|
+
|
|
348
|
+
**CLI groups:** `teams` and `team-memberships`
|
|
349
|
+
**API bases:** `https://webexapis.com/v1/teams` and `https://webexapis.com/v1/team/memberships`
|
|
350
|
+
|
|
351
|
+
A team is a grouping of related spaces. When you delete a team, all team spaces and their content are deleted.
|
|
352
|
+
|
|
353
|
+
### Team Commands
|
|
354
|
+
|
|
355
|
+
| Command | CLI | HTTP Method | What It Does |
|
|
356
|
+
|---------|-----|------------|-------------|
|
|
357
|
+
| List teams | `wxcli teams list` | GET /teams | List teams the caller belongs to |
|
|
358
|
+
| Create team | `wxcli teams create --name "Team Name"` | POST /teams | Create a new team |
|
|
359
|
+
| Show team | `wxcli teams show TEAM_ID` | GET /teams/{teamId} | Get team details |
|
|
360
|
+
| Update team | `wxcli teams update TEAM_ID --name "New Name"` | PUT /teams/{teamId} | Rename or update description |
|
|
361
|
+
| Delete team | `wxcli teams delete TEAM_ID --force` | DELETE /teams/{teamId} | Delete team and ALL team spaces |
|
|
362
|
+
|
|
363
|
+
#### `teams create` Parameters
|
|
364
|
+
|
|
365
|
+
| Option | Required | Description |
|
|
366
|
+
|--------|:--------:|-------------|
|
|
367
|
+
| `--name TEXT` | Yes | Display name for the team |
|
|
368
|
+
| `--description TEXT` | No | Team description |
|
|
369
|
+
|
|
370
|
+
#### `teams update` Parameters
|
|
371
|
+
|
|
372
|
+
| Option | Description |
|
|
373
|
+
|--------|-------------|
|
|
374
|
+
| `--name TEXT` | New team name |
|
|
375
|
+
| `--description TEXT` | Updated description |
|
|
376
|
+
|
|
377
|
+
### Team Membership Commands
|
|
378
|
+
|
|
379
|
+
| Command | CLI | HTTP Method | What It Does |
|
|
380
|
+
|---------|-----|------------|-------------|
|
|
381
|
+
| List team members | `wxcli team-memberships list --team-id TEAM_ID` | GET /team/memberships | List members of a team |
|
|
382
|
+
| Add team member | `wxcli team-memberships create --team-id TEAM_ID --person-email user@example.com` | POST /team/memberships | Add person to team |
|
|
383
|
+
| Show team membership | `wxcli team-memberships show MEMBERSHIP_ID` | GET /team/memberships/{membershipId} | Get team membership details |
|
|
384
|
+
| Update team membership | `wxcli team-memberships update MEMBERSHIP_ID --is-moderator` | PUT /team/memberships/{membershipId} | Change moderator role |
|
|
385
|
+
| Remove team member | `wxcli team-memberships delete MEMBERSHIP_ID --force` | DELETE /team/memberships/{membershipId} | Remove person from team |
|
|
386
|
+
|
|
387
|
+
#### `team-memberships create` Parameters
|
|
388
|
+
|
|
389
|
+
| Option | Required | Description |
|
|
390
|
+
|--------|:--------:|-------------|
|
|
391
|
+
| `--team-id TEAM_ID` | Yes | Team to add the person to |
|
|
392
|
+
| `--person-id PERSON_ID` | One of these | Person to add (by ID) |
|
|
393
|
+
| `--person-email EMAIL` | One of these | Person to add (by email) |
|
|
394
|
+
| `--is-moderator/--no-is-moderator` | No | Grant team moderator role |
|
|
395
|
+
|
|
396
|
+
#### `team-memberships update` Parameters
|
|
397
|
+
|
|
398
|
+
| Option | Description |
|
|
399
|
+
|--------|-------------|
|
|
400
|
+
| `--is-moderator/--no-is-moderator` | Grant or revoke team moderator role |
|
|
401
|
+
|
|
402
|
+
### Raw HTTP
|
|
403
|
+
|
|
404
|
+
```python
|
|
405
|
+
BASE = "https://webexapis.com/v1"
|
|
406
|
+
|
|
407
|
+
# Create team
|
|
408
|
+
body = {"name": "Engineering", "description": "Engineering team"}
|
|
409
|
+
result = api.session.rest_post(f"{BASE}/teams", json=body)
|
|
410
|
+
team_id = result.get("id")
|
|
411
|
+
|
|
412
|
+
# List team members
|
|
413
|
+
result = api.session.rest_get(f"{BASE}/team/memberships", params={"teamId": team_id})
|
|
414
|
+
members = result.get("items", [])
|
|
415
|
+
# Each item: {"id", "teamId", "personId", "personEmail", "personDisplayName", "isModerator", "created", ...}
|
|
416
|
+
|
|
417
|
+
# Add team member
|
|
418
|
+
body = {"teamId": team_id, "personEmail": "engineer@example.com", "isModerator": False}
|
|
419
|
+
result = api.session.rest_post(f"{BASE}/team/memberships", json=body)
|
|
420
|
+
|
|
421
|
+
# Delete team (DESTRUCTIVE — deletes all team spaces)
|
|
422
|
+
api.session.rest_delete(f"{BASE}/teams/{team_id}")
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### Gotchas
|
|
426
|
+
|
|
427
|
+
- **Deleting a team deletes ALL team spaces and their content.** This is irreversible. Use `--force` to skip confirmation, but do not use `--force` in automated scripts without an explicit safety check.
|
|
428
|
+
- **Adding a member to a team auto-adds them to all existing team spaces.** The reverse is not true — removing a team member does not remove them from individual team spaces they were added to directly.
|
|
429
|
+
- **Team membership is separate from space membership.** A user can be removed from individual team spaces while remaining a team member, and vice versa.
|
|
430
|
+
- **Bot tokens cannot create or manage teams.** Only user tokens and admin tokens have this capability.
|
|
431
|
+
- **Note the API URL asymmetry:** teams are at `/teams` but team memberships are at `/team/memberships` (singular "team", not "teams"). The CLI handles this transparently.
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
435
|
+
## 6. ECM — Enterprise Content Management
|
|
436
|
+
|
|
437
|
+
**CLI group:** `ecm`
|
|
438
|
+
**API base:** `https://webexapis.com/v1/room/linkedFolders`
|
|
439
|
+
|
|
440
|
+
ECM links SharePoint/OneDrive folders to Webex spaces, allowing users to access enterprise content directly from a space. This is an admin-only operation.
|
|
441
|
+
|
|
442
|
+
### Commands
|
|
443
|
+
|
|
444
|
+
| Command | CLI | HTTP Method | What It Does |
|
|
445
|
+
|---------|-----|------------|-------------|
|
|
446
|
+
| List linked folders | `wxcli ecm list` | GET /room/linkedFolders | List ECM folder links (optionally filtered by room) |
|
|
447
|
+
| Link folder | `wxcli ecm create --room-id ROOM_ID ...` | POST /room/linkedFolders | Link an ECM folder to a space |
|
|
448
|
+
| Show linked folder | `wxcli ecm show FOLDER_ID` | GET /room/linkedFolders/{id} | Get linked folder details |
|
|
449
|
+
| Update linked folder | `wxcli ecm update FOLDER_ID ...` | PUT /room/linkedFolders/{id} | Update folder link configuration |
|
|
450
|
+
| Unlink folder | `wxcli ecm delete FOLDER_ID --force` | DELETE /room/linkedFolders/{id} | Remove folder link from space |
|
|
451
|
+
|
|
452
|
+
### Key Parameters
|
|
453
|
+
|
|
454
|
+
#### `ecm list`
|
|
455
|
+
|
|
456
|
+
| Option | Description |
|
|
457
|
+
|--------|-------------|
|
|
458
|
+
| `--room-id ROOM_ID` | Filter to linked folders for a specific space |
|
|
459
|
+
| `--output table\|json` | Output format (default: table; columns: ID, Name) |
|
|
460
|
+
|
|
461
|
+
#### `ecm create`
|
|
462
|
+
|
|
463
|
+
| Option | Required | Description |
|
|
464
|
+
|--------|:--------:|-------------|
|
|
465
|
+
| `--room-id ROOM_ID` | Yes | Space to link the folder to |
|
|
466
|
+
| `--content-url URL` | Yes | URL of the ECM folder |
|
|
467
|
+
| `--display-name TEXT` | Yes | Display name (should match the folder name in the ECM backend) |
|
|
468
|
+
| `--drive-id ID` | Yes | SharePoint or OneDrive drive ID (query via MS Graph API) |
|
|
469
|
+
| `--item-id ID` | Yes | SharePoint or OneDrive item ID (query via MS Graph API) |
|
|
470
|
+
| `--default-folder VALUE` | Yes | Set as default storage folder for the space |
|
|
471
|
+
|
|
472
|
+
#### `ecm update`
|
|
473
|
+
|
|
474
|
+
Same parameters as create, all optional. Pass only the fields you want to change.
|
|
475
|
+
|
|
476
|
+
### Required Scopes
|
|
477
|
+
|
|
478
|
+
ECM operations require an admin token with standard `spark-admin:` scopes (e.g., `spark-admin:rooms_read`). No special ECM-specific scopes are needed -- the `/room/linkedFolders` endpoint works with a full admin token using standard room scopes. Standard user tokens are insufficient.
|
|
479
|
+
|
|
480
|
+
### Raw HTTP
|
|
481
|
+
|
|
482
|
+
```python
|
|
483
|
+
BASE = "https://webexapis.com/v1"
|
|
484
|
+
|
|
485
|
+
# List ECM linked folders for a space
|
|
486
|
+
result = api.session.rest_get(f"{BASE}/room/linkedFolders", params={"roomId": room_id})
|
|
487
|
+
folders = result.get("items", [])
|
|
488
|
+
|
|
489
|
+
# Link a SharePoint folder
|
|
490
|
+
body = {
|
|
491
|
+
"roomId": room_id,
|
|
492
|
+
"contentUrl": "https://contoso.sharepoint.com/sites/Engineering/Shared Documents/Project",
|
|
493
|
+
"displayName": "Project",
|
|
494
|
+
"driveId": "<drive-id-from-ms-graph>",
|
|
495
|
+
"itemId": "<item-id-from-ms-graph>",
|
|
496
|
+
"defaultFolder": "true"
|
|
497
|
+
}
|
|
498
|
+
result = api.session.rest_post(f"{BASE}/room/linkedFolders", json=body)
|
|
499
|
+
folder_id = result.get("id")
|
|
500
|
+
|
|
501
|
+
# Unlink folder
|
|
502
|
+
api.session.rest_delete(f"{BASE}/room/linkedFolders/{folder_id}")
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
### Gotchas
|
|
506
|
+
|
|
507
|
+
- **Admin token with `spark-admin:` scopes is required.** User tokens return 403.
|
|
508
|
+
- **`--drive-id` and `--item-id` must be obtained from the Microsoft Graph API** before calling ECM endpoints. They are Microsoft-side identifiers for the SharePoint/OneDrive resource.
|
|
509
|
+
- **`--display-name` should match the actual folder name in the ECM backend** to avoid confusion for end users.
|
|
510
|
+
- **Unlinking a folder removes the link but does not delete the files** in SharePoint/OneDrive.
|
|
511
|
+
|
|
512
|
+
**ECM provider support:** The OpenAPI spec and schema definitions reference only Microsoft SharePoint and OneDrive. The `driveId` and `itemId` fields are described as "Sharepoint or OneDrive" identifiers collected via the MS Graph API, and all examples use `sharepoint.com` URLs. Box is not supported as an ECM provider for folder linking.
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
## 7. HDS — Hybrid Data Security
|
|
517
|
+
|
|
518
|
+
**CLI group:** `hds`
|
|
519
|
+
**API base:** `https://webexapis.com/v1/hds`
|
|
520
|
+
|
|
521
|
+
HDS manages encryption keys on-premises for compliance-sensitive organizations. These commands are monitoring-only — there are no write operations. Requires an admin token.
|
|
522
|
+
|
|
523
|
+
### Commands
|
|
524
|
+
|
|
525
|
+
| Command | CLI | What It Shows |
|
|
526
|
+
|---------|-----|--------------|
|
|
527
|
+
| Org status | `wxcli hds show ORG_ID` | HDS organization enrollment status and configuration |
|
|
528
|
+
| Cluster details | `wxcli hds show-clusters CLUSTER_ID` | HDS cluster configuration and health |
|
|
529
|
+
| Node details | `wxcli hds show-nodes NODE_ID` | Individual node status |
|
|
530
|
+
| Database details | `wxcli hds list ORG_ID` | HDS database configuration |
|
|
531
|
+
| Multi-tenant info | `wxcli hds list-multi-tenant ORG_ID` | Multi-tenant HDS org details |
|
|
532
|
+
| Network tests | `wxcli hds list-network-test NODE_ID` | Network test results for a node |
|
|
533
|
+
| Availability | `wxcli hds list-availability CLUSTER_ID` | Cluster availability metrics over time |
|
|
534
|
+
|
|
535
|
+
### Key Parameters
|
|
536
|
+
|
|
537
|
+
#### `hds list-network-test NODE_ID`
|
|
538
|
+
|
|
539
|
+
| Option | Description |
|
|
540
|
+
|--------|-------------|
|
|
541
|
+
| `--trigger-type OnDemand\|Periodic\|All` | Filter test results by trigger type |
|
|
542
|
+
| `--output table\|json` | Output format (default: table) |
|
|
543
|
+
|
|
544
|
+
#### `hds list-availability CLUSTER_ID`
|
|
545
|
+
|
|
546
|
+
| Option | Description |
|
|
547
|
+
|--------|-------------|
|
|
548
|
+
| `--from DATETIME` | Start of availability window (ISO 8601) |
|
|
549
|
+
| `--to DATETIME` | End of availability window (ISO 8601) |
|
|
550
|
+
| `--output table\|json` | Output format (default: table) |
|
|
551
|
+
|
|
552
|
+
### Raw HTTP
|
|
553
|
+
|
|
554
|
+
```python
|
|
555
|
+
BASE = "https://webexapis.com/v1/hds"
|
|
556
|
+
|
|
557
|
+
# Get HDS org status
|
|
558
|
+
org_status = api.session.rest_get(f"{BASE}/organizations/{org_id}")
|
|
559
|
+
|
|
560
|
+
# Get cluster details
|
|
561
|
+
cluster = api.session.rest_get(f"{BASE}/clusters/{cluster_id}")
|
|
562
|
+
|
|
563
|
+
# Get node details
|
|
564
|
+
node = api.session.rest_get(f"{BASE}/nodes/{node_id}")
|
|
565
|
+
|
|
566
|
+
# Get database details
|
|
567
|
+
db = api.session.rest_get(f"{BASE}/organizations/{org_id}/database/details")
|
|
568
|
+
|
|
569
|
+
# Get multi-tenant details
|
|
570
|
+
mt = api.session.rest_get(f"{BASE}/organizations/{org_id}/multiTenant")
|
|
571
|
+
|
|
572
|
+
# Get node network test results
|
|
573
|
+
tests = api.session.rest_get(f"{BASE}/testResults/nodes/{node_id}/networkTest",
|
|
574
|
+
params={"triggerType": "All"})
|
|
575
|
+
|
|
576
|
+
# Get cluster availability
|
|
577
|
+
avail = api.session.rest_get(f"{BASE}/clusters/{cluster_id}/availability",
|
|
578
|
+
params={"from": "2026-01-01T00:00:00Z", "to": "2026-03-19T00:00:00Z"})
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
### Gotchas
|
|
582
|
+
|
|
583
|
+
- **All HDS commands are read-only.** There are no create, update, or delete operations in the `hds` CLI group.
|
|
584
|
+
- **Requires admin token.** HDS monitoring is not available via user or bot tokens.
|
|
585
|
+
- **IDs are required positional arguments** for all `hds` commands (e.g., `hds show ORG_ID`, `hds show-clusters CLUSTER_ID`). The org ID is available from `wxcli organizations list`.
|
|
586
|
+
|
|
587
|
+
HDS endpoints work with a standard full admin token -- no special admin role (e.g., Compliance Officer) is required. The `/hybrid/clusters` endpoint returns 200 with a full admin token.
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
## 8. Common Patterns
|
|
592
|
+
|
|
593
|
+
All messaging commands support `--output json|table`. Use `--output json` for scripting and piping results to other tools.
|
|
594
|
+
|
|
595
|
+
> **Note:** Specific numeric rate limits (~5 req/s for bot tokens) not yet confirmed via live testing. The OpenAPI spec confirms 429 responses with Retry-After headers but does not document per-token-type rates.
|
|
596
|
+
|
|
597
|
+
### Bulk Create Spaces from a List
|
|
598
|
+
|
|
599
|
+
```bash
|
|
600
|
+
# Create multiple project spaces from a list of names
|
|
601
|
+
for name in "Project Alpha" "Project Beta" "Project Gamma"; do
|
|
602
|
+
wxcli rooms create --title "$name" --team-id TEAM_ID
|
|
603
|
+
sleep 1
|
|
604
|
+
done
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
### Audit All Memberships in a Space
|
|
608
|
+
|
|
609
|
+
```bash
|
|
610
|
+
# List all members of a space in JSON for processing
|
|
611
|
+
wxcli memberships list --room-id ROOM_ID --output json
|
|
612
|
+
|
|
613
|
+
# Find all spaces a specific user belongs to
|
|
614
|
+
wxcli memberships list --person-email user@example.com --output json
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
### Archive a Space (Read-Only + Notice)
|
|
618
|
+
|
|
619
|
+
```bash
|
|
620
|
+
# 1. Post an archival notice
|
|
621
|
+
wxcli messages create --room-id ROOM_ID --text "This space is now archived. No further messages will be accepted."
|
|
622
|
+
|
|
623
|
+
# 2. Set the space to read-only (compliance officer token required)
|
|
624
|
+
wxcli rooms update ROOM_ID --is-read-only
|
|
625
|
+
|
|
626
|
+
# 3. Optionally rename to indicate archived status
|
|
627
|
+
wxcli rooms update ROOM_ID --title "[ARCHIVED] Project Alpha"
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### Set Up a Project Team
|
|
631
|
+
|
|
632
|
+
```bash
|
|
633
|
+
# 1. Create the team (auto-creates a General space)
|
|
634
|
+
wxcli teams create --name "Acme Project" --description "Q2 2026 deployment"
|
|
635
|
+
|
|
636
|
+
# 2. Create additional team spaces
|
|
637
|
+
TEAM_ID="<id from step 1>"
|
|
638
|
+
wxcli rooms create --title "Engineering" --team-id $TEAM_ID
|
|
639
|
+
wxcli rooms create --title "Announcements" --team-id $TEAM_ID --is-announcement-only
|
|
640
|
+
|
|
641
|
+
# 3. Add team members (auto-adds to all team spaces)
|
|
642
|
+
wxcli team-memberships create --team-id $TEAM_ID --person-email lead@example.com --is-moderator
|
|
643
|
+
wxcli team-memberships create --team-id $TEAM_ID --person-email dev1@example.com
|
|
644
|
+
wxcli team-memberships create --team-id $TEAM_ID --person-email dev2@example.com
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
### Export Messages from a Space (Paginated)
|
|
648
|
+
|
|
649
|
+
```bash
|
|
650
|
+
# Get the first 50 messages
|
|
651
|
+
wxcli messages list --room-id ROOM_ID --limit 50 --output json > messages_page1.json
|
|
652
|
+
|
|
653
|
+
# Get the next page using the oldest message ID from the previous result
|
|
654
|
+
OLDEST_ID="<id of oldest message in page 1>"
|
|
655
|
+
wxcli messages list --room-id ROOM_ID --before-message $OLDEST_ID --limit 50 --output json > messages_page2.json
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
### Find a Membership ID for a Specific Person
|
|
659
|
+
|
|
660
|
+
```bash
|
|
661
|
+
# You need the membership ID to update or remove a specific person
|
|
662
|
+
wxcli memberships list --room-id ROOM_ID --output json | python3 -c "
|
|
663
|
+
import sys, json
|
|
664
|
+
members = json.load(sys.stdin)
|
|
665
|
+
for m in members:
|
|
666
|
+
if m.get('personEmail') == 'user@example.com':
|
|
667
|
+
print(m['id'])
|
|
668
|
+
"
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
---
|
|
672
|
+
|
|
673
|
+
## Gotchas (Cross-Cutting)
|
|
674
|
+
|
|
675
|
+
These issues span multiple messaging API surfaces. Check per-section Gotchas for endpoint-specific notes.
|
|
676
|
+
|
|
677
|
+
1. **Rate limits apply across all messaging endpoints.** Bot tokens have lower rate limits than user/admin tokens (exact numbers not officially documented — honor `Retry-After` headers). When bulk-creating spaces, adding members, or sending messages in a loop, add a short delay (e.g., `sleep 1`) between operations. A 429 response includes a `Retry-After` header — always honor it.
|
|
678
|
+
|
|
679
|
+
2. **Pagination is cursor-based, not offset-based.** All `list` commands use `items` arrays with `Link` headers for the next page. The CLI handles pagination internally via `--max` (API page size) and `--limit` (total result cap). For raw HTTP, follow the `Link: <url>; rel="next"` header to walk through pages.
|
|
680
|
+
|
|
681
|
+
3. **Membership sync delays on team operations.** Adding a member to a team auto-adds them to all team spaces, but the space-level membership may take a few seconds to propagate. If you add a team member and immediately try to post a message as that user in a team space, the message may fail with 403 until the membership propagates.
|
|
682
|
+
|
|
683
|
+
4. **Bot vs user vs admin token capabilities differ significantly.** See the Token Type Matrix at the top of this doc before every operation. Bots cannot manage teams. Admins cannot send messages (only list via compliance). Users cannot perform ECM or HDS operations.
|
|
684
|
+
|
|
685
|
+
5. **Direct (1:1) spaces have special behavior.** They cannot be deleted, cannot be renamed (title is derived from participant names), and are auto-created when you send a message via `--to-person-email` or `--to-person-id`. There is no explicit "create direct space" operation.
|
|
686
|
+
|
|
687
|
+
6. **IDs are Base64-encoded and org-scoped.** All Webex resource IDs (room, person, membership, team) are long Base64 strings. They are not transferable between orgs. When scripting, always resolve IDs dynamically rather than hardcoding them.
|
|
688
|
+
|
|
689
|
+
---
|
|
690
|
+
|
|
691
|
+
## 9. See Also
|
|
692
|
+
|
|
693
|
+
- [`messaging-bots.md`](messaging-bots.md) — Bot development, adaptive cards, interactive workflows, `--json-body` recipes for `attachments`
|
|
694
|
+
- [`webhooks-events.md`](webhooks-events.md) — Webhook CRUD and event payloads for messaging events (`messages`, `memberships`, `rooms`, `attachmentActions`)
|
|
695
|
+
- [`authentication.md`](authentication.md) — Token types (user, bot, admin), scopes, OAuth flows
|