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,757 @@
1
+ ---
2
+ name: manage-call-settings
3
+ description: |
4
+ Configure person-level and workspace-level call settings in Webex Calling.
5
+ Covers 39+ settings organized into categories: call handling, voicemail & media,
6
+ permissions, and behavior & devices. Includes phone number add/remove/reassign,
7
+ executive-assistant delegation, hoteling, shared line appearance, simultaneous ring,
8
+ sequential ring, single number reach, receptionist client, and workspace hoteling.
9
+ Use when the user wants to read, change, or audit call settings for one or more
10
+ users/workspaces.
11
+ allowed-tools: Read, Grep, Glob, Bash
12
+ argument-hint: [person-email-or-workspace-name]
13
+ ---
14
+
15
+ <!-- Updated by playbook session 2026-04-23 -->
16
+
17
+ # Manage Call Settings Workflow
18
+
19
+ **Checkpoint — do NOT proceed until you can answer these:**
20
+ 1. What are the two path families for person call settings, and which is newer? (Answer: `/people/{id}/features/{feature}` is classic; `/telephony/config/people/{id}/{feature}` is newer. Some setting names differ between them.)
21
+ 2. What happens when you use `/telephony/config/workspaces/{id}/` settings on a Basic-licensed workspace? (Answer: 405 "Invalid Professional Place" — only `musicOnHold` and `doNotDisturb` work on Basic. Use `/workspaces/{id}/features/` path for Basic workspaces.)
22
+ 3. What wxcli command group handles org/location call recording? (Answer: `call-recording`, NOT `location-settings`. Run `wxcli call-recording --help` to confirm.)
23
+
24
+ If you cannot answer all three, you skipped reading this skill. Go back and read it.
25
+
26
+ **MANDATORY: Before including ANY wxcli command in your plan, verify it exists.** Run `wxcli <group> --help` to confirm the command group exists and list its commands. If you cannot run `--help` (e.g., plan-only mode), use ONLY commands listed in the Quick Recipes section below. Do NOT construct command names from reference doc titles or API concepts — the CLI group names often differ from the API concept names (e.g., location recording config uses `wxcli call-recording`, NOT `wxcli location-settings`).
27
+
28
+ ## Quick Recipes — Use These Exact Commands
29
+
30
+ **These are the authoritative command names. Use them exactly as shown. Do NOT construct command names from reference doc terminology.**
31
+
32
+ ### Recording setup (3-level prerequisite chain)
33
+ ```bash
34
+ wxcli call-recording show -o json # 1. Org-level recording vendor
35
+ wxcli call-recording list-vendors -o json # 2. Per-location vendor assignment
36
+ wxcli user-settings show-call-recording PERSON_ID -o json # 3. Person recording
37
+ wxcli user-settings update-call-recording PERSON_ID --json-body '{"enabled": true, "record": "Always"}'
38
+ ```
39
+
40
+ ### Voicemail transcription (location-scoped — affects ALL users at location)
41
+ ```bash
42
+ wxcli location-voicemail show LOCATION_ID -o json # Location voicemail policy
43
+ wxcli location-voicemail update LOCATION_ID --json-body '{"voiceMessageTranscriptionEnabled": true}'
44
+ wxcli user-settings update-voicemail PERSON_ID --json-body '{"enabled": true, "emailCopyOfMessage": {"enabled": true, "emailId": "user@example.com"}}'
45
+ ```
46
+
47
+ ### Voicemail self-service (user-level OAuth — Phase 5)
48
+ ```bash
49
+ wxcli call-settings-for-me-phase-5 show -o json # Show own voicemail settings
50
+ wxcli call-settings-for-me-phase-5 update --json-body '{"enabled": true, "sendUnansweredCalls": {"enabled": true, "numberOfRings": 6}}'
51
+ wxcli call-settings-for-me-phase-5 show-rules -o json # Show voicemail PIN rules
52
+ wxcli call-settings-for-me-phase-5 update-pin --json-body '{"pin": "123456"}' # Reset/change voicemail PIN
53
+ ```
54
+ - Requires **user-level OAuth** token (`spark:people_read` / `spark:people_write`). Admin tokens will not work.
55
+ - These are `/people/me/` endpoints — the authenticated user configures their own settings.
56
+
57
+ ### Hoteling self-service (user-level OAuth — Phase 5)
58
+ ```bash
59
+ wxcli call-settings-for-me-phase-5 show-guest -o json # Show own hoteling guest settings
60
+ wxcli call-settings-for-me-phase-5 update-guest --json-body '{"enabled": true}' # Enable self as hoteling guest
61
+ wxcli call-settings-for-me-phase-5 list -o json # List available hoteling hosts
62
+ ```
63
+ - Requires **user-level OAuth** token. Admin tokens will not work.
64
+ - The admin path for hoteling guest is `wxcli user-settings update-hoteling PERSON_ID`. Use the self-service path when the user is configuring their own hoteling.
65
+
66
+ ### Call forwarding (PUT replaces entire object — read first, carry ALL blocks)
67
+ ```bash
68
+ wxcli user-settings show-call-forwarding PERSON_ID -o json
69
+ wxcli user-settings update-call-forwarding PERSON_ID --json-body '{
70
+ "always": {"enabled": false},
71
+ "busy": {"enabled": true, "destination": "+15551234567", "destinationVoicemailEnabled": false},
72
+ "noAnswer": {"enabled": false, "numberOfRings": 3},
73
+ "businessContinuity": {"enabled": false}
74
+ }'
75
+ ```
76
+ Note: 4 blocks (always, busy, noAnswer, businessContinuity). selectiveForward is a SEPARATE API.
77
+
78
+ ### Workspace hoteling
79
+ ```bash
80
+ wxcli device-settings update-devices-workspaces WORKSPACE_ID --enabled # Enable workspace hoteling host
81
+ wxcli user-settings update-hoteling PERSON_ID --json-body '{"enabled": true}' # Person hoteling guest (simple toggle)
82
+ ```
83
+ - Workspace hoteling host requires **Professional** workspace license (Basic returns 405).
84
+ - Supports `--limit-guest-use` + `--guest-hours-limit N` for time-limited guest sessions.
85
+ - Guest users must ALSO have person-level hoteling enabled (`user-settings update-hoteling`) to sign in.
86
+
87
+ ### Receptionist client
88
+ ```bash
89
+ wxcli user-settings list-reception PERSON_ID -o json
90
+ wxcli user-settings update-reception PERSON_ID --json-body '{"receptionEnabled": true, "monitoredMembers": ["ID1", "ID2"]}'
91
+ ```
92
+ - API path is `/features/reception` (NOT `/features/receptionist`). Person-level only — no workspace equivalent.
93
+ - `receptionEnabled` must be `true` if `monitoredMembers` is non-empty.
94
+ - Max 50 monitored members. Members can be person or workspace IDs.
95
+
96
+ ### SimRing for persons (admin-configurable)
97
+ ```bash
98
+ wxcli user-settings list-simultaneous-ring PERSON_ID -o json
99
+ wxcli user-settings update-simultaneous-ring PERSON_ID --enabled --json-body '{"enabled":true,"phoneNumbers":[{"phoneNumber":"+15551234567"}]}'
100
+ wxcli user-settings create-criteria-simultaneous-ring PERSON_ID --json-body '{"name":"After hours","phoneNumbers":["+15551234567"]}'
101
+ wxcli user-settings show-criteria-simultaneous-ring PERSON_ID ID -o json
102
+ wxcli user-settings update-criteria-simultaneous-ring PERSON_ID ID --json-body '{"enabled":true}'
103
+ wxcli user-settings delete-criteria-simultaneous-ring PERSON_ID ID
104
+ ```
105
+ - Person SimRing now has an admin path via `user-settings` — `list-simultaneous-ring` / `update-simultaneous-ring` configure the base setting (enabled, do-not-ring-if-on-call, numbers); the `criteria-simultaneous-ring` commands manage schedule-based ring criteria.
106
+ - **Workspace SimRing is also admin-configurable:** `wxcli workspace-settings list-simultaneous-ring WORKSPACE_ID` and `update-simultaneous-ring` exist. Use those for workspaces instead of the `user-settings` commands.
107
+ - SNR (`single-number-reach`) remains a valid alternative for the desk + mobile ring-simultaneously use case, but it is no longer the only admin-configurable option for person SimRing:
108
+ ```bash
109
+ wxcli single-number-reach list-single-number-reach PERSON_ID -o json
110
+ wxcli single-number-reach create PERSON_ID --phone-number "+15551234567" --enabled --name "Mobile"
111
+ ```
112
+
113
+ ### Executive-assistant pairing (3-step process)
114
+ ```bash
115
+ # Step 1: Assign roles
116
+ wxcli user-settings update-executive-assistant EXEC_ID --json-body '{"type": "EXECUTIVE"}'
117
+ wxcli user-settings update-executive-assistant ASST_ID --json-body '{"type": "EXECUTIVE_ASSISTANT"}'
118
+ # Step 2: Link the assistant to the executive
119
+ wxcli user-settings update-assigned-assistants EXEC_ID --json-body '{"assistantIds": ["ASST_ID"]}'
120
+ # Step 3: Verify both sides
121
+ wxcli user-settings show-executive-assistant EXEC_ID -o json
122
+ wxcli user-settings list-assigned-assistants EXEC_ID -o json
123
+ ```
124
+ - Both users require **Professional** Calling license (Basic does not support exec-asst).
125
+ - Type assignment uses `people_write` scope; assigned-assistants linkage uses `telephony_config_write` scope.
126
+ - Rollback: set both to `--type UNASSIGNED` (auto-unlinks).
127
+
128
+ ### Command group mapping (do NOT guess — use this table)
129
+ | Setting domain | wxcli group | NOT this group |
130
+ |---------------|-------------|----------------|
131
+ | Org call recording | `call-recording` | ~~location-settings~~ |
132
+ | Location voicemail | `location-voicemail` | ~~location-settings~~ |
133
+ | Person settings | `user-settings` | — |
134
+ | Workspace settings | `workspace-settings` | — |
135
+ | Workspace hoteling | `device-settings` | ~~workspace-settings~~ |
136
+ | Self-service voicemail/hoteling (Phase 5) | `call-settings-for-me-phase-5` | ~~my-call-settings~~ |
137
+
138
+ ---
139
+
140
+ ## Step 1: Load references (only what you need)
141
+
142
+ Load ONLY the reference docs relevant to the user's specific request. Do NOT load all 4 by default.
143
+
144
+ | If the request involves... | Load this doc |
145
+ |---------------------------|---------------|
146
+ | Forwarding, DND, call waiting, sim ring, SNR | `docs/reference/person-call-settings-handling.md` |
147
+ | Voicemail, caller ID, recording, intercept, monitoring | `docs/reference/person-call-settings-media.md` |
148
+ | Permissions, executive/assistant, feature access | `docs/reference/person-call-settings-permissions.md` |
149
+ | Hoteling, receptionist, calling behavior, numbers | `docs/reference/person-call-settings-behavior.md` |
150
+ | Self-service settings (user-level OAuth) | `docs/reference/self-service-call-settings.md` |
151
+
152
+ **For recording + voicemail scenarios:** Load `person-call-settings-media.md` only. The location-level recording commands are in the Quick Recipes above — you do NOT need to load any location-settings docs.
153
+
154
+ ## Step 2: Verify auth token
155
+
156
+ Before any API calls, confirm the user's auth token is working:
157
+
158
+ ```bash
159
+ wxcli whoami
160
+ ```
161
+
162
+ Check the token has the required scopes for the target operation.
163
+
164
+ ### Required Scopes by Operation Type
165
+
166
+ | Scope | Grants |
167
+ |-------|--------|
168
+ | `spark-admin:people_read` | Read any person's call settings (admin) |
169
+ | `spark-admin:people_write` | Modify any person's call settings (admin) |
170
+ | `spark:people_read` | Read own call settings (self) |
171
+ | `spark:people_write` | Modify own call settings (self) |
172
+ | `spark-admin:telephony_config_read` | Read telephony config (SNR, MoH, App Services, ECBN, Numbers, Feature Access, Executive, etc.) |
173
+ | `spark-admin:telephony_config_write` | Modify telephony config |
174
+ | `spark-admin:workspaces_read` | Read workspace settings (outgoing permissions transfer numbers, access codes, call policy) |
175
+ | `spark-admin:workspaces_write` | Modify workspace settings |
176
+
177
+ ### Which Settings Use Which Scopes
178
+
179
+ | `people_read/write` | `telephony_config_read/write` | `workspaces_read/write` |
180
+ |---------------------|-------------------------------|------------------------|
181
+ | Forwarding | Single Number Reach | Outgoing Permissions — Transfer Numbers |
182
+ | Call Waiting | Music on Hold | Outgoing Permissions — Access Codes |
183
+ | DND | Voicemail (passcode only) | Call Policy |
184
+ | Voicemail (main) | App Services (read) | |
185
+ | Caller ID | App Shared Line | |
186
+ | ~~Anon Call Rejection~~ *(user-only)* | Feature Access Controls | |
187
+ | Privacy | Executive Settings | |
188
+ | Barge-In | Numbers (update) | |
189
+ | Call Recording | Available Numbers | |
190
+ | Call Intercept | Preferred Answer | |
191
+ | Monitoring | MS Teams | |
192
+ | Push-to-Talk | Mode Management | |
193
+ | Incoming Permissions | Personal Assistant | |
194
+ | Outgoing Permissions (main) | ECBN | |
195
+ | Exec Assistant Type | Digit Patterns | |
196
+ | Calling Behavior | | |
197
+ | Call Bridge | | |
198
+ | Hoteling | | |
199
+ | Receptionist | | |
200
+ | Numbers (read) | | |
201
+
202
+ **Self-service scopes:** `call-settings-for-me-phase-5` commands use `spark:people_read` / `spark:people_write` (user-level, NOT admin). These are the same scopes as `my-call-settings`.
203
+
204
+ ### Scope Verification Logic
205
+
206
+ 1. Determine target type: **Person** needs `people_*` scopes; **Workspace** needs `workspaces_*` scopes
207
+ 2. Determine operation: **Read** needs `*_read`; **Write** needs `*_write`
208
+ 3. Check if the setting uses `telephony_config` scopes (see table above) — if so, verify those are present too
209
+ 4. **Self-service commands** (`call-settings-for-me-phase-5`, `my-call-settings`): require user-level `spark:people_*` scopes, NOT admin scopes
210
+ 5. If `wxcli whoami` does not show the required scopes, stop and tell the user which scopes are missing before proceeding
211
+
212
+ ## Step 3: Identify the operation
213
+
214
+ Confirm with the user:
215
+
216
+ - **Target type:** Person or Workspace?
217
+ - **Target identifier:** Email address (person) or workspace name (workspace)?
218
+ - **Scope:** Single target, a list, or all users at a location?
219
+
220
+ ### Look up a person
221
+
222
+ ```bash
223
+ wxcli users list --email user@example.com --output json
224
+ ```
225
+
226
+ Extract the `id` field from the JSON output to use as `PERSON_ID` in subsequent commands.
227
+
228
+ ### Look up a workspace
229
+
230
+ ```bash
231
+ wxcli workspaces list --output json
232
+ ```
233
+
234
+ Filter by display name in the output. Extract the `id` field to use as `WORKSPACE_ID`.
235
+
236
+ ### For bulk operations (all calling users)
237
+
238
+ ```bash
239
+ # List all users, then filter for calling-enabled users (those with a locationId)
240
+ wxcli users list --output json
241
+ ```
242
+
243
+ For small batches, use a shell loop. For large batches (50+ users), use the migration engine's async pattern which handles concurrency, rate limiting, and retry automatically.
244
+
245
+ ### Settings Catalog
246
+
247
+ ### Settings Scope Router
248
+
249
+ **Before attempting any settings command, determine the correct scope.** The same setting often exists at multiple levels with different command groups.
250
+
251
+ #### Quick router: "Who/what am I configuring?"
252
+
253
+ | Target | Command group | Scope prefix | Example |
254
+ |--------|--------------|-------------|---------|
255
+ | A specific **person** | `wxcli user-settings` | `spark-admin:people_read/write` | `wxcli user-settings show-voicemail PERSON_ID` |
256
+ | A specific **workspace** | `wxcli workspace-settings` | `spark-admin:workspaces_read/write` | `wxcli workspace-settings show-voicemail WORKSPACE_ID` |
257
+ | All people/workspaces at a **location** | `wxcli location-voicemail` / `wxcli location-settings` | `spark-admin:telephony_config_read/write` | `wxcli location-voicemail show LOCATION_ID` |
258
+ | **Org-wide** recording vendor | `wxcli call-recording` | `spark-admin:telephony_config_read/write` | `wxcli call-recording show` |
259
+ | **Self** (own settings) | `wxcli my-call-settings` or `wxcli call-settings-for-me-phase-5` | `spark:people_read/write` | `wxcli call-settings-for-me-phase-5 show` |
260
+
261
+ #### Multi-scope settings — which command for what?
262
+
263
+ | Setting | Person | Workspace | Location | Org | Self-Service |
264
+ |---------|--------|-----------|----------|-----|-------------|
265
+ | **Voicemail** | `user-settings show-voicemail PERSON_ID` | `workspace-settings show-voicemail WS_ID` | `location-voicemail show LOC_ID` (policies) | — | `call-settings-for-me-phase-5 show` |
266
+ | **Voicemail PIN** | `user-settings reset-voicemail-pin PERSON_ID` | — | — | — | `call-settings-for-me-phase-5 update-pin` |
267
+ | **Voicemail PIN Rules** | — | — | — | — | `call-settings-for-me-phase-5 show-rules` |
268
+ | **Call Recording** | `user-settings show-call-recording PERSON_ID` | `workspace-settings show-call-recordings WS_ID` | — | `call-recording show` (vendor config) | — |
269
+ | **Music on Hold** | SDK only (telephony_config) | SDK only | `location-settings` (must enable first) | — | — |
270
+ | **Call Intercept** | `user-settings show-intercept PERSON_ID` | `workspace-settings show-intercept WS_ID` | Location defaults apply | — | — |
271
+ | **Call Forwarding** | `user-settings show-call-forwarding PERSON_ID` | `workspace-settings show-call-forwarding WS_ID` | — | — | — |
272
+ | **Hoteling Guest** | `user-settings show-hoteling PERSON_ID` | — | — | — | `call-settings-for-me-phase-5 show-guest` |
273
+ | **Hoteling Hosts** | — | — | — | — | `call-settings-for-me-phase-5 list` |
274
+
275
+ #### User-only settings (no admin endpoint — 404 guaranteed)
276
+
277
+ These 5 settings exist ONLY at `/people/me/settings/{feature}`. Admin tokens **always** get 404. With a **user-level OAuth token**, use `wxcli my-call-settings` (120 commands covering all self-service `/people/me/` endpoints including these 5). Without user-level OAuth, the user must configure these via the Webex app.
278
+
279
+ **Simultaneous Ring is no longer in this table** — it now has an admin path via `user-settings list-simultaneous-ring` / `update-simultaneous-ring` (plus `*-criteria-simultaneous-ring` for schedule-based criteria). See the SimRing recipe above.
280
+
281
+ | Setting | Self-service path | CLI group | Workspace equivalent? |
282
+ |---------|-------------------|-----------|----------------------|
283
+ | Sequential Ring | `/me/settings/sequentialRing` | `my-call-settings` | No |
284
+ | Priority Alert | `/me/settings/priorityAlert` | `my-call-settings` | No |
285
+ | Call Notify | `/me/settings/callNotify` | `my-call-settings` | No |
286
+ | Anonymous Call Reject | `/me/settings/anonymousCallReject` | `my-call-settings` | **Yes:** `workspace-settings` has admin endpoint |
287
+ | Call Policies | `/me/settings/callPolicies` | `my-call-settings` | **Yes:** workspace-level admin endpoint (Professional license required) |
288
+
289
+ **Phase 5 self-service commands** (`call-settings-for-me-phase-5`): These are NOT user-only — they have admin-path equivalents (`user-settings show-voicemail`, `user-settings update-hoteling`, `user-settings reset-voicemail-pin`). The Phase 5 group provides the self-service path for users to manage their own voicemail and hoteling settings with a user-level token. Route to this group when the user is configuring their own settings rather than an admin configuring someone else's.
290
+
291
+ **If the user asks to configure one of these for a person:** Stop and explain that no admin API exists. Offer the workspace-level alternative if applicable, or inform them the user must self-configure.
292
+
293
+ Present the user with the settings categories. Ask which settings they want to read or change.
294
+
295
+ #### Category 1: Call Handling
296
+
297
+ | Setting | CLI Command (show) | CLI Command (update) | Notes |
298
+ |---------|-------------------|---------------------|-------|
299
+ | Call Forwarding | `show-call-forwarding` | `update-call-forwarding` | Always, Busy, No-Answer, Business Continuity |
300
+ | Call Waiting | `show-call-waiting` | `update-call-waiting` | Simple on/off toggle |
301
+ | Do Not Disturb | `show-do-not-disturb` | `update-do-not-disturb` | Includes ring splash, Webex Go override |
302
+ | Simultaneous Ring | `list-simultaneous-ring` | `update-simultaneous-ring` | Admin-configurable via `user-settings`; `*-criteria-simultaneous-ring` commands manage schedule-based criteria |
303
+ | Sequential Ring | — | — | **USER-ONLY: No admin endpoint. Requires user-level OAuth via `/me/settings/sequentialRing`** |
304
+ | Single Number Reach | `wxcli single-number-reach` group | `wxcli single-number-reach` group | Uses `telephony_config` scopes, not `people` scopes |
305
+ | Selective Accept | — | — | Criteria managed via separate CRUD methods (SDK only) |
306
+ | Selective Forward | — | — | Takes precedence over standard forwarding |
307
+ | Selective Reject | — | — | Highest priority of the selective features |
308
+ | Priority Alert | — | — | **USER-ONLY: No admin endpoint. Requires user-level OAuth via `/me/settings/priorityAlert`** |
309
+ | Call Notify | — | — | **USER-ONLY: No admin endpoint. Requires user-level OAuth via `/me/settings/callNotify`** |
310
+
311
+ #### Category 2: Voicemail & Media
312
+
313
+ | Setting | CLI Command (show) | CLI Command (update) | Notes |
314
+ |---------|-------------------|---------------------|-------|
315
+ | Voicemail | `show-voicemail` | `update-voicemail` | Inherits from location; greeting uploads via `configure-busy-voicemail`, `configure-no-answer` |
316
+ | Voicemail (self-service) | `call-settings-for-me-phase-5 show` | `call-settings-for-me-phase-5 update` | User-level OAuth only. User manages own voicemail settings |
317
+ | Voicemail PIN Rules | `call-settings-for-me-phase-5 show-rules` | — | User-level OAuth only. Read-only PIN policy |
318
+ | Voicemail PIN Reset | — | `call-settings-for-me-phase-5 update-pin` | User-level OAuth only. User resets own PIN |
319
+ | Caller ID | `list` | `update-caller-id-features` | |
320
+ | Anonymous Call Rejection | — | — | **USER-ONLY: No admin endpoint. Requires user-level OAuth via `/me/settings/anonymousCallReject`; workspace-level uses `workspaces/{id}/anonymousCallReject`** |
321
+ | Privacy | `list-privacy` | `update-privacy` | Controls line monitoring, AA extension/name dialing |
322
+ | Barge-In | `show-barge-in` | `update-barge-in` | Enables FAC-based barge-in across locations |
323
+ | Call Recording | `show-call-recording` | `update-call-recording` | **Read scope is `people_read` not `people_write` (SDK doc bug)**; inherits from location recording vendor config |
324
+ | Call Intercept | `show-intercept` | `update-intercept` | Takes phone out of service; greeting upload via `configure-call-intercept` |
325
+ | Monitoring | `list-monitoring` | `update-monitoring` | Max 50 monitored elements (people, places, call park extensions) |
326
+ | Push-to-Talk | `list-push-to-talk` | `update-push-to-talk` | One-way or two-way intercom; allow/block member lists |
327
+ | Music on Hold | — | — | **Requires location-level MoH enabled first**; uses `telephony_config` scopes (SDK only for now) |
328
+
329
+ #### Category 3: Permissions
330
+
331
+ | Setting | CLI Command (show) | CLI Command (update) | Notes |
332
+ |---------|-------------------|---------------------|-------|
333
+ | Incoming Permissions | `show-incoming-permission` | `update-incoming-permission` | External transfer, internal calls, collect calls |
334
+ | Outgoing Permissions | `list-outgoing-permission` | `update-outgoing-permission` | Per-call-type (local, toll, international, etc.) |
335
+ | Feature Access Controls | — | — | Controls what users can self-modify (SDK only for now) |
336
+ | Executive/Assistant | `show-executive-assistant` | `update-executive-assistant` | UNASSIGNED, EXECUTIVE, or EXECUTIVE_ASSISTANT |
337
+ | Call Policy | — | — | **USER-ONLY for persons (via `/me/settings/callPolicies`); workspace-only at admin level (`workspaces/{id}/features/callPolicies`, professional license required)** |
338
+
339
+ #### Category 4: Behavior & Devices
340
+
341
+ | Setting | CLI Command (show) | CLI Command (update) | Notes |
342
+ |---------|-------------------|---------------------|-------|
343
+ | Calling Behavior | `show-calling-behavior` | `update-calling-behavior` | Which Webex telephony app handles calls |
344
+ | App Services | `show` | `update` | Client platforms (browser, desktop, tablet, mobile) and ring behavior |
345
+ | Hoteling | `show-hoteling` | `update-hoteling` | Person-level only (admin path). **Workspace hoteling:** use `wxcli device-settings update-devices-workspaces WORKSPACE_ID --enabled` |
346
+ | Hoteling (self-service) | `call-settings-for-me-phase-5 show-guest` | `call-settings-for-me-phase-5 update-guest` | User-level OAuth only. User manages own hoteling guest settings |
347
+ | Available Hoteling Hosts | `call-settings-for-me-phase-5 list` | — | User-level OAuth only. Lists hosts the user can sign into |
348
+ | Receptionist Client | `list-reception` | `update-reception` | `receptionEnabled` must be `true` if members set. Path: `/features/reception` (NOT receptionist) |
349
+ | Numbers | `list-numbers` | — | Primary + alternate numbers; distinctive ring patterns |
350
+ | Preferred Answer Endpoint | — | — | Which device/app answers by default (SDK only for now) |
351
+ | MS Teams | — | — | HIDE_WEBEX_APP, PRESENCE_SYNC (SDK only for now) |
352
+ | Mode Management | — | — | Operating mode assignments (SDK only for now) |
353
+ | Personal Assistant | — | — | Away status, transfer, alerting (SDK only for now) |
354
+ | Emergency Callback Number | — | — | DIRECT_LINE, LOCATION_ECBN, or LOCATION_MEMBER_NUMBER (SDK only for now) |
355
+
356
+ All CLI commands above are under `wxcli user-settings` unless otherwise noted. Run `wxcli user-settings --help` to see the full list. Self-service commands use `wxcli call-settings-for-me-phase-5` (run `wxcli call-settings-for-me-phase-5 --help` to see all 7 commands).
357
+
358
+ ### Settings without CLI commands ("SDK only")
359
+
360
+ **6 USER-ONLY settings (no admin endpoint — require user-level OAuth token):**
361
+ SimRing, SequentialRing, PriorityAlert, CallNotify, AnonymousCallReject, CallPolicies (person-level).
362
+ These ONLY work at `/telephony/config/people/me/settings/{feature}` with a user token. Admin tokens get 404.
363
+
364
+ For other settings marked "SDK only" above (Music on Hold, Feature Access Controls, Preferred Answer, MS Teams, Mode Management, Personal Assistant, ECBN), use the raw HTTP fallback pattern with an **admin** token:
365
+
366
+ ```bash
367
+ # Read the current setting value
368
+ curl -s -H "Authorization: Bearer $TOKEN" \
369
+ "https://webexapis.com/v1/telephony/config/people/{person_id}/{settingEndpoint}" | python3 -m json.tool
370
+
371
+ # Update via PUT (read-modify-write)
372
+ curl -s -X PUT -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
373
+ "https://webexapis.com/v1/telephony/config/people/{person_id}/{settingEndpoint}" \
374
+ -d '{ ... }'
375
+ ```
376
+
377
+ Consult `docs/reference/person-call-settings-handling.md` (SimRing, SeqRing, Priority Alert, Selective features) or `docs/reference/person-call-settings-behavior.md` (ECBN, Mode Management, MS Teams, Personal Assistant, Preferred Answer) for the exact endpoint paths, required fields, and gotchas for each setting.
378
+
379
+ ## Step 4: Check prerequisites
380
+
381
+ ### 4a. Read current settings — always do this first
382
+
383
+ **CRITICAL: Always read the current value of any setting before proposing a change.** This prevents accidental overwrites and gives the user a clear before/after comparison.
384
+
385
+ #### Pattern for simple settings
386
+
387
+ ```bash
388
+ # Call Waiting
389
+ wxcli user-settings show-call-waiting PERSON_ID --output json
390
+ ```
391
+
392
+ #### Pattern for object settings
393
+
394
+ ```bash
395
+ # Call Forwarding (always, busy, no-answer, business continuity)
396
+ wxcli user-settings show-call-forwarding PERSON_ID --output json
397
+ ```
398
+
399
+ #### Pattern for settings with sub-components
400
+
401
+ ```bash
402
+ # Voicemail (many nested fields)
403
+ wxcli user-settings show-voicemail PERSON_ID --output json
404
+
405
+ # DND (enabled + ring splash)
406
+ wxcli user-settings show-do-not-disturb PERSON_ID --output json
407
+ ```
408
+
409
+ #### Reading multiple settings at once
410
+
411
+ For a full audit, read all relevant settings and review the JSON output:
412
+
413
+ ```bash
414
+ # Read several settings for the same person
415
+ wxcli user-settings show-call-waiting PERSON_ID --output json
416
+ wxcli user-settings show-do-not-disturb PERSON_ID --output json
417
+ wxcli user-settings show-hoteling PERSON_ID --output json
418
+ wxcli user-settings show-call-forwarding PERSON_ID --output json
419
+ wxcli user-settings show-voicemail PERSON_ID --output json
420
+ wxcli user-settings show-caller-id PERSON_ID --output json
421
+ wxcli user-settings list-privacy PERSON_ID --output json
422
+ wxcli user-settings show-barge-in PERSON_ID --output json
423
+ ```
424
+
425
+ #### Reading self-service settings (user-level OAuth)
426
+
427
+ ```bash
428
+ # Read own voicemail settings
429
+ wxcli call-settings-for-me-phase-5 show --output json
430
+
431
+ # Read own hoteling guest settings
432
+ wxcli call-settings-for-me-phase-5 show-guest --output json
433
+
434
+ # Check voicemail PIN rules
435
+ wxcli call-settings-for-me-phase-5 show-rules --output json
436
+
437
+ # List available hoteling hosts
438
+ wxcli call-settings-for-me-phase-5 list --output json
439
+ ```
440
+
441
+ ### 4b. Check for location-level dependencies
442
+
443
+ Use the exact commands from the Quick Recipes section. Key prerequisites:
444
+
445
+ | Setting | Verify command | Fix command |
446
+ |---------|----------------|-------------|
447
+ | Call Recording (org) | `wxcli call-recording show -o json` | `wxcli call-recording update --json-body '{...}'` |
448
+ | Call Recording (location vendor) | `wxcli call-recording list-vendors -o json` | `wxcli call-recording update-vendor-call-recording LOC_ID --json-body '{...}'` |
449
+ | Voicemail transcription | `wxcli location-voicemail show LOC_ID -o json` | `wxcli location-voicemail update LOC_ID --json-body '{...}'` |
450
+ | Music on Hold | No wxcli command — use Control Hub or SDK | — |
451
+
452
+ **Do NOT use `location-settings` for recording or voicemail.** That group handles dial patterns only.
453
+
454
+ ### 4c. Verify scope coverage
455
+
456
+ Cross-reference the settings the user wants to change against the scopes table in Step 2. If any required scopes are missing from the token, stop and inform the user before building the plan.
457
+
458
+ ## Step 5: Build and present deployment plan -- [SHOW BEFORE EXECUTING]
459
+
460
+ **CRITICAL: Always show the plan and get user confirmation before making changes.**
461
+
462
+ Format the plan as a table:
463
+
464
+ ```
465
+ ## Deployment Plan for: Jane Smith (jane@company.com)
466
+
467
+ | Setting | Current Value | New Value | Impact |
468
+ |---------|--------------|-----------|--------|
469
+ | Call Forwarding (Always) | Disabled | Enabled -> +12025551234 | All calls forwarded |
470
+ | DND | Disabled | Enabled (ring splash: on) | All callers get busy |
471
+ | Voicemail (rings) | 3 | 6 | More time before VM |
472
+
473
+ Affected scopes required: spark-admin:people_write
474
+
475
+ Proceed? (y/n)
476
+ ```
477
+
478
+ ## Step 6: Execute via wxcli — `[After user confirms plan]`
479
+
480
+ ### 6a. Execute individual changes
481
+
482
+ #### Pattern: Simple toggle
483
+
484
+ ```bash
485
+ # Enable Call Waiting
486
+ wxcli user-settings update-call-waiting PERSON_ID --json-body '{"enabled": true}'
487
+ ```
488
+
489
+ #### Pattern: Object-based settings
490
+
491
+ ```bash
492
+ # Enable DND with ring splash
493
+ wxcli user-settings update-do-not-disturb PERSON_ID --json-body '{"enabled": true, "ringSplashEnabled": true}'
494
+ ```
495
+
496
+ #### Pattern: Complex nested settings (read first, modify fields, write back)
497
+
498
+ ```bash
499
+ # 1. Read current forwarding — capture ALL 4 blocks
500
+ wxcli user-settings show-call-forwarding PERSON_ID --output json
501
+ # 2. PUT replaces entire object — include ALL blocks, modify only target
502
+ wxcli user-settings update-call-forwarding PERSON_ID --json-body '{
503
+ "always": {"enabled": false},
504
+ "busy": {"enabled": true, "destination": "+15551234567", "destinationVoicemailEnabled": false},
505
+ "noAnswer": {"enabled": false, "numberOfRings": 3},
506
+ "businessContinuity": {"enabled": false}
507
+ }'
508
+ ```
509
+ Forwarding has 4 blocks: always, busy, noAnswer, businessContinuity. selectiveForward is a SEPARATE API.
510
+
511
+ #### Pattern: Voicemail configuration
512
+
513
+ ```bash
514
+ # Update voicemail settings
515
+ wxcli user-settings update-voicemail PERSON_ID --json-body '{
516
+ "enabled": true,
517
+ "sendUnansweredCalls": {
518
+ "enabled": true,
519
+ "numberOfRings": 6
520
+ }
521
+ }'
522
+
523
+ # Upload voicemail greetings (json-body only — no --file flag)
524
+ wxcli user-settings configure-busy-voicemail PERSON_ID --json-body '{"type": "CUSTOM", ...}'
525
+ wxcli user-settings configure-no-answer PERSON_ID --json-body '{"type": "CUSTOM", ...}'
526
+ ```
527
+
528
+ #### Pattern: Call intercept (take phone out of service)
529
+
530
+ ```bash
531
+ # Enable call intercept
532
+ wxcli user-settings update-intercept PERSON_ID --json-body '{
533
+ "enabled": true,
534
+ "incoming": {
535
+ "type": "INTERCEPT_ALL"
536
+ }
537
+ }'
538
+
539
+ # Upload intercept greeting (json-body only — no --file flag)
540
+ wxcli user-settings configure-call-intercept PERSON_ID --json-body '{"type": "CUSTOM", ...}'
541
+ ```
542
+
543
+ #### Pattern: Permissions
544
+
545
+ ```bash
546
+ # Update incoming permissions
547
+ wxcli user-settings update-incoming-permission PERSON_ID --json-body '{
548
+ "externalTransfer": "ALLOW_ALL_EXTERNAL",
549
+ "internalCallsEnabled": true,
550
+ "collectCallsEnabled": false
551
+ }'
552
+
553
+ # Update outgoing permissions
554
+ wxcli user-settings update-outgoing-permission PERSON_ID --json-body '{
555
+ "callingPermissions": [
556
+ {"callType": "INTERNATIONAL", "action": "BLOCK"}
557
+ ]
558
+ }'
559
+ ```
560
+
561
+ #### Pattern: Executive/Assistant pairing
562
+
563
+ ```bash
564
+ # Assign executive role
565
+ wxcli user-settings update-executive-assistant EXEC_PERSON_ID --json-body '{"type": "EXECUTIVE"}'
566
+
567
+ # Assign assistant role
568
+ wxcli user-settings update-executive-assistant ASST_PERSON_ID --json-body '{"type": "EXECUTIVE_ASSISTANT"}'
569
+ ```
570
+
571
+ #### Pattern: Workspace settings
572
+
573
+ Workspace settings mirror person settings but use the workspace-settings command group. Check available commands:
574
+
575
+ ```bash
576
+ wxcli workspace-settings --help
577
+ ```
578
+
579
+ #### Pattern: Schedules
580
+
581
+ Person-level schedules have full CRUD support:
582
+
583
+ ```bash
584
+ # List schedules
585
+ wxcli user-settings list-schedules PERSON_ID --output json
586
+
587
+ # Create a schedule
588
+ wxcli user-settings create PERSON_ID --json-body '{
589
+ "name": "Business Hours",
590
+ "type": "businessHours",
591
+ "events": []
592
+ }'
593
+
594
+ # Add an event to a schedule
595
+ wxcli user-settings create-events PERSON_ID SCHEDULE_ID --json-body '{
596
+ "name": "Weekdays",
597
+ "startDate": "2026-01-01",
598
+ "endDate": "2026-12-31",
599
+ "startTime": "09:00",
600
+ "endTime": "17:00",
601
+ "recurrence": {"recurWeekly": {"monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true}}
602
+ }'
603
+
604
+ # Show schedule detail
605
+ wxcli user-settings show-schedules PERSON_ID SCHEDULE_ID --output json
606
+
607
+ # Delete a schedule event (requires 4 positional args)
608
+ wxcli user-settings delete PERSON_ID SCHEDULE_TYPE SCHEDULE_ID EVENT_ID
609
+ ```
610
+
611
+ #### Pattern: Reset voicemail PIN
612
+
613
+ ```bash
614
+ wxcli user-settings reset-voicemail-pin PERSON_ID
615
+ ```
616
+
617
+ #### Pattern: Self-service voicemail and hoteling (user-level OAuth)
618
+
619
+ ```bash
620
+ # User updates own voicemail settings
621
+ wxcli call-settings-for-me-phase-5 update --json-body '{"enabled": true, "sendUnansweredCalls": {"enabled": true, "numberOfRings": 6}}'
622
+
623
+ # User resets own voicemail PIN
624
+ wxcli call-settings-for-me-phase-5 update-pin --json-body '{"pin": "123456"}'
625
+
626
+ # User enables self as hoteling guest
627
+ wxcli call-settings-for-me-phase-5 update-guest --json-body '{"enabled": true}'
628
+ ```
629
+
630
+ ### 6b. Bulk changes
631
+
632
+ #### Shell loop for small batches
633
+
634
+ ```bash
635
+ # Disable call waiting for a list of users
636
+ for ID in PERSON_ID_1 PERSON_ID_2 PERSON_ID_3; do
637
+ wxcli user-settings update-call-waiting "$ID" --json-body '{"enabled": false}'
638
+ done
639
+ ```
640
+
641
+ #### Bulk operations for large batches (50+ users)
642
+
643
+ For large batches, use shell loops with sleep for rate limiting, or reference the migration engine's async pattern for maximum throughput with concurrency control.
644
+
645
+ ```bash
646
+ # Example: disable call waiting for all users via shell loop
647
+ for USER_ID in $(wxcli people list --calling-data --output json | python3 -c "
648
+ import sys, json
649
+ for u in json.load(sys.stdin).get('items', []):
650
+ if u.get('locationId'): print(u['id'])
651
+ "); do
652
+ wxcli user-settings update-call-waiting "$USER_ID" --enabled false
653
+ sleep 1
654
+ ])
655
+ ```
656
+
657
+ ## Step 7: Verify — `[Read back after every update]`
658
+
659
+ Always read back the setting after writing to confirm the change took effect:
660
+
661
+ ```bash
662
+ # After updating call waiting
663
+ wxcli user-settings show-call-waiting PERSON_ID --output json
664
+
665
+ # After updating forwarding
666
+ wxcli user-settings show-call-forwarding PERSON_ID --output json
667
+
668
+ # After updating voicemail
669
+ wxcli user-settings show-voicemail PERSON_ID --output json
670
+
671
+ # After self-service voicemail update
672
+ wxcli call-settings-for-me-phase-5 show --output json
673
+
674
+ # After self-service hoteling update
675
+ wxcli call-settings-for-me-phase-5 show-guest --output json
676
+ ```
677
+
678
+ Compare the JSON output to the values you set. Flag any discrepancies.
679
+
680
+ ## Step 8: Report results
681
+
682
+ Summarize what was changed:
683
+
684
+ ```
685
+ ## Results for: Jane Smith (jane@company.com)
686
+
687
+ | Setting | Before | After | Status |
688
+ |---------|--------|-------|--------|
689
+ | Call Forwarding (Always) | Disabled | Enabled -> +12025551234 | Confirmed |
690
+ | DND | Disabled | Enabled (ring splash: on) | Confirmed |
691
+ | Voicemail (rings) | 3 | 6 | Confirmed |
692
+
693
+ All 3 changes applied successfully.
694
+ ```
695
+
696
+ ---
697
+
698
+ ## Critical Rules
699
+
700
+ - **Always read before writing** — never update a setting without first reading its current value via `wxcli user-settings show-*`
701
+ - **Always show plan before executing** — present the deployment plan (Step 5) and get user confirmation
702
+ - **Handle person vs workspace scope differences** — some scopes use `workspaces_read/write` instead of `people_read/write` (outgoing permissions transfer numbers, access codes, call policy)
703
+ - **Location-level prerequisites** — voicemail, recording, intercept, and MoH have location-level settings that must be configured first; person-level settings may be overridden or ineffective without them
704
+ - **SimRing, SequentialRing, PriorityAlert admin limitation** — these are not available via admin-level person management; use `wxcli my-call-settings` with user-level OAuth, or workspace-level commands where available
705
+ - **Self-service vs admin path** — for voicemail and hoteling, both admin (`user-settings`) and self-service (`call-settings-for-me-phase-5`) paths exist. Use admin path when configuring for another user; use self-service path when the user is configuring their own settings with a user-level token
706
+ - **Call Recording read scope bug** — the actual required scope is `people_read`, not `people_write` as some docs state
707
+ - **Selective feature precedence** — Selective Reject > Selective Accept > Selective Forward > Standard Forwarding
708
+ - **SNR uses telephony_config scopes** — Single Number Reach uses `spark-admin:telephony_config_read/write`, not `people_read/write`
709
+ - **MoH requires both location + person enabled** — `moh_location_enabled=true` AND `moh_enabled=true` for MoH to play; if either is false, no music plays
710
+ - **Numbers API split endpoints** — read uses `people/{id}/features/numbers`, update uses `telephony/config/people/{id}/numbers` (different paths)
711
+ - **Receptionist validation** — `enabled` must be `True` if `monitored_members` is set
712
+ - **Use --output json** — always pass `--output json` on show/list commands to get structured data for comparison and scripting
713
+ - **Run `wxcli user-settings --help`** — to discover all available commands and their exact names
714
+ - **Run `wxcli call-settings-for-me-phase-5 --help`** — to discover all 7 self-service commands
715
+
716
+ ---
717
+
718
+ ## Error Handling
719
+
720
+ When a wxcli command fails:
721
+
722
+ **A. Fix and retry** — If the error is a missing required field, wrong ID, or format issue:
723
+ 1. Read the full error message
724
+ 2. Run `wxcli <group> <command> --help` to check required flags
725
+ 3. Fix the command and retry
726
+
727
+ **B. Skip and continue** — If the error is non-blocking (e.g., setting already configured):
728
+ 1. Verify current state with the corresponding show/list command
729
+ 2. If already correct, skip and move to next setting
730
+
731
+ **C. Escalate** — If the error is unclear or persistent:
732
+ 1. Run with `--debug` to see the raw HTTP request/response
733
+ 2. Invoke `/wxc-calling-debug` for systematic diagnosis
734
+
735
+ Common errors:
736
+ - 400: Check required fields, verify IDs exist, check `--json-body` format
737
+ - 403: Check token scopes — some settings need `spark-admin:people_write`
738
+ - 404: Verify person/location ID is correct and has calling license
739
+ - 409: Resource already exists — GET current state before retrying
740
+
741
+ ### Settings-specific errors
742
+
743
+ - **404 on person settings (anonymousCallReject, sequentialRing, priorityAlert, callNotify, callPolicies):** These 5 settings have NO admin endpoint. Admin tokens always get 404. See the "User-only settings" table in Step 3. Offer the workspace-level alternative if applicable. (Simultaneous Ring is no longer in this list — it now has an admin path via `user-settings list-simultaneous-ring` / `update-simultaneous-ring`.)
744
+ - **404 on person settings (all others):** Verify the person has a Webex Calling license. Unlicensed users return 404 on all `/telephony/config/people/{id}/` endpoints.
745
+ - **405 "Invalid Professional Place" on workspace settings:** The workspace has a Basic license. Most `/telephony/config/workspaces/{id}/` settings require Professional. Only `musicOnHold` and `doNotDisturb` work on Basic. Use the `/workspaces/{id}/features/` path family for Basic workspaces (callForwarding, callWaiting, callerId, intercept, monitoring).
746
+ - **403 on Single Number Reach:** SNR uses `spark-admin:telephony_config_read/write` scopes, not `spark-admin:people_read/write`. Check token scopes.
747
+ - **Empty/no-effect on MoH:** Both location-level `moh_location_enabled` AND person-level `moh_enabled` must be `true`. If either is false, no music plays. Check both levels.
748
+ - **404 on `call-settings-for-me-phase-5` commands:** The authenticated user must have a Webex Calling license. These are `/people/me/` endpoints and require user-level OAuth tokens (`spark:people_read` / `spark:people_write`), not admin tokens.
749
+
750
+ ---
751
+
752
+ ## Context Compaction Recovery
753
+
754
+ If context compacts mid-execution, recover by:
755
+ 1. Read the deployment plan from `docs/plans/` to recover what was planned
756
+ 2. Check what's already been created: run the relevant `list` commands
757
+ 3. Resume from the first incomplete step