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,251 @@
1
+ ---
2
+ name: reporting-cc
3
+ description: |
4
+ Query and analyze Webex Contact Center analytics: CC queue statistics, CC agent statistics,
5
+ estimated wait time, agent summaries, task search, and real-time CC monitoring.
6
+ Requires CC-scoped OAuth (cjp:config_read).
7
+ NOT for: Webex Calling CDR/queue/AA stats (use reporting skill) or
8
+ meetings/workspace analytics (use reporting-meetings skill).
9
+ allowed-tools: Read, Grep, Glob, Bash
10
+ argument-hint: [cc-report-type]
11
+ ---
12
+
13
+ # Contact Center Analytics Workflow
14
+
15
+ **Checkpoint — do NOT proceed until you can answer these:**
16
+ 1. What OAuth scope do CC analytics require? (Answer: `cjp:config_read` / `cjp:config_write` — standard admin tokens will NOT work.)
17
+ 2. How is the CC region configured? (Answer: `wxcli set-cc-region <region>` — defaults to us1.)
18
+
19
+ If you cannot answer both, read `docs/reference/contact-center-analytics.md` before proceeding.
20
+
21
+ ## Step 1: Load references
22
+
23
+ 1. Read `docs/reference/contact-center-analytics.md` for CC analytics API details
24
+
25
+ **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 cc-queue-stats --help` and `wxcli cc-agents --help` — CC analytics groups carry the `cc-` prefix and are distinct from the Calling `reporting` skill's groups). 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.
26
+
27
+ ## Step 2: Verify auth and region
28
+
29
+ ```bash
30
+ wxcli whoami
31
+ ```
32
+
33
+ CC APIs require CJP scopes (`cjp:config_read` / `cjp:config_write`). Two options: **OAuth Integration** (user-facing apps, interactive login) or **Service App** (production automation, no interactive login needed). If the token lacks CC scopes, the user needs to re-authenticate with one of these.
34
+
35
+ Verify region is set. There is no getter command — region is stored in the wxcli
36
+ config file (`~/.wxcli/config.json`, `cc_region` key), set via `wxcli set-cc-region`.
37
+ Inspect the config file directly, or just call `set-cc-region` to (re)set it:
38
+
39
+ If not set, configure it:
40
+ ```bash
41
+ wxcli set-cc-region us1
42
+ ```
43
+
44
+ Available regions: us1, eu1, eu2, anz1, ca1, jp1, sg1.
45
+
46
+ ## Step 3: Identify the CC reporting need
47
+
48
+ | Need | CLI Group | Command |
49
+ |------|-----------|---------|
50
+ | Queue volume, wait times, service level | `cc-queue-stats` | `list` |
51
+ | Agent handle time, calls handled | `cc-agents` | `list-statistics` |
52
+ | Current estimated wait time | `cc-ewt` | `show` |
53
+ | AI-generated interaction summaries | `cc-agent-summaries` | `create`, `create-list` |
54
+ | Historical task/contact search | `cc-search` | `create` |
55
+ | Real-time queue/agent state | `cc-realtime` | `create` |
56
+ | Call monitoring | `cc-call-monitoring` | 7 commands |
57
+
58
+ ## Step 4: Execute and analyze
59
+
60
+ ### Queue Statistics
61
+
62
+ ```bash
63
+ wxcli cc-queue-stats list -o json
64
+ ```
65
+
66
+ #### Recipe CC-1 — Queue volume ranking
67
+ Question: "Which queue gets the most calls?"
68
+ ```bash
69
+ wxcli cc-queue-stats list -o json | python3.11 -c "
70
+ import json, sys
71
+ data = json.load(sys.stdin)
72
+ items = data if isinstance(data, list) else data.get('items', [data])
73
+ for q in sorted(items, key=lambda x: x.get('totalCalls', x.get('callsOffered', 0)), reverse=True):
74
+ name = q.get('queueName', q.get('name', '?'))
75
+ calls = q.get('totalCalls', q.get('callsOffered', 0))
76
+ print(f'{name}: {calls} calls')
77
+ "
78
+ ```
79
+
80
+ #### Recipe CC-2 — Queue abandonment rate
81
+ Question: "What's our abandonment rate per queue?"
82
+ ```bash
83
+ wxcli cc-queue-stats list -o json | python3.11 -c "
84
+ import json, sys
85
+ data = json.load(sys.stdin)
86
+ items = data if isinstance(data, list) else data.get('items', [data])
87
+ for q in items:
88
+ name = q.get('queueName', q.get('name', '?'))
89
+ total = q.get('totalCalls', q.get('callsOffered', 0))
90
+ abandoned = q.get('callsAbandoned', 0)
91
+ rate = abandoned/total*100 if total else 0
92
+ print(f'{name}: {rate:.1f}% abandoned ({abandoned}/{total})')
93
+ "
94
+ ```
95
+
96
+ #### Recipe CC-3 — Average wait time per queue
97
+ Question: "How long are callers waiting?"
98
+ ```bash
99
+ wxcli cc-queue-stats list -o json | python3.11 -c "
100
+ import json, sys
101
+ data = json.load(sys.stdin)
102
+ items = data if isinstance(data, list) else data.get('items', [data])
103
+ for q in sorted(items, key=lambda x: x.get('avgWaitTime', x.get('averageWaitTime', 0)), reverse=True):
104
+ name = q.get('queueName', q.get('name', '?'))
105
+ wait = q.get('avgWaitTime', q.get('averageWaitTime', 0))
106
+ print(f'{name}: avg {wait}s wait')
107
+ "
108
+ ```
109
+
110
+ #### Recipe CC-4 — Service level by queue
111
+ Question: "Are we meeting our SLA?"
112
+ ```bash
113
+ wxcli cc-queue-stats list -o json | python3.11 -c "
114
+ import json, sys
115
+ data = json.load(sys.stdin)
116
+ items = data if isinstance(data, list) else data.get('items', [data])
117
+ for q in items:
118
+ name = q.get('queueName', q.get('name', '?'))
119
+ sl = q.get('serviceLevel', q.get('serviceLevelPercentage', 'N/A'))
120
+ print(f'{name}: {sl}% service level')
121
+ "
122
+ ```
123
+
124
+ ### Agent Statistics
125
+
126
+ ```bash
127
+ wxcli cc-agents list-statistics -o json
128
+ ```
129
+
130
+ #### Recipe CC-5 — Agent handle time ranking
131
+ Question: "Which agents are fastest/slowest?"
132
+ ```bash
133
+ wxcli cc-agents list-statistics -o json | python3.11 -c "
134
+ import json, sys
135
+ data = json.load(sys.stdin)
136
+ items = data if isinstance(data, list) else data.get('items', [data])
137
+ for a in sorted(items, key=lambda x: x.get('avgHandleTime', x.get('averageHandleTime', 0)), reverse=True):
138
+ name = a.get('agentName', a.get('name', '?'))
139
+ aht = a.get('avgHandleTime', a.get('averageHandleTime', 0))
140
+ print(f'{name}: avg {aht}s handle time')
141
+ "
142
+ ```
143
+
144
+ #### Recipe CC-6 — Agent utilization
145
+ Question: "How busy is each agent?"
146
+ ```bash
147
+ wxcli cc-agents list-statistics -o json | python3.11 -c "
148
+ import json, sys
149
+ data = json.load(sys.stdin)
150
+ items = data if isinstance(data, list) else data.get('items', [data])
151
+ for a in sorted(items, key=lambda x: x.get('callsHandled', x.get('totalCalls', 0)), reverse=True):
152
+ name = a.get('agentName', a.get('name', '?'))
153
+ handled = a.get('callsHandled', a.get('totalCalls', 0))
154
+ print(f'{name}: {handled} calls handled')
155
+ "
156
+ ```
157
+
158
+ ### Estimated Wait Time
159
+
160
+ #### Recipe CC-7 — Current wait time check
161
+ Question: "What's the current wait for queue X?"
162
+ ```bash
163
+ wxcli cc-ewt show -o json | python3.11 -c "
164
+ import json, sys
165
+ data = json.load(sys.stdin)
166
+ if isinstance(data, dict):
167
+ print(f\"Estimated wait time: {data.get('estimatedWaitTime', data.get('ewt', 'N/A'))}s\")
168
+ else:
169
+ for q in data:
170
+ print(f\"{q.get('queueName', '?')}: {q.get('estimatedWaitTime', q.get('ewt', 'N/A'))}s\")
171
+ "
172
+ ```
173
+
174
+ ### Agent Summaries
175
+
176
+ #### Recipe CC-8 — Search interaction summaries
177
+ Question: "Find summaries mentioning billing disputes"
178
+ ```bash
179
+ wxcli cc-agent-summaries create --json-body '{"query": "billing dispute"}' -o json
180
+ ```
181
+
182
+ ### Real-Time Monitoring
183
+
184
+ #### Recipe CC-9 — Real-time queue depth
185
+ Question: "How many callers are waiting right now?"
186
+ ```bash
187
+ wxcli cc-realtime create -o json | python3.11 -c "
188
+ import json, sys
189
+ data = json.load(sys.stdin)
190
+ if isinstance(data, list):
191
+ for q in data:
192
+ print(f\"{q.get('queueName', '?')}: {q.get('callsInQueue', q.get('waitingCalls', 0))} waiting\")
193
+ else:
194
+ print(json.dumps(data, indent=2))
195
+ "
196
+ ```
197
+
198
+ #### Recipe CC-10 — Agent availability status
199
+ Question: "Who's available right now?"
200
+ ```bash
201
+ wxcli cc-agents list -o json | python3.11 -c "
202
+ import json, sys
203
+ data = json.load(sys.stdin)
204
+ items = data if isinstance(data, list) else data.get('items', [data])
205
+ from collections import Counter
206
+ states = Counter(a.get('state', a.get('agentState', 'Unknown')) for a in items)
207
+ for state, count in states.most_common():
208
+ print(f'{state}: {count} agents')
209
+ "
210
+ ```
211
+
212
+ ### Historical Search
213
+
214
+ #### Recipe CC-11 — Search tasks by date range
215
+ Question: "Show all contacts handled yesterday"
216
+ ```bash
217
+ wxcli cc-search create --json-body '{"from": "2026-04-09T00:00:00Z", "to": "2026-04-10T00:00:00Z"}' -o json
218
+ ```
219
+
220
+ #### Recipe CC-12 — Longest wait today
221
+ Question: "What was the worst wait time today?"
222
+ ```bash
223
+ wxcli cc-queue-stats list -o json | python3.11 -c "
224
+ import json, sys
225
+ data = json.load(sys.stdin)
226
+ items = data if isinstance(data, list) else data.get('items', [data])
227
+ longest = max(items, key=lambda x: x.get('maxWaitTime', x.get('longestWaitTime', 0)), default={})
228
+ name = longest.get('queueName', longest.get('name', '?'))
229
+ wait = longest.get('maxWaitTime', longest.get('longestWaitTime', 0))
230
+ print(f'Longest wait: {wait}s in queue {name}')
231
+ "
232
+ ```
233
+
234
+ ---
235
+
236
+ ## Critical Rules
237
+
238
+ 1. **CC-scoped OAuth or Service App required.** Standard admin tokens get 403. Must use `cjp:config_read` / `cjp:config_write` — via OAuth Integration or Service App (both supported).
239
+ 2. **Region must be set.** CC APIs route to regional endpoints. Default is us1.
240
+ 3. **Response shapes vary.** CC APIs may return objects or arrays. Recipes handle both with `isinstance` checks.
241
+ 4. **Field names vary.** Different CC API versions use different field names (e.g., `avgWaitTime` vs `averageWaitTime`). Recipes use fallbacks with `x.get('field1', x.get('field2', 0))`.
242
+ 5. **Real-time data is ephemeral.** Snapshot of current state, not historical.
243
+
244
+ ---
245
+
246
+ ## Context Compaction Recovery
247
+
248
+ If context compacts mid-execution:
249
+ 1. Read `docs/reference/contact-center-analytics.md` for API details
250
+ 2. Verify CC auth with `wxcli whoami` and region — check `cc_region` in `~/.wxcli/config.json` (no getter command; set/reset via `wxcli set-cc-region`)
251
+ 3. Resume from the appropriate recipe
@@ -0,0 +1,290 @@
1
+ ---
2
+ name: reporting-meetings
3
+ description: |
4
+ Query and analyze Webex meetings quality, usage reports, workspace utilization,
5
+ historical platform analytics, and live meeting monitoring.
6
+ NOT for: Webex Calling CDR/queue stats (use reporting skill), Contact Center analytics
7
+ (use reporting-cc skill), or scheduling/managing meetings (use manage-meetings skill).
8
+ allowed-tools: Read, Grep, Glob, Bash
9
+ argument-hint: [meetings-report-type]
10
+ ---
11
+
12
+ # Meetings & Workspace Analytics Workflow
13
+
14
+ **Checkpoint — do NOT proceed until you can answer these:**
15
+ 1. Which CLI group provides per-meeting quality data in JSON? (Answer: `wxcli meeting-qualities` — returns jitter, latency, packet loss per media session. Faster than async CSV reports for single-meeting troubleshooting.)
16
+ 2. Which CLI group provides historical platform analytics? (Answer: `wxcli analytics` — messaging daily totals, room device metrics, meetings aggregates.)
17
+
18
+ If you cannot answer both, read `docs/reference/meetings-infrastructure.md` and `docs/reference/reporting-analytics.md` before proceeding.
19
+
20
+ ## Step 1: Load references
21
+
22
+ 1. Read `docs/reference/meetings-infrastructure.md` for meeting quality, participants, Video Mesh
23
+ 2. Read `docs/reference/meetings-core.md` for meeting CRUD and reports
24
+ 3. Read `docs/reference/reporting-analytics.md` Section 2-3 for report templates
25
+
26
+ **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 meeting-qualities --help` and `wxcli meeting-reports --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.
27
+
28
+ ## Step 2: Verify auth token
29
+
30
+ ```bash
31
+ wxcli whoami
32
+ ```
33
+
34
+ ### Required scopes
35
+
36
+ | Report Type | Scope |
37
+ |-------------|-------|
38
+ | Meeting quality | `analytics:read_all` |
39
+ | Meeting usage/attendees | `analytics:read_all` |
40
+ | Historical analytics | `analytics:read_all` |
41
+ | Workspace metrics | `spark-admin:workspace_metrics_read` |
42
+ | Live monitoring | `analytics:read_all` |
43
+
44
+ ## Step 3: Identify the reporting need
45
+
46
+ | Need | CLI Group | Command |
47
+ |------|-----------|---------|
48
+ | Quality for a specific meeting (jitter, latency, loss) | `meeting-qualities` | `list` |
49
+ | Meeting usage trends | `meeting-reports` | `list` |
50
+ | Meeting attendee details | `meeting-reports` | `list-attendees` |
51
+ | Historical messaging metrics | `analytics` | `show` |
52
+ | Historical room device metrics | `analytics` | `show-daily-totals` |
53
+ | Historical meetings aggregates | `analytics` | `show-aggregates` |
54
+ | Workspace usage | `workspace-metrics` | `list` |
55
+ | Workspace duration | `workspace-metrics` | `list-workspace-duration-metrics` |
56
+ | Live meeting counts | `live-monitoring` | `create` |
57
+
58
+ ## Step 4: Execute and analyze
59
+
60
+ ### Meeting Quality
61
+
62
+ ```bash
63
+ wxcli meeting-qualities list --meeting-id MEETING_ID -o json
64
+ ```
65
+
66
+ #### Recipe M-1 — Meeting quality for a specific meeting
67
+ Question: "How was the quality on yesterday's all-hands?"
68
+ ```bash
69
+ wxcli meeting-qualities list --meeting-id MEETING_ID -o json | python3.11 -c "
70
+ import json, sys
71
+ data = json.load(sys.stdin)
72
+ items = data if isinstance(data, list) else data.get('items', [data])
73
+ for p in items:
74
+ name = p.get('participantName', p.get('displayName', '?'))
75
+ jitter = p.get('audioJitter', p.get('jitter', 'N/A'))
76
+ latency = p.get('audioLatency', p.get('latency', 'N/A'))
77
+ loss = p.get('audioPacketLoss', p.get('packetLoss', 'N/A'))
78
+ print(f'{name}: jitter={jitter}ms latency={latency}ms loss={loss}%')
79
+ "
80
+ ```
81
+
82
+ #### Recipe M-2 — Quality issues in a meeting
83
+ Question: "Did anyone have bad quality?"
84
+ ```bash
85
+ wxcli meeting-qualities list --meeting-id MEETING_ID -o json | python3.11 -c "
86
+ import json, sys
87
+ data = json.load(sys.stdin)
88
+ items = data if isinstance(data, list) else data.get('items', [data])
89
+ issues = []
90
+ for p in items:
91
+ name = p.get('participantName', p.get('displayName', '?'))
92
+ jitter = float(p.get('audioJitter', p.get('jitter', 0)) or 0)
93
+ latency = float(p.get('audioLatency', p.get('latency', 0)) or 0)
94
+ loss = float(p.get('audioPacketLoss', p.get('packetLoss', 0)) or 0)
95
+ if jitter > 30 or latency > 200 or loss > 5:
96
+ issues.append(f'{name}: jitter={jitter}ms latency={latency}ms loss={loss}%')
97
+ if issues:
98
+ print(f'{len(issues)} participants with quality issues:')
99
+ for i in issues: print(f' {i}')
100
+ else:
101
+ print('No quality issues detected (thresholds: jitter>30ms, latency>200ms, loss>5%)')
102
+ "
103
+ ```
104
+
105
+ ### Meeting Usage
106
+
107
+ #### Recipe M-3 — Meeting usage summary
108
+ Question: "How many meetings are we having?"
109
+ ```bash
110
+ wxcli meeting-reports list -o json | python3.11 -c "
111
+ import json, sys
112
+ data = json.load(sys.stdin)
113
+ items = data if isinstance(data, list) else data.get('items', [data])
114
+ print(f'Meeting usage reports: {len(items)}')
115
+ for r in items[:10]:
116
+ print(f\" {r.get('meetingDate', r.get('date', '?'))}: {r.get('totalMeetings', r.get('meetingCount', '?'))} meetings\")
117
+ "
118
+ ```
119
+
120
+ #### Recipe M-4 — Meeting attendance
121
+ Question: "How many invitees actually joined?"
122
+ ```bash
123
+ wxcli meeting-reports list-attendees --meeting-id MEETING_ID -o json | python3.11 -c "
124
+ import json, sys
125
+ data = json.load(sys.stdin)
126
+ items = data if isinstance(data, list) else data.get('items', [data])
127
+ attended = [a for a in items if a.get('attended', a.get('joined', False))]
128
+ print(f'Attendees: {len(attended)} of {len(items)} ({len(attended)/len(items)*100:.1f}%)' if items else 'No data')
129
+ "
130
+ ```
131
+
132
+ ### Historical Analytics
133
+
134
+ #### Recipe M-5 — Messaging adoption trend
135
+ Question: "Is messaging usage growing?"
136
+ ```bash
137
+ wxcli analytics show -o json | python3.11 -c "
138
+ import json, sys
139
+ data = json.load(sys.stdin)
140
+ items = data if isinstance(data, list) else data.get('items', [data])
141
+ for d in items[:14]:
142
+ print(f\"{d.get('date', '?')}: {d.get('totalMessages', d.get('messages', '?'))} messages\")
143
+ "
144
+ ```
145
+
146
+ #### Recipe M-6 — Room device utilization
147
+ Question: "Are our room devices being used?"
148
+ ```bash
149
+ wxcli analytics show-daily-totals -o json | python3.11 -c "
150
+ import json, sys
151
+ data = json.load(sys.stdin)
152
+ items = data if isinstance(data, list) else data.get('items', [data])
153
+ for d in items[:14]:
154
+ print(f\"{d.get('date', '?')}: {d.get('activatedDevices', d.get('activeDevices', '?'))} active devices\")
155
+ "
156
+ ```
157
+
158
+ #### Recipe M-7 — Meetings aggregate comparison
159
+ Question: "How do this month's meetings compare?"
160
+ ```bash
161
+ wxcli analytics show-aggregates -o json | python3.11 -c "
162
+ import json, sys
163
+ data = json.load(sys.stdin)
164
+ if isinstance(data, dict):
165
+ for key, val in data.items():
166
+ print(f'{key}: {val}')
167
+ else:
168
+ print(json.dumps(data, indent=2))
169
+ "
170
+ ```
171
+
172
+ ### Workspace Metrics
173
+
174
+ #### Recipe M-8 — Workspace occupancy
175
+ Question: "Which rooms are used the most?"
176
+ ```bash
177
+ wxcli workspace-metrics list -o json | python3.11 -c "
178
+ import json, sys
179
+ data = json.load(sys.stdin)
180
+ items = data if isinstance(data, list) else data.get('items', [data])
181
+ for w in sorted(items, key=lambda x: x.get('utilizationPercentage', x.get('occupancy', 0)), reverse=True)[:15]:
182
+ name = w.get('workspaceName', w.get('name', '?'))
183
+ util = w.get('utilizationPercentage', w.get('occupancy', 0))
184
+ print(f'{name}: {util}% utilized')
185
+ "
186
+ ```
187
+
188
+ #### Recipe M-9 — Workspace duration analysis
189
+ Question: "How long are rooms occupied on average?"
190
+ ```bash
191
+ wxcli workspace-metrics list-workspace-duration-metrics -o json | python3.11 -c "
192
+ import json, sys
193
+ data = json.load(sys.stdin)
194
+ items = data if isinstance(data, list) else data.get('items', [data])
195
+ for w in sorted(items, key=lambda x: x.get('averageDuration', x.get('avgDuration', 0)), reverse=True)[:15]:
196
+ name = w.get('workspaceName', w.get('name', '?'))
197
+ dur = w.get('averageDuration', w.get('avgDuration', 0))
198
+ print(f'{name}: avg {dur/60:.1f} min per session')
199
+ "
200
+ ```
201
+
202
+ ### Live Monitoring
203
+
204
+ #### Recipe M-10 — Live meetings right now
205
+ Question: "How many meetings are happening globally?"
206
+ ```bash
207
+ wxcli live-monitoring create -o json | python3.11 -c "
208
+ import json, sys
209
+ data = json.load(sys.stdin)
210
+ if isinstance(data, dict):
211
+ for country, count in sorted(data.items(), key=lambda x: x[1] if isinstance(x[1], (int,float)) else 0, reverse=True):
212
+ print(f'{country}: {count}')
213
+ else:
214
+ print(json.dumps(data, indent=2))
215
+ "
216
+ ```
217
+
218
+ #### Recipe M-11 — Quality by participant (recurring issues)
219
+ Question: "Who has recurring quality issues across meetings?"
220
+ Note: Requires multiple meeting quality pulls. Run for each recent meeting ID.
221
+ ```bash
222
+ wxcli meeting-qualities list --meeting-id MEETING_ID_1 -o json > /tmp/mq1.json
223
+ wxcli meeting-qualities list --meeting-id MEETING_ID_2 -o json > /tmp/mq2.json
224
+ python3.11 -c "
225
+ import json
226
+ from collections import defaultdict
227
+ issues = defaultdict(int)
228
+ for f in ['/tmp/mq1.json', '/tmp/mq2.json']:
229
+ data = json.load(open(f))
230
+ items = data if isinstance(data, list) else data.get('items', [data])
231
+ for p in items:
232
+ name = p.get('participantName', p.get('displayName', '?'))
233
+ jitter = float(p.get('audioJitter', p.get('jitter', 0)) or 0)
234
+ latency = float(p.get('audioLatency', p.get('latency', 0)) or 0)
235
+ loss = float(p.get('audioPacketLoss', p.get('packetLoss', 0)) or 0)
236
+ if jitter > 30 or latency > 200 or loss > 5:
237
+ issues[name] += 1
238
+ for name, count in sorted(issues.items(), key=lambda x: x[1], reverse=True):
239
+ print(f'{name}: quality issues in {count} meetings')
240
+ "
241
+ ```
242
+
243
+ #### Recipe M-12 — Attendee report for compliance
244
+ Question: "Who attended this meeting?"
245
+ ```bash
246
+ wxcli meeting-reports list-attendees --meeting-id MEETING_ID -o json | python3.11 -c "
247
+ import json, sys
248
+ data = json.load(sys.stdin)
249
+ items = data if isinstance(data, list) else data.get('items', [data])
250
+ for a in items:
251
+ name = a.get('displayName', a.get('name', '?'))
252
+ email = a.get('email', '?')
253
+ joined = a.get('joinTime', a.get('joinedTime', '?'))
254
+ left = a.get('leaveTime', a.get('leftTime', '?'))
255
+ print(f'{name} ({email}): joined {joined}, left {left}')
256
+ "
257
+ ```
258
+
259
+ #### Recipe M-13 — Top meeting hosts
260
+ Question: "Who schedules the most meetings?"
261
+ ```bash
262
+ wxcli meeting-reports list -o json | python3.11 -c "
263
+ import json, sys
264
+ from collections import Counter
265
+ data = json.load(sys.stdin)
266
+ items = data if isinstance(data, list) else data.get('items', [data])
267
+ hosts = Counter(r.get('hostEmail', r.get('hostName', '?')) for r in items)
268
+ for host, count in hosts.most_common(15):
269
+ print(f'{host}: {count} meetings')
270
+ "
271
+ ```
272
+
273
+ ---
274
+
275
+ ## Critical Rules
276
+
277
+ 1. **Meeting quality requires a meeting ID.** Use `wxcli meetings list` to find meeting IDs first.
278
+ 2. **Historical analytics may require Pro Pack.** Depends on the data type.
279
+ 3. **Live monitoring is a snapshot.** Data is current, not historical.
280
+ 4. **Workspace metrics require workspace admin scope.** `spark-admin:workspace_metrics_read`.
281
+ 5. **Response shapes vary across API versions.** Recipes use `isinstance` checks and field fallbacks.
282
+
283
+ ---
284
+
285
+ ## Context Compaction Recovery
286
+
287
+ If context compacts mid-execution:
288
+ 1. Read `docs/reference/meetings-infrastructure.md` for meeting quality API details
289
+ 2. Read `docs/reference/reporting-analytics.md` for report template details
290
+ 3. Resume from the appropriate recipe