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.
Files changed (413) hide show
  1. wxcli/__init__.py +4 -0
  2. wxcli/_playbook/.claude/agents/migration-advisor.md +239 -0
  3. wxcli/_playbook/.claude/agents/wxc-calling-builder.md +946 -0
  4. wxcli/_playbook/.claude/rules/cleanup.md +29 -0
  5. wxcli/_playbook/.claude/rules/cucm-migration.md +58 -0
  6. wxcli/_playbook/.claude/rules/org-health.md +14 -0
  7. wxcli/_playbook/.claude/settings.json +8 -0
  8. wxcli/_playbook/.claude/skills/audit-compliance/SKILL.md +515 -0
  9. wxcli/_playbook/.claude/skills/call-control/SKILL.md +747 -0
  10. wxcli/_playbook/.claude/skills/configure-features/SKILL.md +623 -0
  11. wxcli/_playbook/.claude/skills/configure-routing/SKILL.md +627 -0
  12. wxcli/_playbook/.claude/skills/contact-center/SKILL.md +1181 -0
  13. wxcli/_playbook/.claude/skills/cucm-migrate/SKILL.md +820 -0
  14. wxcli/_playbook/.claude/skills/customer-assist/SKILL.md +443 -0
  15. wxcli/_playbook/.claude/skills/device-platform/SKILL.md +407 -0
  16. wxcli/_playbook/.claude/skills/manage-call-settings/SKILL.md +757 -0
  17. wxcli/_playbook/.claude/skills/manage-devices/SKILL.md +790 -0
  18. wxcli/_playbook/.claude/skills/manage-identity/SKILL.md +638 -0
  19. wxcli/_playbook/.claude/skills/manage-licensing/SKILL.md +528 -0
  20. wxcli/_playbook/.claude/skills/manage-meetings/SKILL.md +708 -0
  21. wxcli/_playbook/.claude/skills/messaging-bots/SKILL.md +365 -0
  22. wxcli/_playbook/.claude/skills/messaging-spaces/SKILL.md +520 -0
  23. wxcli/_playbook/.claude/skills/org-health/SKILL.md +159 -0
  24. wxcli/_playbook/.claude/skills/provision-calling/SKILL.md +421 -0
  25. wxcli/_playbook/.claude/skills/query-live/SKILL.md +183 -0
  26. wxcli/_playbook/.claude/skills/query-live/domains/call-flow-trace.md +223 -0
  27. wxcli/_playbook/.claude/skills/query-live/domains/call-history.md +44 -0
  28. wxcli/_playbook/.claude/skills/query-live/domains/features.md +169 -0
  29. wxcli/_playbook/.claude/skills/query-live/domains/numbers.md +93 -0
  30. wxcli/_playbook/.claude/skills/query-live/domains/people-and-settings.md +146 -0
  31. wxcli/_playbook/.claude/skills/query-live/domains/routing.md +124 -0
  32. wxcli/_playbook/.claude/skills/reporting/SKILL.md +501 -0
  33. wxcli/_playbook/.claude/skills/reporting/references/cdr-recipes.md +1628 -0
  34. wxcli/_playbook/.claude/skills/reporting-cc/SKILL.md +251 -0
  35. wxcli/_playbook/.claude/skills/reporting-meetings/SKILL.md +290 -0
  36. wxcli/_playbook/.claude/skills/teardown/SKILL.md +214 -0
  37. wxcli/_playbook/.claude/skills/video-mesh/SKILL.md +379 -0
  38. wxcli/_playbook/.claude/skills/wxc-calling-debug/SKILL.md +475 -0
  39. wxcli/_playbook/CLAUDE.md +373 -0
  40. wxcli/_playbook/docs/reference/CLAUDE.md +25 -0
  41. wxcli/_playbook/docs/reference/admin-apps-data.md +643 -0
  42. wxcli/_playbook/docs/reference/admin-audit-security.md +322 -0
  43. wxcli/_playbook/docs/reference/admin-hybrid.md +383 -0
  44. wxcli/_playbook/docs/reference/admin-identity-scim.md +1007 -0
  45. wxcli/_playbook/docs/reference/admin-licensing.md +414 -0
  46. wxcli/_playbook/docs/reference/admin-org-management.md +586 -0
  47. wxcli/_playbook/docs/reference/admin-partner.md +357 -0
  48. wxcli/_playbook/docs/reference/archive/wxc-sdk-patterns.md +1229 -0
  49. wxcli/_playbook/docs/reference/archive/wxcadm-advanced.md +835 -0
  50. wxcli/_playbook/docs/reference/archive/wxcadm-core.md +743 -0
  51. wxcli/_playbook/docs/reference/archive/wxcadm-devices-workspaces.md +1305 -0
  52. wxcli/_playbook/docs/reference/archive/wxcadm-features.md +849 -0
  53. wxcli/_playbook/docs/reference/archive/wxcadm-locations.md +938 -0
  54. wxcli/_playbook/docs/reference/archive/wxcadm-person.md +1255 -0
  55. wxcli/_playbook/docs/reference/archive/wxcadm-routing.md +1262 -0
  56. wxcli/_playbook/docs/reference/authentication.md +965 -0
  57. wxcli/_playbook/docs/reference/call-control.md +1205 -0
  58. wxcli/_playbook/docs/reference/call-features-additional.md +2541 -0
  59. wxcli/_playbook/docs/reference/call-features-major.md +1320 -0
  60. wxcli/_playbook/docs/reference/call-routing.md +2304 -0
  61. wxcli/_playbook/docs/reference/contact-center-analytics.md +1049 -0
  62. wxcli/_playbook/docs/reference/contact-center-core.md +1614 -0
  63. wxcli/_playbook/docs/reference/contact-center-journey.md +457 -0
  64. wxcli/_playbook/docs/reference/contact-center-routing.md +1138 -0
  65. wxcli/_playbook/docs/reference/devices-core.md +1869 -0
  66. wxcli/_playbook/docs/reference/devices-dect.md +1150 -0
  67. wxcli/_playbook/docs/reference/devices-platform.md +467 -0
  68. wxcli/_playbook/docs/reference/devices-workspaces.md +1426 -0
  69. wxcli/_playbook/docs/reference/emergency-services.md +1122 -0
  70. wxcli/_playbook/docs/reference/location-calling-core.md +2037 -0
  71. wxcli/_playbook/docs/reference/location-calling-media.md +1334 -0
  72. wxcli/_playbook/docs/reference/location-recording-advanced.md +1482 -0
  73. wxcli/_playbook/docs/reference/meetings-content.md +473 -0
  74. wxcli/_playbook/docs/reference/meetings-core.md +903 -0
  75. wxcli/_playbook/docs/reference/meetings-infrastructure.md +899 -0
  76. wxcli/_playbook/docs/reference/meetings-settings.md +850 -0
  77. wxcli/_playbook/docs/reference/messaging-bots.md +1091 -0
  78. wxcli/_playbook/docs/reference/messaging-spaces.md +695 -0
  79. wxcli/_playbook/docs/reference/person-call-settings-behavior.md +1639 -0
  80. wxcli/_playbook/docs/reference/person-call-settings-handling.md +1394 -0
  81. wxcli/_playbook/docs/reference/person-call-settings-media.md +1898 -0
  82. wxcli/_playbook/docs/reference/person-call-settings-permissions.md +1329 -0
  83. wxcli/_playbook/docs/reference/provisioning.md +1366 -0
  84. wxcli/_playbook/docs/reference/reporting-analytics.md +1318 -0
  85. wxcli/_playbook/docs/reference/self-service-call-settings.md +1020 -0
  86. wxcli/_playbook/docs/reference/virtual-lines.md +1132 -0
  87. wxcli/_playbook/docs/reference/webhooks-events.md +1444 -0
  88. wxcli/_playbook/docs/reference/wxcadm-xsi-realtime.md +953 -0
  89. wxcli/_version.py +24 -0
  90. wxcli/auth.py +137 -0
  91. wxcli/commands/__init__.py +0 -0
  92. wxcli/commands/_registry.py +181 -0
  93. wxcli/commands/activation_email.py +103 -0
  94. wxcli/commands/admin_recordings.py +585 -0
  95. wxcli/commands/analytics.py +105 -0
  96. wxcli/commands/announcement_playlists.py +219 -0
  97. wxcli/commands/announcements.py +519 -0
  98. wxcli/commands/archive_users.py +36 -0
  99. wxcli/commands/attachment_actions.py +60 -0
  100. wxcli/commands/audit_events.py +83 -0
  101. wxcli/commands/authorizations.py +113 -0
  102. wxcli/commands/auto_attendant.py +642 -0
  103. wxcli/commands/broadworks_billing_reports.py +126 -0
  104. wxcli/commands/broadworks_enterprises.py +160 -0
  105. wxcli/commands/broadworks_subscribers.py +319 -0
  106. wxcli/commands/broadworks_workspaces.py +108 -0
  107. wxcli/commands/call_controls.py +1304 -0
  108. wxcli/commands/call_park.py +494 -0
  109. wxcli/commands/call_pickup.py +229 -0
  110. wxcli/commands/call_queue.py +1878 -0
  111. wxcli/commands/call_recording.py +707 -0
  112. wxcli/commands/call_routing.py +1610 -0
  113. wxcli/commands/call_settings_for_me_phase_5.py +212 -0
  114. wxcli/commands/caller_reputation.py +169 -0
  115. wxcli/commands/calling_service.py +305 -0
  116. wxcli/commands/cc_address_book.py +770 -0
  117. wxcli/commands/cc_agent_greetings.py +242 -0
  118. wxcli/commands/cc_agent_summaries.py +39 -0
  119. wxcli/commands/cc_agent_wellbeing.py +216 -0
  120. wxcli/commands/cc_agents.py +425 -0
  121. wxcli/commands/cc_ai_assistant.py +55 -0
  122. wxcli/commands/cc_ai_feature.py +294 -0
  123. wxcli/commands/cc_audio_files.py +149 -0
  124. wxcli/commands/cc_auto_csat.py +311 -0
  125. wxcli/commands/cc_aux_code.py +458 -0
  126. wxcli/commands/cc_business_hour.py +353 -0
  127. wxcli/commands/cc_call_monitoring.py +228 -0
  128. wxcli/commands/cc_callbacks.py +194 -0
  129. wxcli/commands/cc_campaign.py +212 -0
  130. wxcli/commands/cc_captures.py +39 -0
  131. wxcli/commands/cc_contact_list.py +169 -0
  132. wxcli/commands/cc_contact_number.py +295 -0
  133. wxcli/commands/cc_data_sources.py +235 -0
  134. wxcli/commands/cc_desktop_layout.py +380 -0
  135. wxcli/commands/cc_desktop_profile.py +322 -0
  136. wxcli/commands/cc_dial_number.py +511 -0
  137. wxcli/commands/cc_dial_plan.py +347 -0
  138. wxcli/commands/cc_dnc.py +101 -0
  139. wxcli/commands/cc_entry_point.py +545 -0
  140. wxcli/commands/cc_ewt.py +51 -0
  141. wxcli/commands/cc_flow.py +477 -0
  142. wxcli/commands/cc_global_vars.py +430 -0
  143. wxcli/commands/cc_holiday_list.py +335 -0
  144. wxcli/commands/cc_journey.py +1261 -0
  145. wxcli/commands/cc_legacy_flows.py +49 -0
  146. wxcli/commands/cc_multimedia_profile.py +436 -0
  147. wxcli/commands/cc_notification.py +51 -0
  148. wxcli/commands/cc_outdial_ani.py +604 -0
  149. wxcli/commands/cc_overrides.py +341 -0
  150. wxcli/commands/cc_queue.py +1083 -0
  151. wxcli/commands/cc_queue_stats.py +55 -0
  152. wxcli/commands/cc_realtime.py +51 -0
  153. wxcli/commands/cc_resource_collection.py +312 -0
  154. wxcli/commands/cc_search.py +46 -0
  155. wxcli/commands/cc_site.py +400 -0
  156. wxcli/commands/cc_skill.py +350 -0
  157. wxcli/commands/cc_skill_profile.py +289 -0
  158. wxcli/commands/cc_subscriptions.py +426 -0
  159. wxcli/commands/cc_summaries.py +130 -0
  160. wxcli/commands/cc_tasks.py +844 -0
  161. wxcli/commands/cc_team.py +325 -0
  162. wxcli/commands/cc_user_profiles.py +349 -0
  163. wxcli/commands/cc_users.py +701 -0
  164. wxcli/commands/cc_work_types.py +363 -0
  165. wxcli/commands/cdr.py +89 -0
  166. wxcli/commands/classifications.py +38 -0
  167. wxcli/commands/cleanup.py +1427 -0
  168. wxcli/commands/client_settings.py +72 -0
  169. wxcli/commands/conference.py +328 -0
  170. wxcli/commands/configure.py +72 -0
  171. wxcli/commands/converged_recordings.py +347 -0
  172. wxcli/commands/converged_recordings_export.py +310 -0
  173. wxcli/commands/cq_playlists.py +42 -0
  174. wxcli/commands/cucm.py +2794 -0
  175. wxcli/commands/cucm_config.py +129 -0
  176. wxcli/commands/customer_assist.py +373 -0
  177. wxcli/commands/data_sources.py +227 -0
  178. wxcli/commands/dect_devices.py +787 -0
  179. wxcli/commands/device_configurations.py +77 -0
  180. wxcli/commands/device_dynamic_settings.py +320 -0
  181. wxcli/commands/device_settings.py +1489 -0
  182. wxcli/commands/devices.py +280 -0
  183. wxcli/commands/domains.py +142 -0
  184. wxcli/commands/ecm.py +178 -0
  185. wxcli/commands/emergency_services.py +827 -0
  186. wxcli/commands/events.py +83 -0
  187. wxcli/commands/external_voicemail.py +52 -0
  188. wxcli/commands/groups.py +206 -0
  189. wxcli/commands/guest_management.py +76 -0
  190. wxcli/commands/hds.py +340 -0
  191. wxcli/commands/hot_desk.py +67 -0
  192. wxcli/commands/hot_desking_members.py +118 -0
  193. wxcli/commands/hot_desking_portal.py +124 -0
  194. wxcli/commands/hunt_group.py +577 -0
  195. wxcli/commands/hybrid_clusters.py +71 -0
  196. wxcli/commands/hybrid_connectors.py +67 -0
  197. wxcli/commands/identity_org.py +159 -0
  198. wxcli/commands/init_playbook.py +155 -0
  199. wxcli/commands/licenses.py +106 -0
  200. wxcli/commands/live_monitoring.py +40 -0
  201. wxcli/commands/location_call_handling.py +577 -0
  202. wxcli/commands/location_schedules.py +341 -0
  203. wxcli/commands/location_settings.py +1297 -0
  204. wxcli/commands/location_voicemail.py +494 -0
  205. wxcli/commands/locations.py +336 -0
  206. wxcli/commands/meeting_captions.py +110 -0
  207. wxcli/commands/meeting_chats.py +63 -0
  208. wxcli/commands/meeting_invitees.py +234 -0
  209. wxcli/commands/meeting_messages.py +28 -0
  210. wxcli/commands/meeting_participants.py +278 -0
  211. wxcli/commands/meeting_polls.py +111 -0
  212. wxcli/commands/meeting_preferences.py +515 -0
  213. wxcli/commands/meeting_qa.py +78 -0
  214. wxcli/commands/meeting_qualities.py +43 -0
  215. wxcli/commands/meeting_reports.py +101 -0
  216. wxcli/commands/meeting_session_types.py +105 -0
  217. wxcli/commands/meeting_site.py +57 -0
  218. wxcli/commands/meeting_slido.py +44 -0
  219. wxcli/commands/meeting_summaries.py +92 -0
  220. wxcli/commands/meeting_tracking_codes.py +233 -0
  221. wxcli/commands/meeting_transcripts.py +230 -0
  222. wxcli/commands/meetings.py +1997 -0
  223. wxcli/commands/memberships.py +164 -0
  224. wxcli/commands/messages.py +213 -0
  225. wxcli/commands/mode_management.py +244 -0
  226. wxcli/commands/my_call_settings.py +3577 -0
  227. wxcli/commands/numbers.py +405 -0
  228. wxcli/commands/operating_modes.py +410 -0
  229. wxcli/commands/org_contacts.py +284 -0
  230. wxcli/commands/org_health_cli.py +55 -0
  231. wxcli/commands/org_settings.py +71 -0
  232. wxcli/commands/organizations.py +83 -0
  233. wxcli/commands/paging_group.py +257 -0
  234. wxcli/commands/partner_admins.py +141 -0
  235. wxcli/commands/partner_reports.py +188 -0
  236. wxcli/commands/partner_tags.py +216 -0
  237. wxcli/commands/people.py +279 -0
  238. wxcli/commands/person_call_settings.py +71 -0
  239. wxcli/commands/pstn.py +280 -0
  240. wxcli/commands/recording_report.py +154 -0
  241. wxcli/commands/report_templates.py +38 -0
  242. wxcli/commands/reports.py +144 -0
  243. wxcli/commands/resource_group_memberships.py +160 -0
  244. wxcli/commands/resource_groups.py +67 -0
  245. wxcli/commands/roles.py +63 -0
  246. wxcli/commands/room_tabs.py +160 -0
  247. wxcli/commands/rooms.py +225 -0
  248. wxcli/commands/scim_bulk.py +46 -0
  249. wxcli/commands/scim_groups.py +246 -0
  250. wxcli/commands/scim_schemas.py +82 -0
  251. wxcli/commands/scim_users.py +283 -0
  252. wxcli/commands/security_audit.py +54 -0
  253. wxcli/commands/service_apps.py +51 -0
  254. wxcli/commands/single_number_reach.py +209 -0
  255. wxcli/commands/team_memberships.py +155 -0
  256. wxcli/commands/teams.py +153 -0
  257. wxcli/commands/ucm_profile.py +42 -0
  258. wxcli/commands/update.py +219 -0
  259. wxcli/commands/user_settings.py +5116 -0
  260. wxcli/commands/video_mesh.py +1090 -0
  261. wxcli/commands/virtual_extensions.py +502 -0
  262. wxcli/commands/virtual_line_settings.py +2072 -0
  263. wxcli/commands/webhooks.py +176 -0
  264. wxcli/commands/wholesale_billing_reports.py +147 -0
  265. wxcli/commands/wholesale_provisioning.py +523 -0
  266. wxcli/commands/workspace_locations.py +339 -0
  267. wxcli/commands/workspace_metrics.py +103 -0
  268. wxcli/commands/workspace_personalization.py +70 -0
  269. wxcli/commands/workspace_settings.py +3347 -0
  270. wxcli/commands/workspaces.py +279 -0
  271. wxcli/commands/xapi.py +114 -0
  272. wxcli/config.py +139 -0
  273. wxcli/errors.py +77 -0
  274. wxcli/main.py +210 -0
  275. wxcli/migration/CLAUDE.md +106 -0
  276. wxcli/migration/__init__.py +1 -0
  277. wxcli/migration/advisory/CLAUDE.md +196 -0
  278. wxcli/migration/advisory/__init__.py +46 -0
  279. wxcli/migration/advisory/advisor.py +107 -0
  280. wxcli/migration/advisory/advisory_patterns.py +2552 -0
  281. wxcli/migration/advisory/recommendation_rules.py +835 -0
  282. wxcli/migration/cucm/CLAUDE.md +74 -0
  283. wxcli/migration/cucm/__init__.py +5 -0
  284. wxcli/migration/cucm/connection.py +265 -0
  285. wxcli/migration/cucm/discovery.py +225 -0
  286. wxcli/migration/cucm/extractors/__init__.py +1 -0
  287. wxcli/migration/cucm/extractors/announcements.py +92 -0
  288. wxcli/migration/cucm/extractors/base.py +90 -0
  289. wxcli/migration/cucm/extractors/device_profiles.py +98 -0
  290. wxcli/migration/cucm/extractors/devices.py +193 -0
  291. wxcli/migration/cucm/extractors/e911.py +103 -0
  292. wxcli/migration/cucm/extractors/features.py +309 -0
  293. wxcli/migration/cucm/extractors/helpers.py +73 -0
  294. wxcli/migration/cucm/extractors/informational.py +295 -0
  295. wxcli/migration/cucm/extractors/locations.py +221 -0
  296. wxcli/migration/cucm/extractors/moh.py +100 -0
  297. wxcli/migration/cucm/extractors/remote_destinations.py +96 -0
  298. wxcli/migration/cucm/extractors/routing.py +493 -0
  299. wxcli/migration/cucm/extractors/shared_lines.py +146 -0
  300. wxcli/migration/cucm/extractors/templates.py +229 -0
  301. wxcli/migration/cucm/extractors/tier4.py +173 -0
  302. wxcli/migration/cucm/extractors/users.py +240 -0
  303. wxcli/migration/cucm/extractors/voicemail.py +243 -0
  304. wxcli/migration/cucm/extractors/workspaces.py +88 -0
  305. wxcli/migration/cucm/unity_connection.py +304 -0
  306. wxcli/migration/execute/CLAUDE.md +372 -0
  307. wxcli/migration/execute/__init__.py +303 -0
  308. wxcli/migration/execute/batch.py +277 -0
  309. wxcli/migration/execute/dependency.py +483 -0
  310. wxcli/migration/execute/engine.py +964 -0
  311. wxcli/migration/execute/handlers.py +2232 -0
  312. wxcli/migration/execute/planner.py +1939 -0
  313. wxcli/migration/execute/runtime.py +571 -0
  314. wxcli/migration/export/CLAUDE.md +49 -0
  315. wxcli/migration/export/__init__.py +8 -0
  316. wxcli/migration/export/csv_export.py +126 -0
  317. wxcli/migration/export/deployment_plan.py +479 -0
  318. wxcli/migration/export/json_export.py +60 -0
  319. wxcli/migration/models.py +941 -0
  320. wxcli/migration/phone_models.py +50 -0
  321. wxcli/migration/preflight/CLAUDE.md +52 -0
  322. wxcli/migration/preflight/__init__.py +89 -0
  323. wxcli/migration/preflight/checks.py +911 -0
  324. wxcli/migration/preflight/runner.py +293 -0
  325. wxcli/migration/rate_limiter.py +144 -0
  326. wxcli/migration/report/CLAUDE.md +245 -0
  327. wxcli/migration/report/__init__.py +7 -0
  328. wxcli/migration/report/appendix.py +2437 -0
  329. wxcli/migration/report/assembler.py +183 -0
  330. wxcli/migration/report/charts.py +263 -0
  331. wxcli/migration/report/executive.py +776 -0
  332. wxcli/migration/report/explainer.py +704 -0
  333. wxcli/migration/report/helpers.py +74 -0
  334. wxcli/migration/report/ingest.py +152 -0
  335. wxcli/migration/report/notice_templates.py +192 -0
  336. wxcli/migration/report/score.py +375 -0
  337. wxcli/migration/report/styles.py +1052 -0
  338. wxcli/migration/report/user_diff.py +1052 -0
  339. wxcli/migration/report/user_notice.py +425 -0
  340. wxcli/migration/state.py +139 -0
  341. wxcli/migration/store.py +860 -0
  342. wxcli/migration/transform/CLAUDE.md +107 -0
  343. wxcli/migration/transform/__init__.py +12 -0
  344. wxcli/migration/transform/analysis_pipeline.py +453 -0
  345. wxcli/migration/transform/analyzers/__init__.py +142 -0
  346. wxcli/migration/transform/analyzers/css_permission.py +189 -0
  347. wxcli/migration/transform/analyzers/css_routing.py +335 -0
  348. wxcli/migration/transform/analyzers/device_compatibility.py +122 -0
  349. wxcli/migration/transform/analyzers/dn_ambiguity.py +131 -0
  350. wxcli/migration/transform/analyzers/duplicate_user.py +221 -0
  351. wxcli/migration/transform/analyzers/extension_conflict.py +173 -0
  352. wxcli/migration/transform/analyzers/feature_approximation.py +227 -0
  353. wxcli/migration/transform/analyzers/layout_overflow.py +174 -0
  354. wxcli/migration/transform/analyzers/location_ambiguity.py +184 -0
  355. wxcli/migration/transform/analyzers/missing_data.py +300 -0
  356. wxcli/migration/transform/analyzers/selective_call_handling.py +394 -0
  357. wxcli/migration/transform/analyzers/shared_line.py +170 -0
  358. wxcli/migration/transform/analyzers/voicemail_compatibility.py +267 -0
  359. wxcli/migration/transform/analyzers/workspace_license.py +212 -0
  360. wxcli/migration/transform/cross_reference.py +1136 -0
  361. wxcli/migration/transform/cucm_pattern.py +246 -0
  362. wxcli/migration/transform/decisions.py +301 -0
  363. wxcli/migration/transform/e164.py +145 -0
  364. wxcli/migration/transform/engine.py +256 -0
  365. wxcli/migration/transform/mappers/CLAUDE.md +123 -0
  366. wxcli/migration/transform/mappers/__init__.py +76 -0
  367. wxcli/migration/transform/mappers/announcement_mapper.py +122 -0
  368. wxcli/migration/transform/mappers/base.py +190 -0
  369. wxcli/migration/transform/mappers/button_template_mapper.py +186 -0
  370. wxcli/migration/transform/mappers/call_forwarding_mapper.py +228 -0
  371. wxcli/migration/transform/mappers/call_settings_mapper.py +144 -0
  372. wxcli/migration/transform/mappers/css_mapper.py +868 -0
  373. wxcli/migration/transform/mappers/dect_mapper.py +367 -0
  374. wxcli/migration/transform/mappers/device_layout_mapper.py +289 -0
  375. wxcli/migration/transform/mappers/device_mapper.py +227 -0
  376. wxcli/migration/transform/mappers/device_profile_mapper.py +190 -0
  377. wxcli/migration/transform/mappers/device_settings_mapper.py +464 -0
  378. wxcli/migration/transform/mappers/e911_mapper.py +129 -0
  379. wxcli/migration/transform/mappers/ecbn_mapper.py +263 -0
  380. wxcli/migration/transform/mappers/executive_assistant_mapper.py +156 -0
  381. wxcli/migration/transform/mappers/feature_mapper.py +1179 -0
  382. wxcli/migration/transform/mappers/line_mapper.py +310 -0
  383. wxcli/migration/transform/mappers/location_mapper.py +235 -0
  384. wxcli/migration/transform/mappers/moh_mapper.py +114 -0
  385. wxcli/migration/transform/mappers/monitoring_mapper.py +221 -0
  386. wxcli/migration/transform/mappers/receptionist_mapper.py +245 -0
  387. wxcli/migration/transform/mappers/routing_mapper.py +821 -0
  388. wxcli/migration/transform/mappers/snr_mapper.py +201 -0
  389. wxcli/migration/transform/mappers/softkey_mapper.py +205 -0
  390. wxcli/migration/transform/mappers/user_mapper.py +264 -0
  391. wxcli/migration/transform/mappers/voicemail_group_mapper.py +286 -0
  392. wxcli/migration/transform/mappers/voicemail_mapper.py +514 -0
  393. wxcli/migration/transform/mappers/workspace_mapper.py +464 -0
  394. wxcli/migration/transform/normalizers.py +2008 -0
  395. wxcli/migration/transform/pattern_converter.py +106 -0
  396. wxcli/migration/transform/pipeline.py +271 -0
  397. wxcli/migration/transform/rules.py +255 -0
  398. wxcli/org_health/CLAUDE.md +63 -0
  399. wxcli/org_health/__init__.py +7 -0
  400. wxcli/org_health/analyze.py +93 -0
  401. wxcli/org_health/checks.py +458 -0
  402. wxcli/org_health/collector.py +62 -0
  403. wxcli/org_health/models.py +78 -0
  404. wxcli/org_health/report.py +300 -0
  405. wxcli/output.py +101 -0
  406. wxcli-1.2.0.dist-info/METADATA +505 -0
  407. wxcli-1.2.0.dist-info/RECORD +413 -0
  408. wxcli-1.2.0.dist-info/WHEEL +5 -0
  409. wxcli-1.2.0.dist-info/entry_points.txt +2 -0
  410. wxcli-1.2.0.dist-info/licenses/LICENSE +191 -0
  411. wxcli-1.2.0.dist-info/scm_file_list.json +751 -0
  412. wxcli-1.2.0.dist-info/scm_version.json +8 -0
  413. wxcli-1.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,623 @@
