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,505 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: wxcli
|
|
3
|
+
Version: 1.2.0
|
|
4
|
+
Summary: Webex Calling CLI — terminal-based provisioning for Webex APIs
|
|
5
|
+
Author: Adam Hobgood
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/achobgood/wxops
|
|
8
|
+
Project-URL: Repository, https://github.com/achobgood/wxops
|
|
9
|
+
Project-URL: Issues, https://github.com/achobgood/wxops/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/achobgood/wxops/releases
|
|
11
|
+
Keywords: webex,cisco,calling,cli,provisioning
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: System Administrators
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Operating System :: OS Independent
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: typer>=0.9.0
|
|
24
|
+
Requires-Dist: click>=8.1
|
|
25
|
+
Requires-Dist: rich>=13.0
|
|
26
|
+
Requires-Dist: httpx>=0.27.0
|
|
27
|
+
Requires-Dist: pyyaml>=6.0
|
|
28
|
+
Requires-Dist: packaging>=23.0
|
|
29
|
+
Requires-Dist: pydantic>=2.0
|
|
30
|
+
Requires-Dist: aiohttp>=3.9
|
|
31
|
+
Requires-Dist: networkx>=3.0
|
|
32
|
+
Requires-Dist: phonenumbers>=8.13
|
|
33
|
+
Requires-Dist: requests>=2.31
|
|
34
|
+
Requires-Dist: urllib3>=2.0
|
|
35
|
+
Requires-Dist: zeep>=4.2
|
|
36
|
+
Dynamic: license-file
|
|
37
|
+
|
|
38
|
+
# wxcli — Webex Calling CLI
|
|
39
|
+
|
|
40
|
+
A command-line tool and AI-assisted playbook for provisioning, managing, migrating, and auditing Webex Calling environments. 178 command groups covering the full Webex Calling, admin, device, messaging, meetings, and contact center API surface.
|
|
41
|
+
|
|
42
|
+
> **Unofficial community CLI — not affiliated with or endorsed by Cisco.**
|
|
43
|
+
|
|
44
|
+
## What It Does
|
|
45
|
+
|
|
46
|
+
- **178 CLI command groups** — provision locations, users, call features, devices, routing, PSTN, messaging, meetings, and contact center resources from the terminal
|
|
47
|
+
- **AI-guided playbook** — a Claude Code agent that interviews you about what to build, generates a deployment plan, executes commands, and verifies results
|
|
48
|
+
- **CUCM-to-Webex migration** — 11-phase pipeline: discover a CUCM cluster via AXL, normalize, map, analyze, generate decisions, plan, and execute the migration with an async concurrent engine
|
|
49
|
+
- **Org health assessment** — 18 automated checks across security posture, routing hygiene, feature utilization, and device health with a self-contained HTML report
|
|
50
|
+
- **Partner / multi-org support** — manage multiple customer orgs with a single partner token; 1150 commands auto-inject the target `orgId`
|
|
51
|
+
- **Batch cleanup** — dependency-safe teardown of an entire Webex Calling environment (or scoped to specific locations) with `--dry-run` support
|
|
52
|
+
|
|
53
|
+
## How It Works
|
|
54
|
+
|
|
55
|
+
Most "AI + API" tools hand a language model an OpenAPI spec and hope. That breaks at scale: across hundreds of endpoints a model malforms request bodies, hallucinates field names and license tiers, and — worst — doesn't know a hunt group needs a calling-enabled location *first*. Specs describe endpoints; they don't describe outcomes.
|
|
56
|
+
|
|
57
|
+
wxops splits the problem into three layers, each killing one way an LLM fails:
|
|
58
|
+
|
|
59
|
+
| Layer | What it is | Failure it prevents |
|
|
60
|
+
|-------|-----------|---------------------|
|
|
61
|
+
| **Reference docs** (43 active) | De-conflated, authoritative API knowledge — data models, enums, license-tier distinctions, gotchas | **Hallucination** — the agent grounds on docs, never on training data |
|
|
62
|
+
| **Skills** (24) | Encoded procedures for outcomes — prerequisites, ordering, intent disambiguation, known landmines | **Wrong sequence / wrong tool** — the agent follows a checklist, not a guess |
|
|
63
|
+
| **CLI** (178 groups) | Tested, self-describing commands generated from 9 OpenAPI specs | **Malformed execution** — the model emits a command string, not hand-rolled HTTP |
|
|
64
|
+
|
|
65
|
+
The model only does what it's reliably good at — reasoning and orchestration. Facts come from the docs, procedure from the skills, execution from the tested CLI.
|
|
66
|
+
|
|
67
|
+
**One request, traced** — *"Add a sales hunt group for the Denver office":*
|
|
68
|
+
|
|
69
|
+
1. The agent routes to the `configure-features` skill — not contact-center, not customer-assist (the disambiguation map handles the overloaded word "queue").
|
|
70
|
+
2. The skill loads `docs/reference/call-features-major.md` for ground truth, then checks prerequisites in order: location exists → calling-enabled → users exist → numbers available.
|
|
71
|
+
3. Before building the command it runs `wxcli hunt-group create --help` — the CLI is the final source of truth for flags, never the docs or memory.
|
|
72
|
+
4. The CLI executes; a verify step reads the result back to confirm.
|
|
73
|
+
|
|
74
|
+
At every step the agent is forced back to an authoritative source: data model from the doc, flags from `--help`, final state from a read-back. It never operates on memory. That layered grounding *is* the design.
|
|
75
|
+
|
|
76
|
+
### Why a CLI, not an MCP server?
|
|
77
|
+
|
|
78
|
+
The natural question for an agent-driven tool: why not expose the API as MCP tools? Because at this surface area — 178 command groups and several hundred individual operations — one tool per endpoint breaks down:
|
|
79
|
+
|
|
80
|
+
- **MCP tool schemas load eagerly, every turn.** Hundreds of operations means hundreds of JSON tool definitions sitting in the model's context *before it reads your request* — tens of thousands of tokens of overhead on every call. A CLI loads nothing up front; the model pulls a single command's schema on demand with `wxcli <group> <command> --help`. Just-in-time, not all-at-once.
|
|
81
|
+
- **Tool-selection accuracy collapses well before hundreds.** Models reliably pick from a handful of tools, not a sea of near-duplicates — and this surface is full of overloaded names ("queue" means three different things across Calling, Contact Center, and Customer Assist). The skill layer disambiguates intent; a flat tool list just hands the model the ambiguity.
|
|
82
|
+
- **CLI commands compose; MCP tool calls don't.** Pipe to `jq`, filter with `grep`, chain a list of IDs into the next command. Ops work is full of "get these, feed them to that" — the shell makes it trivial.
|
|
83
|
+
- **The CLI runs without an LLM at all.** The same commands work in scripts, in CI, and by hand, backed by thousands of tests. An MCP tool only exists inside an MCP client.
|
|
84
|
+
|
|
85
|
+
This isn't anti-MCP. MCP is the right *thin boundary* for host integration: to let an agent platform drive wxops, you wrap the CLI behind **one** small MCP surface — a single "run a wxcli command" tool — not several hundred. The CLI stays the execution layer; MCP is just the seam. You get the integration without paying the tool-explosion tax.
|
|
86
|
+
|
|
87
|
+
## Install
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
pipx install wxcli # recommended — isolated, always on PATH
|
|
91
|
+
# or:
|
|
92
|
+
pip install wxcli
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Works on macOS, Linux, and Windows. On Windows, first install [Python 3.11+](https://www.python.org/downloads/) (tick **"Add python.exe to PATH"** during setup); then `python -m pip install --user pipx && python -m pipx ensurepath` gives you `pipx`. `pipx`/`pip` pull every dependency automatically.
|
|
96
|
+
|
|
97
|
+
### From source (for development or the Claude Code playbook)
|
|
98
|
+
|
|
99
|
+
The Claude Code playbook (agents, skills, reference docs) lives in the repo, not the wheel. Clone if you want the playbook or plan to develop wxcli:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
git clone https://github.com/achobgood/wxops.git
|
|
103
|
+
cd wxops
|
|
104
|
+
pip install -e .
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
On Windows this also needs [Git](https://git-scm.com/download/win). The version is derived from git tags at install time, so a full clone (not a shallow/zip download) is required.
|
|
108
|
+
|
|
109
|
+
## Authenticate
|
|
110
|
+
|
|
111
|
+
Get a personal access token from [developer.webex.com](https://developer.webex.com) (valid for 12 hours).
|
|
112
|
+
|
|
113
|
+
**Option 1 — persistent (recommended).** Run `wxcli configure` and paste the token at the prompt. Identical in macOS/Linux Terminal, Windows PowerShell, and cmd:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
wxcli configure
|
|
117
|
+
# prompts: "Webex API token:" → paste token, press Enter
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Option 2 — environment variable (per session).** Use the form for your shell:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# macOS / Linux
|
|
124
|
+
export WEBEX_ACCESS_TOKEN="YOUR_TOKEN"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
```powershell
|
|
128
|
+
# Windows PowerShell
|
|
129
|
+
$env:WEBEX_ACCESS_TOKEN="YOUR_TOKEN"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
```bat
|
|
133
|
+
:: Windows cmd
|
|
134
|
+
set WEBEX_ACCESS_TOKEN=YOUR_TOKEN
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Verify auth (any shell):
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
wxcli whoami
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Updating
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
wxcli update # check PyPI and upgrade in place
|
|
147
|
+
wxcli update --check # report the latest version without upgrading
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
`wxcli update` detects how it was installed and upgrades accordingly — `pipx upgrade wxcli` for pipx installs, `pip install --upgrade wxcli` for pip installs — then deep-links the release notes for the new version. No git required.
|
|
151
|
+
|
|
152
|
+
**If you originally cloned the repo** (a source/dev install), `wxcli update` prints guidance instead of upgrading. To move to a managed install, run:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
wxcli update --migrate # installs via pipx, removes the old editable install
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Developers who want to keep hacking on the source stay on `git pull`. Behind a firewall that blocks PyPI? Point `WXCLI_UPDATE_INDEX_URL` at an internal mirror, or install fresh with `pipx install wxcli` and abandon the clone.
|
|
159
|
+
|
|
160
|
+
## Claude Code Playbook
|
|
161
|
+
|
|
162
|
+
This repo includes an AI playbook for [Claude Code](https://claude.com/claude-code) that turns your terminal into a guided Webex Calling configuration assistant.
|
|
163
|
+
|
|
164
|
+
### What is the Playbook?
|
|
165
|
+
|
|
166
|
+
A guided AI assistant that walks you through Webex Calling configuration end-to-end. It interviews you about what you want to build, generates a deployment plan, executes `wxcli` commands on your behalf, and verifies the results. Think of it as a Webex Calling expert sitting next to you in the terminal.
|
|
167
|
+
|
|
168
|
+
### What's Included
|
|
169
|
+
|
|
170
|
+
- **1 builder agent** (`/agents` → wxc-calling-builder) — the main entry point that drives the full workflow
|
|
171
|
+
- **24 domain skills** covering: provisioning & teardown, call features, Customer Assist, routing, devices, device platform, call settings, call control, reporting (calling, meetings, contact center), identity/SCIM, licensing, audit/compliance, messaging spaces, messaging bots, meetings, video mesh, contact center, CUCM migration, org health, live query, and debugging
|
|
172
|
+
- **43 reference docs** in `docs/reference/` (+8 archived historical SDK docs) documenting every Webex Calling API surface with SDK method signatures, raw HTTP examples, and gotchas
|
|
173
|
+
- **Shared permissions** (`.claude/settings.json`) that pre-approve `wxcli` commands so Claude Code doesn't prompt you for every CLI execution
|
|
174
|
+
|
|
175
|
+
### How to Use It
|
|
176
|
+
|
|
177
|
+
1. Install [Claude Code](https://claude.com/claude-code)
|
|
178
|
+
2. Clone this repo and `cd` into it — the clone delivers the **playbook** (agents/skills/docs)
|
|
179
|
+
3. Install the CLI: `pip install -e .` (or use a PyPI-installed `wxcli` — the playbook drives whichever `wxcli` is on your PATH)
|
|
180
|
+
4. Run `claude` to start Claude Code
|
|
181
|
+
5. Use `/agents` and select **wxc-calling-builder** to begin
|
|
182
|
+
6. Or use `/wxc-calling-debug` to troubleshoot a specific issue
|
|
183
|
+
|
|
184
|
+
The repo includes a `.claude/settings.json` that pre-approves common commands (`wxcli`, `pip install`, `which`). This means the playbook agent can run `wxcli` commands without prompting you for permission each time. You can review or customize these permissions in `.claude/settings.json`. Any personal overrides go in `.claude/settings.local.json` (gitignored).
|
|
185
|
+
|
|
186
|
+
### Without Claude Code
|
|
187
|
+
|
|
188
|
+
The AI playbook is optional — everything else works standalone:
|
|
189
|
+
|
|
190
|
+
- **wxcli** is a regular Python CLI tool. Install it and use it directly.
|
|
191
|
+
- The **43 reference docs** in `docs/reference/` are a comprehensive API knowledge base, useful for any developer working with Webex APIs.
|
|
192
|
+
- The **9 OpenAPI specs** (`specs/webex-*.json`) can be imported into Postman or any API client.
|
|
193
|
+
|
|
194
|
+
## CLI Reference
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# See all 178 command groups
|
|
198
|
+
wxcli --help
|
|
199
|
+
|
|
200
|
+
# List calling-enabled locations
|
|
201
|
+
wxcli location-settings list-1
|
|
202
|
+
|
|
203
|
+
# Create a location (address requires --json-body)
|
|
204
|
+
wxcli locations create --name "San Jose Office" \
|
|
205
|
+
--time-zone "America/Los_Angeles" \
|
|
206
|
+
--preferred-language en_us \
|
|
207
|
+
--announcement-language en_us \
|
|
208
|
+
--json-body '{"address": {"address1": "123 Main St", "city": "San Jose", "state": "CA", "postalCode": "95113", "country": "US"}}'
|
|
209
|
+
|
|
210
|
+
# Enable Webex Calling on a location (fetch details first with wxcli locations show LOCATION_ID)
|
|
211
|
+
wxcli location-settings create --id LOCATION_ID --name "..." --time-zone "..." --preferred-language en_US --announcement-language en_us
|
|
212
|
+
|
|
213
|
+
# Create an auto attendant (LOCATION_ID is positional)
|
|
214
|
+
wxcli auto-attendant create LOCATION_ID \
|
|
215
|
+
--name "Main Menu" --extension 1000 --business-schedule "Business Hours"
|
|
216
|
+
|
|
217
|
+
# Create a call queue
|
|
218
|
+
wxcli call-queue create LOCATION_ID \
|
|
219
|
+
--name "Support Queue" --extension 2000
|
|
220
|
+
|
|
221
|
+
# Create a hunt group
|
|
222
|
+
wxcli hunt-group create LOCATION_ID \
|
|
223
|
+
--name "Sales Team" --extension 3000 --enabled
|
|
224
|
+
|
|
225
|
+
# View user call settings
|
|
226
|
+
wxcli user-settings show-call-forwarding PERSON_ID --output json
|
|
227
|
+
|
|
228
|
+
# Get help for any command
|
|
229
|
+
wxcli locations create --help
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Finding IDs
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
wxcli locations list --calling-only # Get location IDs
|
|
236
|
+
wxcli users list --location-id LOC_ID # Get person IDs
|
|
237
|
+
wxcli numbers list --location-id LOC_ID # Get number inventory
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Tips
|
|
241
|
+
|
|
242
|
+
- **`--json-body`** — For complex nested settings (call forwarding rules, voicemail config, agent lists), pass the full JSON body: `wxcli call-queue update LOC_ID QUEUE_ID --json-body '{"agents": [...]}'`
|
|
243
|
+
- **`--debug`** — Add to any command for verbose HTTP request/response output, useful for troubleshooting
|
|
244
|
+
|
|
245
|
+
## Command Groups
|
|
246
|
+
|
|
247
|
+
| Group | Description |
|
|
248
|
+
|-------|-------------|
|
|
249
|
+
| `whoami` | Show current authenticated user and org |
|
|
250
|
+
| `locations` | Create, list, enable calling on locations |
|
|
251
|
+
| `users` | Create, list, manage users |
|
|
252
|
+
| `licenses` | List and inspect licenses |
|
|
253
|
+
| `numbers` | Manage phone numbers |
|
|
254
|
+
| `location-schedules` | Business hours and holiday schedules |
|
|
255
|
+
| `auto-attendant` | IVR menus with key-press routing |
|
|
256
|
+
| `call-queue` | Hold callers until an agent is free |
|
|
257
|
+
| `hunt-group` | Ring a group of agents directly |
|
|
258
|
+
| `call-park` | Park calls on extensions |
|
|
259
|
+
| `call-pickup` | Answer each other's ringing phones |
|
|
260
|
+
| `paging-group` | One-way broadcast announcements |
|
|
261
|
+
| `location-voicemail` | Shared voicemail boxes |
|
|
262
|
+
| `operating-modes` | Business hours operating modes |
|
|
263
|
+
| `call-routing` | Dial plans, trunks, route groups |
|
|
264
|
+
| `call-controls` | Real-time call control (dial, hold, transfer) |
|
|
265
|
+
| `user-settings` | Person-level call settings (forwarding, DND, voicemail, etc.) |
|
|
266
|
+
| `location-settings` | Location-level call settings |
|
|
267
|
+
| `dect-devices` | DECT networks, base stations, handsets |
|
|
268
|
+
| `device-settings` | Device configurations |
|
|
269
|
+
| `workspaces` | Workspace management |
|
|
270
|
+
| `emergency-services` | E911 and emergency services |
|
|
271
|
+
| `announcements` | Announcement repository |
|
|
272
|
+
| `announcement-playlists` | Playlist management |
|
|
273
|
+
| `virtual-extensions` | Virtual extension management |
|
|
274
|
+
| `single-number-reach` | Single number reach settings |
|
|
275
|
+
| `call-recording` | Call recording settings |
|
|
276
|
+
| `pstn` | PSTN connection management |
|
|
277
|
+
| `cx-essentials` | Customer Assist (screen pop, wrap-up, supervisors) |
|
|
278
|
+
| `cleanup` | Batch-delete resources in dependency-safe order |
|
|
279
|
+
|
|
280
|
+
This table shows the most commonly used groups. Run `wxcli --help` to see all 178 groups, which also cover admin, device, messaging, meetings, and contact center APIs.
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## CUCM-to-Webex Migration Tool
|
|
285
|
+
|
|
286
|
+
A full migration pipeline at `src/wxcli/migration/` that analyzes a CUCM environment, maps objects to Webex Calling equivalents, and executes the migration. 2535 tests passing.
|
|
287
|
+
|
|
288
|
+
### Pipeline
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
wxcli cucm init -p myproject # Create project
|
|
292
|
+
wxcli cucm discover --host 10.0.0.1 \ # Extract from CUCM via AXL
|
|
293
|
+
--username admin --password secret -p myproject
|
|
294
|
+
wxcli cucm normalize -p myproject # Normalize to canonical models
|
|
295
|
+
wxcli cucm map -p myproject # Map CUCM objects to Webex operations
|
|
296
|
+
wxcli cucm analyze -p myproject # Run 14 analyzers, generate decisions
|
|
297
|
+
wxcli cucm report --brand "Acme Corp" \ # Generate HTML assessment report
|
|
298
|
+
--prepared-by "Jane Admin" -p myproject
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
The assessment report provides a complexity score, environment inventory, analog gateway review, and effort estimates — suitable for customer-facing delivery.
|
|
302
|
+
|
|
303
|
+
### Additional Pipeline Outputs
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
wxcli cucm user-diff -p myproject # Per-user before/after comparison
|
|
307
|
+
wxcli cucm user-notice --brand "Acme" \ # Email-ready migration notice
|
|
308
|
+
--migration-date "2026-06-01" \
|
|
309
|
+
--helpdesk "help@acme.com" -p myproject
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Execution
|
|
313
|
+
|
|
314
|
+
After analysis and decision review:
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
wxcli cucm plan -p myproject # Build dependency-ordered execution plan
|
|
318
|
+
wxcli cucm preflight -p myproject # Run 8 preflight checks
|
|
319
|
+
wxcli cucm export -p myproject # Export deployment plan
|
|
320
|
+
wxcli cucm execute -p myproject \ # Execute all operations concurrently
|
|
321
|
+
--concurrency 15
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
The execution engine handles 409 auto-recovery (existing resources), cascade-skip (failed dependencies), and concurrent batch execution. A 561-operation stress test completes in ~90 seconds.
|
|
325
|
+
|
|
326
|
+
### Migration Architecture
|
|
327
|
+
|
|
328
|
+
- **SQLite-backed store** with objects, cross-references, decisions, and journal
|
|
329
|
+
- **42 normalizers** (Pass 1) + CrossReferenceBuilder (34 relationships)
|
|
330
|
+
- **26 mappers** that convert CUCM objects to Webex Calling operations
|
|
331
|
+
- **14 analyzers** that surface decisions requiring human review
|
|
332
|
+
- **Advisory system** with 19 per-decision rules + 30 cross-cutting patterns
|
|
333
|
+
- **NetworkX DAG** for dependency ordering and batch planning
|
|
334
|
+
- **Async execution engine** with configurable concurrency
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## Org Health Assessment
|
|
339
|
+
|
|
340
|
+
An automated audit of a live Webex Calling org. Runs 18 deterministic checks across 4 categories and produces a self-contained HTML report.
|
|
341
|
+
|
|
342
|
+
### Categories and Checks
|
|
343
|
+
|
|
344
|
+
| Category | Checks |
|
|
345
|
+
|----------|--------|
|
|
346
|
+
| **Security Posture** | Unrestricted international dialing, no outgoing call restrictions, auto attendant external transfer enabled, call queues without recording |
|
|
347
|
+
| **Routing Hygiene** | Empty dial plans, orphan route components (route groups/lists without trunks), trunk errors |
|
|
348
|
+
| **Feature Utilization** | Disabled auto attendants, understaffed call queues, single-member hunt groups, empty voicemail groups, empty paging groups, empty call parks |
|
|
349
|
+
| **Device Health** | Offline devices, users at device limit, unassigned devices, workspaces without devices, stale activation codes |
|
|
350
|
+
|
|
351
|
+
### How to Run
|
|
352
|
+
|
|
353
|
+
Via the Claude Code playbook:
|
|
354
|
+
|
|
355
|
+
```
|
|
356
|
+
/agents → wxc-calling-builder → "audit my org"
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
The builder agent orchestrates three phases: collect data via `wxcli`, analyze with the check engine, and generate the HTML report.
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## Partner / Multi-Org Support
|
|
364
|
+
|
|
365
|
+
For partners, VARs, and MSPs managing multiple customer organizations with a single token.
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
wxcli configure # Auto-detects multi-org token, prompts for org selection
|
|
369
|
+
wxcli switch-org # Change the active target org
|
|
370
|
+
wxcli clear-org # Revert to single-org behavior
|
|
371
|
+
wxcli whoami # Shows "Target:" line when an org is set
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
1149 of the generated commands auto-inject the selected `orgId` on endpoints that accept it — no extra flag required.
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## Cleanup
|
|
379
|
+
|
|
380
|
+
Batch-delete Webex Calling resources in dependency-safe order (13 layers, reverse of creation order).
|
|
381
|
+
|
|
382
|
+
```bash
|
|
383
|
+
wxcli cleanup run --scope "San Jose,Austin" # Specific locations only
|
|
384
|
+
wxcli cleanup run --all # Entire org
|
|
385
|
+
wxcli cleanup run --all --dry-run # Preview without deleting
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**Flags:**
|
|
389
|
+
- `--include-users` — also delete users (off by default)
|
|
390
|
+
- `--include-locations` — also delete locations (off by default)
|
|
391
|
+
- `--exclude-user-domains "wbx.ai,corp.com"` — protect users matching these email domains
|
|
392
|
+
- `--max-concurrent N` — parallel deletions per layer (default 5)
|
|
393
|
+
- `--force` — skip confirmation prompt
|
|
394
|
+
|
|
395
|
+
**Deletion order:** dial plans → route lists → route groups → translation patterns → trunks → call features → schedules/operating modes → virtual lines → devices → workspaces → users → numbers → locations.
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## Project Architecture
|
|
400
|
+
|
|
401
|
+
```
|
|
402
|
+
wxops/
|
|
403
|
+
├── src/wxcli/ # CLI source (Typer + httpx REST client)
|
|
404
|
+
│ ├── main.py # Entry point — registers 178 command groups
|
|
405
|
+
│ ├── auth.py # Token storage and API client init
|
|
406
|
+
│ ├── output.py # Table/JSON output formatting
|
|
407
|
+
│ ├── commands/ # generated command modules (one per API tag) + _registry.py manifest
|
|
408
|
+
│ ├── org_health/ # Org health assessment engine (18 checks → HTML report)
|
|
409
|
+
│ └── migration/ # CUCM-to-Webex migration engine
|
|
410
|
+
│ ├── cucm/ # AXL extractors and discovery
|
|
411
|
+
│ ├── transform/ # Normalizers, mappers, analyzers
|
|
412
|
+
│ ├── execute/ # Async execution engine + handlers
|
|
413
|
+
│ ├── advisory/ # Decision recommendations
|
|
414
|
+
│ ├── report/ # HTML/PDF assessment report generator
|
|
415
|
+
│ └── models.py # 38 canonical data models
|
|
416
|
+
├── tools/ # Code generator pipeline
|
|
417
|
+
│ ├── generate_commands.py # Orchestrator: OpenAPI → Click commands
|
|
418
|
+
│ ├── openapi_parser.py # Parses OpenAPI 3.0 specs into Endpoint objects
|
|
419
|
+
│ ├── command_renderer.py # Renders Endpoints into Python command files
|
|
420
|
+
│ └── field_overrides.yaml # Table columns, display config, bug fixes
|
|
421
|
+
├── tests/ # 2535 tests (pytest)
|
|
422
|
+
├── specs/ # 9 OpenAPI 3.0 specs (calling, admin, device, messaging, meetings, CC, UCM, BroadWorks, wholesale)
|
|
423
|
+
├── docs/reference/ # 43 API reference docs (SDK + raw HTTP + gotchas)
|
|
424
|
+
├── .claude/settings.json # Shared permissions (pre-approves wxcli commands)
|
|
425
|
+
├── .claude/agents/ # Claude Code builder + migration advisor agents
|
|
426
|
+
└── .claude/skills/ # 25 Claude Code skills
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
**Key design decisions:**
|
|
430
|
+
|
|
431
|
+
- **Commands are generated, never hand-edited.** Fix bugs in `field_overrides.yaml` and regenerate with `tools/generate_commands.py`.
|
|
432
|
+
- **The CLI uses raw HTTP** via its own `WebexSession` client (`src/wxcli/auth.py`) built on `httpx`, not any third-party SDK. This gives 100% API coverage without external dependencies.
|
|
433
|
+
- **Reference docs serve both humans and AI.** Developers can read them directly; the playbook loads them as context for guided configuration.
|
|
434
|
+
|
|
435
|
+
## Known Limitations
|
|
436
|
+
|
|
437
|
+
- **Call control commands require a user-level OAuth token.** Admin and service app tokens return `400 "Target user not authorized"`. Use a personal access token from the user who will control calls.
|
|
438
|
+
- **Complex nested settings need `--json-body`.** Call forwarding rules, agent lists, voicemail config, and similar deeply nested structures can't be expressed as CLI flags — pass the full JSON body instead.
|
|
439
|
+
- **6 person call settings are user-only.** `simultaneousRing`, `sequentialRing`, `priorityAlert`, `callNotify`, `anonymousCallReject`, and `callPolicies` only work with user-level tokens, not admin tokens.
|
|
440
|
+
- **CDR/analytics endpoints require the `analytics:read_all` scope**, which standard admin tokens may not include.
|
|
441
|
+
|
|
442
|
+
## Requirements
|
|
443
|
+
|
|
444
|
+
- Python 3.11+ (includes `pip`)
|
|
445
|
+
- Git — required to clone the repo *and* to build it (the version is derived from git tags at install time)
|
|
446
|
+
- A Webex admin account with access tokens
|
|
447
|
+
|
|
448
|
+
### OAuth Scopes
|
|
449
|
+
|
|
450
|
+
The CLI covers 178 command groups across calling, admin, device, messaging, meetings, and contact center APIs. Not all scopes are needed — request only those for the API domains you use.
|
|
451
|
+
|
|
452
|
+
**Minimum scopes for Webex Calling admin operations:**
|
|
453
|
+
|
|
454
|
+
| Scope | Purpose |
|
|
455
|
+
|-------|---------|
|
|
456
|
+
| `spark-admin:telephony_config_read` | Read telephony config (locations, numbers, call routing, features) |
|
|
457
|
+
| `spark-admin:telephony_config_write` | Create/edit/delete telephony config |
|
|
458
|
+
| `spark-admin:people_read` | Read people across the organization |
|
|
459
|
+
| `spark-admin:people_write` | Create/update/delete people |
|
|
460
|
+
| `spark-admin:locations_read` | List and view locations |
|
|
461
|
+
| `spark-admin:locations_write` | Create/update/delete locations |
|
|
462
|
+
| `spark-admin:licenses_read` | List and inspect licenses |
|
|
463
|
+
| `spark-admin:devices_read` | View devices |
|
|
464
|
+
| `spark-admin:devices_write` | Add/update/delete devices |
|
|
465
|
+
| `spark-admin:workspaces_read` | View workspaces and workspace settings |
|
|
466
|
+
| `spark-admin:workspaces_write` | Create/update/delete workspaces |
|
|
467
|
+
|
|
468
|
+
**Additional scopes by API domain:**
|
|
469
|
+
|
|
470
|
+
| Domain | Scopes |
|
|
471
|
+
|--------|--------|
|
|
472
|
+
| PSTN / routing | `spark-admin:telephony_pstn_read`, `spark-admin:telephony_pstn_write` |
|
|
473
|
+
| Workspace locations | `spark-admin:workspace_locations_read`, `spark-admin:workspace_locations_write` |
|
|
474
|
+
| Org-wide call control | `spark-admin:calls_read`, `spark-admin:calls_write` |
|
|
475
|
+
| CDR / call history | `spark-admin:calling_cdr_read` (+ admin role "Webex Calling Detailed Call History API access") |
|
|
476
|
+
| Reports / analytics | `analytics:read_all` (requires Pro Pack) |
|
|
477
|
+
| Org & roles | `spark-admin:organizations_read` |
|
|
478
|
+
| Audit events | `spark-admin:audit_events_read` |
|
|
479
|
+
| SCIM identity sync | `identity:people_rw`, `identity:people_read` |
|
|
480
|
+
| Hybrid services | `spark-admin:hybrid_clusters_read`, `spark-admin:hybrid_connectors_read` |
|
|
481
|
+
| Recordings | `spark-admin:recordings_read`, `spark-admin:recordings_write` |
|
|
482
|
+
| Data sources | `spark-admin:datasource_read`, `spark-admin:datasource_write` |
|
|
483
|
+
| Resource groups | `spark-admin:resource_groups_read`, `spark-admin:resource_group_memberships_write` |
|
|
484
|
+
| Partner reports | `spark-admin:reports_read`, `spark-admin:reports_write` |
|
|
485
|
+
| Messaging (rooms) | `spark:rooms_read`, `spark:rooms_write` |
|
|
486
|
+
| Messaging (memberships) | `spark:memberships_read`, `spark:memberships_write` |
|
|
487
|
+
| RoomOS xAPI | `spark:xapi_commands`, `spark:xapi_statuses` |
|
|
488
|
+
| Device activation | `identity:placeonetimepassword_create` or `Identity:one_time_password` |
|
|
489
|
+
| Contact center | `cjp:config_read`, `cjp:config_write` (also requires `wxcli set-cc-region`) |
|
|
490
|
+
|
|
491
|
+
**User-level scopes** (for call control and self-service settings — requires a user token, not admin):
|
|
492
|
+
|
|
493
|
+
| Scope | Purpose |
|
|
494
|
+
|-------|---------|
|
|
495
|
+
| `spark:calls_read` | List active calls and call history |
|
|
496
|
+
| `spark:calls_write` | Call control (answer, hold, transfer, park) |
|
|
497
|
+
| `spark:people_read` | Read own user info |
|
|
498
|
+
| `spark:people_write` | Modify own call settings |
|
|
499
|
+
| `spark:xsi` | XSI events and call monitoring |
|
|
500
|
+
|
|
501
|
+
See [`docs/reference/authentication.md`](docs/reference/authentication.md) for full details on token types, OAuth flows, and scope requirements per endpoint.
|
|
502
|
+
|
|
503
|
+
## License
|
|
504
|
+
|
|
505
|
+
Apache 2.0 — see LICENSE.
|