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,520 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: messaging-spaces
|
|
3
|
+
description: |
|
|
4
|
+
Manage Webex messaging spaces, teams (collaboration groupings), memberships, messages,
|
|
5
|
+
and enterprise content management (ECM folder linking, HDS monitoring) using wxcli CLI commands.
|
|
6
|
+
Guides the user from prerequisites through execution and verification.
|
|
7
|
+
NOT for: Contact Center teams (use contact-center skill — CC teams group agents for routing,
|
|
8
|
+
not collaboration spaces) or bot/webhook development (use messaging-bots skill).
|
|
9
|
+
allowed-tools: Read, Grep, Glob, Bash
|
|
10
|
+
argument-hint: [operation-type]
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<!-- Created by playbook session 2026-03-19 -->
|
|
14
|
+
|
|
15
|
+
# Messaging Spaces Workflow
|
|
16
|
+
|
|
17
|
+
**Checkpoint — do NOT proceed until you can answer these:**
|
|
18
|
+
1. What token type do messaging space operations require? (Answer: User-level or bot token with `spark:rooms_read`/`spark:rooms_write` — admin tokens work for listing but some operations need the acting user's token.)
|
|
19
|
+
2. How do you list messages in a space? (Answer: `wxcli messages list --room-id SPACE_ID` — the API uses `roomId` not `spaceId`, matching the older "rooms" terminology.)
|
|
20
|
+
|
|
21
|
+
If you cannot answer both, you skipped reading this skill. Go back and read it.
|
|
22
|
+
|
|
23
|
+
## Step 1: Load references
|
|
24
|
+
|
|
25
|
+
1. Read `docs/reference/messaging-spaces.md` for spaces/messages/teams/ECM/HDS data models and CLI commands
|
|
26
|
+
|
|
27
|
+
**Mandatory --help verification:** Before constructing any wxcli command, run `wxcli <group> --help` to verify the subcommand exists, then `wxcli <group> <subcommand> --help` to verify the exact flags (e.g. `wxcli rooms create --help` — the CLI group for spaces is `rooms`, not `spaces`, and `teams` here are collaboration teams, not CC agent teams). Do NOT rely on examples in this skill or reference docs — the CLI is auto-generated and flag names may differ from what documentation suggests.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Step 2: Verify auth token
|
|
32
|
+
|
|
33
|
+
Before any API calls, confirm the user has a working auth token:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
wxcli whoami
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
If this fails, stop and resolve authentication first (`wxcli configure`).
|
|
40
|
+
|
|
41
|
+
Check the `type` field in the response to determine the token type:
|
|
42
|
+
|
|
43
|
+
| `type` value | Token type | Notes |
|
|
44
|
+
|-------------|-----------|-------|
|
|
45
|
+
| `bot` | Bot token | Limited — cannot create teams, cannot add self to spaces |
|
|
46
|
+
| `person` | User token | Full messaging access; space-scoped operations |
|
|
47
|
+
| `person` (with `spark-admin:` scopes) | Admin token | Required for ECM, HDS, and org-wide operations. API returns `type: person`, not `admin` — detect admin by checking if `spark-admin:` scoped operations succeed. |
|
|
48
|
+
|
|
49
|
+
**Required scopes by operation:**
|
|
50
|
+
|
|
51
|
+
| Operation | Required Scopes |
|
|
52
|
+
|-----------|----------------|
|
|
53
|
+
| Spaces read | `spark:rooms_read` |
|
|
54
|
+
| Spaces write | `spark:rooms_write` |
|
|
55
|
+
| Messages read | `spark:messages_read` |
|
|
56
|
+
| Messages write | `spark:messages_write` |
|
|
57
|
+
| Memberships read | `spark:memberships_read` |
|
|
58
|
+
| Memberships write | `spark:memberships_write` |
|
|
59
|
+
| Teams read | `spark:teams_read` |
|
|
60
|
+
| Teams write | `spark:teams_write` |
|
|
61
|
+
| Team memberships | `spark:team_memberships_read`, `spark:team_memberships_write` |
|
|
62
|
+
| ECM folder linking | `spark-admin:room_linkedFolders_read`, `spark-admin:room_linkedFolders_write` |
|
|
63
|
+
| HDS monitoring | `spark-admin:hds_read` |
|
|
64
|
+
|
|
65
|
+
**Warn the user** if they are using a bot token and attempting ECM, HDS, or team management operations. Bot tokens will return 403 for those endpoints.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Step 3: Identify the operation type
|
|
70
|
+
|
|
71
|
+
Ask the user what they want to accomplish. Present this decision matrix if they are unsure:
|
|
72
|
+
|
|
73
|
+
| User Wants To | Operation Type | Token Required |
|
|
74
|
+
|--------------|---------------|---------------|
|
|
75
|
+
| Create/manage spaces | Space lifecycle | User or admin token |
|
|
76
|
+
| Send/manage messages | Message management | User or bot token (bot must be member) |
|
|
77
|
+
| Add/remove space members | Membership management | User token (moderator) or admin token |
|
|
78
|
+
| Create/manage teams and team spaces | Team management | User or admin token (NOT bot) |
|
|
79
|
+
| Link SharePoint/OneDrive folder to space | ECM setup | Admin token only |
|
|
80
|
+
| Monitor HDS cluster health and key availability | HDS monitoring | Admin token only |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Step 4: Check prerequisites per operation
|
|
85
|
+
|
|
86
|
+
### 4a. Space lifecycle
|
|
87
|
+
|
|
88
|
+
Check whether the target space already exists before creating:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# List all spaces the token has access to
|
|
92
|
+
wxcli rooms list --output json
|
|
93
|
+
|
|
94
|
+
# Filter by type
|
|
95
|
+
wxcli rooms list --type group --output json
|
|
96
|
+
|
|
97
|
+
# Filter by team
|
|
98
|
+
wxcli rooms list --team-id TEAM_ID --output json
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
If creating a new space, no prerequisites are required beyond a valid token.
|
|
102
|
+
|
|
103
|
+
If targeting an existing space, capture the `id` field from the list output.
|
|
104
|
+
|
|
105
|
+
### 4b. Message management
|
|
106
|
+
|
|
107
|
+
The space must exist and the authenticated user or bot must be a member:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Verify the space exists and get its ID
|
|
111
|
+
wxcli rooms show ROOM_ID --output json
|
|
112
|
+
|
|
113
|
+
# Verify the token's identity is a member
|
|
114
|
+
wxcli memberships list --room-id ROOM_ID --output json
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Bot tokens:** Bots can only read messages where they are @mentioned, except in 1:1 direct spaces. Bots cannot add themselves to spaces — they must be added by a user.
|
|
118
|
+
|
|
119
|
+
### 4c. Membership management
|
|
120
|
+
|
|
121
|
+
Confirm the target space exists and the person is identifiable:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Verify space exists
|
|
125
|
+
wxcli rooms show ROOM_ID --output json
|
|
126
|
+
|
|
127
|
+
# List current members (to check if person is already a member or find membership IDs)
|
|
128
|
+
wxcli memberships list --room-id ROOM_ID --output json
|
|
129
|
+
|
|
130
|
+
# Find all spaces a specific person belongs to
|
|
131
|
+
wxcli memberships list --person-email user@example.com --output json
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
| Prerequisite | Check |
|
|
135
|
+
|-------------|-------|
|
|
136
|
+
| Space exists | `wxcli rooms show ROOM_ID` |
|
|
137
|
+
| Person email or ID is known | Have it ready before `memberships create` |
|
|
138
|
+
| Caller is moderator (for locked spaces) | Confirm `isModerator: true` in own membership |
|
|
139
|
+
| At least one moderator will remain after removal | Check current moderators before `memberships delete` |
|
|
140
|
+
|
|
141
|
+
### 4d. Team management
|
|
142
|
+
|
|
143
|
+
Teams require a user or admin token (bot tokens cannot create or manage teams).
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# List existing teams
|
|
147
|
+
wxcli teams list --output json
|
|
148
|
+
|
|
149
|
+
# Show a team
|
|
150
|
+
wxcli teams show TEAM_ID --output json
|
|
151
|
+
|
|
152
|
+
# List team members
|
|
153
|
+
wxcli team-memberships list --team-id TEAM_ID --output json
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**Warning:** Deleting a team deletes ALL team spaces and their content. This is irreversible.
|
|
157
|
+
|
|
158
|
+
### 4e. ECM folder linking
|
|
159
|
+
|
|
160
|
+
ECM requires an admin token and Microsoft Graph API identifiers obtained before calling wxcli:
|
|
161
|
+
|
|
162
|
+
| Prerequisite | How to obtain |
|
|
163
|
+
|-------------|--------------|
|
|
164
|
+
| Admin token with `spark-admin:` scopes | `wxcli configure`, verify admin access by testing a `spark-admin:` scoped operation |
|
|
165
|
+
| Target space ID (`roomId`) | `wxcli rooms show ROOM_ID` or `wxcli rooms list` |
|
|
166
|
+
| SharePoint/OneDrive `driveId` | Microsoft Graph API: `GET /sites/{site-id}/drive` |
|
|
167
|
+
| SharePoint/OneDrive `itemId` | Microsoft Graph API: `GET /drives/{drive-id}/root:/path/to/folder` |
|
|
168
|
+
| Content URL (`contentUrl`) | The full URL to the SharePoint/OneDrive folder |
|
|
169
|
+
| Display name | Human-readable name for the folder link |
|
|
170
|
+
|
|
171
|
+
### 4f. HDS monitoring
|
|
172
|
+
|
|
173
|
+
HDS requires an admin token. Obtain org and cluster IDs first:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# Get the org ID
|
|
177
|
+
wxcli organizations list --output json
|
|
178
|
+
|
|
179
|
+
# Check HDS org enrollment status
|
|
180
|
+
wxcli hds show ORG_ID --output json
|
|
181
|
+
|
|
182
|
+
# List available clusters (if org has HDS enrolled)
|
|
183
|
+
wxcli hds list ORG_ID --output json
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Step 5: Build and present deployment plan — [SHOW BEFORE EXECUTING]
|
|
189
|
+
|
|
190
|
+
Before executing any commands, present the full plan to the user:
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
DEPLOYMENT PLAN
|
|
194
|
+
===============
|
|
195
|
+
Operation: [type — e.g., "Create project team with 3 spaces and 5 members"]
|
|
196
|
+
Target: [space name / team name / org-wide]
|
|
197
|
+
|
|
198
|
+
Resources to create/modify:
|
|
199
|
+
- [Team: "Acme Project"] (if applicable)
|
|
200
|
+
- [Space: "Engineering"] (if applicable)
|
|
201
|
+
- [Space: "Announcements" — announcement-only] (if applicable)
|
|
202
|
+
- [Members to add: lead@example.com (moderator), dev1@example.com, dev2@example.com]
|
|
203
|
+
|
|
204
|
+
Prerequisites verified:
|
|
205
|
+
[checkmark] Auth token verified — type: [user/admin/bot]
|
|
206
|
+
[checkmark] Required scopes present
|
|
207
|
+
[checkmark] Target space/team identified or does not yet exist (new)
|
|
208
|
+
[checkmark] Person emails/IDs confirmed
|
|
209
|
+
[checkmark] ECM drive/item IDs obtained (if ECM operation)
|
|
210
|
+
|
|
211
|
+
Commands to execute:
|
|
212
|
+
1. wxcli teams create --name "Acme Project" --description "..."
|
|
213
|
+
2. wxcli rooms create --title "Engineering" --team-id TEAM_ID
|
|
214
|
+
3. wxcli rooms create --title "Announcements" --team-id TEAM_ID --is-announcement-only
|
|
215
|
+
4. wxcli team-memberships create --team-id TEAM_ID --person-email lead@example.com --is-moderator
|
|
216
|
+
5. wxcli team-memberships create --team-id TEAM_ID --person-email dev1@example.com
|
|
217
|
+
6. wxcli team-memberships create --team-id TEAM_ID --person-email dev2@example.com
|
|
218
|
+
|
|
219
|
+
Proceed? (yes/no)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Wait for user confirmation before executing.**
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Step 6: Execute via wxcli
|
|
227
|
+
|
|
228
|
+
Run the commands in plan order. Capture IDs from each creation response to use in subsequent commands.
|
|
229
|
+
|
|
230
|
+
Refer to the **CLI Command Reference** section at the bottom of this skill for the full command catalog per resource type.
|
|
231
|
+
|
|
232
|
+
Handle errors explicitly:
|
|
233
|
+
|
|
234
|
+
- **401/403**: Token expired or insufficient scopes — run `wxcli configure` to re-authenticate
|
|
235
|
+
- **404**: Resource not found — confirm the ID is correct and the token has access
|
|
236
|
+
- **409**: Conflict (e.g., space already exists with that name) — verify with `list`, then proceed or skip
|
|
237
|
+
- **400**: Validation error — read the error message and fix the parameter (e.g., missing required field)
|
|
238
|
+
- **429**: Rate limiting — add `sleep 1` between commands; use sequential execution for bulk operations
|
|
239
|
+
|
|
240
|
+
## Step 7: Verify
|
|
241
|
+
|
|
242
|
+
Read back each created resource to confirm:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
# Verify a space
|
|
246
|
+
wxcli rooms show ROOM_ID --output json
|
|
247
|
+
|
|
248
|
+
# Verify memberships in a space
|
|
249
|
+
wxcli memberships list --room-id ROOM_ID --output json
|
|
250
|
+
|
|
251
|
+
# Verify a team
|
|
252
|
+
wxcli teams show TEAM_ID --output json
|
|
253
|
+
|
|
254
|
+
# Verify team members
|
|
255
|
+
wxcli team-memberships list --team-id TEAM_ID --output json
|
|
256
|
+
|
|
257
|
+
# Verify ECM folder link
|
|
258
|
+
wxcli ecm show FOLDER_ID --output json
|
|
259
|
+
|
|
260
|
+
# Verify HDS status
|
|
261
|
+
wxcli hds show ORG_ID --output json
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Step 8: Report results
|
|
267
|
+
|
|
268
|
+
Present the operation results:
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
OPERATION COMPLETE
|
|
272
|
+
==================
|
|
273
|
+
Operation: [type]
|
|
274
|
+
Status: Success
|
|
275
|
+
|
|
276
|
+
Resources Created/Modified:
|
|
277
|
+
[Team: "Acme Project"]
|
|
278
|
+
ID: [team_id]
|
|
279
|
+
Created: [timestamp]
|
|
280
|
+
|
|
281
|
+
[Space: "Engineering"]
|
|
282
|
+
ID: [room_id]
|
|
283
|
+
Team: Acme Project
|
|
284
|
+
Type: group
|
|
285
|
+
|
|
286
|
+
[Space: "Announcements"]
|
|
287
|
+
ID: [room_id]
|
|
288
|
+
Team: Acme Project
|
|
289
|
+
Type: group (announcement-only)
|
|
290
|
+
|
|
291
|
+
Members added: 3
|
|
292
|
+
lead@example.com — team moderator
|
|
293
|
+
dev1@example.com
|
|
294
|
+
dev2@example.com
|
|
295
|
+
|
|
296
|
+
Next steps:
|
|
297
|
+
- [e.g., "Add remaining team members"]
|
|
298
|
+
- [e.g., "Upload project files and link ECM folder"]
|
|
299
|
+
- [e.g., "Configure webhooks for message events — see webhooks-events.md"]
|
|
300
|
+
- [e.g., "Set up bot integrations — see messaging-bots.md"]
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## Critical Rules
|
|
306
|
+
|
|
307
|
+
1. **Always verify token type before executing.** Bot tokens cannot create teams, manage team memberships, or access ECM/HDS. Check `type` in `wxcli whoami` output.
|
|
308
|
+
2. **Always show the deployment plan** (Step 5) and wait for user confirmation before executing any create, update, or delete commands.
|
|
309
|
+
3. **Membership operations require valid person IDs or emails.** Use `wxcli memberships list` or `wxcli team-memberships list` to find existing membership IDs — they are different from person IDs.
|
|
310
|
+
4. **Deleting a space or team is permanent.** There is no recycle bin. Confirm with the user explicitly before running any `delete` command. Deleting a team removes ALL team spaces and content.
|
|
311
|
+
5. **Bot tokens cannot create teams or manage team memberships.** Only user tokens and admin tokens can do this. Bot tokens also cannot add themselves to spaces.
|
|
312
|
+
6. **ECM and HDS require admin tokens with `spark-admin:` scopes.** User tokens return 403. Verify token type before attempting ECM or HDS commands.
|
|
313
|
+
7. **`rooms list` only returns spaces the authenticated user or bot is a member of.** It does not list all org spaces. Use an admin token or the compliance API for org-wide space auditing.
|
|
314
|
+
8. **Direct (1:1) spaces cannot be deleted or renamed via API.** The delete endpoint returns an error for direct spaces. The `title` field may be empty for direct spaces.
|
|
315
|
+
9. **When adding members in bulk, execute sequentially with `sleep 1` between operations.** The messaging API enforces rate limits (~5 requests/second for bot tokens). Parallel bulk adds risk 429 errors.
|
|
316
|
+
10. **Always check if a space or team already exists before creating (idempotency).** Run `wxcli rooms list` or `wxcli teams list` first. Creating a duplicate may succeed but creates clutter, or may fail with a 409 conflict.
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Context Compaction Recovery
|
|
321
|
+
|
|
322
|
+
If context compacts mid-execution, recover by:
|
|
323
|
+
|
|
324
|
+
1. Read the deployment plan from `docs/plans/` to recover what was planned
|
|
325
|
+
2. Check what has already been created:
|
|
326
|
+
```bash
|
|
327
|
+
wxcli rooms list --output json
|
|
328
|
+
wxcli teams list --output json
|
|
329
|
+
wxcli memberships list --room-id ROOM_ID --output json
|
|
330
|
+
```
|
|
331
|
+
3. Resume from the first incomplete step in the plan
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## CLI Command Reference
|
|
336
|
+
|
|
337
|
+
### Spaces (`rooms`)
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
# List spaces (authenticated user's spaces only)
|
|
341
|
+
wxcli rooms list --output json
|
|
342
|
+
wxcli rooms list --type group --sort-by lastactivity --output json
|
|
343
|
+
wxcli rooms list --org-public-spaces --output json
|
|
344
|
+
|
|
345
|
+
# Create a space
|
|
346
|
+
wxcli rooms create --title "Project Alpha"
|
|
347
|
+
wxcli rooms create --title "Announcements" --team-id TEAM_ID --is-announcement-only
|
|
348
|
+
wxcli rooms create --title "Private Discussion" --is-locked
|
|
349
|
+
|
|
350
|
+
# Show space details
|
|
351
|
+
wxcli rooms show ROOM_ID --output json
|
|
352
|
+
|
|
353
|
+
# Update a space
|
|
354
|
+
wxcli rooms update ROOM_ID --title "New Name"
|
|
355
|
+
wxcli rooms update ROOM_ID --is-locked
|
|
356
|
+
wxcli rooms update ROOM_ID --is-announcement-only
|
|
357
|
+
|
|
358
|
+
# Get space meeting/SIP info
|
|
359
|
+
wxcli rooms show-meeting-info ROOM_ID --output json
|
|
360
|
+
|
|
361
|
+
# Delete a space (permanent — use with caution)
|
|
362
|
+
wxcli rooms delete ROOM_ID --force
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Messages (`messages`)
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
# List messages in a space
|
|
369
|
+
wxcli messages list --room-id ROOM_ID --output json
|
|
370
|
+
wxcli messages list --room-id ROOM_ID --limit 50 --output json
|
|
371
|
+
|
|
372
|
+
# Send a message
|
|
373
|
+
wxcli messages create --room-id ROOM_ID --text "Hello team"
|
|
374
|
+
wxcli messages create --room-id ROOM_ID --markdown "**Alert:** Deploy complete"
|
|
375
|
+
wxcli messages create --to-person-email user@example.com --text "Hi there"
|
|
376
|
+
|
|
377
|
+
# Reply to a thread
|
|
378
|
+
wxcli messages create --room-id ROOM_ID --parent-id MESSAGE_ID --text "Acknowledged"
|
|
379
|
+
|
|
380
|
+
# List 1:1 direct messages
|
|
381
|
+
wxcli messages list-direct --person-email user@example.com --output json
|
|
382
|
+
|
|
383
|
+
# Show a message
|
|
384
|
+
wxcli messages show MESSAGE_ID --output json
|
|
385
|
+
|
|
386
|
+
# Edit a message (own messages only)
|
|
387
|
+
wxcli messages update MESSAGE_ID --text "Updated text"
|
|
388
|
+
|
|
389
|
+
# Delete a message
|
|
390
|
+
wxcli messages delete MESSAGE_ID --force
|
|
391
|
+
|
|
392
|
+
# Send adaptive card or file attachment (requires --json-body)
|
|
393
|
+
wxcli messages create --json-body '{"roomId": "ROOM_ID", "text": "fallback", "attachments": [...]}'
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Memberships (`memberships`)
|
|
397
|
+
|
|
398
|
+
```bash
|
|
399
|
+
# List all members of a space
|
|
400
|
+
wxcli memberships list --room-id ROOM_ID --output json
|
|
401
|
+
|
|
402
|
+
# Find all spaces a person belongs to
|
|
403
|
+
wxcli memberships list --person-email user@example.com --output json
|
|
404
|
+
|
|
405
|
+
# Add a member to a space
|
|
406
|
+
wxcli memberships create --room-id ROOM_ID --person-email user@example.com
|
|
407
|
+
wxcli memberships create --room-id ROOM_ID --person-email user@example.com --is-moderator
|
|
408
|
+
|
|
409
|
+
# Show membership details (need membership ID, not person ID)
|
|
410
|
+
wxcli memberships show MEMBERSHIP_ID --output json
|
|
411
|
+
|
|
412
|
+
# Promote/demote moderator
|
|
413
|
+
wxcli memberships update MEMBERSHIP_ID --is-moderator
|
|
414
|
+
wxcli memberships update MEMBERSHIP_ID --no-is-moderator
|
|
415
|
+
|
|
416
|
+
# Remove a member from a space
|
|
417
|
+
wxcli memberships delete MEMBERSHIP_ID --force
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**Finding a membership ID for a specific person:**
|
|
421
|
+
|
|
422
|
+
```bash
|
|
423
|
+
wxcli memberships list --room-id ROOM_ID --output json | python3 -c "
|
|
424
|
+
import sys, json
|
|
425
|
+
members = json.load(sys.stdin)
|
|
426
|
+
for m in members:
|
|
427
|
+
if m.get('personEmail') == 'user@example.com':
|
|
428
|
+
print(m['id'])
|
|
429
|
+
"
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### Teams (`teams`)
|
|
433
|
+
|
|
434
|
+
```bash
|
|
435
|
+
# List teams
|
|
436
|
+
wxcli teams list --output json
|
|
437
|
+
|
|
438
|
+
# Create a team (auto-creates a General space)
|
|
439
|
+
wxcli teams create --name "Engineering" --description "Engineering team spaces"
|
|
440
|
+
|
|
441
|
+
# Show team details
|
|
442
|
+
wxcli teams show TEAM_ID --output json
|
|
443
|
+
|
|
444
|
+
# Rename a team
|
|
445
|
+
wxcli teams update TEAM_ID --name "New Name"
|
|
446
|
+
|
|
447
|
+
# Delete a team (DESTRUCTIVE — deletes ALL team spaces and content)
|
|
448
|
+
wxcli teams delete TEAM_ID --force
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Team memberships (`team-memberships`)
|
|
452
|
+
|
|
453
|
+
```bash
|
|
454
|
+
# List team members
|
|
455
|
+
wxcli team-memberships list --team-id TEAM_ID --output json
|
|
456
|
+
|
|
457
|
+
# Add a member to a team (auto-adds to all team spaces)
|
|
458
|
+
wxcli team-memberships create --team-id TEAM_ID --person-email user@example.com
|
|
459
|
+
wxcli team-memberships create --team-id TEAM_ID --person-email lead@example.com --is-moderator
|
|
460
|
+
|
|
461
|
+
# Show team membership details
|
|
462
|
+
wxcli team-memberships show MEMBERSHIP_ID --output json
|
|
463
|
+
|
|
464
|
+
# Change moderator role
|
|
465
|
+
wxcli team-memberships update MEMBERSHIP_ID --is-moderator
|
|
466
|
+
wxcli team-memberships update MEMBERSHIP_ID --no-is-moderator
|
|
467
|
+
|
|
468
|
+
# Remove from team
|
|
469
|
+
wxcli team-memberships delete MEMBERSHIP_ID --force
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### ECM (`ecm`)
|
|
473
|
+
|
|
474
|
+
```bash
|
|
475
|
+
# List linked folders for a space
|
|
476
|
+
wxcli ecm list --room-id ROOM_ID --output json
|
|
477
|
+
|
|
478
|
+
# Link a SharePoint/OneDrive folder to a space
|
|
479
|
+
wxcli ecm create \
|
|
480
|
+
--room-id ROOM_ID \
|
|
481
|
+
--content-url "https://contoso.sharepoint.com/sites/Engineering/Shared Documents/Project" \
|
|
482
|
+
--display-name "Project Files" \
|
|
483
|
+
--drive-id DRIVE_ID \
|
|
484
|
+
--item-id ITEM_ID \
|
|
485
|
+
--default-folder true
|
|
486
|
+
|
|
487
|
+
# Show linked folder details
|
|
488
|
+
wxcli ecm show FOLDER_ID --output json
|
|
489
|
+
|
|
490
|
+
# Update folder link
|
|
491
|
+
wxcli ecm update FOLDER_ID --display-name "Updated Name"
|
|
492
|
+
|
|
493
|
+
# Unlink folder (does NOT delete files in SharePoint/OneDrive)
|
|
494
|
+
wxcli ecm delete FOLDER_ID --force
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
### HDS (`hds`) — read-only
|
|
498
|
+
|
|
499
|
+
```bash
|
|
500
|
+
# Get HDS org enrollment status
|
|
501
|
+
wxcli hds show ORG_ID --output json
|
|
502
|
+
|
|
503
|
+
# Get cluster details
|
|
504
|
+
wxcli hds show-clusters CLUSTER_ID --output json
|
|
505
|
+
|
|
506
|
+
# Get node details
|
|
507
|
+
wxcli hds show-nodes NODE_ID --output json
|
|
508
|
+
|
|
509
|
+
# Get HDS database configuration
|
|
510
|
+
wxcli hds list ORG_ID --output json
|
|
511
|
+
|
|
512
|
+
# Get multi-tenant HDS details
|
|
513
|
+
wxcli hds list-tenants ORG_ID --output json
|
|
514
|
+
|
|
515
|
+
# Get node network test results
|
|
516
|
+
wxcli hds list-network-test NODE_ID --trigger-type All --output json
|
|
517
|
+
|
|
518
|
+
# Get cluster availability metrics
|
|
519
|
+
wxcli hds list-availability CLUSTER_ID --from 2026-01-01T00:00:00Z --to 2026-03-19T00:00:00Z --output json
|
|
520
|
+
```
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: org-health
|
|
3
|
+
description: |
|
|
4
|
+
Run an org health assessment on a live Webex Calling org. Collects state via
|
|
5
|
+
wxcli commands, runs 18 deterministic Python checks across 4 categories, and
|
|
6
|
+
generates an Authority Minimal HTML report. Three phases: collect → analyze → report.
|
|
7
|
+
Use when the user wants to audit their org, run a health check, or see what needs attention.
|
|
8
|
+
NOT for: security/compliance audit logs (use audit-compliance skill), CDR/call analytics
|
|
9
|
+
(use reporting skill), or license auditing (use manage-licensing skill).
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Org Health Assessment
|
|
13
|
+
|
|
14
|
+
## Prerequisites
|
|
15
|
+
|
|
16
|
+
1. Authenticated session: `wxcli whoami` succeeds
|
|
17
|
+
2. Confirm target org with user — show org name from `wxcli whoami` output
|
|
18
|
+
|
|
19
|
+
## Phase 1 — Collect
|
|
20
|
+
|
|
21
|
+
Create the output directory and run each wxcli command. Save results as JSON.
|
|
22
|
+
|
|
23
|
+
**Mandatory --help verification:** The collection commands below are a fixed list, but if you adapt one or a command errors on an unexpected flag, run `wxcli <group> --help` to verify the subcommand and flags (e.g. `wxcli call-routing --help`, `wxcli call-queue --help`). Do NOT rely on examples in this skill or reference docs — the CLI is auto-generated and flag names may differ from what documentation suggests.
|
|
24
|
+
|
|
25
|
+
### Setup
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
|
29
|
+
OUTPUT_DIR="org-health-output/${TIMESTAMP}/collected"
|
|
30
|
+
mkdir -p "${OUTPUT_DIR}/call_queue_details" "${OUTPUT_DIR}/outgoing_permissions"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Collection Commands
|
|
34
|
+
|
|
35
|
+
Run each command and save the output. If a command fails (e.g., no resources of that type),
|
|
36
|
+
save an empty JSON array `[]`.
|
|
37
|
+
|
|
38
|
+
| # | Command | Output File |
|
|
39
|
+
|---|---------|-------------|
|
|
40
|
+
| 1 | `wxcli auto-attendant list -o json` | `${OUTPUT_DIR}/auto_attendants.json` |
|
|
41
|
+
| 2 | `wxcli call-queue list -o json` | `${OUTPUT_DIR}/call_queues.json` |
|
|
42
|
+
| 3 | `wxcli hunt-group list -o json` | `${OUTPUT_DIR}/hunt_groups.json` |
|
|
43
|
+
| 4 | `wxcli location-voicemail list -o json` | `${OUTPUT_DIR}/voicemail_groups.json` |
|
|
44
|
+
| 5 | `wxcli paging-group list -o json` | `${OUTPUT_DIR}/paging_groups.json` |
|
|
45
|
+
| 6 | `wxcli call-park list -o json` | `${OUTPUT_DIR}/call_parks.json` |
|
|
46
|
+
| 7 | `wxcli devices list -o json` | `${OUTPUT_DIR}/devices.json` |
|
|
47
|
+
| 8 | `wxcli workspaces list -o json` | `${OUTPUT_DIR}/workspaces.json` |
|
|
48
|
+
| 9 | `wxcli people list -o json` | `${OUTPUT_DIR}/users.json` |
|
|
49
|
+
| 10 | `wxcli call-routing list-dial-plans -o json` | `${OUTPUT_DIR}/dial_plans.json` |
|
|
50
|
+
| 11 | `wxcli call-routing list-route-groups -o json` | `${OUTPUT_DIR}/route_groups.json` |
|
|
51
|
+
| 12 | `wxcli call-routing list-route-lists -o json` | `${OUTPUT_DIR}/route_lists.json` |
|
|
52
|
+
| 13 | `wxcli call-routing list-trunks -o json` | `${OUTPUT_DIR}/trunks.json` |
|
|
53
|
+
| 14 | `wxcli numbers list -o json` | `${OUTPUT_DIR}/numbers.json` |
|
|
54
|
+
|
|
55
|
+
### Detail Collection
|
|
56
|
+
|
|
57
|
+
**Call queue details** — iterate queue IDs from step 2:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# For each queue ID from call_queues.json:
|
|
61
|
+
wxcli call-queue show <QUEUE_ID> -o json > "${OUTPUT_DIR}/call_queue_details/<QUEUE_ID>.json"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Outgoing permissions sample** — select up to 50 user IDs from step 9:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# For each of the first 50 user IDs from users.json:
|
|
68
|
+
wxcli user-settings list-outgoing-permission <USER_ID> -o json > "${OUTPUT_DIR}/outgoing_permissions/<USER_ID>.json"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Manifest
|
|
72
|
+
|
|
73
|
+
After all collection is complete, write `manifest.json`:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"collected_at": "<ISO timestamp>",
|
|
78
|
+
"org_id": "<from wxcli whoami>",
|
|
79
|
+
"org_name": "<from wxcli whoami>",
|
|
80
|
+
"total_users": <count from users.json>,
|
|
81
|
+
"total_devices": <count from devices.json>,
|
|
82
|
+
"sampled_users_for_permissions": <actual number sampled, max 50>,
|
|
83
|
+
"commands_run": ["auto-attendant list", "call-queue list", "..."],
|
|
84
|
+
"wxcli_version": "<from wxcli --version>"
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Progress Report
|
|
89
|
+
|
|
90
|
+
After collection, tell the user:
|
|
91
|
+
- "Collected X users, Y devices, Z features across N locations"
|
|
92
|
+
- "Sampled M users for outgoing permission analysis"
|
|
93
|
+
|
|
94
|
+
## Phase 2 — Analyze
|
|
95
|
+
|
|
96
|
+
Run the analyzer:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
wxcli org-health analyze \
|
|
100
|
+
"org-health-output/${TIMESTAMP}/collected" \
|
|
101
|
+
--output "org-health-output/${TIMESTAMP}/results"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- If exit code 0: read `results/results.json` and present a summary:
|
|
105
|
+
- Total findings by severity (HIGH/MEDIUM/LOW/INFO)
|
|
106
|
+
- Category breakdown (which categories have findings)
|
|
107
|
+
- If exit code 1: report the error to the user and stop
|
|
108
|
+
|
|
109
|
+
## Phase 3 — Report
|
|
110
|
+
|
|
111
|
+
Ask the user for:
|
|
112
|
+
- **Brand name** (default: org name from manifest)
|
|
113
|
+
- **Prepared by** (default: ask the user)
|
|
114
|
+
|
|
115
|
+
Generate the report:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
wxcli org-health report \
|
|
119
|
+
"org-health-output/${TIMESTAMP}/results" \
|
|
120
|
+
--brand "<brand>" \
|
|
121
|
+
--prepared-by "<name>"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Present Results
|
|
125
|
+
|
|
126
|
+
Tell the user:
|
|
127
|
+
1. Report file path: `org-health-output/${TIMESTAMP}/report/org-health-report.html`
|
|
128
|
+
2. Top 3 highest-severity findings (title + recommendation)
|
|
129
|
+
3. Total finding counts: X HIGH, Y MEDIUM, Z LOW
|
|
130
|
+
4. Any categories with zero issues (positive reinforcement)
|
|
131
|
+
|
|
132
|
+
## Check Categories
|
|
133
|
+
|
|
134
|
+
For reference, the 18 checks organized by category:
|
|
135
|
+
|
|
136
|
+
**Security Posture** (checked first — infrastructure risk):
|
|
137
|
+
- Auto attendants allowing external transfers (toll fraud vector)
|
|
138
|
+
- Call queues without recording (compliance gap)
|
|
139
|
+
- Unrestricted international/premium dialing (toll fraud risk)
|
|
140
|
+
- No outgoing permission rules configured (policy gap)
|
|
141
|
+
|
|
142
|
+
**Routing Hygiene** (infrastructure reliability):
|
|
143
|
+
- Dial plans with no route choices (calls will fail)
|
|
144
|
+
- Route groups/lists with no trunks/groups (orphaned components)
|
|
145
|
+
- Trunks in error/unregistered state (PSTN outage)
|
|
146
|
+
|
|
147
|
+
**Feature Utilization** (operational efficiency):
|
|
148
|
+
- Disabled auto attendants
|
|
149
|
+
- Call queues with 0 or 1 agents
|
|
150
|
+
- Single-member hunt groups
|
|
151
|
+
- Empty voicemail/paging groups
|
|
152
|
+
- Call parks with no extensions
|
|
153
|
+
|
|
154
|
+
**Device Health** (endpoint reliability):
|
|
155
|
+
- Offline devices
|
|
156
|
+
- Users at 5-device limit
|
|
157
|
+
- Unassigned devices
|
|
158
|
+
- Calling-enabled workspaces with no device
|
|
159
|
+
- Stale activation codes
|