1
+ ---
2
+ name: configure-features
3
+ description: |
4
+ Create, modify, or delete Webex Calling call features using wxcli CLI commands: Auto Attendants, Call Queues,
5
+ Hunt Groups, Paging Groups, Call Park, Call Pickup, Voicemail Groups, and Calling schedules
6
+ (business hours, holidays). Guides the user from prerequisites through creation, modification,
7
+ deletion, and verification.
8
+ Use for: create, update, delete, remove, list, or troubleshoot any Calling call feature.
9
+ NOT for: Contact Center queues/teams/flows (use contact-center skill), Customer Assist/CX Essentials
10
+ (use customer-assist skill), or per-person call settings (use manage-call-settings skill).
11
+ allowed-tools: Read, Grep, Glob, Bash
12
+ argument-hint: [feature-type]
13
+ ---
14
+
15
+ <!-- Updated by playbook session 2026-03-18 -->
16
+
17
+ # Configure Call Features Workflow
18
+
19
+ **Checkpoint — do NOT proceed until you can answer these:**
20
+ 1. What is the argument order for location-scoped feature deletes? (Answer: `--force LOCATION_ID FEATURE_ID` — location comes FIRST, not second.)
21
+ 2. How do you list CX Essentials call queues? (Answer: `wxcli call-queue list --has-cx-essentials true` — they are hidden from the default list.)
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/call-features-major.md` for AA, CQ, HG data models and API signatures
28
+ 2. Read `docs/reference/call-features-additional.md` for Paging, Call Park, Call Pickup, VM Groups, CX Essentials
29
+
30
+ **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 call-queue create --help` reveals the kebab-cased flags like `--has-cx-essentials` and the `--json-body` shape you cannot guess from training data). 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.
31
+
32
+ ## Step 2: Verify auth token
33
+
34
+ Before any API calls, confirm the user has a working auth token:
35
+
36
+ ```bash
37
+ wxcli whoami
38
+ ```
39
+
40
+ If this fails, stop and resolve authentication first (`wxcli configure`). Required scopes:
41
+ - **Read**: `spark-admin:telephony_config_read`
42
+ - **Write**: `spark-admin:telephony_config_write`
43
+
44
+ ## Step 3: Identify which feature(s) to configure
45
+
46
+ Ask the user which feature they want to create. Present this decision matrix if they are unsure:
47
+
48
+ | Need | Feature |
49
+ |------|---------|
50
+ | IVR menu with key-press routing ("Press 1 for Sales...") | **Auto Attendant** |
51
+ | Hold callers in queue until an agent is free | **Call Queue** |
52
+ | Ring a group of agents directly (no queue hold) | **Hunt Group** |
53
+ | One-way broadcast announcements to phones | **Paging Group** |
54
+ | Park a call on an extension for someone else to pick up | **Call Park** |
55
+ | Let team members answer each other's ringing phones | **Call Pickup** |
56
+ | Shared voicemail box for a team or feature | **Voicemail Group** |
57
+ | Screen pop, recording, wrap-up, supervisors on a CQ | **Customer Assist** (use `customer-assist` skill) |
58
+
59
+ ## Step 4: Check prerequisites
60
+
61
+ Before creating any feature, verify these exist:
62
+
63
+ ### 4a. Location exists and is calling-enabled
64
+
65
+ All features are location-scoped. Confirm the target location:
66
+
67
+ ```bash
68
+ wxcli locations list --output json
69
+ ```
70
+
71
+ Scan the output for the target location name and capture the `location_id`. Then confirm calling is enabled on it — calling features cannot be created at a location where calling is disabled:
72
+
73
+ ```bash
74
+ wxcli location-settings list-1
75
+ ```
76
+
77
+ The target location must appear in this output. If it does not, calling is not enabled there — run the provision-calling skill to enable it before proceeding.
78
+
79
+ If no location matches the name at all, the user must create one first (see provision-calling skill).
80
+
81
+ ### 4b. Users/agents exist (for features that need members)
82
+
83
+ For CQ, HG, Paging, Call Park, Call Pickup -- confirm the people who will be agents/members:
84
+
85
+ ```bash
86
+ wxcli users list --calling-data true --output json
87
+ ```
88
+
89
+ To filter by location:
90
+
91
+ ```bash
92
+ wxcli users list --calling-data true --location-id LOCATION_ID --output json
93
+ ```
94
+
95
+ ### 4c. Phone numbers available (for features that need a number)
96
+
97
+ For AA, CQ, HG, Paging, VM Groups -- check available numbers at the location:
98
+
99
+ ```bash
100
+ wxcli numbers list --location-id LOCATION_ID --output json
101
+ ```
102
+
103
+ ### 4d. Feature-specific prerequisites — verify before creating
104
+
105
+ **Run the verification command for each prerequisite before creating the feature.** Missing prerequisites cause 400 errors that waste an API call and require diagnosis.
106
+
107
+ #### Auto Attendant
108
+
109
+ | Prerequisite | Verification | If missing |
110
+ |-------------|-------------|-----------|
111
+ | Business hours schedule | `wxcli location-schedules list LOCATION_ID -o json` — look for a schedule with `type: businessHours` | Create one first: `wxcli location-schedules create LOCATION_ID --name "Business Hours" --type businessHours --json-body '{...}'` |
112
+ | Holiday schedule (optional) | Same command — look for `type: holidays` | Create if needed for holiday service routing |
113
+ | Custom greetings | Cannot be verified via API | Upload via Control Hub (API upload not supported) |
114
+
115
+ #### Call Queue
116
+
117
+ | Prerequisite | Verification | If missing |
118
+ |-------------|-------------|-----------|
119
+ | Agents have Professional license | `wxcli users list -o json` — for each agent, check license type. OR `wxcli licenses list -o json` and cross-reference | Assign Professional license via `manage-licensing` skill before adding as agent |
120
+ | CX Essentials license (for CX queues) | Same license check — look for CX Essentials license | Assign via `manage-licensing` skill. Without it, error 28018 on any CX operation |
121
+ | `callPolicies` in create body (CX queues) | N/A — CX queues require `callPolicies` in the `--json-body` at creation time | Include `"callPolicies": {...}` in the create body. See `customer-assist` skill for format |
122
+
123
+ #### Hunt Group
124
+
125
+ No additional prerequisites beyond location + agents. Can be created with zero agents.
126
+
127
+ #### Paging Group
128
+
129
+ | Prerequisite | Verification | If missing |
130
+ |-------------|-------------|-----------|
131
+ | Originators/targets exist | `wxcli users list --calling-data true -o json` | Originators and targets are added via `wxcli paging-group update` AFTER creation (not in the create call) |
132
+
133
+ #### Call Park
134
+
135
+ | Prerequisite | Verification | If missing |
136
+ |-------------|-------------|-----------|
137
+ | Hunt group exists (for recall) | `wxcli hunt-group list --location-id LOCATION_ID -o json` | Create the hunt group first, then configure call park recall to reference it |
138
+
139
+ #### Call Pickup
140
+
141
+ | Prerequisite | Verification | If missing |
142
+ |-------------|-------------|-----------|
143
+ | Users not already in another pickup group | `wxcli call-pickup list LOCATION_ID -o json` — check member lists for the target user | Remove user from existing group before adding to new one |
144
+
145
+ #### Voicemail Group
146
+
147
+ | Prerequisite | Verification | If missing |
148
+ |-------------|-------------|-----------|
149
+ | Extension available | `wxcli numbers list --location-id LOCATION_ID -o json` | Choose an unused extension |
150
+ | Passcode format | N/A — validate locally | 6+ digits, no repeating sequences (e.g., `111111` is rejected). Use a pattern like `740384` |
151
+
152
+ #### Customer Assist (CX Essentials)
153
+
154
+ | Prerequisite | Verification | If missing |
155
+ |-------------|-------------|-----------|
156
+ | Call queue exists | `wxcli call-queue list --location-id LOCATION_ID -o json` | Create the queue first in this skill, then switch to `customer-assist` skill |
157
+ | Queue is CX-enabled | `wxcli call-queue list --has-cx-essentials true -o json` | CX queues are hidden from default list. If queue doesn't appear, it wasn't created as a CX queue |
158
+
159
+ ## Step 5: Gather configuration and present deployment plan -- [SHOW BEFORE EXECUTING]
160
+
161
+ Based on the selected feature, collect the required parameters from the user. **Always present the plan before executing.**
162
+
163
+ ---
164
+
165
+ ### Auto Attendant
166
+
167
+ Collect from user:
168
+
169
+ | Parameter | Required | Notes |
170
+ |-----------|:--------:|-------|
171
+ | Name | Yes | Unique name for the AA |
172
+ | Phone number or extension | Yes (one of) | Use `wxcli numbers list` to find candidates |
173
+ | Business hours schedule | Yes | Must already exist at org/location level |
174
+ | Holiday schedule | No | Optional |
175
+ | Business hours menu | Yes | Key-press actions (see key config below) |
176
+ | After hours menu | Yes | Key-press actions |
177
+ | Extension dialing | No | `ENTERPRISE` (default) or `GROUP` |
178
+ | Name dialing | No | `ENTERPRISE` (default) or `GROUP` |
179
+
180
+ **Key-press actions** -- for each menu, define up to 12 keys (`0`-`9`, `*`, `#`):
181
+
182
+ | Action | Description |
183
+ |--------|-------------|
184
+ | `TRANSFER_WITHOUT_PROMPT` | Transfer immediately to a number/extension |
185
+ | `TRANSFER_WITH_PROMPT` | Play prompt then transfer |
186
+ | `TRANSFER_TO_OPERATOR` | Transfer to operator |
187
+ | `NAME_DIALING` | Dial-by-name directory |
188
+ | `EXTENSION_DIALING` | Dial-by-extension |
189
+ | `REPEAT_MENU` | Replay the menu |
190
+ | `EXIT` | Disconnect |
191
+ | `TRANSFER_TO_MAILBOX` | Transfer to voicemail |
192
+ | `RETURN_TO_PREVIOUS_MENU` | Go back one level |
193
+ | `PLAY_ANNOUNCEMENT` | Play an announcement |
194
+
195
+ **CLI command:**
196
+
197
+ > **NOTE:** The CLI automatically provides default menus (key 0 = EXIT, extension dialing enabled, DEFAULT greeting) so the create command succeeds without specifying menu details. To customize menus with specific key-press actions, use `wxcli auto-attendant update` after creation.
198
+
199
+ ```bash
200
+ wxcli auto-attendant create LOCATION_ID \
201
+ --name "Main Menu" \
202
+ --extension 1000 \
203
+ --business-schedule "Business Hours"
204
+ ```
205
+
206
+ Optional flags: `--phone-number`, `--holiday-schedule`, `--disabled`.
207
+
208
+ ---
209
+
210
+ ### Call Queue
211
+
212
+ Collect from user:
213
+
214
+ | Parameter | Required | Notes |
215
+ |-----------|:--------:|-------|
216
+ | Name | Yes | Unique name |
217
+ | Phone number or extension | Yes (one of) | |
218
+ | Routing policy | Yes | `CIRCULAR`, `REGULAR`, `SIMULTANEOUS` (max 50 agents), `UNIFORM`, `WEIGHTED` (max 100 agents) |
219
+ | Routing type | No | `PRIORITY_BASED` (default) or `SKILL_BASED` |
220
+ | Agents | Yes | List of person IDs (people, workspaces, or virtual lines) |
221
+ | Queue size | Yes | Max calls in queue before overflow triggers |
222
+ | Overflow action | No | `PERFORM_BUSY_TREATMENT`, `TRANSFER_TO_PHONE_NUMBER`, `PLAY_RINGING_UNTIL_CALLER_HANGS_UP` |
223
+ | Overflow transfer number | If overflow=transfer | Destination number |
224
+ | Call bounce settings | No | `max_rings` (default 5), `agent_unavailable_enabled` |
225
+ | Agent join/unjoin enabled | No | Let agents toggle themselves in/out |
226
+
227
+ **Announcement chain** (all optional, configure as needed):
228
+
229
+ 1. **Welcome message** -- first thing callers hear; can be mandatory even when agent is available
230
+ 2. **Wait message** -- estimated wait time or queue position
231
+ 3. **Comfort message** -- periodic message (promotions, info); interval 10-600 seconds
232
+ 4. **Comfort message bypass** -- short comfort for quickly-answered calls
233
+ 5. **Music on hold** -- normal + alternate source
234
+ 6. **Whisper message** -- plays to agent before connection (identifies which queue)
235
+
236
+ **CLI command:**
237
+
238
+ > **NOTE:** The API may accept call queue creates without `callPolicies` for non-CX queues (using server-side defaults), but the spec marks it required. For CX Essentials queues, `callPolicies` is strictly required — pass via `--json-body`. Agents are added after creation.
239
+
240
+ ```bash
241
+ wxcli call-queue create LOCATION_ID \
242
+ --name "Support Queue" \
243
+ --extension 2000
244
+ ```
245
+
246
+ Optional flags: `--phone-number`.
247
+
248
+ To add agents after creation, use the update command with `--json-body`:
249
+
250
+ ```bash
251
+ wxcli call-queue update LOCATION_ID QUEUE_ID --json-body '{"agents": [{"id": "AGENT_PERSON_ID"}]}'
252
+ ```
253
+
254
+ To find available agents for a location:
255
+
256
+ ```bash
257
+ wxcli call-queue list-available-agents-queues LOCATION_ID --output json
258
+ ```
259
+
260
+ > **WARNING (CQ Update):** The CLI `update` command uses partial objects to avoid the `callingLineIdPolicy=CUSTOM` 400 error. Only changed fields are sent:
261
+ > ```bash
262
+ > wxcli call-queue update LOCATION_ID QUEUE_ID --name "New Name"
263
+ > ```
264
+
265
+ ---
266
+
267
+ ### Hunt Group
268
+
269
+ Collect from user:
270
+
271
+ | Parameter | Required | Notes |
272
+ |-----------|:--------:|-------|
273
+ | Name | Yes | Unique name |
274
+ | Phone number or extension | Yes (one of) | |
275
+ | Ring pattern (policy) | No | `CIRCULAR` (default), `REGULAR`, `SIMULTANEOUS` (max 50), `UNIFORM`, `WEIGHTED` (max 100) |
276
+ | Members | No | Can create with zero agents and add later |
277
+ | No-answer behavior | No | Advance to next agent, forward after N rings, forward destination |
278
+ | Busy redirect | No | Where to send calls when all agents busy |
279
+ | Business continuity redirect | No | Fallback when phone system is disconnected |
280
+
281
+ **Key difference from Call Queue:** Hunt groups ring agents directly -- no queue hold, no announcements chain, no agent join/unjoin.
282
+
283
+ **CLI command (simple — uses CLI defaults for callPolicies):**
284
+
285
+ ```bash
286
+ wxcli hunt-group create LOCATION_ID \
287
+ --name "Sales Team" \
288
+ --extension 3000 \
289
+ --enabled
290
+ ```
291
+
292
+ > **NOTE:** The CLI auto-injects a default `callPolicies` (CIRCULAR policy, advance to next agent after 3 rings, no forwarding) when not provided. This covers simple creates. For custom policies, use `--json-body`.
293
+
294
+ **CLI command (full control — custom policy and no-answer behavior):**
295
+
296
+ ```bash
297
+ wxcli hunt-group create LOCATION_ID --json-body '{
298
+ "name": "Sales Team",
299
+ "extension": "3000",
300
+ "enabled": true,
301
+ "callPolicies": {
302
+ "policy": "REGULAR",
303
+ "noAnswer": {
304
+ "nextAgentEnabled": true,
305
+ "nextAgentRings": 3,
306
+ "forwardEnabled": false,
307
+ "numberOfRings": 15,
308
+ "destinationVoicemailEnabled": false
309
+ }
310
+ },
311
+ "agents": [{"id": "AGENT_PERSON_ID"}]
312
+ }'
313
+ ```
314
+
315
+ **callPolicies structure (required by API):**
316
+
317
+ | Field | Required | Notes |
318
+ |-------|:--------:|-------|
319
+ | `policy` | Yes | `CIRCULAR`, `REGULAR`, `SIMULTANEOUS` (max 50 agents), `UNIFORM`, `WEIGHTED` (max 100 agents) |
320
+ | `noAnswer.nextAgentEnabled` | Yes | Advance to next agent after rings |
321
+ | `noAnswer.nextAgentRings` | Yes | Rings before advancing (when nextAgentEnabled) |
322
+ | `noAnswer.forwardEnabled` | Yes | Forward unanswered calls to destination |
323
+ | `noAnswer.numberOfRings` | Yes | Rings before forwarding (when forwardEnabled) |
324
+ | `noAnswer.destinationVoicemailEnabled` | Yes | Send to destination's voicemail |
325
+ | `noAnswer.destination` | No | Forward-to number (required when forwardEnabled=true) |
326
+ | `waitingEnabled` | No | false = "advance when busy" |
327
+ | `groupBusyEnabled` | No | Set hunt group status to busy |
328
+ | `busyRedirect.enabled` | No | Divert calls when all agents busy |
329
+ | `busyRedirect.destination` | No | Busy redirect number |
330
+ | `businessContinuityRedirect.enabled` | No | Fallback when phones disconnected |
331
+ | `businessContinuityRedirect.destination` | No | Business continuity number |
332
+
333
+ **CUCM migration mapping:** Map `CanonicalHuntGroup.policy` → `callPolicies.policy`, and `CanonicalHuntGroup.no_answer_rings` → `callPolicies.noAnswer.nextAgentRings`.
334
+
335
+ Optional flags: `--phone-number`.
336
+
337
+ To add agents after creation, use the update command with `--json-body`:
338
+
339
+ ```bash
340
+ wxcli hunt-group update LOCATION_ID HG_ID --json-body '{"agents": [{"id": "AGENT_PERSON_ID"}]}'
341
+ ```
342
+
343
+ ---
344
+
345
+ ### Paging Group
346
+
347
+ Collect from user:
348
+
349
+ | Parameter | Required | Notes |
350
+ |-----------|:--------:|-------|
351
+ | Name | Yes | Max 30 chars |
352
+ | Phone number or extension | Yes (one of) | |
353
+ | Originators | No | People/workspaces who can initiate pages |
354
+ | Targets | No | People/workspaces/virtual lines who receive pages (up to 75) |
355
+ | Originator caller ID enabled | Yes if originators set | Shows originator's caller ID on target phones |
356
+
357
+ **CLI command:**
358
+
359
+ ```bash
360
+ wxcli paging-group create LOCATION_ID \
361
+ --name "Warehouse Page" \
362
+ --extension 8100
363
+ ```
364
+
365
+ Optional flags: `--disabled`.
366
+
367
+ To list existing paging groups:
368
+
369
+ ```bash
370
+ wxcli paging-group list --location-id LOCATION_ID --output json
371
+ ```
372
+
373
+ > **NOTE:** Originator and target assignment requires `wxcli paging-group update` after creation. The CLI create command creates the group with name, extension, and enabled status.
374
+
375
+ ---
376
+
377
+ ### Call Park
378
+
379
+ Collect from user:
380
+
381
+ | Parameter | Required | Notes |
382
+ |-----------|:--------:|-------|
383
+ | Name | Yes | Max 80 chars |
384
+ | Agents | No | People/workspaces eligible to receive parked calls |
385
+ | Call Park Extensions | No | Dedicated park extensions (create these first) |
386
+ | Park on agents enabled | No | Whether calls can be parked directly on agents |
387
+ | Recall behavior | No | `ALERT_PARKING_USER_ONLY` (default), `ALERT_PARKING_USER_FIRST_THEN_HUNT_GROUP`, `ALERT_HUNT_GROUP_ONLY` |
388
+ | Recall hunt group | If recall uses HG | Must be an existing hunt group at the location |
389
+
390
+ **CLI command:**
391
+
392
+ > **NOTE:** The CLI automatically provides the required `recall` field (defaults to `parking_user_only`), so the create succeeds with just a name.
393
+
394
+ ```bash
395
+ wxcli call-park create LOCATION_ID --name "Lobby Park"
396
+ ```
397
+
398
+ Note: `LOCATION_ID` is a positional argument for call-park commands.
399
+
400
+ To list call park groups:
401
+
402
+ ```bash
403
+ wxcli call-park list LOCATION_ID --output json
404
+ ```
405
+
406
+ **Gotcha:** Call Park ID changes when name is modified. Always re-fetch after a name change.
407
+
408
+ ---
409
+
410
+ ### Call Pickup
411
+
412
+ Collect from user:
413
+
414
+ | Parameter | Required | Notes |
415
+ |-----------|:--------:|-------|
416
+ | Name | Yes | Max 80 chars |
417
+ | Members | No | People, workspaces, virtual lines |
418
+ | Notification type | No | `NONE`, `AUDIO_ONLY`, `VISUAL_ONLY`, `AUDIO_AND_VISUAL` |
419
+ | Notification delay (seconds) | No | Time before notification fires |
420
+
421
+ **Constraint:** A user can only belong to one call pickup group at a time.
422
+
423
+ **CLI command:**
424
+
425
+ ```bash
426
+ wxcli call-pickup create LOCATION_ID --name "Front Desk Pickup"
427
+ ```
428
+
429
+ Note: `LOCATION_ID` is a positional argument for call-pickup commands.
430
+
431
+ To list call pickup groups:
432
+
433
+ ```bash
434
+ wxcli call-pickup list LOCATION_ID --output json
435
+ ```
436
+
437
+ **Gotcha:** Call Pickup ID changes when name is modified. Always re-fetch after a name change.
438
+
439
+ ---
440
+
441
+ ### Voicemail Group
442
+
443
+ Collect from user:
444
+
445
+ | Parameter | Required | Notes |
446
+ |-----------|:--------:|-------|
447
+ | Name | Yes | Group name |
448
+ | Extension | Yes | Required on create |
449
+ | Passcode | Yes | Access passcode (6+ digits, no repeating) |
450
+ | Phone number | No | Optional external number |
451
+ | Language code | No | Default `en_us` |
452
+
453
+ **CLI command:**
454
+
455
+ > **NOTE:** The CLI handles the known `VoicemailGroupDetail.for_create()` SDK bug (missing `by_alias=True`) internally. It uses `model_dump(by_alias=True)` and raw HTTP under the hood, so the command just works.
456
+
457
+ ```bash
458
+ wxcli location-voicemail create LOCATION_ID \
459
+ --name "Support VM" \
460
+ --extension 8200 \
461
+ --passcode 740384 \
462
+ --language-code en_us
463
+ ```
464
+
465
+ Optional flags: `--phone-number`, `--first-name`, `--last-name`.
466
+
467
+ ---
468
+
469
+ ### CX Essentials (Customer Assist)
470
+
471
+ Customer Assist (formerly CX Essentials) has its own dedicated skill with full coverage of screen pop, wrap-up reasons, queue call recording, supervisors, and available agents.
472
+
473
+ > **Use the `customer-assist` skill** for all Customer Assist configuration.
474
+
475
+ The call queue itself is still created here (see Call Queue section above). Once the queue exists, switch to the `customer-assist` skill to configure Customer Assist features on it.
476
+
477
+ ---
478
+
479
+ ### Deployment Plan Template
480
+
481
+ Before executing any commands, present the full plan to the user:
482
+
483
+ ```
484
+ DEPLOYMENT PLAN
485
+ ===============
486
+ Feature: [type]
487
+ Location: [name] ([location_id])
488
+ Name: [feature_name]
489
+ Phone/Extension: [number or extension]
490
+
491
+ Configuration:
492
+ [Feature-specific settings listed here]
493
+
494
+ Members/Agents:
495
+ - [Person 1] ([person_id])
496
+ - [Person 2] ([person_id])
497
+
498
+ Prerequisites verified:
499
+ ✓ Location exists
500
+ ✓ [N] agents found
501
+ ✓ Phone number/extension available
502
+ ✓ [Feature-specific prereqs]
503
+
504
+ Commands to execute:
505
+ wxcli [feature] create ...
506
+ wxcli [feature] update ... --json-body '{"agents": [...]}' (if applicable)
507
+
508
+ Proceed? (yes/no)
509
+ ```
510
+
511
+ **Wait for user confirmation before executing.**
512
+
513
+ ## Step 6: Execute via wxcli
514
+
515
+ Run the creation command. If the feature requires multiple steps (e.g., agents added after CQ/HG creation), execute them in order.
516
+
517
+ Handle errors explicitly:
518
+
519
+ **Generic errors:**
520
+ - **401/403**: Token expired or insufficient scopes — run `wxcli configure` to re-authenticate. Required scope: `spark-admin:telephony_config_write`.
521
+ - **409**: Name or extension conflict — ask user for alternate name/extension.
522
+ - **400**: Validation error — read the error message and fix the parameter.
523
+
524
+ **Feature-specific errors:**
525
+ - **400 on AA create (schedule reference):** The business hours schedule doesn't exist or the schedule ID is wrong. Verify with `wxcli location-schedules list LOCATION_ID -o json`.
526
+ - **400 on CQ create (missing callPolicies):** CX Essentials queues require `callPolicies` in the create body. Add via `--json-body`.
527
+ - **400 on CQ update (callingLineIdPolicy=CUSTOM):** Sending the full queue object on update triggers this. Use individual flags (`--name`, `--extension`) instead of `--json-body` with the full object. The CLI handles partial updates automatically.
528
+ - **28018 on CX operations:** "CX Essentials is not enabled for this Call center" — the queue isn't a CX queue. Must pass `--has-cx-essentials true` on list commands and create with `callPolicies`.
529
+ - **400 on VM Group create (passcode):** Passcode doesn't meet requirements: 6+ digits, no repeating sequences, no common patterns.
530
+ - **ID changed after rename (Call Park, Call Pickup):** These features generate new IDs when renamed. Always re-fetch the list after a rename: `wxcli call-park list LOCATION_ID -o json`.
531
+
532
+ ## Step 7: Verify creation
533
+
534
+ After creation, fetch the details back and confirm:
535
+
536
+ ```bash
537
+ # Example for auto attendant
538
+ wxcli auto-attendant show LOCATION_ID AA_ID --output json
539
+
540
+ # Example for call queue
541
+ wxcli call-queue show LOCATION_ID QUEUE_ID --output json
542
+
543
+ # Example for hunt group
544
+ wxcli hunt-group show LOCATION_ID HG_ID --output json
545
+
546
+ # Example for paging
547
+ wxcli paging-group show LOCATION_ID PAGING_ID --output json
548
+
549
+ # Example for call park
550
+ wxcli call-park show LOCATION_ID CALLPARK_ID --output json
551
+
552
+ # Example for call pickup
553
+ wxcli call-pickup show LOCATION_ID PICKUP_ID --output json
554
+
555
+ # Example for voicemail group
556
+ wxcli location-voicemail show-voicemail-groups LOCATION_ID VMG_ID --output json
557
+ ```
558
+
559
+ ## Step 8: Report results
560
+
561
+ Present the creation results:
562
+
563
+ ```
564
+ FEATURE CREATED
565
+ ===============
566
+ Type: [feature_type]
567
+ Name: [name]
568
+ ID: [feature_id]
569
+ Location: [location_name]
570
+ Extension: [extension]
571
+ Phone Number: [phone_number or "None assigned"]
572
+ Agents/Members: [count]
573
+
574
+ Next steps:
575
+ - [Feature-specific next steps, e.g., "Upload custom greeting via Control Hub"]
576
+ - [e.g., "Configure holiday service on the queue policy"]
577
+ - [e.g., "Add agents to the hunt group"]
578
+ ```
579
+
580
+ ---
581
+
582
+ ## Critical Rules
583
+
584
+ 1. **Always verify location exists** before creating any feature. Every feature is location-scoped.
585
+ 2. **Always show the deployment plan** (Step 5) and wait for user confirmation before executing.
586
+ 3. **Agent/member assignment requires valid person IDs.** Use `wxcli users list --calling-data true` or the feature-specific `available-agents` subcommand to find them.
587
+ 4. **Phone number vs. extension** -- at least one is required for AA, CQ, HG, Paging, VM Groups. Use `wxcli numbers list --location-id LOCATION_ID` to find unassigned numbers.
588
+ 5. **Audio file upload is not supported via API** -- custom greetings for AA and CQ must be uploaded through Webex Control Hub.
589
+ 6. **Call Park and Call Pickup IDs change on name modification.** Always re-fetch after renaming.
590
+ 7. **CQ routing policy limits** -- `SIMULTANEOUS` max 50 agents; `WEIGHTED` max 100 agents; `CIRCULAR`/`REGULAR`/`UNIFORM` max 1,000 agents.
591
+ 8. **Paging Group: originators require update** -- the CLI create command does not accept originator/target lists; use `wxcli paging-group update` after creation.
592
+ 9. **Call Pickup one-group-per-user constraint** -- a user can only belong to one pickup group.
593
+ 10. **Customer Assist (CX Essentials) has its own skill.** Use the `customer-assist` skill for screen pop, wrap-up, queue recording, and supervisor configuration. Call queue creation stays in this skill.
594
+ 11. **Hunt Group holiday/night service** uses forwarding rules (schedule-based), not a dedicated policy API like Call Queues have.
595
+ 12. **Voicemail Group passcode is required** on create -- the CLI enforces this via `--passcode` (required option).
596
+ 13. **AA create: menus are auto-populated by the CLI.** The CLI provides default menus (key 0 = EXIT, extension dialing enabled) so the create command succeeds. Customize menus via `wxcli auto-attendant update` after creation.
597
+ 14. **CQ update uses partial objects.** The CLI `update` command avoids the `callingLineIdPolicy=CUSTOM` 400 error by sending only changed fields.
598
+ 15. **VM Group SDK bug is handled by the CLI.** The `wxcli location-voicemail create` command works around the `by_alias=True` bug internally.
599
+ 16. **Before deleting, check for cross-feature references.** Some features are referenced by others and deleting them silently breaks the dependent feature:
600
+ - Hunt Groups may be referenced by Call Park recall configuration. Check: `wxcli call-park list LOCATION_ID -o json` and inspect `recall.huntGroupId`.
601
+ - Auto Attendants may be referenced by Call Queues (overflow destination) or other AAs (key-press routing). Check overflow settings on any CQ at the location.
602
+ - Call Queues may be referenced by AAs as overflow targets.
603
+ Run the relevant checks before executing any delete.
604
+
605
+ 17. **Location-scoped deletes take LOCATION_ID as the FIRST argument** — `wxcli hunt-group delete --force LOCATION_ID HG_ID`, not `wxcli hunt-group delete --force HG_ID`. This applies to all location-scoped features: hunt-group, auto-attendant, call-queue, paging-group, call-park, call-pickup, location-voicemail, location-schedules.
606
+ 17. **Always use `--force` for programmatic deletes** — Without `--force`, delete commands prompt `[y/N]` which blocks non-interactive execution.
607
+ 18. **Agent/member format differs by feature type.** Hunt Groups and Call Queues take `agents` as `[{"id": "person_id"}]` (array of objects). Call Pickups take `agents` as `["person_id"]` (plain string array). Paging Groups take `targets`/`originators` as plain string arrays. Using the wrong format returns 400 "Invalid field value". Always check `docs/reference/call-features-additional.md` if unsure.
608
+ 19. **Call Parks and Call Pickups require location for listing.** `wxcli call-park list` and `wxcli call-pickup list` without a location argument return empty. Must pass `LOCATION_ID` as first positional arg: `wxcli call-park list LOCATION_ID -o json`.
609
+ 20. **Cross-skill handoffs:**
610
+ - CX Essentials configuration → `customer-assist` skill (screen pop, wrap-up, recording, supervisors)
611
+ - Person/workspace call settings → `manage-call-settings` skill (voicemail, forwarding, DND, etc.)
612
+ - Routing (trunks, dial plans, PSTN) → `configure-routing` skill
613
+ - Device provisioning → `manage-devices` skill
614
+ - Location teardown → `provision-calling` skill (Operation D: Teardown)
615
+
616
+ ---
617
+
618
+ ## Context Compaction Recovery
619
+
620
+ If context compacts mid-execution, recover by:
621
+ 1. Read the deployment plan from `docs/plans/` to recover what was planned
622
+ 2. Check what's already been created: run the relevant `list` commands
623
+ 3. Resume from the first incomplete step