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,520 @@
1
+ ---
2
+ name: messaging-spaces
3
+ description: |
4
+ Manage Webex messaging spaces, teams (collaboration groupings), memberships, messages,
5
+ and enterprise content management (ECM folder linking, HDS monitoring) using wxcli CLI commands.
6
+ Guides the user from prerequisites through execution and verification.
7
+ NOT for: Contact Center teams (use contact-center skill — CC teams group agents for routing,
8
+ not collaboration spaces) or bot/webhook development (use messaging-bots skill).
9
+ allowed-tools: Read, Grep, Glob, Bash
10
+ argument-hint: [operation-type]
11
+ ---
12
+
13
+ <!-- Created by playbook session 2026-03-19 -->
14
+
15
+ # Messaging Spaces Workflow
16
+
17
+ **Checkpoint — do NOT proceed until you can answer these:**
18
+ 1. What token type do messaging space operations require? (Answer: User-level or bot token with `spark:rooms_read`/`spark:rooms_write` — admin tokens work for listing but some operations need the acting user's token.)
19
+ 2. How do you list messages in a space? (Answer: `wxcli messages list --room-id SPACE_ID` — the API uses `roomId` not `spaceId`, matching the older "rooms" terminology.)
20
+
21
+ If you cannot answer both, you skipped reading this skill. Go back and read it.
22
+
23
+ ## Step 1: Load references
24
+
25
+ 1. Read `docs/reference/messaging-spaces.md` for spaces/messages/teams/ECM/HDS data models and CLI commands
26
+
27
+ **Mandatory --help verification:** Before constructing any wxcli command, run `wxcli <group> --help` to verify the subcommand exists, then `wxcli <group> <subcommand> --help` to verify the exact flags (e.g. `wxcli rooms create --help` — the CLI group for spaces is `rooms`, not `spaces`, and `teams` here are collaboration teams, not CC agent teams). 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.
28
+
29
+ ---
30
+
31
+ ## Step 2: Verify auth token
32
+
33
+ Before any API calls, confirm the user has a working auth token:
34
+
35
+ ```bash
36
+ wxcli whoami
37
+ ```
38
+
39
+ If this fails, stop and resolve authentication first (`wxcli configure`).
40
+
41
+ Check the `type` field in the response to determine the token type:
42
+
43
+ | `type` value | Token type | Notes |
44
+ |-------------|-----------|-------|
45
+ | `bot` | Bot token | Limited — cannot create teams, cannot add self to spaces |
46
+ | `person` | User token | Full messaging access; space-scoped operations |
47
+ | `person` (with `spark-admin:` scopes) | Admin token | Required for ECM, HDS, and org-wide operations. API returns `type: person`, not `admin` — detect admin by checking if `spark-admin:` scoped operations succeed. |
48
+
49
+ **Required scopes by operation:**
50
+
51
+ | Operation | Required Scopes |
52
+ |-----------|----------------|
53
+ | Spaces read | `spark:rooms_read` |
54
+ | Spaces write | `spark:rooms_write` |
55
+ | Messages read | `spark:messages_read` |
56
+ | Messages write | `spark:messages_write` |
57
+ | Memberships read | `spark:memberships_read` |
58
+ | Memberships write | `spark:memberships_write` |
59
+ | Teams read | `spark:teams_read` |
60
+ | Teams write | `spark:teams_write` |
61
+ | Team memberships | `spark:team_memberships_read`, `spark:team_memberships_write` |
62
+ | ECM folder linking | `spark-admin:room_linkedFolders_read`, `spark-admin:room_linkedFolders_write` |
63
+ | HDS monitoring | `spark-admin:hds_read` |
64
+
65
+ **Warn the user** if they are using a bot token and attempting ECM, HDS, or team management operations. Bot tokens will return 403 for those endpoints.
66
+
67
+ ---
68
+
69
+ ## Step 3: Identify the operation type
70
+
71
+ Ask the user what they want to accomplish. Present this decision matrix if they are unsure:
72
+
73
+ | User Wants To | Operation Type | Token Required |
74
+ |--------------|---------------|---------------|
75
+ | Create/manage spaces | Space lifecycle | User or admin token |
76
+ | Send/manage messages | Message management | User or bot token (bot must be member) |
77
+ | Add/remove space members | Membership management | User token (moderator) or admin token |
78
+ | Create/manage teams and team spaces | Team management | User or admin token (NOT bot) |
79
+ | Link SharePoint/OneDrive folder to space | ECM setup | Admin token only |
80
+ | Monitor HDS cluster health and key availability | HDS monitoring | Admin token only |
81
+
82
+ ---
83
+
84
+ ## Step 4: Check prerequisites per operation
85
+
86
+ ### 4a. Space lifecycle
87
+
88
+ Check whether the target space already exists before creating:
89
+
90
+ ```bash
91
+ # List all spaces the token has access to
92
+ wxcli rooms list --output json
93
+
94
+ # Filter by type
95
+ wxcli rooms list --type group --output json
96
+
97
+ # Filter by team
98
+ wxcli rooms list --team-id TEAM_ID --output json
99
+ ```
100
+
101
+ If creating a new space, no prerequisites are required beyond a valid token.
102
+
103
+ If targeting an existing space, capture the `id` field from the list output.
104
+
105
+ ### 4b. Message management
106
+
107
+ The space must exist and the authenticated user or bot must be a member:
108
+
109
+ ```bash
110
+ # Verify the space exists and get its ID
111
+ wxcli rooms show ROOM_ID --output json
112
+
113
+ # Verify the token's identity is a member
114
+ wxcli memberships list --room-id ROOM_ID --output json
115
+ ```
116
+
117
+ **Bot tokens:** Bots can only read messages where they are @mentioned, except in 1:1 direct spaces. Bots cannot add themselves to spaces — they must be added by a user.
118
+
119
+ ### 4c. Membership management
120
+
121
+ Confirm the target space exists and the person is identifiable:
122
+
123
+ ```bash
124
+ # Verify space exists
125
+ wxcli rooms show ROOM_ID --output json
126
+
127
+ # List current members (to check if person is already a member or find membership IDs)
128
+ wxcli memberships list --room-id ROOM_ID --output json
129
+
130
+ # Find all spaces a specific person belongs to
131
+ wxcli memberships list --person-email user@example.com --output json
132
+ ```
133
+
134
+ | Prerequisite | Check |
135
+ |-------------|-------|
136
+ | Space exists | `wxcli rooms show ROOM_ID` |
137
+ | Person email or ID is known | Have it ready before `memberships create` |
138
+ | Caller is moderator (for locked spaces) | Confirm `isModerator: true` in own membership |
139
+ | At least one moderator will remain after removal | Check current moderators before `memberships delete` |
140
+
141
+ ### 4d. Team management
142
+
143
+ Teams require a user or admin token (bot tokens cannot create or manage teams).
144
+
145
+ ```bash
146
+ # List existing teams
147
+ wxcli teams list --output json
148
+
149
+ # Show a team
150
+ wxcli teams show TEAM_ID --output json
151
+
152
+ # List team members
153
+ wxcli team-memberships list --team-id TEAM_ID --output json
154
+ ```
155
+
156
+ **Warning:** Deleting a team deletes ALL team spaces and their content. This is irreversible.
157
+
158
+ ### 4e. ECM folder linking
159
+
160
+ ECM requires an admin token and Microsoft Graph API identifiers obtained before calling wxcli:
161
+
162
+ | Prerequisite | How to obtain |
163
+ |-------------|--------------|
164
+ | Admin token with `spark-admin:` scopes | `wxcli configure`, verify admin access by testing a `spark-admin:` scoped operation |
165
+ | Target space ID (`roomId`) | `wxcli rooms show ROOM_ID` or `wxcli rooms list` |
166
+ | SharePoint/OneDrive `driveId` | Microsoft Graph API: `GET /sites/{site-id}/drive` |
167
+ | SharePoint/OneDrive `itemId` | Microsoft Graph API: `GET /drives/{drive-id}/root:/path/to/folder` |
168
+ | Content URL (`contentUrl`) | The full URL to the SharePoint/OneDrive folder |
169
+ | Display name | Human-readable name for the folder link |
170
+
171
+ ### 4f. HDS monitoring
172
+
173
+ HDS requires an admin token. Obtain org and cluster IDs first:
174
+
175
+ ```bash
176
+ # Get the org ID
177
+ wxcli organizations list --output json
178
+
179
+ # Check HDS org enrollment status
180
+ wxcli hds show ORG_ID --output json
181
+
182
+ # List available clusters (if org has HDS enrolled)
183
+ wxcli hds list ORG_ID --output json
184
+ ```
185
+
186
+ ---
187
+
188
+ ## Step 5: Build and present deployment plan — [SHOW BEFORE EXECUTING]
189
+
190
+ Before executing any commands, present the full plan to the user:
191
+
192
+ ```
193
+ DEPLOYMENT PLAN
194
+ ===============
195
+ Operation: [type — e.g., "Create project team with 3 spaces and 5 members"]
196
+ Target: [space name / team name / org-wide]
197
+
198
+ Resources to create/modify:
199
+ - [Team: "Acme Project"] (if applicable)
200
+ - [Space: "Engineering"] (if applicable)
201
+ - [Space: "Announcements" — announcement-only] (if applicable)
202
+ - [Members to add: lead@example.com (moderator), dev1@example.com, dev2@example.com]
203
+
204
+ Prerequisites verified:
205
+ [checkmark] Auth token verified — type: [user/admin/bot]
206
+ [checkmark] Required scopes present
207
+ [checkmark] Target space/team identified or does not yet exist (new)
208
+ [checkmark] Person emails/IDs confirmed
209
+ [checkmark] ECM drive/item IDs obtained (if ECM operation)
210
+
211
+ Commands to execute:
212
+ 1. wxcli teams create --name "Acme Project" --description "..."
213
+ 2. wxcli rooms create --title "Engineering" --team-id TEAM_ID
214
+ 3. wxcli rooms create --title "Announcements" --team-id TEAM_ID --is-announcement-only
215
+ 4. wxcli team-memberships create --team-id TEAM_ID --person-email lead@example.com --is-moderator
216
+ 5. wxcli team-memberships create --team-id TEAM_ID --person-email dev1@example.com
217
+ 6. wxcli team-memberships create --team-id TEAM_ID --person-email dev2@example.com
218
+
219
+ Proceed? (yes/no)
220
+ ```
221
+
222
+ **Wait for user confirmation before executing.**
223
+
224
+ ---
225
+
226
+ ## Step 6: Execute via wxcli
227
+
228
+ Run the commands in plan order. Capture IDs from each creation response to use in subsequent commands.
229
+
230
+ Refer to the **CLI Command Reference** section at the bottom of this skill for the full command catalog per resource type.
231
+
232
+ Handle errors explicitly:
233
+
234
+ - **401/403**: Token expired or insufficient scopes — run `wxcli configure` to re-authenticate
235
+ - **404**: Resource not found — confirm the ID is correct and the token has access
236
+ - **409**: Conflict (e.g., space already exists with that name) — verify with `list`, then proceed or skip
237
+ - **400**: Validation error — read the error message and fix the parameter (e.g., missing required field)
238
+ - **429**: Rate limiting — add `sleep 1` between commands; use sequential execution for bulk operations
239
+
240
+ ## Step 7: Verify
241
+
242
+ Read back each created resource to confirm:
243
+
244
+ ```bash
245
+ # Verify a space
246
+ wxcli rooms show ROOM_ID --output json
247
+
248
+ # Verify memberships in a space
249
+ wxcli memberships list --room-id ROOM_ID --output json
250
+
251
+ # Verify a team
252
+ wxcli teams show TEAM_ID --output json
253
+
254
+ # Verify team members
255
+ wxcli team-memberships list --team-id TEAM_ID --output json
256
+
257
+ # Verify ECM folder link
258
+ wxcli ecm show FOLDER_ID --output json
259
+
260
+ # Verify HDS status
261
+ wxcli hds show ORG_ID --output json
262
+ ```
263
+
264
+ ---
265
+
266
+ ## Step 8: Report results
267
+
268
+ Present the operation results:
269
+
270
+ ```
271
+ OPERATION COMPLETE
272
+ ==================
273
+ Operation: [type]
274
+ Status: Success
275
+
276
+ Resources Created/Modified:
277
+ [Team: "Acme Project"]
278
+ ID: [team_id]
279
+ Created: [timestamp]
280
+
281
+ [Space: "Engineering"]
282
+ ID: [room_id]
283
+ Team: Acme Project
284
+ Type: group
285
+
286
+ [Space: "Announcements"]
287
+ ID: [room_id]
288
+ Team: Acme Project
289
+ Type: group (announcement-only)
290
+
291
+ Members added: 3
292
+ lead@example.com — team moderator
293
+ dev1@example.com
294
+ dev2@example.com
295
+
296
+ Next steps:
297
+ - [e.g., "Add remaining team members"]
298
+ - [e.g., "Upload project files and link ECM folder"]
299
+ - [e.g., "Configure webhooks for message events — see webhooks-events.md"]
300
+ - [e.g., "Set up bot integrations — see messaging-bots.md"]
301
+ ```
302
+
303
+ ---
304
+
305
+ ## Critical Rules
306
+
307
+ 1. **Always verify token type before executing.** Bot tokens cannot create teams, manage team memberships, or access ECM/HDS. Check `type` in `wxcli whoami` output.
308
+ 2. **Always show the deployment plan** (Step 5) and wait for user confirmation before executing any create, update, or delete commands.
309
+ 3. **Membership operations require valid person IDs or emails.** Use `wxcli memberships list` or `wxcli team-memberships list` to find existing membership IDs — they are different from person IDs.
310
+ 4. **Deleting a space or team is permanent.** There is no recycle bin. Confirm with the user explicitly before running any `delete` command. Deleting a team removes ALL team spaces and content.
311
+ 5. **Bot tokens cannot create teams or manage team memberships.** Only user tokens and admin tokens can do this. Bot tokens also cannot add themselves to spaces.
312
+ 6. **ECM and HDS require admin tokens with `spark-admin:` scopes.** User tokens return 403. Verify token type before attempting ECM or HDS commands.
313
+ 7. **`rooms list` only returns spaces the authenticated user or bot is a member of.** It does not list all org spaces. Use an admin token or the compliance API for org-wide space auditing.
314
+ 8. **Direct (1:1) spaces cannot be deleted or renamed via API.** The delete endpoint returns an error for direct spaces. The `title` field may be empty for direct spaces.
315
+ 9. **When adding members in bulk, execute sequentially with `sleep 1` between operations.** The messaging API enforces rate limits (~5 requests/second for bot tokens). Parallel bulk adds risk 429 errors.
316
+ 10. **Always check if a space or team already exists before creating (idempotency).** Run `wxcli rooms list` or `wxcli teams list` first. Creating a duplicate may succeed but creates clutter, or may fail with a 409 conflict.
317
+
318
+ ---
319
+
320
+ ## Context Compaction Recovery
321
+
322
+ If context compacts mid-execution, recover by:
323
+
324
+ 1. Read the deployment plan from `docs/plans/` to recover what was planned
325
+ 2. Check what has already been created:
326
+ ```bash
327
+ wxcli rooms list --output json
328
+ wxcli teams list --output json
329
+ wxcli memberships list --room-id ROOM_ID --output json
330
+ ```
331
+ 3. Resume from the first incomplete step in the plan
332
+
333
+ ---
334
+
335
+ ## CLI Command Reference
336
+
337
+ ### Spaces (`rooms`)
338
+
339
+ ```bash
340
+ # List spaces (authenticated user's spaces only)
341
+ wxcli rooms list --output json
342
+ wxcli rooms list --type group --sort-by lastactivity --output json
343
+ wxcli rooms list --org-public-spaces --output json
344
+
345
+ # Create a space
346
+ wxcli rooms create --title "Project Alpha"
347
+ wxcli rooms create --title "Announcements" --team-id TEAM_ID --is-announcement-only
348
+ wxcli rooms create --title "Private Discussion" --is-locked
349
+
350
+ # Show space details
351
+ wxcli rooms show ROOM_ID --output json
352
+
353
+ # Update a space
354
+ wxcli rooms update ROOM_ID --title "New Name"
355
+ wxcli rooms update ROOM_ID --is-locked
356
+ wxcli rooms update ROOM_ID --is-announcement-only
357
+
358
+ # Get space meeting/SIP info
359
+ wxcli rooms show-meeting-info ROOM_ID --output json
360
+
361
+ # Delete a space (permanent — use with caution)
362
+ wxcli rooms delete ROOM_ID --force
363
+ ```
364
+
365
+ ### Messages (`messages`)
366
+
367
+ ```bash
368
+ # List messages in a space
369
+ wxcli messages list --room-id ROOM_ID --output json
370
+ wxcli messages list --room-id ROOM_ID --limit 50 --output json
371
+
372
+ # Send a message
373
+ wxcli messages create --room-id ROOM_ID --text "Hello team"
374
+ wxcli messages create --room-id ROOM_ID --markdown "**Alert:** Deploy complete"
375
+ wxcli messages create --to-person-email user@example.com --text "Hi there"
376
+
377
+ # Reply to a thread
378
+ wxcli messages create --room-id ROOM_ID --parent-id MESSAGE_ID --text "Acknowledged"
379
+
380
+ # List 1:1 direct messages
381
+ wxcli messages list-direct --person-email user@example.com --output json
382
+
383
+ # Show a message
384
+ wxcli messages show MESSAGE_ID --output json
385
+
386
+ # Edit a message (own messages only)
387
+ wxcli messages update MESSAGE_ID --text "Updated text"
388
+
389
+ # Delete a message
390
+ wxcli messages delete MESSAGE_ID --force
391
+
392
+ # Send adaptive card or file attachment (requires --json-body)
393
+ wxcli messages create --json-body '{"roomId": "ROOM_ID", "text": "fallback", "attachments": [...]}'
394
+ ```
395
+
396
+ ### Memberships (`memberships`)
397
+
398
+ ```bash
399
+ # List all members of a space
400
+ wxcli memberships list --room-id ROOM_ID --output json
401
+
402
+ # Find all spaces a person belongs to
403
+ wxcli memberships list --person-email user@example.com --output json
404
+
405
+ # Add a member to a space
406
+ wxcli memberships create --room-id ROOM_ID --person-email user@example.com
407
+ wxcli memberships create --room-id ROOM_ID --person-email user@example.com --is-moderator
408
+
409
+ # Show membership details (need membership ID, not person ID)
410
+ wxcli memberships show MEMBERSHIP_ID --output json
411
+
412
+ # Promote/demote moderator
413
+ wxcli memberships update MEMBERSHIP_ID --is-moderator
414
+ wxcli memberships update MEMBERSHIP_ID --no-is-moderator
415
+
416
+ # Remove a member from a space
417
+ wxcli memberships delete MEMBERSHIP_ID --force
418
+ ```
419
+
420
+ **Finding a membership ID for a specific person:**
421
+
422
+ ```bash
423
+ wxcli memberships list --room-id ROOM_ID --output json | python3 -c "
424
+ import sys, json
425
+ members = json.load(sys.stdin)
426
+ for m in members:
427
+ if m.get('personEmail') == 'user@example.com':
428
+ print(m['id'])
429
+ "
430
+ ```
431
+
432
+ ### Teams (`teams`)
433
+
434
+ ```bash
435
+ # List teams
436
+ wxcli teams list --output json
437
+
438
+ # Create a team (auto-creates a General space)
439
+ wxcli teams create --name "Engineering" --description "Engineering team spaces"
440
+
441
+ # Show team details
442
+ wxcli teams show TEAM_ID --output json
443
+
444
+ # Rename a team
445
+ wxcli teams update TEAM_ID --name "New Name"
446
+
447
+ # Delete a team (DESTRUCTIVE — deletes ALL team spaces and content)
448
+ wxcli teams delete TEAM_ID --force
449
+ ```
450
+
451
+ ### Team memberships (`team-memberships`)
452
+
453
+ ```bash
454
+ # List team members
455
+ wxcli team-memberships list --team-id TEAM_ID --output json
456
+
457
+ # Add a member to a team (auto-adds to all team spaces)
458
+ wxcli team-memberships create --team-id TEAM_ID --person-email user@example.com
459
+ wxcli team-memberships create --team-id TEAM_ID --person-email lead@example.com --is-moderator
460
+
461
+ # Show team membership details
462
+ wxcli team-memberships show MEMBERSHIP_ID --output json
463
+
464
+ # Change moderator role
465
+ wxcli team-memberships update MEMBERSHIP_ID --is-moderator
466
+ wxcli team-memberships update MEMBERSHIP_ID --no-is-moderator
467
+
468
+ # Remove from team
469
+ wxcli team-memberships delete MEMBERSHIP_ID --force
470
+ ```
471
+
472
+ ### ECM (`ecm`)
473
+
474
+ ```bash
475
+ # List linked folders for a space
476
+ wxcli ecm list --room-id ROOM_ID --output json
477
+
478
+ # Link a SharePoint/OneDrive folder to a space
479
+ wxcli ecm create \
480
+ --room-id ROOM_ID \
481
+ --content-url "https://contoso.sharepoint.com/sites/Engineering/Shared Documents/Project" \
482
+ --display-name "Project Files" \
483
+ --drive-id DRIVE_ID \
484
+ --item-id ITEM_ID \
485
+ --default-folder true
486
+
487
+ # Show linked folder details
488
+ wxcli ecm show FOLDER_ID --output json
489
+
490
+ # Update folder link
491
+ wxcli ecm update FOLDER_ID --display-name "Updated Name"
492
+
493
+ # Unlink folder (does NOT delete files in SharePoint/OneDrive)
494
+ wxcli ecm delete FOLDER_ID --force
495
+ ```
496
+
497
+ ### HDS (`hds`) — read-only
498
+
499
+ ```bash
500
+ # Get HDS org enrollment status
501
+ wxcli hds show ORG_ID --output json
502
+
503
+ # Get cluster details
504
+ wxcli hds show-clusters CLUSTER_ID --output json
505
+
506
+ # Get node details
507
+ wxcli hds show-nodes NODE_ID --output json
508
+
509
+ # Get HDS database configuration
510
+ wxcli hds list ORG_ID --output json
511
+
512
+ # Get multi-tenant HDS details
513
+ wxcli hds list-tenants ORG_ID --output json
514
+
515
+ # Get node network test results
516
+ wxcli hds list-network-test NODE_ID --trigger-type All --output json
517
+
518
+ # Get cluster availability metrics
519
+ wxcli hds list-availability CLUSTER_ID --from 2026-01-01T00:00:00Z --to 2026-03-19T00:00:00Z --output json
520
+ ```
@@ -0,0 +1,159 @@
1
+ ---
2
+ name: org-health
3
+ description: |
4
+ Run an org health assessment on a live Webex Calling org. Collects state via
5
+ wxcli commands, runs 18 deterministic Python checks across 4 categories, and
6
+ generates an Authority Minimal HTML report. Three phases: collect → analyze → report.
7
+ Use when the user wants to audit their org, run a health check, or see what needs attention.
8
+ NOT for: security/compliance audit logs (use audit-compliance skill), CDR/call analytics
9
+ (use reporting skill), or license auditing (use manage-licensing skill).
10
+ ---
11
+
12
+ # Org Health Assessment
13
+
14
+ ## Prerequisites
15
+
16
+ 1. Authenticated session: `wxcli whoami` succeeds
17
+ 2. Confirm target org with user — show org name from `wxcli whoami` output
18
+
19
+ ## Phase 1 — Collect
20
+
21
+ Create the output directory and run each wxcli command. Save results as JSON.
22
+
23
+ **Mandatory --help verification:** The collection commands below are a fixed list, but if you adapt one or a command errors on an unexpected flag, run `wxcli <group> --help` to verify the subcommand and flags (e.g. `wxcli call-routing --help`, `wxcli call-queue --help`). 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.
24
+
25
+ ### Setup
26
+
27
+ ```bash
28
+ TIMESTAMP=$(date +%Y%m%d-%H%M%S)
29
+ OUTPUT_DIR="org-health-output/${TIMESTAMP}/collected"
30
+ mkdir -p "${OUTPUT_DIR}/call_queue_details" "${OUTPUT_DIR}/outgoing_permissions"
31
+ ```
32
+
33
+ ### Collection Commands
34
+
35
+ Run each command and save the output. If a command fails (e.g., no resources of that type),
36
+ save an empty JSON array `[]`.
37
+
38
+ | # | Command | Output File |
39
+ |---|---------|-------------|
40
+ | 1 | `wxcli auto-attendant list -o json` | `${OUTPUT_DIR}/auto_attendants.json` |
41
+ | 2 | `wxcli call-queue list -o json` | `${OUTPUT_DIR}/call_queues.json` |
42
+ | 3 | `wxcli hunt-group list -o json` | `${OUTPUT_DIR}/hunt_groups.json` |
43
+ | 4 | `wxcli location-voicemail list -o json` | `${OUTPUT_DIR}/voicemail_groups.json` |
44
+ | 5 | `wxcli paging-group list -o json` | `${OUTPUT_DIR}/paging_groups.json` |
45
+ | 6 | `wxcli call-park list -o json` | `${OUTPUT_DIR}/call_parks.json` |
46
+ | 7 | `wxcli devices list -o json` | `${OUTPUT_DIR}/devices.json` |
47
+ | 8 | `wxcli workspaces list -o json` | `${OUTPUT_DIR}/workspaces.json` |
48
+ | 9 | `wxcli people list -o json` | `${OUTPUT_DIR}/users.json` |
49
+ | 10 | `wxcli call-routing list-dial-plans -o json` | `${OUTPUT_DIR}/dial_plans.json` |
50
+ | 11 | `wxcli call-routing list-route-groups -o json` | `${OUTPUT_DIR}/route_groups.json` |
51
+ | 12 | `wxcli call-routing list-route-lists -o json` | `${OUTPUT_DIR}/route_lists.json` |
52
+ | 13 | `wxcli call-routing list-trunks -o json` | `${OUTPUT_DIR}/trunks.json` |
53
+ | 14 | `wxcli numbers list -o json` | `${OUTPUT_DIR}/numbers.json` |
54
+
55
+ ### Detail Collection
56
+
57
+ **Call queue details** — iterate queue IDs from step 2:
58
+
59
+ ```bash
60
+ # For each queue ID from call_queues.json:
61
+ wxcli call-queue show <QUEUE_ID> -o json > "${OUTPUT_DIR}/call_queue_details/<QUEUE_ID>.json"
62
+ ```
63
+
64
+ **Outgoing permissions sample** — select up to 50 user IDs from step 9:
65
+
66
+ ```bash
67
+ # For each of the first 50 user IDs from users.json:
68
+ wxcli user-settings list-outgoing-permission <USER_ID> -o json > "${OUTPUT_DIR}/outgoing_permissions/<USER_ID>.json"
69
+ ```
70
+
71
+ ### Manifest
72
+
73
+ After all collection is complete, write `manifest.json`:
74
+
75
+ ```json
76
+ {
77
+ "collected_at": "<ISO timestamp>",
78
+ "org_id": "<from wxcli whoami>",
79
+ "org_name": "<from wxcli whoami>",
80
+ "total_users": <count from users.json>,
81
+ "total_devices": <count from devices.json>,
82
+ "sampled_users_for_permissions": <actual number sampled, max 50>,
83
+ "commands_run": ["auto-attendant list", "call-queue list", "..."],
84
+ "wxcli_version": "<from wxcli --version>"
85
+ }
86
+ ```
87
+
88
+ ### Progress Report
89
+
90
+ After collection, tell the user:
91
+ - "Collected X users, Y devices, Z features across N locations"
92
+ - "Sampled M users for outgoing permission analysis"
93
+
94
+ ## Phase 2 — Analyze
95
+
96
+ Run the analyzer:
97
+
98
+ ```bash
99
+ wxcli org-health analyze \
100
+ "org-health-output/${TIMESTAMP}/collected" \
101
+ --output "org-health-output/${TIMESTAMP}/results"
102
+ ```
103
+
104
+ - If exit code 0: read `results/results.json` and present a summary:
105
+ - Total findings by severity (HIGH/MEDIUM/LOW/INFO)
106
+ - Category breakdown (which categories have findings)
107
+ - If exit code 1: report the error to the user and stop
108
+
109
+ ## Phase 3 — Report
110
+
111
+ Ask the user for:
112
+ - **Brand name** (default: org name from manifest)
113
+ - **Prepared by** (default: ask the user)
114
+
115
+ Generate the report:
116
+
117
+ ```bash
118
+ wxcli org-health report \
119
+ "org-health-output/${TIMESTAMP}/results" \
120
+ --brand "<brand>" \
121
+ --prepared-by "<name>"
122
+ ```
123
+
124
+ ### Present Results
125
+
126
+ Tell the user:
127
+ 1. Report file path: `org-health-output/${TIMESTAMP}/report/org-health-report.html`
128
+ 2. Top 3 highest-severity findings (title + recommendation)
129
+ 3. Total finding counts: X HIGH, Y MEDIUM, Z LOW
130
+ 4. Any categories with zero issues (positive reinforcement)
131
+
132
+ ## Check Categories
133
+
134
+ For reference, the 18 checks organized by category:
135
+
136
+ **Security Posture** (checked first — infrastructure risk):
137
+ - Auto attendants allowing external transfers (toll fraud vector)
138
+ - Call queues without recording (compliance gap)
139
+ - Unrestricted international/premium dialing (toll fraud risk)
140
+ - No outgoing permission rules configured (policy gap)
141
+
142
+ **Routing Hygiene** (infrastructure reliability):
143
+ - Dial plans with no route choices (calls will fail)
144
+ - Route groups/lists with no trunks/groups (orphaned components)
145
+ - Trunks in error/unregistered state (PSTN outage)
146
+
147
+ **Feature Utilization** (operational efficiency):
148
+ - Disabled auto attendants
149
+ - Call queues with 0 or 1 agents
150
+ - Single-member hunt groups
151
+ - Empty voicemail/paging groups
152
+ - Call parks with no extensions
153
+
154
+ **Device Health** (endpoint reliability):
155
+ - Offline devices
156
+ - Users at 5-device limit
157
+ - Unassigned devices
158
+ - Calling-enabled workspaces with no device
159
+ - Stale activation codes