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,695 @@
1
+ # Messaging: Spaces, Messages, Teams, ECM, and HDS
2
+
3
+ Reference for Webex messaging infrastructure management. Covers the 40 commands across 7 CLI groups that an IT admin or space manager uses to create and manage spaces, messages, memberships, teams, and enterprise content. Sourced from the Webex Messaging API (OpenAPI spec: `specs/webex-messaging.json`).
4
+
5
+ ## Sources
6
+
7
+ - OpenAPI spec: `specs/webex-messaging.json`
8
+ - [developer.webex.com Messaging APIs](https://developer.webex.com/docs/api/v1/messages)
9
+
10
+ ---
11
+
12
+ ## Token Type Matrix
13
+
14
+ This matrix is the most important thing to check before running any messaging command. The wrong token type will produce a 403 or unexpected empty results.
15
+
16
+ | Operation | User Token | Bot Token | Admin Token |
17
+ |-----------|-----------|-----------|-------------|
18
+ | Space CRUD | Yes | Yes (bot must be member) | Yes |
19
+ | Send/list messages | Yes | Yes (bot must be member) | No (admin can list via compliance, not send) |
20
+ | Membership CRUD | Yes (if moderator or creator) | Limited (can't add self) | Yes |
21
+ | Team CRUD | Yes | No | Yes |
22
+ | Team membership CRUD | Yes | No | Yes |
23
+ | ECM folder linking | No | No | Yes (requires `spark-admin:` scopes) |
24
+ | HDS monitoring | No | No | Yes (requires `spark-admin:` scopes) |
25
+
26
+ ---
27
+
28
+ ## Table of Contents
29
+
30
+ 1. [Messaging Model Overview](#1-messaging-model-overview)
31
+ 2. [Spaces](#2-spaces)
32
+ 3. [Messages](#3-messages)
33
+ 4. [Memberships](#4-memberships)
34
+ 5. [Teams](#5-teams)
35
+ 6. [ECM — Enterprise Content Management](#6-ecm--enterprise-content-management)
36
+ 7. [HDS — Hybrid Data Security](#7-hds--hybrid-data-security)
37
+ 8. [Common Patterns](#8-common-patterns)
38
+ 9. [See Also](#9-see-also)
39
+
40
+ ---
41
+
42
+ ## 1. Messaging Model Overview
43
+
44
+ Webex messaging is organized around spaces (also called rooms). Teams are an optional grouping layer.
45
+
46
+ ```
47
+ Organization
48
+ └── Teams (optional grouping)
49
+ └── Team Spaces (rooms belonging to a team)
50
+ └── Spaces (rooms — the core unit)
51
+ ├── Members (memberships — who is in the space)
52
+ ├── Messages (text, files, cards)
53
+ └── Tabs (embedded apps — not covered here)
54
+ ```
55
+
56
+ **Terminology:**
57
+ - **"room"** is the API term. **"space"** is what the Webex App shows users. They are the same thing.
58
+ - **Space types:** `direct` (1:1 between two people) or `group` (multi-person).
59
+ - **Team relationship:** a team groups multiple spaces under one umbrella. Creating a team auto-creates a "General" space. Adding a member to a team auto-adds them to all team spaces.
60
+
61
+ **CLI groups in this doc:**
62
+
63
+ | CLI Group | Resource | Commands |
64
+ |-----------|----------|---------|
65
+ | `rooms` | Spaces | 6 |
66
+ | `messages` | Messages | 6 |
67
+ | `memberships` | Space memberships | 5 |
68
+ | `teams` | Teams | 5 |
69
+ | `team-memberships` | Team memberships | 5 |
70
+ | `ecm` | ECM folder links | 5 |
71
+ | `hds` | HDS monitoring | 7 (read-only) |
72
+
73
+ ---
74
+
75
+ ## 2. Spaces
76
+
77
+ **CLI group:** `rooms`
78
+ **API base:** `https://webexapis.com/v1/rooms`
79
+
80
+ ### Commands
81
+
82
+ | Command | CLI | HTTP Method | What It Does |
83
+ |---------|-----|------------|-------------|
84
+ | List spaces | `wxcli rooms list` | GET /rooms | List spaces the caller belongs to |
85
+ | Create space | `wxcli rooms create --title "Name"` | POST /rooms | Create a new group space |
86
+ | Show space | `wxcli rooms show ROOM_ID` | GET /rooms/{roomId} | Get space details |
87
+ | Update space | `wxcli rooms update ROOM_ID --title "New Name"` | PUT /rooms/{roomId} | Rename, lock, set read-only |
88
+ | Delete space | `wxcli rooms delete ROOM_ID --force` | DELETE /rooms/{roomId} | Delete space and all content |
89
+ | Meeting info | `wxcli rooms show-meeting-info ROOM_ID` | GET /rooms/{roomId}/meetingInfo | Get SIP/meeting URI for space |
90
+
91
+ ### Key Parameters
92
+
93
+ #### `rooms list`
94
+
95
+ | Option | Description |
96
+ |--------|-------------|
97
+ | `--type direct\|group` | Filter by space type |
98
+ | `--team-id TEAM_ID` | List spaces belonging to a specific team |
99
+ | `--sort-by id\|lastactivity\|created` | Sort order |
100
+ | `--org-public-spaces` | Show org's public spaces (joined and unjoined) |
101
+ | `--from` | Filter public spaces made public after this time (ISO 8601) |
102
+ | `--to` | Filter public spaces made public before this time (ISO 8601) |
103
+ | `--max N` | API-level page size |
104
+ | `--limit N` | CLI-level result cap |
105
+ | `--output table\|json` | Output format (default: table) |
106
+
107
+ #### `rooms create`
108
+
109
+ | Option | Required | Description |
110
+ |--------|:--------:|-------------|
111
+ | `--title TEXT` | Yes | Display name for the space |
112
+ | `--team-id TEAM_ID` | No | Associate with an existing team |
113
+ | `--is-locked/--no-is-locked` | No | Locked (moderated): creator becomes moderator, others cannot add members |
114
+ | `--is-public/--no-is-public` | No | Make space discoverable within the org |
115
+ | `--is-announcement-only/--no-is-announcement-only` | No | Only moderators can post |
116
+ | `--description TEXT` | No | Space description |
117
+ | `--classification-id ID` | No | Data classification label |
118
+ | `--json-body JSON` | No | Full JSON body (overrides all other options) |
119
+
120
+ #### `rooms update`
121
+
122
+ | Option | Description |
123
+ |--------|-------------|
124
+ | `--title TEXT` | Rename the space |
125
+ | `--is-locked/--no-is-locked` | Lock or unlock the space |
126
+ | `--is-public/--no-is-public` | Change public visibility |
127
+ | `--is-announcement-only/--no-is-announcement-only` | Set/clear announcement mode |
128
+ | `--is-read-only/--no-is-read-only` | Compliance officer can set direct room as read-only (archive pattern) |
129
+ | `--description TEXT` | Update description |
130
+ | `--team-id TEAM_ID` | Move unowned space to a team |
131
+ | `--classification-id ID` | Change classification |
132
+
133
+ ### Raw HTTP
134
+
135
+ ```python
136
+ BASE = "https://webexapis.com/v1"
137
+
138
+ # List spaces
139
+ result = api.session.rest_get(f"{BASE}/rooms", params={"type": "group", "sortBy": "lastactivity"})
140
+ spaces = result.get("items", [])
141
+ # Each item: {"id", "title", "type", "isLocked", "teamId", "lastActivity", "created", ...}
142
+
143
+ # Create space
144
+ body = {"title": "Project Alpha", "teamId": team_id}
145
+ result = api.session.rest_post(f"{BASE}/rooms", json=body)
146
+ room_id = result.get("id")
147
+
148
+ # Get meeting info (SIP URI + meeting link)
149
+ info = api.session.rest_get(f"{BASE}/rooms/{room_id}/meetingInfo")
150
+ # Returns: {"roomId", "meetingLink", "sipAddress", "meetingNumber", "callInTollFreeNumber", ...}
151
+ ```
152
+
153
+ ### Gotchas
154
+
155
+ - **Deleting a space is permanent** — no recycle bin. Always confirm with `--force` or the CLI will prompt.
156
+ - **`list` only returns spaces the authenticated user or bot is a member of.** To list all org spaces, use an admin token or the compliance API.
157
+ - **Direct spaces (1:1) cannot be deleted via API.** The delete endpoint will return an error.
158
+ - **Space titles are optional for direct spaces** — the Webex App uses participant names instead. The `title` field may be empty or absent for direct spaces.
159
+ - **`show-meeting-info` returns the SIP address and meeting link for a space** — useful for bridging Webex Calling + Messaging (e.g., dialing into a space from a desk phone).
160
+ - **`--is-read-only` is a compliance officer capability.** Regular users and admins without the compliance role cannot set this flag.
161
+
162
+ ---
163
+
164
+ ## 3. Messages
165
+
166
+ **CLI group:** `messages`
167
+ **API base:** `https://webexapis.com/v1/messages`
168
+
169
+ For adaptive card payloads (`attachments` field), use `--json-body`. See `messaging-bots.md` for card recipes.
170
+
171
+ ### Commands
172
+
173
+ | Command | CLI | HTTP Method | What It Does |
174
+ |---------|-----|------------|-------------|
175
+ | List messages | `wxcli messages list --room-id ROOM_ID` | GET /messages | List messages in a space |
176
+ | Send message | `wxcli messages create --room-id ROOM_ID --text "Hello"` | POST /messages | Send a message to a space |
177
+ | List direct | `wxcli messages list-direct --person-email user@example.com` | GET /messages/direct | List 1:1 messages with a person |
178
+ | Show message | `wxcli messages show MESSAGE_ID` | GET /messages/{messageId} | Get message details |
179
+ | Edit message | `wxcli messages update MESSAGE_ID --text "Updated"` | PUT /messages/{messageId} | Edit an existing message |
180
+ | Delete message | `wxcli messages delete MESSAGE_ID --force` | DELETE /messages/{messageId} | Delete a message |
181
+
182
+ ### Key Parameters
183
+
184
+ #### `messages list`
185
+
186
+ | Option | Description |
187
+ |--------|-------------|
188
+ | `--room-id ROOM_ID` | Required — list messages in this space |
189
+ | `--parent-id MESSAGE_ID` | List threaded replies to a message |
190
+ | `--mentioned-people PERSON_ID` | Filter to messages mentioning this person (use `me` for self) |
191
+ | `--before DATETIME` | Messages sent before this time (ISO 8601) |
192
+ | `--before-message MESSAGE_ID` | Messages sent before this message (pagination) |
193
+ | `--max N` | API-level page size |
194
+ | `--limit N` | CLI-level result cap |
195
+ | `--output table\|json` | Output format (default: table; columns: ID, Person Email, Text) |
196
+
197
+ #### `messages create`
198
+
199
+ | Option | Notes |
200
+ |--------|-------|
201
+ | `--room-id ROOM_ID` | Send to a group or direct space |
202
+ | `--to-person-id PERSON_ID` | Send a 1:1 direct message by person ID |
203
+ | `--to-person-email EMAIL` | Send a 1:1 direct message by email |
204
+ | `--text TEXT` | Plain text content |
205
+ | `--markdown TEXT` | Markdown content (bold, italic, links, @mentions, code blocks) |
206
+ | `--parent-id MESSAGE_ID` | Reply to a specific message (creates a thread) |
207
+ | `--json-body JSON` | Full JSON body — required for `files`, `attachments` (adaptive cards) |
208
+
209
+ Use exactly one of `--room-id`, `--to-person-id`, or `--to-person-email` to specify the destination.
210
+
211
+ #### `messages list-direct`
212
+
213
+ | Option | Description |
214
+ |--------|-------------|
215
+ | `--person-id PERSON_ID` | List 1:1 messages with this person (by ID) |
216
+ | `--person-email EMAIL` | List 1:1 messages with this person (by email) |
217
+ | `--parent-id MESSAGE_ID` | Filter to a thread |
218
+
219
+ #### `messages update`
220
+
221
+ | Option | Notes |
222
+ |--------|-------|
223
+ | `--room-id ROOM_ID` | Room ID of the message (required in body for edit) |
224
+ | `--text TEXT` | Updated plain text |
225
+ | `--markdown TEXT` | Updated markdown text |
226
+
227
+ ### Raw HTTP
228
+
229
+ ```python
230
+ BASE = "https://webexapis.com/v1"
231
+
232
+ # Send a plain text message
233
+ body = {"roomId": room_id, "text": "Hello from wxcli"}
234
+ result = api.session.rest_post(f"{BASE}/messages", json=body)
235
+
236
+ # Send a markdown message
237
+ body = {"roomId": room_id, "markdown": "**Alert:** Configuration complete for _Location Alpha_."}
238
+ result = api.session.rest_post(f"{BASE}/messages", json=body)
239
+
240
+ # Send a file attachment (URL must be publicly accessible)
241
+ body = {"roomId": room_id, "text": "Here is the report", "files": ["https://example.com/report.pdf"]}
242
+ result = api.session.rest_post(f"{BASE}/messages", json=body)
243
+
244
+ # Send adaptive card (see messaging-bots.md for card schema)
245
+ body = {
246
+ "roomId": room_id,
247
+ "text": "Fallback text for clients that don't support cards",
248
+ "attachments": [{"contentType": "application/vnd.microsoft.card.adaptive", "content": {...}}]
249
+ }
250
+ result = api.session.rest_post(f"{BASE}/messages", json=body)
251
+
252
+ # List messages with pagination
253
+ result = api.session.rest_get(f"{BASE}/messages", params={"roomId": room_id, "max": 50})
254
+ messages = result.get("items", [])
255
+ # Each item: {"id", "roomId", "personId", "personEmail", "text", "markdown", "created", "updated", ...}
256
+ ```
257
+
258
+ ### Gotchas
259
+
260
+ - **`--room-id` is required for `list`** — there is no global messages endpoint. You must specify a room.
261
+ - **`--files` accepts a URL, not a local file path.** The URL must be publicly accessible or a Webex content URL. For local file uploads, use `--json-body` with a multipart approach or upload first via another mechanism.
262
+ - **Bots can only read messages where they are @mentioned**, except in 1:1 direct spaces where they see all messages.
263
+ - **Edit only works on messages sent by the authenticated user or bot.** Editing someone else's message will return 403.
264
+ - **`--before` and `--before-message` are pagination tools** — use `--before-message` with the ID of the oldest message in the last page to walk backward through history.
265
+ - **Adaptive card payloads require `--json-body`** — the `attachments` array cannot be set via `--text` or `--markdown`. See `messaging-bots.md` for adaptive card recipes.
266
+
267
+ ---
268
+
269
+ ## 4. Memberships
270
+
271
+ **CLI group:** `memberships`
272
+ **API base:** `https://webexapis.com/v1/memberships`
273
+
274
+ A membership is the relationship between a person and a space. The membership ID is distinct from the person ID.
275
+
276
+ ### Commands
277
+
278
+ | Command | CLI | HTTP Method | What It Does |
279
+ |---------|-----|------------|-------------|
280
+ | List members | `wxcli memberships list --room-id ROOM_ID` | GET /memberships | List space members |
281
+ | Add member | `wxcli memberships create --room-id ROOM_ID --person-email user@example.com` | POST /memberships | Add person to space |
282
+ | Show membership | `wxcli memberships show MEMBERSHIP_ID` | GET /memberships/{membershipId} | Get membership details |
283
+ | Update membership | `wxcli memberships update MEMBERSHIP_ID --is-moderator` | PUT /memberships/{membershipId} | Change moderator status or hide space |
284
+ | Remove member | `wxcli memberships delete MEMBERSHIP_ID --force` | DELETE /memberships/{membershipId} | Remove person from space |
285
+
286
+ ### Key Parameters
287
+
288
+ #### `memberships list`
289
+
290
+ | Option | Description |
291
+ |--------|-------------|
292
+ | `--room-id ROOM_ID` | List all members of a specific space |
293
+ | `--person-id PERSON_ID` | List all spaces a specific person belongs to |
294
+ | `--person-email EMAIL` | List all spaces a specific person belongs to (by email) |
295
+ | `--max N` | Page size |
296
+ | `--output table\|json` | Output format (default: table; columns: ID, Name) |
297
+
298
+ #### `memberships create`
299
+
300
+ | Option | Required | Description |
301
+ |--------|:--------:|-------------|
302
+ | `--room-id ROOM_ID` | Yes | Space to add the person to |
303
+ | `--person-id PERSON_ID` | One of these | Person to add (by ID) |
304
+ | `--person-email EMAIL` | One of these | Person to add (by email) |
305
+ | `--is-moderator/--no-is-moderator` | No | Grant moderator role on add |
306
+
307
+ #### `memberships update`
308
+
309
+ | Option | Description |
310
+ |--------|-------------|
311
+ | `--is-moderator/--no-is-moderator` | Grant or revoke moderator role |
312
+ | `--is-room-hidden/--no-is-room-hidden` | Hide/show the space in the member's space list (Teams client only) |
313
+
314
+ ### Raw HTTP
315
+
316
+ ```python
317
+ BASE = "https://webexapis.com/v1"
318
+
319
+ # List members of a space
320
+ result = api.session.rest_get(f"{BASE}/memberships", params={"roomId": room_id})
321
+ members = result.get("items", [])
322
+ # Each item: {"id", "roomId", "personId", "personEmail", "personDisplayName", "isModerator", "created", ...}
323
+
324
+ # Add a member
325
+ body = {"roomId": room_id, "personEmail": "user@example.com", "isModerator": False}
326
+ result = api.session.rest_post(f"{BASE}/memberships", json=body)
327
+ membership_id = result.get("id")
328
+
329
+ # Promote to moderator
330
+ body = {"isModerator": True}
331
+ api.session.rest_put(f"{BASE}/memberships/{membership_id}", json=body)
332
+
333
+ # Remove member
334
+ api.session.rest_delete(f"{BASE}/memberships/{membership_id}")
335
+ ```
336
+
337
+ ### Gotchas
338
+
339
+ - **The membership ID is NOT the person ID.** It is a separate identifier for the person-in-space relationship. You need the membership ID to update or delete a membership. Use `memberships list --room-id ROOM_ID` to find it.
340
+ - **Removing the last moderator from a locked space makes it unmodifiable.** Always ensure at least one moderator remains before removing others.
341
+ - **Bots cannot add themselves to spaces.** Bots must be added by a user or via an integration OAuth flow.
342
+ - **`list` requires at least `--room-id` or `--person-id`.** A bare `memberships list` with no filter will return memberships for the authenticated user only.
343
+
344
+ ---
345
+
346
+ ## 5. Teams
347
+
348
+ **CLI groups:** `teams` and `team-memberships`
349
+ **API bases:** `https://webexapis.com/v1/teams` and `https://webexapis.com/v1/team/memberships`
350
+
351
+ A team is a grouping of related spaces. When you delete a team, all team spaces and their content are deleted.
352
+
353
+ ### Team Commands
354
+
355
+ | Command | CLI | HTTP Method | What It Does |
356
+ |---------|-----|------------|-------------|
357
+ | List teams | `wxcli teams list` | GET /teams | List teams the caller belongs to |
358
+ | Create team | `wxcli teams create --name "Team Name"` | POST /teams | Create a new team |
359
+ | Show team | `wxcli teams show TEAM_ID` | GET /teams/{teamId} | Get team details |
360
+ | Update team | `wxcli teams update TEAM_ID --name "New Name"` | PUT /teams/{teamId} | Rename or update description |
361
+ | Delete team | `wxcli teams delete TEAM_ID --force` | DELETE /teams/{teamId} | Delete team and ALL team spaces |
362
+
363
+ #### `teams create` Parameters
364
+
365
+ | Option | Required | Description |
366
+ |--------|:--------:|-------------|
367
+ | `--name TEXT` | Yes | Display name for the team |
368
+ | `--description TEXT` | No | Team description |
369
+
370
+ #### `teams update` Parameters
371
+
372
+ | Option | Description |
373
+ |--------|-------------|
374
+ | `--name TEXT` | New team name |
375
+ | `--description TEXT` | Updated description |
376
+
377
+ ### Team Membership Commands
378
+
379
+ | Command | CLI | HTTP Method | What It Does |
380
+ |---------|-----|------------|-------------|
381
+ | List team members | `wxcli team-memberships list --team-id TEAM_ID` | GET /team/memberships | List members of a team |
382
+ | Add team member | `wxcli team-memberships create --team-id TEAM_ID --person-email user@example.com` | POST /team/memberships | Add person to team |
383
+ | Show team membership | `wxcli team-memberships show MEMBERSHIP_ID` | GET /team/memberships/{membershipId} | Get team membership details |
384
+ | Update team membership | `wxcli team-memberships update MEMBERSHIP_ID --is-moderator` | PUT /team/memberships/{membershipId} | Change moderator role |
385
+ | Remove team member | `wxcli team-memberships delete MEMBERSHIP_ID --force` | DELETE /team/memberships/{membershipId} | Remove person from team |
386
+
387
+ #### `team-memberships create` Parameters
388
+
389
+ | Option | Required | Description |
390
+ |--------|:--------:|-------------|
391
+ | `--team-id TEAM_ID` | Yes | Team to add the person to |
392
+ | `--person-id PERSON_ID` | One of these | Person to add (by ID) |
393
+ | `--person-email EMAIL` | One of these | Person to add (by email) |
394
+ | `--is-moderator/--no-is-moderator` | No | Grant team moderator role |
395
+
396
+ #### `team-memberships update` Parameters
397
+
398
+ | Option | Description |
399
+ |--------|-------------|
400
+ | `--is-moderator/--no-is-moderator` | Grant or revoke team moderator role |
401
+
402
+ ### Raw HTTP
403
+
404
+ ```python
405
+ BASE = "https://webexapis.com/v1"
406
+
407
+ # Create team
408
+ body = {"name": "Engineering", "description": "Engineering team"}
409
+ result = api.session.rest_post(f"{BASE}/teams", json=body)
410
+ team_id = result.get("id")
411
+
412
+ # List team members
413
+ result = api.session.rest_get(f"{BASE}/team/memberships", params={"teamId": team_id})
414
+ members = result.get("items", [])
415
+ # Each item: {"id", "teamId", "personId", "personEmail", "personDisplayName", "isModerator", "created", ...}
416
+
417
+ # Add team member
418
+ body = {"teamId": team_id, "personEmail": "engineer@example.com", "isModerator": False}
419
+ result = api.session.rest_post(f"{BASE}/team/memberships", json=body)
420
+
421
+ # Delete team (DESTRUCTIVE — deletes all team spaces)
422
+ api.session.rest_delete(f"{BASE}/teams/{team_id}")
423
+ ```
424
+
425
+ ### Gotchas
426
+
427
+ - **Deleting a team deletes ALL team spaces and their content.** This is irreversible. Use `--force` to skip confirmation, but do not use `--force` in automated scripts without an explicit safety check.
428
+ - **Adding a member to a team auto-adds them to all existing team spaces.** The reverse is not true — removing a team member does not remove them from individual team spaces they were added to directly.
429
+ - **Team membership is separate from space membership.** A user can be removed from individual team spaces while remaining a team member, and vice versa.
430
+ - **Bot tokens cannot create or manage teams.** Only user tokens and admin tokens have this capability.
431
+ - **Note the API URL asymmetry:** teams are at `/teams` but team memberships are at `/team/memberships` (singular "team", not "teams"). The CLI handles this transparently.
432
+
433
+ ---
434
+
435
+ ## 6. ECM — Enterprise Content Management
436
+
437
+ **CLI group:** `ecm`
438
+ **API base:** `https://webexapis.com/v1/room/linkedFolders`
439
+
440
+ ECM links SharePoint/OneDrive folders to Webex spaces, allowing users to access enterprise content directly from a space. This is an admin-only operation.
441
+
442
+ ### Commands
443
+
444
+ | Command | CLI | HTTP Method | What It Does |
445
+ |---------|-----|------------|-------------|
446
+ | List linked folders | `wxcli ecm list` | GET /room/linkedFolders | List ECM folder links (optionally filtered by room) |
447
+ | Link folder | `wxcli ecm create --room-id ROOM_ID ...` | POST /room/linkedFolders | Link an ECM folder to a space |
448
+ | Show linked folder | `wxcli ecm show FOLDER_ID` | GET /room/linkedFolders/{id} | Get linked folder details |
449
+ | Update linked folder | `wxcli ecm update FOLDER_ID ...` | PUT /room/linkedFolders/{id} | Update folder link configuration |
450
+ | Unlink folder | `wxcli ecm delete FOLDER_ID --force` | DELETE /room/linkedFolders/{id} | Remove folder link from space |
451
+
452
+ ### Key Parameters
453
+
454
+ #### `ecm list`
455
+
456
+ | Option | Description |
457
+ |--------|-------------|
458
+ | `--room-id ROOM_ID` | Filter to linked folders for a specific space |
459
+ | `--output table\|json` | Output format (default: table; columns: ID, Name) |
460
+
461
+ #### `ecm create`
462
+
463
+ | Option | Required | Description |
464
+ |--------|:--------:|-------------|
465
+ | `--room-id ROOM_ID` | Yes | Space to link the folder to |
466
+ | `--content-url URL` | Yes | URL of the ECM folder |
467
+ | `--display-name TEXT` | Yes | Display name (should match the folder name in the ECM backend) |
468
+ | `--drive-id ID` | Yes | SharePoint or OneDrive drive ID (query via MS Graph API) |
469
+ | `--item-id ID` | Yes | SharePoint or OneDrive item ID (query via MS Graph API) |
470
+ | `--default-folder VALUE` | Yes | Set as default storage folder for the space |
471
+
472
+ #### `ecm update`
473
+
474
+ Same parameters as create, all optional. Pass only the fields you want to change.
475
+
476
+ ### Required Scopes
477
+
478
+ ECM operations require an admin token with standard `spark-admin:` scopes (e.g., `spark-admin:rooms_read`). No special ECM-specific scopes are needed -- the `/room/linkedFolders` endpoint works with a full admin token using standard room scopes. Standard user tokens are insufficient.
479
+
480
+ ### Raw HTTP
481
+
482
+ ```python
483
+ BASE = "https://webexapis.com/v1"
484
+
485
+ # List ECM linked folders for a space
486
+ result = api.session.rest_get(f"{BASE}/room/linkedFolders", params={"roomId": room_id})
487
+ folders = result.get("items", [])
488
+
489
+ # Link a SharePoint folder
490
+ body = {
491
+ "roomId": room_id,
492
+ "contentUrl": "https://contoso.sharepoint.com/sites/Engineering/Shared Documents/Project",
493
+ "displayName": "Project",
494
+ "driveId": "<drive-id-from-ms-graph>",
495
+ "itemId": "<item-id-from-ms-graph>",
496
+ "defaultFolder": "true"
497
+ }
498
+ result = api.session.rest_post(f"{BASE}/room/linkedFolders", json=body)
499
+ folder_id = result.get("id")
500
+
501
+ # Unlink folder
502
+ api.session.rest_delete(f"{BASE}/room/linkedFolders/{folder_id}")
503
+ ```
504
+
505
+ ### Gotchas
506
+
507
+ - **Admin token with `spark-admin:` scopes is required.** User tokens return 403.
508
+ - **`--drive-id` and `--item-id` must be obtained from the Microsoft Graph API** before calling ECM endpoints. They are Microsoft-side identifiers for the SharePoint/OneDrive resource.
509
+ - **`--display-name` should match the actual folder name in the ECM backend** to avoid confusion for end users.
510
+ - **Unlinking a folder removes the link but does not delete the files** in SharePoint/OneDrive.
511
+
512
+ **ECM provider support:** The OpenAPI spec and schema definitions reference only Microsoft SharePoint and OneDrive. The `driveId` and `itemId` fields are described as "Sharepoint or OneDrive" identifiers collected via the MS Graph API, and all examples use `sharepoint.com` URLs. Box is not supported as an ECM provider for folder linking.
513
+
514
+ ---
515
+
516
+ ## 7. HDS — Hybrid Data Security
517
+
518
+ **CLI group:** `hds`
519
+ **API base:** `https://webexapis.com/v1/hds`
520
+
521
+ HDS manages encryption keys on-premises for compliance-sensitive organizations. These commands are monitoring-only — there are no write operations. Requires an admin token.
522
+
523
+ ### Commands
524
+
525
+ | Command | CLI | What It Shows |
526
+ |---------|-----|--------------|
527
+ | Org status | `wxcli hds show ORG_ID` | HDS organization enrollment status and configuration |
528
+ | Cluster details | `wxcli hds show-clusters CLUSTER_ID` | HDS cluster configuration and health |
529
+ | Node details | `wxcli hds show-nodes NODE_ID` | Individual node status |
530
+ | Database details | `wxcli hds list ORG_ID` | HDS database configuration |
531
+ | Multi-tenant info | `wxcli hds list-multi-tenant ORG_ID` | Multi-tenant HDS org details |
532
+ | Network tests | `wxcli hds list-network-test NODE_ID` | Network test results for a node |
533
+ | Availability | `wxcli hds list-availability CLUSTER_ID` | Cluster availability metrics over time |
534
+
535
+ ### Key Parameters
536
+
537
+ #### `hds list-network-test NODE_ID`
538
+
539
+ | Option | Description |
540
+ |--------|-------------|
541
+ | `--trigger-type OnDemand\|Periodic\|All` | Filter test results by trigger type |
542
+ | `--output table\|json` | Output format (default: table) |
543
+
544
+ #### `hds list-availability CLUSTER_ID`
545
+
546
+ | Option | Description |
547
+ |--------|-------------|
548
+ | `--from DATETIME` | Start of availability window (ISO 8601) |
549
+ | `--to DATETIME` | End of availability window (ISO 8601) |
550
+ | `--output table\|json` | Output format (default: table) |
551
+
552
+ ### Raw HTTP
553
+
554
+ ```python
555
+ BASE = "https://webexapis.com/v1/hds"
556
+
557
+ # Get HDS org status
558
+ org_status = api.session.rest_get(f"{BASE}/organizations/{org_id}")
559
+
560
+ # Get cluster details
561
+ cluster = api.session.rest_get(f"{BASE}/clusters/{cluster_id}")
562
+
563
+ # Get node details
564
+ node = api.session.rest_get(f"{BASE}/nodes/{node_id}")
565
+
566
+ # Get database details
567
+ db = api.session.rest_get(f"{BASE}/organizations/{org_id}/database/details")
568
+
569
+ # Get multi-tenant details
570
+ mt = api.session.rest_get(f"{BASE}/organizations/{org_id}/multiTenant")
571
+
572
+ # Get node network test results
573
+ tests = api.session.rest_get(f"{BASE}/testResults/nodes/{node_id}/networkTest",
574
+ params={"triggerType": "All"})
575
+
576
+ # Get cluster availability
577
+ avail = api.session.rest_get(f"{BASE}/clusters/{cluster_id}/availability",
578
+ params={"from": "2026-01-01T00:00:00Z", "to": "2026-03-19T00:00:00Z"})
579
+ ```
580
+
581
+ ### Gotchas
582
+
583
+ - **All HDS commands are read-only.** There are no create, update, or delete operations in the `hds` CLI group.
584
+ - **Requires admin token.** HDS monitoring is not available via user or bot tokens.
585
+ - **IDs are required positional arguments** for all `hds` commands (e.g., `hds show ORG_ID`, `hds show-clusters CLUSTER_ID`). The org ID is available from `wxcli organizations list`.
586
+
587
+ HDS endpoints work with a standard full admin token -- no special admin role (e.g., Compliance Officer) is required. The `/hybrid/clusters` endpoint returns 200 with a full admin token.
588
+
589
+ ---
590
+
591
+ ## 8. Common Patterns
592
+
593
+ All messaging commands support `--output json|table`. Use `--output json` for scripting and piping results to other tools.
594
+
595
+ > **Note:** Specific numeric rate limits (~5 req/s for bot tokens) not yet confirmed via live testing. The OpenAPI spec confirms 429 responses with Retry-After headers but does not document per-token-type rates.
596
+
597
+ ### Bulk Create Spaces from a List
598
+
599
+ ```bash
600
+ # Create multiple project spaces from a list of names
601
+ for name in "Project Alpha" "Project Beta" "Project Gamma"; do
602
+ wxcli rooms create --title "$name" --team-id TEAM_ID
603
+ sleep 1
604
+ done
605
+ ```
606
+
607
+ ### Audit All Memberships in a Space
608
+
609
+ ```bash
610
+ # List all members of a space in JSON for processing
611
+ wxcli memberships list --room-id ROOM_ID --output json
612
+
613
+ # Find all spaces a specific user belongs to
614
+ wxcli memberships list --person-email user@example.com --output json
615
+ ```
616
+
617
+ ### Archive a Space (Read-Only + Notice)
618
+
619
+ ```bash
620
+ # 1. Post an archival notice
621
+ wxcli messages create --room-id ROOM_ID --text "This space is now archived. No further messages will be accepted."
622
+
623
+ # 2. Set the space to read-only (compliance officer token required)
624
+ wxcli rooms update ROOM_ID --is-read-only
625
+
626
+ # 3. Optionally rename to indicate archived status
627
+ wxcli rooms update ROOM_ID --title "[ARCHIVED] Project Alpha"
628
+ ```
629
+
630
+ ### Set Up a Project Team
631
+
632
+ ```bash
633
+ # 1. Create the team (auto-creates a General space)
634
+ wxcli teams create --name "Acme Project" --description "Q2 2026 deployment"
635
+
636
+ # 2. Create additional team spaces
637
+ TEAM_ID="<id from step 1>"
638
+ wxcli rooms create --title "Engineering" --team-id $TEAM_ID
639
+ wxcli rooms create --title "Announcements" --team-id $TEAM_ID --is-announcement-only
640
+
641
+ # 3. Add team members (auto-adds to all team spaces)
642
+ wxcli team-memberships create --team-id $TEAM_ID --person-email lead@example.com --is-moderator
643
+ wxcli team-memberships create --team-id $TEAM_ID --person-email dev1@example.com
644
+ wxcli team-memberships create --team-id $TEAM_ID --person-email dev2@example.com
645
+ ```
646
+
647
+ ### Export Messages from a Space (Paginated)
648
+
649
+ ```bash
650
+ # Get the first 50 messages
651
+ wxcli messages list --room-id ROOM_ID --limit 50 --output json > messages_page1.json
652
+
653
+ # Get the next page using the oldest message ID from the previous result
654
+ OLDEST_ID="<id of oldest message in page 1>"
655
+ wxcli messages list --room-id ROOM_ID --before-message $OLDEST_ID --limit 50 --output json > messages_page2.json
656
+ ```
657
+
658
+ ### Find a Membership ID for a Specific Person
659
+
660
+ ```bash
661
+ # You need the membership ID to update or remove a specific person
662
+ wxcli memberships list --room-id ROOM_ID --output json | python3 -c "
663
+ import sys, json
664
+ members = json.load(sys.stdin)
665
+ for m in members:
666
+ if m.get('personEmail') == 'user@example.com':
667
+ print(m['id'])
668
+ "
669
+ ```
670
+
671
+ ---
672
+
673
+ ## Gotchas (Cross-Cutting)
674
+
675
+ These issues span multiple messaging API surfaces. Check per-section Gotchas for endpoint-specific notes.
676
+
677
+ 1. **Rate limits apply across all messaging endpoints.** Bot tokens have lower rate limits than user/admin tokens (exact numbers not officially documented — honor `Retry-After` headers). When bulk-creating spaces, adding members, or sending messages in a loop, add a short delay (e.g., `sleep 1`) between operations. A 429 response includes a `Retry-After` header — always honor it.
678
+
679
+ 2. **Pagination is cursor-based, not offset-based.** All `list` commands use `items` arrays with `Link` headers for the next page. The CLI handles pagination internally via `--max` (API page size) and `--limit` (total result cap). For raw HTTP, follow the `Link: <url>; rel="next"` header to walk through pages.
680
+
681
+ 3. **Membership sync delays on team operations.** Adding a member to a team auto-adds them to all team spaces, but the space-level membership may take a few seconds to propagate. If you add a team member and immediately try to post a message as that user in a team space, the message may fail with 403 until the membership propagates.
682
+
683
+ 4. **Bot vs user vs admin token capabilities differ significantly.** See the Token Type Matrix at the top of this doc before every operation. Bots cannot manage teams. Admins cannot send messages (only list via compliance). Users cannot perform ECM or HDS operations.
684
+
685
+ 5. **Direct (1:1) spaces have special behavior.** They cannot be deleted, cannot be renamed (title is derived from participant names), and are auto-created when you send a message via `--to-person-email` or `--to-person-id`. There is no explicit "create direct space" operation.
686
+
687
+ 6. **IDs are Base64-encoded and org-scoped.** All Webex resource IDs (room, person, membership, team) are long Base64 strings. They are not transferable between orgs. When scripting, always resolve IDs dynamically rather than hardcoding them.
688
+
689
+ ---
690
+
691
+ ## 9. See Also
692
+
693
+ - [`messaging-bots.md`](messaging-bots.md) — Bot development, adaptive cards, interactive workflows, `--json-body` recipes for `attachments`
694
+ - [`webhooks-events.md`](webhooks-events.md) — Webhook CRUD and event payloads for messaging events (`messages`, `memberships`, `rooms`, `attachmentActions`)
695
+ - [`authentication.md`](authentication.md) — Token types (user, bot, admin), scopes, OAuth flows