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,790 @@
1
+ ---
2
+ name: manage-devices
3
+ description: |
4
+ Manage Webex Calling devices using wxcli CLI commands: phones (MPP, ATA, room devices),
5
+ DECT networks, workspaces, activation codes, device settings, line key templates (BLF,
6
+ speed dials, line key layout), hot desking members, and device tags.
7
+ Guides the user from prerequisites through provisioning, activation, configuration, deletion, and verification.
8
+ Use for: create, provision, activate, configure, delete, remove, decommission, or list devices and workspaces.
9
+ NOT for: PhoneOS/RoomOS config keys or xAPI commands (use device-platform skill).
10
+ allowed-tools: Read, Grep, Glob, Bash
11
+ argument-hint: [device-operation]
12
+ ---
13
+
14
+ # Manage Devices Workflow
15
+
16
+ **Checkpoint — do NOT proceed until you can answer these:**
17
+ 1. What is the correct order for DECT provisioning? (Answer: Create DECT network → add base stations (real Cisco MACs required) → add handsets with line assignments.)
18
+ 2. How do you generate an activation code for a device? (Answer: Use `wxcli devices create-activation-code` — the device must exist first via `wxcli devices create`.)
19
+
20
+ If you cannot answer both, you skipped reading this skill. Go back and read it.
21
+
22
+ ## Step 1: Load references and verify commands
23
+
24
+ 1. Read `docs/reference/devices-core.md` for device CRUD, activation codes, MAC provisioning, line key templates, device settings
25
+ 2. Read `docs/reference/devices-dect.md` for DECT networks, base stations, handsets, hot desking
26
+ 3. Read `docs/reference/devices-workspaces.md` for workspace creation, workspace device assignment, workspace call settings
27
+
28
+ **Mandatory --help verification:** Before constructing any wxcli command, run `wxcli <group> --help` to verify the subcommand exists, then `wxcli <group> <subcommand> --help` to verify the exact flags. Do NOT rely on examples in this skill or reference docs — the CLI is auto-generated and flag names may differ from what documentation suggests. Common traps:
29
+ - `validate-a-list` has NO `--macs` flag and NO `--output` flag — use `--json-body '{"macs":["..."]}'` (always outputs JSON)
30
+ - `create-base-stations` has NO `--base-station-macs` flag — use `--json-body '{"baseStationMacs":["..."]}'`
31
+ - Person-level hoteling is `wxcli device-settings update-hoteling` — NOT `wxcli user-call-settings` (that group does not exist in the CLI; the registered group is `user-settings`)
32
+ - Hoteling read/write split: UPDATE is `device-settings update-hoteling`, but READ/VERIFY is `user-settings show-hoteling` — different groups! There is no `show-hoteling` in `device-settings`.
33
+ - LKT delete is `wxcli device-settings delete TEMPLATE_ID` — NOT `delete-line-key-templates` (that command doesn't exist)
34
+ - `create-apply-line-key-template` has named flags `--action` and `--template-id` — prefer these over `--json-body` for simple applies
35
+
36
+ ## Step 2: Verify auth token
37
+
38
+ Before any API calls, confirm the user has a working auth token:
39
+
40
+ ```bash
41
+ wxcli whoami
42
+ ```
43
+
44
+ If this fails, stop and resolve authentication first (`wxcli configure`). Required scopes vary by operation:
45
+
46
+ | Operation | Read Scope | Write Scope |
47
+ |-----------|-----------|-------------|
48
+ | Cloud device CRUD, tags | `spark-admin:devices_read` | `spark-admin:devices_write` |
49
+ | Activation codes | `spark-admin:devices_read` | `spark-admin:devices_write` + `identity:one_time_password` |
50
+ | Telephony device config (members, settings, line keys, layout) | `spark-admin:telephony_config_read` | `spark-admin:telephony_config_write` |
51
+ | Workspaces | `spark-admin:workspaces_read` | `spark-admin:workspaces_write` |
52
+ | DECT networks, base stations, handsets | `spark-admin:telephony_config_read` | `spark-admin:telephony_config_write` |
53
+
54
+ ## Step 3: Identify which device operation to perform
55
+
56
+ Ask the user what they want to do. Present this decision matrix if they are unsure:
57
+
58
+ | Need | Operation | CLI Group |
59
+ |------|-----------|-----------|
60
+ | Add a Cisco MPP phone or ATA by MAC address | **Create device by MAC** | `wxcli devices` |
61
+ | Generate a code for a phone to self-register | **Activation code** | `wxcli devices` |
62
+ | View/manage devices in the org | **List/show/delete devices** | `wxcli devices` |
63
+ | Assign lines, shared lines, or members to a phone | **Device members** | `wxcli device-settings` |
64
+ | Configure line keys, speed dials, BLF monitoring | **Line key templates / layout** | `wxcli device-settings` |
65
+ | Change phone display, ringtone, or device-level settings | **Device settings** | `wxcli device-settings` |
66
+ | Set up a wireless DECT phone system | **DECT network** | `wxcli dect-devices` |
67
+ | Create a conference room or lobby phone workspace | **Workspace** | `wxcli workspaces` |
68
+ | Allow users to temporarily use a shared phone | **Hot desking** | `wxcli hot-desk` / `wxcli hot-desking-portal` |
69
+ | Validate MAC addresses before provisioning | **MAC validation** | `wxcli device-settings` |
70
+
71
+ **Not a hardware operation?** For RoomOS software configuration, workspace personalization, or xAPI commands (dial, volume, standby, room analytics), use the `device-platform` skill instead.
72
+
73
+ ## Step 4: Prerequisites
74
+
75
+ Before any device operation, verify these exist and gather operation-specific requirements.
76
+
77
+ ### 4a. Location exists
78
+
79
+ All devices and workspaces are location-scoped. Confirm the target location:
80
+
81
+ ```bash
82
+ wxcli locations list --output json
83
+ ```
84
+
85
+ Capture the `location_id` for the target location.
86
+
87
+ ### 4b. Check device configuration mode (for settings operations)
88
+
89
+ **If the user's request involves reading or changing device settings** (not just CRUD, line assignment, or activation), determine which API surface the target device uses:
90
+
91
+ 1. Look up the device:
92
+ ```bash
93
+ wxcli devices list --mac MAC_ADDRESS --output json
94
+ ```
95
+
96
+ 2. Check the `product` field in the response. **Route based on model family and operation type:**
97
+ - **9800-series** (product contains "9811", "9821", "9841", "9851", "9861", or "9871"):
98
+ - **Device-level settings** (`show-settings-devices`, `update-settings-devices`): These 404 on 9800-series. **Redirect to the `device-platform` skill** for PhoneOS config keys (ringtone, standby, display, wallpaper, line labels, etc.). NOTE: 9800-series runs PhoneOS, NOT RoomOS. PhoneOS is RoomOS-derived but distinct — do not call these "RoomOS keys" or call 9800 devices "RoomOS devices".
99
+ - **Line Key Templates** (create, list, show, update, delete, apply): **Stay in this skill.** Works with model `"Cisco 98xx"`.
100
+ - **Device member management** (list members, update members/ports): **Stay in this skill.** Works normally.
101
+ - **Person-level device settings** (`show-settings-devices-3`): **Stay in this skill.** Works (limited fields).
102
+ - **Room, Board, Desk series**: Redirect to `device-platform` skill for all configuration.
103
+ - **MPP 68xx, 78xx, 88xx, ATA**: Continue with `device-settings` commands in this skill.
104
+
105
+ **Why this matters:** The 9800-series phones are `productType: phone` but run PhoneOS (RoomOS-derived). Only device-level settings endpoints (`show-settings-devices`, `update-settings-devices`) fail on 9800-series with 404. Line key templates, member management, and person-level settings work fine through the telephony config API. Do not blanket-redirect all 9800-series operations — route by operation type.
106
+
107
+ See `docs/reference/devices-core.md` Section 5a (Device Settings API Router) for the full routing table.
108
+
109
+ ### 4c. User or workspace exists (for device assignment)
110
+
111
+ Devices must be assigned to a person or workspace:
112
+
113
+ ```bash
114
+ # List calling-enabled users
115
+ wxcli users list --calling-data true --output json
116
+
117
+ # List workspaces
118
+ wxcli workspaces list --output json
119
+ ```
120
+
121
+ ### 4d. Phone numbers/extensions available
122
+
123
+ ```bash
124
+ wxcli numbers list --location-id LOCATION_ID --output json
125
+ ```
126
+
127
+ ### 4e. MPP/ATA phone prerequisites
128
+
129
+ | Requirement | Details |
130
+ |-------------|---------|
131
+ | Valid MAC address | 12 hex characters (e.g., `AABBCCDDEEFF`). Validate with `wxcli device-settings validate-a-list --macs AABBCCDDEEFF` |
132
+ | Target person/workspace | Must exist before device creation |
133
+ | Device model | Must be in supported catalog |
134
+ | SIP password | Only for 3rd-party (non-Cisco) devices |
135
+
136
+ ### 4f. Activation code prerequisites
137
+
138
+ | Requirement | Details |
139
+ |-------------|---------|
140
+ | Target person/workspace | Must exist |
141
+ | Model parameter | Required for phones; optional for RoomOS collaboration devices |
142
+
143
+ ### 4g. DECT prerequisites
144
+
145
+ | Requirement | Details |
146
+ |-------------|---------|
147
+ | Location | Must exist |
148
+ | Base station MAC addresses | Physical hardware MAC required |
149
+ | Dependency chain | Network --> Base Station(s) --> Handset(s). Cannot skip steps |
150
+
151
+ ### 4h. Workspace device prerequisites
152
+
153
+ | Requirement | Details |
154
+ |-------------|---------|
155
+ | Workspace | Must be created first with Webex Calling enabled and a location assigned |
156
+ | `location_id` and `supported_devices` | Immutable after creation -- set correctly on creation |
157
+ | Hot-desk-only workspaces | Cannot have `phoneNumber`, `extension`, `calendar`, or `deviceHostedMeetings` set |
158
+
159
+ ### 4i. Device settings prerequisites
160
+
161
+ | Requirement | Details |
162
+ |-------------|---------|
163
+ | Line key template | Device model must match. Template applies org-wide or by location/tag filter |
164
+ | Device settings GET/PUT | `deviceModel` parameter is required |
165
+
166
+ ### 4j. Hot desking prerequisites
167
+
168
+ | Requirement | Details |
169
+ |-------------|---------|
170
+ | Workspace side | `hotdeskingStatus` must be `on` |
171
+ | Person side | Hoteling must be enabled on person's profile via `wxcli device-settings update-hoteling` |
172
+
173
+ ---
174
+
175
+ ## Step 5: Build and present deployment plan -- [SHOW BEFORE EXECUTING]
176
+
177
+ Before executing any commands, present the full plan to the user:
178
+
179
+ ```
180
+ DEPLOYMENT PLAN
181
+ ===============
182
+ Operation: [device operation type]
183
+ Location: [name] ([location_id])
184
+ Target: [person/workspace name] ([id])
185
+
186
+ Device Details:
187
+ Type: [MPP phone / ATA / DECT / Room device]
188
+ Model: [model name]
189
+ MAC: [mac_address or "Activation code"]
190
+ Assignment: [person / workspace]
191
+
192
+ Configuration:
193
+ [Operation-specific settings listed here]
194
+
195
+ Prerequisites verified:
196
+ [check] Location exists
197
+ [check] Person/workspace exists
198
+ [check] MAC address validated (if applicable)
199
+ [check] [Operation-specific prereqs]
200
+
201
+ Commands to execute:
202
+ wxcli [group] [command] ...
203
+ wxcli device-settings apply-changes-for DEVICE_ID (if settings changed)
204
+
205
+ Proceed? (yes/no)
206
+ ```
207
+
208
+ **Wait for user confirmation before executing.**
209
+
210
+ ## Step 6: Execute via wxcli
211
+
212
+ Run the commands in order. For multi-step operations (e.g., workspace + device + settings), execute sequentially.
213
+
214
+ Handle errors explicitly:
215
+ - **401/403**: Token expired or insufficient scopes -- run `wxcli configure` to re-authenticate
216
+ - **400 "MAC address unavailable"**: MAC already registered to another device -- check with `wxcli device-settings validate-a-list`
217
+ - **400 "Model not supported"**: Use `wxcli device-settings list-supported-devices-dect-networks` or check supported catalog
218
+ - **409**: Name or resource conflict -- ask user for alternate
219
+
220
+ **Always call `apply-changes-for` after updating device settings, members, or layout** to push configuration to the physical device.
221
+
222
+ ### 6a. Device lifecycle -- Create, Activate, Configure, Manage
223
+
224
+ **List and discover devices:**
225
+
226
+ ```bash
227
+ # List all devices in the org
228
+ wxcli devices list --output json
229
+
230
+ # Show details for a specific device
231
+ wxcli devices show DEVICE_ID --output json
232
+ ```
233
+
234
+ **Create a device by MAC address:**
235
+
236
+ Collect from user:
237
+
238
+ | Parameter | Required | Notes |
239
+ |-----------|:--------:|-------|
240
+ | MAC address | Yes | 12 hex characters (e.g., `AABBCCDDEEFF`) |
241
+ | Person ID or Workspace ID | Yes | Who/what the device is assigned to |
242
+ | Model | Yes | Must be from the supported devices catalog |
243
+ | Password | Only for 3rd-party | SIP password for non-Cisco devices |
244
+
245
+ ```bash
246
+ # Validate MAC first (no --macs flag; use --json-body)
247
+ wxcli device-settings validate-a-list --json-body '{"macs":["AABBCCDDEEFF"]}'
248
+
249
+ # Create the device
250
+ wxcli devices create --mac AABBCCDDEEFF --workspace-id WORKSPACE_ID --model "DMS Cisco 8845"
251
+ ```
252
+
253
+ **Generate activation code:**
254
+
255
+ Activation codes allow a phone to self-register when the user enters the code on the phone screen.
256
+
257
+ ```bash
258
+ # For a workspace device
259
+ wxcli devices create-activation-code --workspace-id WORKSPACE_ID
260
+
261
+ # For a person's device (model required for phones)
262
+ wxcli devices create-activation-code --person-id PERSON_ID --model "DMS Cisco 8845"
263
+ ```
264
+
265
+ The code expires after a set period. The user enters it on the phone's activation screen, and the device auto-registers with Webex Calling.
266
+
267
+ Activation codes provide a zero-touch provisioning workflow:
268
+
269
+ 1. **Admin generates code** via `wxcli devices create-activation-code`
270
+ 2. **Code is communicated** to the on-site technician or end user
271
+ 3. **User enters code** on the phone's activation screen
272
+ 4. **Phone auto-registers** with Webex Calling, downloads config, and becomes operational
273
+ 5. **Code expires** after the configured period (typically 7 days)
274
+
275
+ > **NOTE:** Activation codes for phones require a `model` parameter. RoomOS collaboration devices do not require a model.
276
+
277
+ **Delete a device:**
278
+
279
+ ```bash
280
+ wxcli devices delete DEVICE_ID
281
+ ```
282
+
283
+ > **WARNING:** Deleting a device deregisters it. The device must be reactivated (new activation code or re-provisioned by MAC) to be reused.
284
+
285
+ **Update device tags:**
286
+
287
+ ```bash
288
+ wxcli devices update DEVICE_ID --output json
289
+ ```
290
+
291
+ > **NOTE:** Tag operations use JSON Patch format. The CLI handles this internally. Tags are useful for filtering devices in bulk operations (e.g., apply line key templates by tag).
292
+
293
+ ### 6b. DECT workflow -- Network, Base Station, Handset (strict dependency)
294
+
295
+ DECT provisioning follows a strict dependency chain. Each step depends on the previous one completing first.
296
+
297
+ ```
298
+ DECT Network --> Base Station(s) --> Handset(s)
299
+ (step 1) (step 2) (step 3)
300
+ ```
301
+
302
+ **You cannot skip steps. A base station requires a network. A handset requires a base station.**
303
+
304
+ **Create a DECT network:**
305
+
306
+ Collect from user:
307
+
308
+ | Parameter | Required | Notes |
309
+ |-----------|:--------:|-------|
310
+ | Location ID | Yes | Positional argument |
311
+ | Name | Yes | Unique per location, 1-40 characters |
312
+ | Model | Yes | `DMS Cisco DBS110` (single-cell, 1 base, 30 lines) or `DMS Cisco DBS210` (multi-cell, up to 250 bases, 1000 lines) |
313
+ | Default access code enabled | Yes | `true` = shared 4-digit code; `false` = auto-generated per-handset |
314
+ | Default access code | If enabled | 4 numeric digits, unique within the location |
315
+ | Display name | No | Shown on handsets, max 11 characters |
316
+
317
+ ```bash
318
+ # Create DECT network
319
+ wxcli dect-devices create LOCATION_ID \
320
+ --name "Building A DECT" \
321
+ --model "DMS Cisco DBS210" \
322
+ --default-access-code-enabled \
323
+ --default-access-code 1234 \
324
+ --display-name "Bldg A"
325
+
326
+ # List DECT networks
327
+ wxcli dect-devices list --output json
328
+
329
+ # Show network details
330
+ wxcli dect-devices show LOCATION_ID DECT_NETWORK_ID --output json
331
+ ```
332
+
333
+ **Add base stations:**
334
+
335
+ Base stations require MAC addresses from the physical DECT base station hardware.
336
+
337
+ ```bash
338
+ # Create base station(s) by MAC (no --base-station-macs flag; use --json-body)
339
+ wxcli dect-devices create-base-stations LOCATION_ID DECT_NETWORK_ID \
340
+ --json-body '{"baseStationMacs":["AABBCCDDEEFF"]}'
341
+
342
+ # List base stations
343
+ wxcli dect-devices list-base-stations LOCATION_ID DECT_NETWORK_ID --output json
344
+
345
+ # Show base station details
346
+ wxcli dect-devices show-base-stations LOCATION_ID DECT_NETWORK_ID BASE_STATION_ID --output json
347
+ ```
348
+
349
+ **Add handsets:**
350
+
351
+ Each handset supports up to 2 lines. Line 1 must be a person or workspace (place). Line 2 can also be a virtual line.
352
+
353
+ ```bash
354
+ # Search for available members to assign to handsets
355
+ wxcli dect-devices list-available-members --output json
356
+
357
+ # Add a single handset
358
+ wxcli dect-devices create-handsets LOCATION_ID DECT_NETWORK_ID \
359
+ --line1-member-id PERSON_ID \
360
+ --custom-display-name "Reception"
361
+
362
+ # Add handsets in bulk (up to 50)
363
+ wxcli dect-devices create-bulk LOCATION_ID DECT_NETWORK_ID --json-body '{
364
+ "items": [
365
+ {"line1MemberId": "PERSON_ID_1", "customDisplayName": "User 1"},
366
+ {"line1MemberId": "PERSON_ID_2", "customDisplayName": "User 2"}
367
+ ]
368
+ }'
369
+
370
+ # List handsets
371
+ wxcli dect-devices list-handsets LOCATION_ID DECT_NETWORK_ID --output json
372
+
373
+ # Update handset line assignment
374
+ wxcli dect-devices update-handsets LOCATION_ID DECT_NETWORK_ID HANDSET_ID \
375
+ --line1-member-id NEW_PERSON_ID \
376
+ --custom-display-name "Updated Name"
377
+ ```
378
+
379
+ **DECT serviceability password:**
380
+
381
+ ```bash
382
+ # Check password status
383
+ wxcli dect-devices show-serviceability-password LOCATION_ID DECT_NETWORK_ID --output json
384
+
385
+ # Generate and enable (WARNING: may reboot entire DECT network)
386
+ wxcli dect-devices generate-and-enable LOCATION_ID DECT_NETWORK_ID --output json
387
+ ```
388
+
389
+ **DECT association queries:**
390
+
391
+ ```bash
392
+ # DECT networks associated with a person
393
+ wxcli dect-devices list-dect-networks-people PERSON_ID --output json
394
+
395
+ # DECT networks associated with a workspace
396
+ wxcli dect-devices list-dect-networks-workspaces WORKSPACE_ID --output json
397
+ ```
398
+
399
+ ### 6c. Workspace devices -- Create workspace, assign device, configure settings
400
+
401
+ **Create a Webex Calling workspace:**
402
+
403
+ Collect from user:
404
+
405
+ | Parameter | Required | Notes |
406
+ |-----------|:--------:|-------|
407
+ | Display name | Yes | Workspace name |
408
+ | Location ID | Yes | Cannot be changed after creation |
409
+ | Supported devices | Yes | `phones` (MPP) or `collaborationDevices` (Room/Board/Desk). Cannot be changed after creation |
410
+ | Extension or phone number | Yes (one of) | Not applicable for hot-desk-only workspaces |
411
+ | Workspace type | No | `desk`, `meetingRoom`, `huddle`, `focus`, `open`, `other` |
412
+ | Hotdesking status | No | `on` or `off` |
413
+ | Calling license ID | No | Auto-assigned from active subscriptions if omitted |
414
+
415
+ ```bash
416
+ # Create a workspace
417
+ wxcli workspaces create --json-body '{
418
+ "displayName": "Lobby Phone",
419
+ "locationId": "LOCATION_ID",
420
+ "type": "desk",
421
+ "supportedDevices": "phones",
422
+ "hotdeskingStatus": "off",
423
+ "calling": {
424
+ "type": "webexCalling",
425
+ "webexCalling": {
426
+ "extension": "2001",
427
+ "locationId": "LOCATION_ID"
428
+ }
429
+ }
430
+ }'
431
+
432
+ # List workspaces
433
+ wxcli workspaces list --output json
434
+
435
+ # Show workspace details
436
+ wxcli workspaces show WORKSPACE_ID --output json
437
+
438
+ # Get workspace capabilities
439
+ wxcli workspaces show-capabilities WORKSPACE_ID --output json
440
+ ```
441
+
442
+ **Assign a device to the workspace:**
443
+
444
+ After creating the workspace, assign a device using either MAC address or activation code:
445
+
446
+ ```bash
447
+ # Option 1: Create device by MAC and assign to workspace
448
+ wxcli devices create --mac AABBCCDDEEFF --workspace-id WORKSPACE_ID --model "DMS Cisco 8845"
449
+
450
+ # Option 2: Generate activation code for the workspace
451
+ wxcli devices create-activation-code --workspace-id WORKSPACE_ID
452
+ ```
453
+
454
+ **List workspace devices:**
455
+
456
+ ```bash
457
+ # List telephony devices assigned to a workspace
458
+ wxcli device-settings list-devices-workspaces WORKSPACE_ID --output json
459
+ ```
460
+
461
+ **Configure workspace call settings:**
462
+
463
+ Workspace call settings mirror person call settings. Use `wxcli workspace-settings`:
464
+
465
+ ```bash
466
+ # Call forwarding
467
+ wxcli workspace-settings show WORKSPACE_ID --output json
468
+ wxcli workspace-settings update WORKSPACE_ID --json-body '{"callForwarding": {"always": {"enabled": true, "destination": "+15551234567"}}}'
469
+
470
+ # Call waiting
471
+ wxcli workspace-settings show-call-waiting WORKSPACE_ID --output json
472
+ wxcli workspace-settings update-call-waiting WORKSPACE_ID --enabled
473
+
474
+ # Caller ID
475
+ wxcli workspace-settings list WORKSPACE_ID --output json
476
+
477
+ # Monitoring (BLF)
478
+ wxcli workspace-settings list-monitoring WORKSPACE_ID --output json
479
+
480
+ # DND
481
+ wxcli workspace-settings show-do-not-disturb WORKSPACE_ID --output json
482
+ wxcli workspace-settings update-do-not-disturb WORKSPACE_ID --enabled
483
+
484
+ # Voicemail
485
+ wxcli workspace-settings show-voicemail WORKSPACE_ID --output json
486
+ ```
487
+
488
+ **Delete a workspace:**
489
+
490
+ ```bash
491
+ wxcli workspaces delete WORKSPACE_ID
492
+ ```
493
+
494
+ > **WARNING:** Deleting a workspace also deletes all associated devices. Those devices must be reactivated to be reused.
495
+
496
+ ### 6d. Device settings configuration
497
+
498
+ **Device members (line assignment):**
499
+
500
+ Manage which users/lines appear on a phone:
501
+
502
+ ```bash
503
+ # Get current members on a device
504
+ wxcli device-settings list DEVICE_ID --output json
505
+
506
+ # Search for available members to add as shared lines
507
+ wxcli device-settings list-available-members DEVICE_ID --output json
508
+
509
+ # Update members (add shared line appearance)
510
+ # IMPORTANT: every member entry MUST include lineWeight and primaryOwner — omitting either returns 400
511
+ wxcli device-settings update DEVICE_ID --json-body '{
512
+ "members": [
513
+ {"id": "PRIMARY_PERSON_ID", "port": 1, "lineType": "PRIMARY", "primaryOwner": true, "lineWeight": 1},
514
+ {"id": "SHARED_PERSON_ID", "port": 2, "lineType": "SHARED_LINE", "primaryOwner": false, "lineWeight": 1}
515
+ ]
516
+ }'
517
+
518
+ # Apply changes to push config to the physical device
519
+ wxcli device-settings apply-changes-for DEVICE_ID
520
+ ```
521
+
522
+ **Device-level settings (MPP/ATA):**
523
+
524
+ ```bash
525
+ # Get device settings (model required)
526
+ wxcli device-settings show-settings-devices DEVICE_ID --device-model "DMS Cisco 8845" --output json
527
+
528
+ # Update device settings
529
+ wxcli device-settings update-settings-devices DEVICE_ID --json-body '{
530
+ "customEnabled": true,
531
+ "customizations": {"mpp": {"displayNameFormat": "PERSON_LAST_THEN_FIRST_NAME"}}
532
+ }'
533
+
534
+ # Get person-level device settings (compression)
535
+ wxcli device-settings show-settings-devices-3 PERSON_ID --output json
536
+
537
+ # Get workspace-level device settings (compression)
538
+ wxcli device-settings show-settings-devices-4 WORKSPACE_ID --output json
539
+
540
+ # Get location-level device settings
541
+ wxcli device-settings show-settings-devices-1 LOCATION_ID --output json
542
+
543
+ # Get org-level device settings
544
+ wxcli device-settings show-settings-devices-2 --output json
545
+ ```
546
+
547
+ **Line key templates:**
548
+
549
+ Line key templates define the button layout for phone models org-wide:
550
+
551
+ ```bash
552
+ # List existing templates
553
+ wxcli device-settings list-line-key-templates --output json
554
+
555
+ # Create a template
556
+ wxcli device-settings create --json-body '{
557
+ "templateName": "Standard Layout",
558
+ "deviceModel": "DMS Cisco 8845",
559
+ "lineKeys": [
560
+ {"lineKeyIndex": 1, "lineKeyType": "PRIMARY_LINE"},
561
+ {"lineKeyIndex": 2, "lineKeyType": "MONITOR"},
562
+ {"lineKeyIndex": 3, "lineKeyType": "SPEED_DIAL", "lineKeyLabel": "Front Desk", "lineKeyValue": "1000"},
563
+ {"lineKeyIndex": 4, "lineKeyType": "OPEN"}
564
+ ]
565
+ }'
566
+
567
+ # Preview how many devices would be affected
568
+ wxcli device-settings preview-apply-line TEMPLATE_ID --output json
569
+
570
+ # Apply template to devices (has named flags — simpler than --json-body)
571
+ wxcli device-settings create-apply-line-key-template --action APPLY_TEMPLATE --template-id TEMPLATE_ID
572
+
573
+ # Check apply job status
574
+ wxcli device-settings list-apply-line-key-template --output json
575
+ wxcli device-settings show-apply-line-key-template JOB_ID --output json
576
+ ```
577
+
578
+ **Line key types:**
579
+
580
+ | Type | Description |
581
+ |------|-------------|
582
+ | `PRIMARY_LINE` | User's primary line |
583
+ | `SHARED_LINE` | Shared line appearance |
584
+ | `MONITOR` | BLF (busy lamp field) monitoring |
585
+ | `CALL_PARK_EXTENSION` | Dedicated call park button |
586
+ | `SPEED_DIAL` | Speed dial (requires label + value) |
587
+ | `OPEN` | Available for user self-configuration |
588
+ | `CLOSED` | Locked/unavailable |
589
+ | `MODE_MANAGEMENT` | Operating mode control |
590
+
591
+ **Device layout (per-device customization):**
592
+
593
+ ```bash
594
+ # Get current device layout
595
+ wxcli device-settings list-layout DEVICE_ID --output json
596
+
597
+ # Update layout
598
+ wxcli device-settings update-layout DEVICE_ID --json-body '{
599
+ "layoutMode": "CUSTOM",
600
+ "lineKeys": [
601
+ {"lineKeyIndex": 1, "lineKeyType": "PRIMARY_LINE"},
602
+ {"lineKeyIndex": 2, "lineKeyType": "SPEED_DIAL", "lineKeyLabel": "Lobby", "lineKeyValue": "2000"}
603
+ ]
604
+ }'
605
+ ```
606
+
607
+ **Background images:**
608
+
609
+ ```bash
610
+ # List org background images
611
+ wxcli device-settings list-background-images --output json
612
+
613
+ # Upload a background image to a device — no CLI (multipart upload, generator cannot render)
614
+ # Raw HTTP fallback: POST /telephony/config/devices/{deviceId}/actions/backgroundImageUpload/invoke (multipart/form-data)
615
+
616
+ # Delete background images
617
+ wxcli device-settings delete-background-images --json-body '{
618
+ "backgroundImages": [{"fileName": "logo.png", "forceDelete": true}]
619
+ }'
620
+ ```
621
+
622
+ **MAC address validation:**
623
+
624
+ ```bash
625
+ wxcli device-settings validate-a-list --json-body '{"macs":["AABBCCDDEEFF","112233445566"]}' --output json
626
+ ```
627
+
628
+ States: `AVAILABLE`, `UNAVAILABLE`, `DUPLICATE_IN_LIST`, `INVALID`
629
+
630
+ ### 6e. Hot desking configuration
631
+
632
+ Hot desking allows users to temporarily sign into a shared workspace phone and use it as their own.
633
+
634
+ **Workspace side: enable hot desking:**
635
+
636
+ When creating a workspace, set `hotdeskingStatus` to `on`. For hot-desk-only workspaces, do not set `phoneNumber`, `extension`, `calendar`, or `deviceHostedMeetings`.
637
+
638
+ **Person side: enable hoteling:**
639
+
640
+ Use `wxcli device-settings update-hoteling PERSON_ID --json-body '{"hoteling":{"enabled":true}}'` to enable hoteling on a person's profile. **Do NOT use `wxcli user-call-settings`** — that CLI group does not exist (its orphan source file was deleted at the 2026-07-01 spec sync; the registered group is `user-settings`).
641
+
642
+ **Hoteling read/write asymmetry:** The update command is `wxcli device-settings update-hoteling`, but the read/verify command is `wxcli user-settings show-hoteling PERSON_ID` — they are in different CLI groups. There is no `show-hoteling` in `device-settings`.
643
+
644
+ **Manage hot desk sessions:**
645
+
646
+ ```bash
647
+ # List active hot desk sessions
648
+ wxcli hot-desk list --output json
649
+
650
+ # List sessions for a specific person
651
+ wxcli hot-desk list --person-id PERSON_ID --output json
652
+
653
+ # List sessions for a specific workspace
654
+ wxcli hot-desk list --workspace-id WORKSPACE_ID --output json
655
+
656
+ # End a hot desk session
657
+ wxcli hot-desk delete SESSION_ID
658
+ ```
659
+
660
+ **Voice portal hot desking sign-in:**
661
+
662
+ ```bash
663
+ # View location-level voice portal hot desking settings
664
+ wxcli hot-desking-portal show LOCATION_ID --output json
665
+
666
+ # Update location-level settings
667
+ wxcli hot-desking-portal update LOCATION_ID --json-body '{...}'
668
+
669
+ # View user-level guest hot desking settings
670
+ wxcli hot-desking-portal show-guest PERSON_ID --output json
671
+ ```
672
+
673
+ ---
674
+
675
+ ## Step 7: Verify
676
+
677
+ After execution, fetch details back and confirm:
678
+
679
+ ```bash
680
+ # Verify device creation
681
+ wxcli devices show DEVICE_ID --output json
682
+
683
+ # Verify DECT network
684
+ wxcli dect-devices show LOCATION_ID DECT_NETWORK_ID --output json
685
+
686
+ # Verify workspace
687
+ wxcli workspaces show WORKSPACE_ID --output json
688
+
689
+ # Verify device members/lines
690
+ wxcli device-settings list DEVICE_ID --output json
691
+
692
+ # Verify device layout
693
+ wxcli device-settings list-layout DEVICE_ID --output json
694
+
695
+ # Verify workspace devices
696
+ wxcli device-settings list-devices-workspaces WORKSPACE_ID --output json
697
+ ```
698
+
699
+ ## Step 8: Report results
700
+
701
+ Present the results:
702
+
703
+ ```
704
+ DEVICE OPERATION COMPLETE
705
+ =========================
706
+ Operation: [type]
707
+ Device: [display_name]
708
+ ID: [device_id]
709
+ MAC: [mac_address]
710
+ Model: [model]
711
+ Assigned to: [person/workspace name] ([id])
712
+ Location: [location_name]
713
+ Status: [activation_state]
714
+
715
+ Next steps:
716
+ - [Operation-specific next steps]
717
+ - [e.g., "Enter activation code XXXX-XXXX on the phone"]
718
+ - [e.g., "Configure line key template for standardized button layout"]
719
+ - [e.g., "Add shared line appearances via device-settings update"]
720
+ ```
721
+
722
+ ---
723
+
724
+ ## Critical Rules
725
+
726
+ 1. **Always verify location exists** before any device operation. Devices and workspaces are location-scoped.
727
+ 2. **Always show the deployment plan** (Step 5) and wait for user confirmation before executing.
728
+ 3. **Always call `apply-changes-for` after settings changes.** After updating device members, settings, or layout, call `wxcli device-settings apply-changes-for DEVICE_ID` to push config to the physical device. Without this, changes exist only in the cloud.
729
+ 4. **DECT dependency chain is strict.** Network must exist before base stations. Base stations must exist before handsets. You cannot skip steps.
730
+ 5. **DECT serviceability password operations can reboot the entire network.** Generating or toggling the password triggers a network-wide reboot. Schedule during maintenance windows.
731
+ 6. **90-second cooldown on DECT handset changes.** Adding or removing handsets within 90 seconds may leave base stations out of sync until rebooted.
732
+ 7. **Adding a DECT handset to a Standard license user disables Webex Calling** on their mobile, tablet, desktop, and browser apps. Deleting the handset re-enables it. Use Professional licenses for users who need both.
733
+ 8. **Workspace `location_id` and `supported_devices` are immutable.** Set correctly on creation; they cannot be changed afterward.
734
+ 9. **Deleting a workspace deletes all associated devices.** Those devices must be reactivated (new activation code or MAC re-provision) to be reused.
735
+ 10. **Hot-desk-only workspaces** cannot have `phoneNumber`, `extension`, `calendar`, or `deviceHostedMeetings` set. These cause errors if provided.
736
+ 11. **`deviceModel` is required for device settings GET/PUT.** Omitting it from `wxcli device-settings show-settings-devices` returns an error.
737
+ 12. **Device IDs differ between API surfaces.** The `id` from `GET /devices` (cloud CRUD) may differ from the telephony `callingDeviceId`. Use the correct ID for each CLI group.
738
+ 13. **No API for auto-generated DECT access codes.** When `defaultAccessCodeEnabled` is `false`, per-handset codes are auto-generated but cannot be retrieved via API. Use Control Hub instead.
739
+ 14. **DECT handset Line 1 vs Line 2 member types.** Line 1 supports only PEOPLE and PLACE. Line 2 also supports VIRTUAL_LINE. Virtual lines cannot be the primary (line 1) member.
740
+ 15. **Activation codes for phones require a model parameter.** RoomOS collaboration devices do not require a model.
741
+ 16. **Background image limits.** Max 100 images per org. Upload max 625 KB, `.jpeg` or `.png` only. Max 10 images per delete request.
742
+ 17. **DECT network create response uses `dectNetworkId`, not `id`.** The CLI handles this, but if using raw HTTP, parse the correct key.
743
+ 18. **DECT is not supported for Webex for Government (FedRAMP).**
744
+ 19. **Workspace call settings mirror person call settings.** Use `wxcli workspace-settings` with the workspace ID. The sub-API is the same as person settings but workspace-scoped.
745
+ 20. **Maximum 5 devices per user (hardware + soft clients).** `POST /devices` and `POST /devices/activationCode` return HTTP 400 `"Phones cannot be added to this user"` on the 6th device. Server-enforced, not configurable. Orphan devices from prior failed attempts count against the cap — delete stale devices before retrying. See `docs/reference/devices-core.md` Gotcha #12.
746
+ 21. **Model string format differs by phone family.** Classic MPP phones use `"DMS Cisco 8845"` (with DMS prefix). 9800-series phones use `"Cisco 9861"` (no DMS prefix). Using the wrong format for device creation or line key templates will fail. Check `wxcli device-settings list-supported-devices-dects --output json` for exact model strings.
747
+ 22. **DECT display name character limits.** Network `displayName` is max 11 characters. Handset `customDisplayName` is 1-16 characters. Exceeding limits returns 400.
748
+ 23. **DECT access code must be unique within the location.** If two DECT networks at the same location share an access code, handsets may register with the wrong network.
749
+
750
+ ---
751
+
752
+ ## Registered CLI Groups (this skill only)
753
+
754
+ These are the **exact group names** registered in `wxcli`. Do not use any other group names:
755
+
756
+ | CLI Group | Source File | Commands |
757
+ |-----------|-----------|----------|
758
+ | `wxcli devices` | `devices.py` | list, create, show, update, delete, create-activation-code |
759
+ | `wxcli device-settings` | `device_settings.py` | 46 commands (members, LKT, layout, settings, hoteling, validation, background images, jobs) |
760
+ | `wxcli dect-devices` | `dect_devices.py` | 23 commands (networks, base stations, handsets, bulk, associations, serviceability) |
761
+ | `wxcli workspaces` | `workspaces.py` | list, create, show, update, delete, show-capabilities |
762
+ | `wxcli workspace-settings` | `workspace_settings.py` | 60+ commands (call settings, monitoring, permissions, voicemail, recording) |
763
+ | `wxcli device-configurations` | `device_configurations.py` | show, update (PhoneOS/RoomOS config keys) |
764
+ | `wxcli hot-desk` | `hot_desk.py` | list, delete |
765
+ | `wxcli hot-desking-portal` | `hot_desking_portal.py` | show, update, show-guest, update-guest |
766
+
767
+ **NOT registered:** `user-call-settings` (file exists but not wired into CLI). Use `wxcli device-settings update-hoteling` for person-level hoteling.
768
+
769
+ ---
770
+
771
+ ## Scope Quick Reference
772
+
773
+ | CLI Group | Read Scope | Write Scope |
774
+ |-----------|-----------|-------------|
775
+ | `wxcli devices` | `spark-admin:devices_read` | `spark-admin:devices_write` |
776
+ | `wxcli device-settings` | `spark-admin:telephony_config_read` | `spark-admin:telephony_config_write` |
777
+ | `wxcli dect-devices` | `spark-admin:telephony_config_read` | `spark-admin:telephony_config_write` |
778
+ | `wxcli workspaces` | `spark-admin:workspaces_read` | `spark-admin:workspaces_write` |
779
+ | `wxcli workspace-settings` | `spark-admin:workspaces_read` | `spark-admin:workspaces_write` |
780
+ | `wxcli hot-desk` | (undocumented) | (undocumented) |
781
+ | `wxcli hot-desking-portal` | `spark-admin:telephony_config_read` | `spark-admin:telephony_config_write` |
782
+
783
+ ---
784
+
785
+ ## Context Compaction Recovery
786
+
787
+ If context compacts mid-execution, recover by:
788
+ 1. Read the deployment plan from `docs/plans/` to recover what was planned
789
+ 2. Check what's already been created: run the relevant `list` / `show` commands
790
+ 3. Resume from the first incomplete step