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,421 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: provision-calling
|
|
3
|
+
description: |
|
|
4
|
+
Provision Webex Calling users, locations, and licenses via the wxcli CLI.
|
|
5
|
+
Also covers People API profile updates (alternate phone numbers, display name,
|
|
6
|
+
phoneNumbers array including alternate1/alternate2), number inventory management,
|
|
7
|
+
and bulk CSV import. Guides through auth verification, prerequisite checks,
|
|
8
|
+
deployment planning, execution, and result verification for any provisioning operation.
|
|
9
|
+
Use for: create, enable, assign, bulk provision, update user profile fields.
|
|
10
|
+
For teardown/delete/cleanup operations, use the teardown skill instead.
|
|
11
|
+
allowed-tools: Read, Grep, Glob, Bash
|
|
12
|
+
argument-hint: [operation — e.g. "create location", "enable user", "assign license", "bulk provision"]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
<!-- Updated by playbook session 2026-03-18 -->
|
|
16
|
+
|
|
17
|
+
# Provision Calling Workflow
|
|
18
|
+
|
|
19
|
+
**Checkpoint — do NOT proceed until you can answer these:**
|
|
20
|
+
1. Can `location_id` be changed after a calling license is assigned? (Answer: No — it is write-once. Wrong location = must remove and re-add calling license.)
|
|
21
|
+
2. What case must `announcement_language` use? (Answer: lowercase only — `en_us` not `en_US`. Mixed case causes "Invalid Language Code" error.)
|
|
22
|
+
|
|
23
|
+
If you cannot answer both, you skipped reading this skill. Go back and read it.
|
|
24
|
+
|
|
25
|
+
## Step 1: Load references
|
|
26
|
+
|
|
27
|
+
1. Read `docs/reference/provisioning.md` for People, Licenses, and Locations API patterns
|
|
28
|
+
|
|
29
|
+
**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. 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.
|
|
30
|
+
|
|
31
|
+
## Step 2: Verify auth token is working
|
|
32
|
+
|
|
33
|
+
Before any provisioning operation, confirm the token is valid and has admin scopes.
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
wxcli whoami
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
If this fails with 401/403, stop and troubleshoot auth before proceeding. Common causes:
|
|
40
|
+
- Token expired (personal access tokens last 12 hours)
|
|
41
|
+
- Token not configured — run `wxcli configure` or check `~/.wxcli/config.json`
|
|
42
|
+
- Token lacks admin scopes (`spark-admin:people_write`, `spark-admin:licenses_read`, etc.)
|
|
43
|
+
|
|
44
|
+
## Step 3: Determine the operation
|
|
45
|
+
|
|
46
|
+
Ask the user which provisioning operation they need. The six supported operations are:
|
|
47
|
+
|
|
48
|
+
| Operation | What It Does | Prerequisites |
|
|
49
|
+
|-----------|-------------|---------------|
|
|
50
|
+
| **Create location** | Add a new physical location | Admin token with `spark-admin:locations_write` |
|
|
51
|
+
| **Enable location for calling** | Turn on Webex Calling for an existing location | Location must exist; `spark-admin:telephony_config_write` |
|
|
52
|
+
| **Create user** | Add a new person to the org | Admin token with `spark-admin:people_write` |
|
|
53
|
+
| **Enable user for calling** | Assign calling license + location + extension to existing user | Location must exist; calling license available |
|
|
54
|
+
| **Assign/change licenses** | Add or remove licenses on a user | License with available capacity |
|
|
55
|
+
| **Bulk provision** | Provision multiple users in one run | All of the above |
|
|
56
|
+
|
|
57
|
+
Confirm with the user before proceeding:
|
|
58
|
+
- **Which operation** from the table above
|
|
59
|
+
- **Target details** (location name/address, user email, license type, etc.)
|
|
60
|
+
- **For bulk**: CSV or list of users to provision
|
|
61
|
+
|
|
62
|
+
## Step 4: Check prerequisites
|
|
63
|
+
|
|
64
|
+
Run these checks based on the operation. **Stop and report** if any prerequisite fails.
|
|
65
|
+
|
|
66
|
+
### For location creation:
|
|
67
|
+
```bash
|
|
68
|
+
# Check if location name already exists
|
|
69
|
+
wxcli locations list --name "target name"
|
|
70
|
+
# Look for a match in the output. If the target name appears:
|
|
71
|
+
wxcli locations show LOCATION_ID
|
|
72
|
+
# Ask user: update existing or abort?
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### For user provisioning:
|
|
76
|
+
```bash
|
|
77
|
+
# 1. Verify location exists and is calling-enabled
|
|
78
|
+
wxcli location-settings list-1
|
|
79
|
+
# Confirm target location appears (only calling-enabled locations are returned)
|
|
80
|
+
|
|
81
|
+
# 2. Find an available calling license with capacity
|
|
82
|
+
wxcli licenses list
|
|
83
|
+
# Look for "Webex Calling - Professional" with consumed < total
|
|
84
|
+
|
|
85
|
+
# 3. Check if user already exists
|
|
86
|
+
wxcli users list --email target@example.com --output json
|
|
87
|
+
# If user exists, check if already calling-enabled:
|
|
88
|
+
wxcli users show PERSON_ID --output json
|
|
89
|
+
# If location_id is set, user is already calling-enabled.
|
|
90
|
+
# Ask user: update or abort?
|
|
91
|
+
|
|
92
|
+
# 4. Verify email domain is provisioned in this org
|
|
93
|
+
# No CLI command lists currently-claimed org domains — the `domains` group only
|
|
94
|
+
# supports get-domain-verification / verify-domain / claim-domain / unverify-domain /
|
|
95
|
+
# unclaim-domain (see manage-identity skill for the verification flow). If domain
|
|
96
|
+
# status is unknown, check Control Hub, or attempt user creation and watch for a
|
|
97
|
+
# domain authorization error; resolve via manage-identity's domain verification
|
|
98
|
+
# flow before retrying.
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### For phone number assignment:
|
|
102
|
+
```bash
|
|
103
|
+
# Verify number is in location inventory before assigning to a user
|
|
104
|
+
# Numbers must be added to location first via numbers-manage commands
|
|
105
|
+
wxcli numbers create LOCATION_ID --json-body '{"phoneNumbers": ["+15551234567"], "numberType": "DID"}'
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Step 5: Build deployment plan — [SHOW BEFORE EXECUTING]
|
|
109
|
+
|
|
110
|
+
**Present the plan to the user and wait for approval.** Never execute without confirmation.
|
|
111
|
+
|
|
112
|
+
Format the plan as:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
=== Provisioning Plan ===
|
|
116
|
+
|
|
117
|
+
Operation: [Create Location / Enable User / etc.]
|
|
118
|
+
|
|
119
|
+
Target:
|
|
120
|
+
- [specific details]
|
|
121
|
+
|
|
122
|
+
Steps:
|
|
123
|
+
1. [First CLI command — what it does]
|
|
124
|
+
2. [Second CLI command — what it does]
|
|
125
|
+
3. Verify: [what we'll check after]
|
|
126
|
+
|
|
127
|
+
Prerequisites verified:
|
|
128
|
+
✓ Auth token valid (authenticated as [name])
|
|
129
|
+
✓ Location exists: [name] ([id])
|
|
130
|
+
✓ License available: [name] ([consumed]/[total])
|
|
131
|
+
✓ [any other checks]
|
|
132
|
+
|
|
133
|
+
Proceed? [wait for user confirmation]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Step 6: Execute the provisioning operation
|
|
137
|
+
|
|
138
|
+
### Operation A: Create a Location
|
|
139
|
+
|
|
140
|
+
Required flags: `--name`, `--time-zone`, `--preferred-language`, `--announcement-language`. Address must go in `--json-body`.
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
wxcli locations create \
|
|
144
|
+
--name "San Jose Office" \
|
|
145
|
+
--time-zone "America/Los_Angeles" \
|
|
146
|
+
--preferred-language en_US \
|
|
147
|
+
--announcement-language en_us \
|
|
148
|
+
--json-body '{"address": {"address1": "123 Main St", "city": "San Jose", "state": "CA", "postalCode": "95113", "country": "US"}}'
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Operation B: Enable Location for Calling
|
|
152
|
+
|
|
153
|
+
Creating a location does NOT automatically enable calling. Separate command required.
|
|
154
|
+
|
|
155
|
+
First, fetch the location details you'll need:
|
|
156
|
+
```bash
|
|
157
|
+
wxcli locations show LOCATION_ID
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Then enable calling using those details:
|
|
161
|
+
```bash
|
|
162
|
+
wxcli location-settings create \
|
|
163
|
+
--id LOCATION_ID \
|
|
164
|
+
--name "San Jose Office" \
|
|
165
|
+
--time-zone "America/Los_Angeles" \
|
|
166
|
+
--preferred-language en_US \
|
|
167
|
+
--announcement-language en_us
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Important:** `announcement_language` must be lowercase (`en_us` not `en_US`) or the API rejects with "Invalid Language Code".
|
|
171
|
+
|
|
172
|
+
**Warning:** Do not promise an API-based "disable calling" step during teardown. Use CLI/API to clear visible blockers first, but final delete of a calling-enabled location may still require Control Hub if the backend continues to hold the telephony reference.
|
|
173
|
+
|
|
174
|
+
### Operation C: Create a New User
|
|
175
|
+
|
|
176
|
+
**Before creating:** confirm the user's `firstName`, `lastName`, and `displayName` with the requester. Do not use email-derived placeholders (e.g., `jsmith`/`example`) — they produce incorrect directory entries and cannot be changed without a separate update call.
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
wxcli users create \
|
|
180
|
+
--json-body '{"emails":["jsmith@example.com"],"firstName":"John","lastName":"Smith","displayName":"John Smith"}'
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Gotcha:** A POST that returns 400 may **still have created the person**. Always check with a GET before retrying:
|
|
184
|
+
```bash
|
|
185
|
+
wxcli users list --email jsmith@example.com --output json
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Operation D: Enable Existing User for Calling
|
|
189
|
+
|
|
190
|
+
Assign a calling license, location, and extension to an existing user.
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# Look up current user state
|
|
194
|
+
wxcli users show PERSON_ID --output json
|
|
195
|
+
|
|
196
|
+
# Look up the calling license ID
|
|
197
|
+
wxcli licenses list --output json
|
|
198
|
+
# Find the license where name contains "Calling - Professional"
|
|
199
|
+
|
|
200
|
+
# Assign the calling license with location and extension
|
|
201
|
+
wxcli licenses update --person-id PERSON_ID --json-body '{
|
|
202
|
+
"email": "jsmith@example.com",
|
|
203
|
+
"licenses": [{
|
|
204
|
+
"id": "CALLING_LICENSE_ID",
|
|
205
|
+
"properties": {
|
|
206
|
+
"locationId": "LOCATION_ID",
|
|
207
|
+
"extension": "1001"
|
|
208
|
+
}
|
|
209
|
+
}]
|
|
210
|
+
}'
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Key constraints:**
|
|
214
|
+
- `location_id` is **write-once** — can only be set on initial calling license assignment, cannot be changed after
|
|
215
|
+
- `extension` value must NOT include the location routing prefix
|
|
216
|
+
- Either `phone_number` or `extension` is mandatory for calling licenses
|
|
217
|
+
- To move a user, remove calling license and re-add with new location
|
|
218
|
+
|
|
219
|
+
### Operation E: Bulk Provision
|
|
220
|
+
|
|
221
|
+
**Before running:** confirm `firstName`, `lastName`, and `displayName` for each user with the requester. Do not derive names from email aliases.
|
|
222
|
+
|
|
223
|
+
For small batches (< 20 users), pair each create with an immediate license assignment in a single loop:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
LOCATION_ID="<location_id>"
|
|
227
|
+
LICENSE_ID="<calling_license_id>"
|
|
228
|
+
EXT=1001
|
|
229
|
+
|
|
230
|
+
for email in user1@example.com user2@example.com user3@example.com; do
|
|
231
|
+
echo "=== Provisioning $email ==="
|
|
232
|
+
|
|
233
|
+
# Step 1: Create the user — capture the returned person ID
|
|
234
|
+
PERSON_ID=$(wxcli people create -o json \
|
|
235
|
+
--json-body "{\"emails\":[\"$email\"],\"firstName\":\"First\",\"lastName\":\"Last\",\"displayName\":\"First Last\"}" \
|
|
236
|
+
| python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
|
|
237
|
+
echo "Created: $email → $PERSON_ID"
|
|
238
|
+
|
|
239
|
+
# Step 2: Assign calling license with location and extension
|
|
240
|
+
wxcli licenses update --person-id "$PERSON_ID" --json-body "{
|
|
241
|
+
\"email\": \"$email\",
|
|
242
|
+
\"licenses\": [{
|
|
243
|
+
\"id\": \"$LICENSE_ID\",
|
|
244
|
+
\"operation\": \"add\",
|
|
245
|
+
\"properties\": {
|
|
246
|
+
\"locationId\": \"$LOCATION_ID\",
|
|
247
|
+
\"extension\": \"$EXT\"
|
|
248
|
+
}
|
|
249
|
+
}]
|
|
250
|
+
}"
|
|
251
|
+
echo "Enabled for calling: ext $EXT"
|
|
252
|
+
|
|
253
|
+
EXT=$((EXT + 1))
|
|
254
|
+
done
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**Note:** If `people create` returns 400, the user may still have been created. Check with `wxcli people list --email <email>` before retrying. If the user exists, skip the create and run only the `licenses update` step with the existing person ID.
|
|
258
|
+
|
|
259
|
+
> **Bulk operations (50+ users):** Shell loops with `sleep 1` work for small batches. For large batches, use the migration engine's async pattern, which handles concurrency, rate limiting, and retry automatically.
|
|
260
|
+
|
|
261
|
+
### Operation F: Teardown / Delete Location
|
|
262
|
+
|
|
263
|
+
**For teardown operations, load the `teardown` skill.** It covers single-location teardown, multi-location bulk cleanup, and org reset with the full dependency-safe deletion order and `wxcli cleanup` automation.
|
|
264
|
+
|
|
265
|
+
Delete-related critical rules (13-15) below still apply.
|
|
266
|
+
|
|
267
|
+
## Step 7: Verify results
|
|
268
|
+
|
|
269
|
+
Always read back the created/updated resources to confirm.
|
|
270
|
+
|
|
271
|
+
### Verify a user:
|
|
272
|
+
```bash
|
|
273
|
+
wxcli users show PERSON_ID --output json
|
|
274
|
+
# Confirm: location_id is set, calling license appears in licenses list, extension is correct
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Verify a location:
|
|
278
|
+
```bash
|
|
279
|
+
wxcli locations show LOCATION_ID --output json
|
|
280
|
+
# Confirm: name, address, timezone are correct
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Verify bulk:
|
|
284
|
+
```bash
|
|
285
|
+
# List all users at a location
|
|
286
|
+
wxcli users list --location-id LOCATION_ID --output json
|
|
287
|
+
# Count results to confirm expected number of users provisioned
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## Step 8: Report results
|
|
291
|
+
|
|
292
|
+
Summarize what was done:
|
|
293
|
+
|
|
294
|
+
```
|
|
295
|
+
=== Provisioning Complete ===
|
|
296
|
+
|
|
297
|
+
Operation: [what was done]
|
|
298
|
+
Results:
|
|
299
|
+
- [resource]: [status] ([id])
|
|
300
|
+
- [resource]: [status] ([id])
|
|
301
|
+
|
|
302
|
+
Verification:
|
|
303
|
+
✓ [what was confirmed]
|
|
304
|
+
|
|
305
|
+
Next steps:
|
|
306
|
+
- [any follow-up actions needed]
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## Critical Rules
|
|
312
|
+
|
|
313
|
+
1. **ALWAYS test auth first** — Run `wxcli whoami` before any provisioning call. Do not proceed on auth failure.
|
|
314
|
+
|
|
315
|
+
2. **ALWAYS show plan before executing** — Present the deployment plan and wait for user confirmation. Never provision without approval.
|
|
316
|
+
|
|
317
|
+
3. **`location_id` is write-once** — Can only be set when first assigning a calling license. Cannot be changed after. To move a user, remove calling license and re-add with new location.
|
|
318
|
+
|
|
319
|
+
4. **`announcement_language` must be lowercase** — `en_us` not `en_US`. The telephony `enable_for_calling` API rejects mixed case with "Invalid Language Code".
|
|
320
|
+
|
|
321
|
+
5. **`announcement_language` returns None from details** — Always set it explicitly before calling `enable_for_calling`, even if it was set during creation.
|
|
322
|
+
|
|
323
|
+
6. **Do not promise API disable-calling on locations** — the older `wxcli location-settings update-location-calling ...` guidance is stale in this repo. For teardown, use CLI/API to remove visible blockers, run `wxcli location-settings safe-delete-check LOCATION_ID`, retry delete, and warn that final removal of a calling-enabled location may still require Control Hub.
|
|
324
|
+
|
|
325
|
+
7. **Phone numbers must be in location inventory first** — Before assigning a DID to a user, add it via `wxcli numbers create LOCATION_ID`.
|
|
326
|
+
|
|
327
|
+
8. **POST/PUT may partially succeed** — A 400 response on user create/update may have still created/modified the resource. Always verify with a subsequent GET before retrying.
|
|
328
|
+
|
|
329
|
+
9. **License IDs are org-specific base64 strings** — Never hardcode them. Always retrieve via `wxcli licenses list`.
|
|
330
|
+
|
|
331
|
+
10. **Extension values must NOT include the routing prefix** — Set extension to `1001`. The work_extension in the response will include the prefix (e.g., `8001001`), but when writing, omit it. To check for extension conflicts before assigning, run `wxcli numbers list --location-id LOCATION_ID` and scan the extension column.
|
|
332
|
+
|
|
333
|
+
11. **Log all operations** — Print what you're about to do before each CLI command, and print the result after. This creates an audit trail for troubleshooting.
|
|
334
|
+
|
|
335
|
+
12. **For bulk operations (50+ users), use the migration engine's async pattern** — wxcli runs one command at a time. For large batches, the proven async pattern handles concurrency, rate limiting, and retry. For smaller batches (<50), shell loops with `sleep 1` suffice.
|
|
336
|
+
|
|
337
|
+
13. **Location-scoped feature deletes require LOCATION_ID as FIRST argument** — `wxcli hunt-group delete --force LOCATION_ID HG_ID`, not `wxcli hunt-group delete --force HG_ID`. The LOCATION_ID comes before the feature ID.
|
|
338
|
+
|
|
339
|
+
14. **Always use `--force` for programmatic deletes** — Without `--force`, delete commands prompt `[y/N]` which blocks non-interactive execution.
|
|
340
|
+
|
|
341
|
+
15. **Routing delete commands use PLURAL names** — `delete-route-groups`, `delete-trunks`, `delete-route-lists`. The singular form (`delete-route-group`) does not exist.
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## Error Handling
|
|
346
|
+
|
|
347
|
+
When a wxcli command fails:
|
|
348
|
+
|
|
349
|
+
**A. Fix and retry** — Missing required field, wrong ID, format issue:
|
|
350
|
+
1. Read the full error message
|
|
351
|
+
2. Run `wxcli <group> <command> --help` to check required flags
|
|
352
|
+
3. Fix the command and retry
|
|
353
|
+
|
|
354
|
+
**B. Skip and continue** — Resource already exists or already configured:
|
|
355
|
+
1. Verify current state: `wxcli users show PERSON_ID` or `wxcli locations show LOCATION_ID`
|
|
356
|
+
2. If state is correct, skip to next operation
|
|
357
|
+
|
|
358
|
+
**C. Escalate** — Unclear or persistent error:
|
|
359
|
+
1. Run with `--debug` for raw HTTP details
|
|
360
|
+
2. Invoke `/wxc-calling-debug` for systematic diagnosis
|
|
361
|
+
|
|
362
|
+
**D. 409 Conflict (50003 "Location is being referenced")**
|
|
363
|
+
|
|
364
|
+
The location still has dependent resources. Load the `teardown` skill and follow its enumeration procedure. If all resources are deleted and the 409 persists, calling is still enabled — disable it and wait 90+ seconds.
|
|
365
|
+
|
|
366
|
+
Provisioning-specific errors:
|
|
367
|
+
- 400 on `users create`: Check email format, verify no existing user with same email
|
|
368
|
+
- 400 on `numbers create`: Check E.164 format (+1XXXXXXXXXX), verify number not already assigned
|
|
369
|
+
- 403: Check token has `spark-admin:people_write` and `spark-admin:telephony_config_write` scopes
|
|
370
|
+
- 409: User/location already exists — GET current state first
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## Required Scopes Reference
|
|
375
|
+
|
|
376
|
+
| Operation | Scope(s) |
|
|
377
|
+
|-----------|----------|
|
|
378
|
+
| List/view people | `spark-admin:people_read` |
|
|
379
|
+
| Create/update/delete people | `spark-admin:people_write` + `spark-admin:people_read` |
|
|
380
|
+
| List licenses | `spark-admin:licenses_read` |
|
|
381
|
+
| Assign licenses (PATCH) | `spark-admin:people_write` |
|
|
382
|
+
| List/view locations | `spark-admin:locations_read` |
|
|
383
|
+
| Create/update/delete locations | `spark-admin:locations_write` |
|
|
384
|
+
| Enable location for calling | `spark-admin:telephony_config_write` |
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## License Lookup Quick Reference
|
|
389
|
+
|
|
390
|
+
> For bulk license assignment, usage auditing, and reclamation workflows, see the `manage-licensing` skill. The `licenses update` command provides CLI-native license assignment (`licenses-api` remains a deprecated alias for one release).
|
|
391
|
+
|
|
392
|
+
```bash
|
|
393
|
+
# List all licenses — look for "Webex Calling - Professional" with available capacity
|
|
394
|
+
wxcli licenses list
|
|
395
|
+
|
|
396
|
+
# Key license types to look for in the output:
|
|
397
|
+
# "Webex Calling - Professional" — full calling license
|
|
398
|
+
# "Webex Calling - Basic" — basic calling (limited features)
|
|
399
|
+
# "Webex Calling - Workspaces" — for workspace devices
|
|
400
|
+
# Check that consumed < total for the license you need
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
## Two License Assignment Methods
|
|
406
|
+
|
|
407
|
+
| | Method A: People API PUT | Method B: Licenses PATCH API |
|
|
408
|
+
|---|---|---|
|
|
409
|
+
| **CLI equivalent** | `wxcli users update` (modify user fields) | Raw HTTP PATCH `/licenses/users` (license assignment not in CLI yet) |
|
|
410
|
+
| **Best for** | Migrating existing users, changing multiple Person fields | Net-new provisioning, SCIM users, atomic license+location+extension |
|
|
411
|
+
| **Gotcha** | Must GET full person first, include ALL fields in PUT | Requires extension or phone_number for calling licenses |
|
|
412
|
+
| **Can combine add+remove** | Manually modify the licenses list | Yes, add + remove operations in same call |
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## Context Compaction Recovery
|
|
417
|
+
|
|
418
|
+
If context compacts mid-execution, recover by:
|
|
419
|
+
1. Read the deployment plan from `docs/plans/` to recover what was planned
|
|
420
|
+
2. Check what's already been created: run the relevant `list` commands
|
|
421
|
+
3. Resume from the first incomplete step
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: query-live
|
|
3
|
+
description: |
|
|
4
|
+
Answer natural-language questions about a Webex Calling environment using live API data.
|
|
5
|
+
Read-only queries against people, call features, routing, numbers, call history, and call flow tracing.
|
|
6
|
+
Use when the user asks "who", "what", "which", "how many", "does", "is", "show me", or "check" questions
|
|
7
|
+
about their current Webex Calling configuration. Invoked by the wxc-calling-builder agent on query intent,
|
|
8
|
+
or directly via /query-live.
|
|
9
|
+
NOT for: making changes (use the appropriate config skill), historical CDR analysis
|
|
10
|
+
(use reporting skill), or Contact Center queries (use reporting-cc skill).
|
|
11
|
+
allowed-tools: Read, Grep, Glob, Bash, Skill
|
|
12
|
+
argument-hint: [question]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Query Live State
|
|
16
|
+
|
|
17
|
+
Answer plain-English questions about a Webex Calling environment using live API data. **Read-only only.**
|
|
18
|
+
|
|
19
|
+
## Checkpoint — verify before proceeding
|
|
20
|
+
|
|
21
|
+
1. Has `wxcli whoami` succeeded in this session? If not, run it now. Do not proceed without a valid token.
|
|
22
|
+
2. Do you know which domain(s) this question touches? (people, features, routing, numbers, call-history, call-flow). If unsure, read the Domain Routing table below.
|
|
23
|
+
|
|
24
|
+
## Step 1: Classify the question
|
|
25
|
+
|
|
26
|
+
**Query signals** — this skill handles these:
|
|
27
|
+
- Interrogative form: "Who...?", "What...?", "Which...?", "How many...?", "Does...?", "Is...?"
|
|
28
|
+
- Inspection verbs: "show me", "list", "check", "look up", "find", "tell me about"
|
|
29
|
+
- State references: "current", "right now", "configured", "enabled", "assigned"
|
|
30
|
+
- Comparison/audit: "which users don't have...", "compare", "differences between"
|
|
31
|
+
|
|
32
|
+
**Not a query** — hand back to the builder's normal workflow:
|
|
33
|
+
- Action verbs: "create", "set up", "enable", "add", "configure", "change", "move", "delete"
|
|
34
|
+
- Future intent: "I want to...", "we need to...", "can you make..."
|
|
35
|
+
|
|
36
|
+
**Edge case:** "Can you check if voicemail is enabled and turn it on if not?"
|
|
37
|
+
→ Classify as query first. Answer the check. Then say: "I can look things up but can't make changes. To enable voicemail, you'd go to Control Hub → Calling → User Settings → Voicemail, or I can help configure it if you'd like to switch to build mode."
|
|
38
|
+
|
|
39
|
+
## Step 2: Route to domain module(s)
|
|
40
|
+
|
|
41
|
+
Read the domain module(s) that match the question. Cross-domain queries load multiple modules.
|
|
42
|
+
|
|
43
|
+
### Domain Routing Table
|
|
44
|
+
|
|
45
|
+
| Question about... | Domain module | Load with |
|
|
46
|
+
|-------------------|--------------|-----------|
|
|
47
|
+
| Users, person settings (voicemail, forwarding, DND, recording, caller ID, permissions) | people-and-settings | `Read .claude/skills/query-live/domains/people-and-settings.md` |
|
|
48
|
+
| Hunt groups, call queues, auto attendants, paging, call park, pickup, voicemail groups | features | `Read .claude/skills/query-live/domains/features.md` |
|
|
49
|
+
| Trunks, route groups, route lists, dial plans, translation patterns, PSTN | routing | `Read .claude/skills/query-live/domains/routing.md` |
|
|
50
|
+
| Phone numbers, number inventory, assignment status, available numbers | numbers | `Read .claude/skills/query-live/domains/numbers.md` |
|
|
51
|
+
| Call history, CDR, call volume, missed calls, busiest hours | call-history | `Read .claude/skills/query-live/domains/call-history.md` |
|
|
52
|
+
| "What happens when someone calls...", call path tracing, schedule evaluation | call-flow-trace | `Read .claude/skills/query-live/domains/call-flow-trace.md` |
|
|
53
|
+
|
|
54
|
+
**Cross-domain examples:**
|
|
55
|
+
- "Show me all users at Austin with their devices and voicemail status" → people-and-settings (primary)
|
|
56
|
+
- "What number is assigned to the Main auto attendant?" → features + numbers
|
|
57
|
+
|
|
58
|
+
**Cross-domain anti-pattern — do NOT combine these:**
|
|
59
|
+
- "Who's in the Sales hunt group and what are their forwarding settings?" — member personal forwarding settings are irrelevant to HG routing. Hunt groups route directly to agent devices and ignore personal call forwarding entirely. Ask about the HG's own no-answer/forwarding settings instead (features domain only).
|
|
60
|
+
|
|
61
|
+
## Step 3: Execute the domain module's recipes
|
|
62
|
+
|
|
63
|
+
Follow the loaded domain module's command recipes, resolution rules, and join patterns exactly. Use `-o json` on all commands for programmatic parsing.
|
|
64
|
+
|
|
65
|
+
**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 people list --help`). Even read-only commands differ by name (`show` vs `list`, singular vs plural — known issue #5), so confirm before running. Do NOT rely on examples in this skill, the domain modules, or reference docs — the CLI is auto-generated and flag names may differ from what documentation suggests.
|
|
66
|
+
|
|
67
|
+
### Resource Resolution Protocol
|
|
68
|
+
|
|
69
|
+
When the user references a resource by name (not ID):
|
|
70
|
+
|
|
71
|
+
1. **List** the resource type with `-o json`
|
|
72
|
+
2. **Search** the response for name matches (case-insensitive substring)
|
|
73
|
+
3. **Exact match** → use it immediately
|
|
74
|
+
4. **Multiple partial matches** → disambiguate:
|
|
75
|
+
```
|
|
76
|
+
I found 2 hunt groups matching "Sales":
|
|
77
|
+
1. Sales - East (Austin, 5 members)
|
|
78
|
+
2. Sales - West (Denver, 3 members)
|
|
79
|
+
Which one?
|
|
80
|
+
```
|
|
81
|
+
5. **No match** → report with suggestion:
|
|
82
|
+
```
|
|
83
|
+
I couldn't find a hunt group named "Sales". The hunt groups at your org are:
|
|
84
|
+
- Support (Austin)
|
|
85
|
+
- Engineering (Denver)
|
|
86
|
+
- Front Desk (Austin)
|
|
87
|
+
Did you mean one of these?
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Batch Query Protocol
|
|
91
|
+
|
|
92
|
+
For audit queries checking a setting across many users (e.g., "which users don't have voicemail?"):
|
|
93
|
+
|
|
94
|
+
1. **Count first:** `wxcli people list -o json` → count results
|
|
95
|
+
2. **If ≤ 50 users:** Fetch settings for each user sequentially
|
|
96
|
+
3. **If > 50 users:** Note upfront: "Checking [N] users — this will take a moment." Batch in groups of 20 with brief progress updates every 20 users.
|
|
97
|
+
4. **Report:** "Checked all [N] users at [location]. [X] of [N] don't have voicemail enabled."
|
|
98
|
+
|
|
99
|
+
## Step 4: Format the response
|
|
100
|
+
|
|
101
|
+
### Formatting Principles
|
|
102
|
+
|
|
103
|
+
- **Lead with the direct answer**, then supporting details
|
|
104
|
+
- **Use the admin's language**: "voicemail" not "voicemailEnabled", "forwarding" not "callForwarding"
|
|
105
|
+
- **Include counts and context**: "3 of 12 users" not just "3 users"
|
|
106
|
+
- **Be specific about what was checked**: "I checked all 45 users at the Austin location"
|
|
107
|
+
|
|
108
|
+
### Format by Query Type
|
|
109
|
+
|
|
110
|
+
**Membership queries** ("Who's in the Sales hunt group?"):
|
|
111
|
+
```
|
|
112
|
+
Sales Hunt Group has 4 members:
|
|
113
|
+
- Jane Smith (ext 2001, Austin)
|
|
114
|
+
- Bob Lee (ext 2002, Austin)
|
|
115
|
+
- Maria Garcia (ext 2003, Denver)
|
|
116
|
+
- Tom Chen (ext 2004, Denver)
|
|
117
|
+
|
|
118
|
+
Ring pattern: Simultaneous
|
|
119
|
+
No-answer action: Forward to Sales voicemail after 20 seconds
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Yes/no queries** ("Does John have voicemail enabled?"):
|
|
123
|
+
```
|
|
124
|
+
Yes, John Smith has voicemail enabled.
|
|
125
|
+
- Messages sent to: john.smith@acme.com
|
|
126
|
+
- PIN required: Yes
|
|
127
|
+
- Greeting: Custom greeting uploaded
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Inventory/audit queries** ("Which users at Austin don't have voicemail?"):
|
|
131
|
+
```
|
|
132
|
+
12 of 45 users at Austin don't have voicemail enabled:
|
|
133
|
+
- Alice Johnson (ext 3001)
|
|
134
|
+
- Brian Kim (ext 3002)
|
|
135
|
+
- Carol Davis (ext 3003)
|
|
136
|
+
... and 9 more
|
|
137
|
+
|
|
138
|
+
Note: I checked all 45 Webex Calling-licensed users at the Austin location.
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Large result sets (> 10 items):**
|
|
142
|
+
- Show first 10 with "...and N more" note
|
|
143
|
+
- Include summary count at top
|
|
144
|
+
- Offer to show full list if needed
|
|
145
|
+
|
|
146
|
+
### Disambiguation format:
|
|
147
|
+
```
|
|
148
|
+
I found 2 queues matching "Sales":
|
|
149
|
+
1. Sales - East (Austin, 5 agents)
|
|
150
|
+
2. Sales - West (Denver, 3 agents)
|
|
151
|
+
|
|
152
|
+
Which one?
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Safety Guardrails
|
|
156
|
+
|
|
157
|
+
### Read-Only Enforcement
|
|
158
|
+
|
|
159
|
+
**Only use these command verbs:** `list`, `show`, `test`
|
|
160
|
+
|
|
161
|
+
**Blocklisted verbs — NEVER use these in query mode:**
|
|
162
|
+
`create`, `add`, `update`, `modify`, `delete`, `remove`, `assign`, `enable`, `disable`, `configure`
|
|
163
|
+
|
|
164
|
+
If the user requests a change, respond with:
|
|
165
|
+
1. The current state (the query result)
|
|
166
|
+
2. "I can look things up but can't make changes in query mode."
|
|
167
|
+
3. Where in Control Hub they'd make the change, OR offer to switch to build mode
|
|
168
|
+
|
|
169
|
+
### Scope Limiting
|
|
170
|
+
|
|
171
|
+
- Operate within the org authenticated via `wxcli configure`
|
|
172
|
+
- If a partner/multi-org token is active, query the currently-selected org only
|
|
173
|
+
- No cross-org queries or comparisons
|
|
174
|
+
|
|
175
|
+
### Error Handling
|
|
176
|
+
|
|
177
|
+
| Error | Response |
|
|
178
|
+
|-------|----------|
|
|
179
|
+
| 401 Unauthorized | "Your session may have expired. Run `wxcli configure` to re-authenticate." |
|
|
180
|
+
| 403 Forbidden | "Your account doesn't have permission to view [resource]. Contact your org admin." |
|
|
181
|
+
| 404 Not Found | "I couldn't find [resource]. It may have been deleted or the name might be different." |
|
|
182
|
+
| 429 Rate Limited | "The API is rate-limiting requests. Try again in a minute." |
|
|
183
|
+
| Timeout | "The request timed out. The org may have a large number of [resources]. Try narrowing your query to a specific location." |
|