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,421 @@
1
+ ---
2
+ name: provision-calling
3
+ description: |
4
+ Provision Webex Calling users, locations, and licenses via the wxcli CLI.
5
+ Also covers People API profile updates (alternate phone numbers, display name,
6
+ phoneNumbers array including alternate1/alternate2), number inventory management,
7
+ and bulk CSV import. Guides through auth verification, prerequisite checks,
8
+ deployment planning, execution, and result verification for any provisioning operation.
9
+ Use for: create, enable, assign, bulk provision, update user profile fields.
10
+ For teardown/delete/cleanup operations, use the teardown skill instead.
11
+ allowed-tools: Read, Grep, Glob, Bash
12
+ argument-hint: [operation — e.g. "create location", "enable user", "assign license", "bulk provision"]
13
+ ---
14
+
15
+ <!-- Updated by playbook session 2026-03-18 -->
16
+
17
+ # Provision Calling Workflow
18
+
19
+ **Checkpoint — do NOT proceed until you can answer these:**
20
+ 1. Can `location_id` be changed after a calling license is assigned? (Answer: No — it is write-once. Wrong location = must remove and re-add calling license.)
21
+ 2. What case must `announcement_language` use? (Answer: lowercase only — `en_us` not `en_US`. Mixed case causes "Invalid Language Code" error.)
22
+
23
+ If you cannot answer both, you skipped reading this skill. Go back and read it.
24
+
25
+ ## Step 1: Load references
26
+
27
+ 1. Read `docs/reference/provisioning.md` for People, Licenses, and Locations API patterns
28
+
29
+ **Mandatory --help verification:** Before constructing any wxcli command, run `wxcli <group> --help` to verify the subcommand exists, then `wxcli <group> <subcommand> --help` to verify the exact flags. Do NOT rely on examples in this skill or reference docs — the CLI is auto-generated and flag names may differ from what documentation suggests.
30
+
31
+ ## Step 2: Verify auth token is working
32
+
33
+ Before any provisioning operation, confirm the token is valid and has admin scopes.
34
+
35
+ ```bash
36
+ wxcli whoami
37
+ ```
38
+
39
+ If this fails with 401/403, stop and troubleshoot auth before proceeding. Common causes:
40
+ - Token expired (personal access tokens last 12 hours)
41
+ - Token not configured — run `wxcli configure` or check `~/.wxcli/config.json`
42
+ - Token lacks admin scopes (`spark-admin:people_write`, `spark-admin:licenses_read`, etc.)
43
+
44
+ ## Step 3: Determine the operation
45
+
46
+ Ask the user which provisioning operation they need. The six supported operations are:
47
+
48
+ | Operation | What It Does | Prerequisites |
49
+ |-----------|-------------|---------------|
50
+ | **Create location** | Add a new physical location | Admin token with `spark-admin:locations_write` |
51
+ | **Enable location for calling** | Turn on Webex Calling for an existing location | Location must exist; `spark-admin:telephony_config_write` |
52
+ | **Create user** | Add a new person to the org | Admin token with `spark-admin:people_write` |
53
+ | **Enable user for calling** | Assign calling license + location + extension to existing user | Location must exist; calling license available |
54
+ | **Assign/change licenses** | Add or remove licenses on a user | License with available capacity |
55
+ | **Bulk provision** | Provision multiple users in one run | All of the above |
56
+
57
+ Confirm with the user before proceeding:
58
+ - **Which operation** from the table above
59
+ - **Target details** (location name/address, user email, license type, etc.)
60
+ - **For bulk**: CSV or list of users to provision
61
+
62
+ ## Step 4: Check prerequisites
63
+
64
+ Run these checks based on the operation. **Stop and report** if any prerequisite fails.
65
+
66
+ ### For location creation:
67
+ ```bash
68
+ # Check if location name already exists
69
+ wxcli locations list --name "target name"
70
+ # Look for a match in the output. If the target name appears:
71
+ wxcli locations show LOCATION_ID
72
+ # Ask user: update existing or abort?
73
+ ```
74
+
75
+ ### For user provisioning:
76
+ ```bash
77
+ # 1. Verify location exists and is calling-enabled
78
+ wxcli location-settings list-1
79
+ # Confirm target location appears (only calling-enabled locations are returned)
80
+
81
+ # 2. Find an available calling license with capacity
82
+ wxcli licenses list
83
+ # Look for "Webex Calling - Professional" with consumed < total
84
+
85
+ # 3. Check if user already exists
86
+ wxcli users list --email target@example.com --output json
87
+ # If user exists, check if already calling-enabled:
88
+ wxcli users show PERSON_ID --output json
89
+ # If location_id is set, user is already calling-enabled.
90
+ # Ask user: update or abort?
91
+
92
+ # 4. Verify email domain is provisioned in this org
93
+ # No CLI command lists currently-claimed org domains — the `domains` group only
94
+ # supports get-domain-verification / verify-domain / claim-domain / unverify-domain /
95
+ # unclaim-domain (see manage-identity skill for the verification flow). If domain
96
+ # status is unknown, check Control Hub, or attempt user creation and watch for a
97
+ # domain authorization error; resolve via manage-identity's domain verification
98
+ # flow before retrying.
99
+ ```
100
+
101
+ ### For phone number assignment:
102
+ ```bash
103
+ # Verify number is in location inventory before assigning to a user
104
+ # Numbers must be added to location first via numbers-manage commands
105
+ wxcli numbers create LOCATION_ID --json-body '{"phoneNumbers": ["+15551234567"], "numberType": "DID"}'
106
+ ```
107
+
108
+ ## Step 5: Build deployment plan — [SHOW BEFORE EXECUTING]
109
+
110
+ **Present the plan to the user and wait for approval.** Never execute without confirmation.
111
+
112
+ Format the plan as:
113
+
114
+ ```
115
+ === Provisioning Plan ===
116
+
117
+ Operation: [Create Location / Enable User / etc.]
118
+
119
+ Target:
120
+ - [specific details]
121
+
122
+ Steps:
123
+ 1. [First CLI command — what it does]
124
+ 2. [Second CLI command — what it does]
125
+ 3. Verify: [what we'll check after]
126
+
127
+ Prerequisites verified:
128
+ ✓ Auth token valid (authenticated as [name])
129
+ ✓ Location exists: [name] ([id])
130
+ ✓ License available: [name] ([consumed]/[total])
131
+ ✓ [any other checks]
132
+
133
+ Proceed? [wait for user confirmation]
134
+ ```
135
+
136
+ ## Step 6: Execute the provisioning operation
137
+
138
+ ### Operation A: Create a Location
139
+
140
+ Required flags: `--name`, `--time-zone`, `--preferred-language`, `--announcement-language`. Address must go in `--json-body`.
141
+
142
+ ```bash
143
+ wxcli locations create \
144
+ --name "San Jose Office" \
145
+ --time-zone "America/Los_Angeles" \
146
+ --preferred-language en_US \
147
+ --announcement-language en_us \
148
+ --json-body '{"address": {"address1": "123 Main St", "city": "San Jose", "state": "CA", "postalCode": "95113", "country": "US"}}'
149
+ ```
150
+
151
+ ### Operation B: Enable Location for Calling
152
+
153
+ Creating a location does NOT automatically enable calling. Separate command required.
154
+
155
+ First, fetch the location details you'll need:
156
+ ```bash
157
+ wxcli locations show LOCATION_ID
158
+ ```
159
+
160
+ Then enable calling using those details:
161
+ ```bash
162
+ wxcli location-settings create \
163
+ --id LOCATION_ID \
164
+ --name "San Jose Office" \
165
+ --time-zone "America/Los_Angeles" \
166
+ --preferred-language en_US \
167
+ --announcement-language en_us
168
+ ```
169
+
170
+ **Important:** `announcement_language` must be lowercase (`en_us` not `en_US`) or the API rejects with "Invalid Language Code".
171
+
172
+ **Warning:** Do not promise an API-based "disable calling" step during teardown. Use CLI/API to clear visible blockers first, but final delete of a calling-enabled location may still require Control Hub if the backend continues to hold the telephony reference.
173
+
174
+ ### Operation C: Create a New User
175
+
176
+ **Before creating:** confirm the user's `firstName`, `lastName`, and `displayName` with the requester. Do not use email-derived placeholders (e.g., `jsmith`/`example`) — they produce incorrect directory entries and cannot be changed without a separate update call.
177
+
178
+ ```bash
179
+ wxcli users create \
180
+ --json-body '{"emails":["jsmith@example.com"],"firstName":"John","lastName":"Smith","displayName":"John Smith"}'
181
+ ```
182
+
183
+ **Gotcha:** A POST that returns 400 may **still have created the person**. Always check with a GET before retrying:
184
+ ```bash
185
+ wxcli users list --email jsmith@example.com --output json
186
+ ```
187
+
188
+ ### Operation D: Enable Existing User for Calling
189
+
190
+ Assign a calling license, location, and extension to an existing user.
191
+
192
+ ```bash
193
+ # Look up current user state
194
+ wxcli users show PERSON_ID --output json
195
+
196
+ # Look up the calling license ID
197
+ wxcli licenses list --output json
198
+ # Find the license where name contains "Calling - Professional"
199
+
200
+ # Assign the calling license with location and extension
201
+ wxcli licenses update --person-id PERSON_ID --json-body '{
202
+ "email": "jsmith@example.com",
203
+ "licenses": [{
204
+ "id": "CALLING_LICENSE_ID",
205
+ "properties": {
206
+ "locationId": "LOCATION_ID",
207
+ "extension": "1001"
208
+ }
209
+ }]
210
+ }'
211
+ ```
212
+
213
+ **Key constraints:**
214
+ - `location_id` is **write-once** — can only be set on initial calling license assignment, cannot be changed after
215
+ - `extension` value must NOT include the location routing prefix
216
+ - Either `phone_number` or `extension` is mandatory for calling licenses
217
+ - To move a user, remove calling license and re-add with new location
218
+
219
+ ### Operation E: Bulk Provision
220
+
221
+ **Before running:** confirm `firstName`, `lastName`, and `displayName` for each user with the requester. Do not derive names from email aliases.
222
+
223
+ For small batches (< 20 users), pair each create with an immediate license assignment in a single loop:
224
+
225
+ ```bash
226
+ LOCATION_ID="<location_id>"
227
+ LICENSE_ID="<calling_license_id>"
228
+ EXT=1001
229
+
230
+ for email in user1@example.com user2@example.com user3@example.com; do
231
+ echo "=== Provisioning $email ==="
232
+
233
+ # Step 1: Create the user — capture the returned person ID
234
+ PERSON_ID=$(wxcli people create -o json \
235
+ --json-body "{\"emails\":[\"$email\"],\"firstName\":\"First\",\"lastName\":\"Last\",\"displayName\":\"First Last\"}" \
236
+ | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
237
+ echo "Created: $email → $PERSON_ID"
238
+
239
+ # Step 2: Assign calling license with location and extension
240
+ wxcli licenses update --person-id "$PERSON_ID" --json-body "{
241
+ \"email\": \"$email\",
242
+ \"licenses\": [{
243
+ \"id\": \"$LICENSE_ID\",
244
+ \"operation\": \"add\",
245
+ \"properties\": {
246
+ \"locationId\": \"$LOCATION_ID\",
247
+ \"extension\": \"$EXT\"
248
+ }
249
+ }]
250
+ }"
251
+ echo "Enabled for calling: ext $EXT"
252
+
253
+ EXT=$((EXT + 1))
254
+ done
255
+ ```
256
+
257
+ **Note:** If `people create` returns 400, the user may still have been created. Check with `wxcli people list --email <email>` before retrying. If the user exists, skip the create and run only the `licenses update` step with the existing person ID.
258
+
259
+ > **Bulk operations (50+ users):** Shell loops with `sleep 1` work for small batches. For large batches, use the migration engine's async pattern, which handles concurrency, rate limiting, and retry automatically.
260
+
261
+ ### Operation F: Teardown / Delete Location
262
+
263
+ **For teardown operations, load the `teardown` skill.** It covers single-location teardown, multi-location bulk cleanup, and org reset with the full dependency-safe deletion order and `wxcli cleanup` automation.
264
+
265
+ Delete-related critical rules (13-15) below still apply.
266
+
267
+ ## Step 7: Verify results
268
+
269
+ Always read back the created/updated resources to confirm.
270
+
271
+ ### Verify a user:
272
+ ```bash
273
+ wxcli users show PERSON_ID --output json
274
+ # Confirm: location_id is set, calling license appears in licenses list, extension is correct
275
+ ```
276
+
277
+ ### Verify a location:
278
+ ```bash
279
+ wxcli locations show LOCATION_ID --output json
280
+ # Confirm: name, address, timezone are correct
281
+ ```
282
+
283
+ ### Verify bulk:
284
+ ```bash
285
+ # List all users at a location
286
+ wxcli users list --location-id LOCATION_ID --output json
287
+ # Count results to confirm expected number of users provisioned
288
+ ```
289
+
290
+ ## Step 8: Report results
291
+
292
+ Summarize what was done:
293
+
294
+ ```
295
+ === Provisioning Complete ===
296
+
297
+ Operation: [what was done]
298
+ Results:
299
+ - [resource]: [status] ([id])
300
+ - [resource]: [status] ([id])
301
+
302
+ Verification:
303
+ ✓ [what was confirmed]
304
+
305
+ Next steps:
306
+ - [any follow-up actions needed]
307
+ ```
308
+
309
+ ---
310
+
311
+ ## Critical Rules
312
+
313
+ 1. **ALWAYS test auth first** — Run `wxcli whoami` before any provisioning call. Do not proceed on auth failure.
314
+
315
+ 2. **ALWAYS show plan before executing** — Present the deployment plan and wait for user confirmation. Never provision without approval.
316
+
317
+ 3. **`location_id` is write-once** — Can only be set when first assigning a calling license. Cannot be changed after. To move a user, remove calling license and re-add with new location.
318
+
319
+ 4. **`announcement_language` must be lowercase** — `en_us` not `en_US`. The telephony `enable_for_calling` API rejects mixed case with "Invalid Language Code".
320
+
321
+ 5. **`announcement_language` returns None from details** — Always set it explicitly before calling `enable_for_calling`, even if it was set during creation.
322
+
323
+ 6. **Do not promise API disable-calling on locations** — the older `wxcli location-settings update-location-calling ...` guidance is stale in this repo. For teardown, use CLI/API to remove visible blockers, run `wxcli location-settings safe-delete-check LOCATION_ID`, retry delete, and warn that final removal of a calling-enabled location may still require Control Hub.
324
+
325
+ 7. **Phone numbers must be in location inventory first** — Before assigning a DID to a user, add it via `wxcli numbers create LOCATION_ID`.
326
+
327
+ 8. **POST/PUT may partially succeed** — A 400 response on user create/update may have still created/modified the resource. Always verify with a subsequent GET before retrying.
328
+
329
+ 9. **License IDs are org-specific base64 strings** — Never hardcode them. Always retrieve via `wxcli licenses list`.
330
+
331
+ 10. **Extension values must NOT include the routing prefix** — Set extension to `1001`. The work_extension in the response will include the prefix (e.g., `8001001`), but when writing, omit it. To check for extension conflicts before assigning, run `wxcli numbers list --location-id LOCATION_ID` and scan the extension column.
332
+
333
+ 11. **Log all operations** — Print what you're about to do before each CLI command, and print the result after. This creates an audit trail for troubleshooting.
334
+
335
+ 12. **For bulk operations (50+ users), use the migration engine's async pattern** — wxcli runs one command at a time. For large batches, the proven async pattern handles concurrency, rate limiting, and retry. For smaller batches (<50), shell loops with `sleep 1` suffice.
336
+
337
+ 13. **Location-scoped feature deletes require LOCATION_ID as FIRST argument** — `wxcli hunt-group delete --force LOCATION_ID HG_ID`, not `wxcli hunt-group delete --force HG_ID`. The LOCATION_ID comes before the feature ID.
338
+
339
+ 14. **Always use `--force` for programmatic deletes** — Without `--force`, delete commands prompt `[y/N]` which blocks non-interactive execution.
340
+
341
+ 15. **Routing delete commands use PLURAL names** — `delete-route-groups`, `delete-trunks`, `delete-route-lists`. The singular form (`delete-route-group`) does not exist.
342
+
343
+ ---
344
+
345
+ ## Error Handling
346
+
347
+ When a wxcli command fails:
348
+
349
+ **A. Fix and retry** — Missing required field, wrong ID, format issue:
350
+ 1. Read the full error message
351
+ 2. Run `wxcli <group> <command> --help` to check required flags
352
+ 3. Fix the command and retry
353
+
354
+ **B. Skip and continue** — Resource already exists or already configured:
355
+ 1. Verify current state: `wxcli users show PERSON_ID` or `wxcli locations show LOCATION_ID`
356
+ 2. If state is correct, skip to next operation
357
+
358
+ **C. Escalate** — Unclear or persistent error:
359
+ 1. Run with `--debug` for raw HTTP details
360
+ 2. Invoke `/wxc-calling-debug` for systematic diagnosis
361
+
362
+ **D. 409 Conflict (50003 "Location is being referenced")**
363
+
364
+ The location still has dependent resources. Load the `teardown` skill and follow its enumeration procedure. If all resources are deleted and the 409 persists, calling is still enabled — disable it and wait 90+ seconds.
365
+
366
+ Provisioning-specific errors:
367
+ - 400 on `users create`: Check email format, verify no existing user with same email
368
+ - 400 on `numbers create`: Check E.164 format (+1XXXXXXXXXX), verify number not already assigned
369
+ - 403: Check token has `spark-admin:people_write` and `spark-admin:telephony_config_write` scopes
370
+ - 409: User/location already exists — GET current state first
371
+
372
+ ---
373
+
374
+ ## Required Scopes Reference
375
+
376
+ | Operation | Scope(s) |
377
+ |-----------|----------|
378
+ | List/view people | `spark-admin:people_read` |
379
+ | Create/update/delete people | `spark-admin:people_write` + `spark-admin:people_read` |
380
+ | List licenses | `spark-admin:licenses_read` |
381
+ | Assign licenses (PATCH) | `spark-admin:people_write` |
382
+ | List/view locations | `spark-admin:locations_read` |
383
+ | Create/update/delete locations | `spark-admin:locations_write` |
384
+ | Enable location for calling | `spark-admin:telephony_config_write` |
385
+
386
+ ---
387
+
388
+ ## License Lookup Quick Reference
389
+
390
+ > For bulk license assignment, usage auditing, and reclamation workflows, see the `manage-licensing` skill. The `licenses update` command provides CLI-native license assignment (`licenses-api` remains a deprecated alias for one release).
391
+
392
+ ```bash
393
+ # List all licenses — look for "Webex Calling - Professional" with available capacity
394
+ wxcli licenses list
395
+
396
+ # Key license types to look for in the output:
397
+ # "Webex Calling - Professional" — full calling license
398
+ # "Webex Calling - Basic" — basic calling (limited features)
399
+ # "Webex Calling - Workspaces" — for workspace devices
400
+ # Check that consumed < total for the license you need
401
+ ```
402
+
403
+ ---
404
+
405
+ ## Two License Assignment Methods
406
+
407
+ | | Method A: People API PUT | Method B: Licenses PATCH API |
408
+ |---|---|---|
409
+ | **CLI equivalent** | `wxcli users update` (modify user fields) | Raw HTTP PATCH `/licenses/users` (license assignment not in CLI yet) |
410
+ | **Best for** | Migrating existing users, changing multiple Person fields | Net-new provisioning, SCIM users, atomic license+location+extension |
411
+ | **Gotcha** | Must GET full person first, include ALL fields in PUT | Requires extension or phone_number for calling licenses |
412
+ | **Can combine add+remove** | Manually modify the licenses list | Yes, add + remove operations in same call |
413
+
414
+ ---
415
+
416
+ ## Context Compaction Recovery
417
+
418
+ If context compacts mid-execution, recover by:
419
+ 1. Read the deployment plan from `docs/plans/` to recover what was planned
420
+ 2. Check what's already been created: run the relevant `list` commands
421
+ 3. Resume from the first incomplete step
@@ -0,0 +1,183 @@
1
+ ---
2
+ name: query-live
3
+ description: |
4
+ Answer natural-language questions about a Webex Calling environment using live API data.
5
+ Read-only queries against people, call features, routing, numbers, call history, and call flow tracing.
6
+ Use when the user asks "who", "what", "which", "how many", "does", "is", "show me", or "check" questions
7
+ about their current Webex Calling configuration. Invoked by the wxc-calling-builder agent on query intent,
8
+ or directly via /query-live.
9
+ NOT for: making changes (use the appropriate config skill), historical CDR analysis
10
+ (use reporting skill), or Contact Center queries (use reporting-cc skill).
11
+ allowed-tools: Read, Grep, Glob, Bash, Skill
12
+ argument-hint: [question]
13
+ ---
14
+
15
+ # Query Live State
16
+
17
+ Answer plain-English questions about a Webex Calling environment using live API data. **Read-only only.**
18
+
19
+ ## Checkpoint — verify before proceeding
20
+
21
+ 1. Has `wxcli whoami` succeeded in this session? If not, run it now. Do not proceed without a valid token.
22
+ 2. Do you know which domain(s) this question touches? (people, features, routing, numbers, call-history, call-flow). If unsure, read the Domain Routing table below.
23
+
24
+ ## Step 1: Classify the question
25
+
26
+ **Query signals** — this skill handles these:
27
+ - Interrogative form: "Who...?", "What...?", "Which...?", "How many...?", "Does...?", "Is...?"
28
+ - Inspection verbs: "show me", "list", "check", "look up", "find", "tell me about"
29
+ - State references: "current", "right now", "configured", "enabled", "assigned"
30
+ - Comparison/audit: "which users don't have...", "compare", "differences between"
31
+
32
+ **Not a query** — hand back to the builder's normal workflow:
33
+ - Action verbs: "create", "set up", "enable", "add", "configure", "change", "move", "delete"
34
+ - Future intent: "I want to...", "we need to...", "can you make..."
35
+
36
+ **Edge case:** "Can you check if voicemail is enabled and turn it on if not?"
37
+ → Classify as query first. Answer the check. Then say: "I can look things up but can't make changes. To enable voicemail, you'd go to Control Hub → Calling → User Settings → Voicemail, or I can help configure it if you'd like to switch to build mode."
38
+
39
+ ## Step 2: Route to domain module(s)
40
+
41
+ Read the domain module(s) that match the question. Cross-domain queries load multiple modules.
42
+
43
+ ### Domain Routing Table
44
+
45
+ | Question about... | Domain module | Load with |
46
+ |-------------------|--------------|-----------|
47
+ | Users, person settings (voicemail, forwarding, DND, recording, caller ID, permissions) | people-and-settings | `Read .claude/skills/query-live/domains/people-and-settings.md` |
48
+ | Hunt groups, call queues, auto attendants, paging, call park, pickup, voicemail groups | features | `Read .claude/skills/query-live/domains/features.md` |
49
+ | Trunks, route groups, route lists, dial plans, translation patterns, PSTN | routing | `Read .claude/skills/query-live/domains/routing.md` |
50
+ | Phone numbers, number inventory, assignment status, available numbers | numbers | `Read .claude/skills/query-live/domains/numbers.md` |
51
+ | Call history, CDR, call volume, missed calls, busiest hours | call-history | `Read .claude/skills/query-live/domains/call-history.md` |
52
+ | "What happens when someone calls...", call path tracing, schedule evaluation | call-flow-trace | `Read .claude/skills/query-live/domains/call-flow-trace.md` |
53
+
54
+ **Cross-domain examples:**
55
+ - "Show me all users at Austin with their devices and voicemail status" → people-and-settings (primary)
56
+ - "What number is assigned to the Main auto attendant?" → features + numbers
57
+
58
+ **Cross-domain anti-pattern — do NOT combine these:**
59
+ - "Who's in the Sales hunt group and what are their forwarding settings?" — member personal forwarding settings are irrelevant to HG routing. Hunt groups route directly to agent devices and ignore personal call forwarding entirely. Ask about the HG's own no-answer/forwarding settings instead (features domain only).
60
+
61
+ ## Step 3: Execute the domain module's recipes
62
+
63
+ Follow the loaded domain module's command recipes, resolution rules, and join patterns exactly. Use `-o json` on all commands for programmatic parsing.
64
+
65
+ **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 people list --help`). Even read-only commands differ by name (`show` vs `list`, singular vs plural — known issue #5), so confirm before running. Do NOT rely on examples in this skill, the domain modules, or reference docs — the CLI is auto-generated and flag names may differ from what documentation suggests.
66
+
67
+ ### Resource Resolution Protocol
68
+
69
+ When the user references a resource by name (not ID):
70
+
71
+ 1. **List** the resource type with `-o json`
72
+ 2. **Search** the response for name matches (case-insensitive substring)
73
+ 3. **Exact match** → use it immediately
74
+ 4. **Multiple partial matches** → disambiguate:
75
+ ```
76
+ I found 2 hunt groups matching "Sales":
77
+ 1. Sales - East (Austin, 5 members)
78
+ 2. Sales - West (Denver, 3 members)
79
+ Which one?
80
+ ```
81
+ 5. **No match** → report with suggestion:
82
+ ```
83
+ I couldn't find a hunt group named "Sales". The hunt groups at your org are:
84
+ - Support (Austin)
85
+ - Engineering (Denver)
86
+ - Front Desk (Austin)
87
+ Did you mean one of these?
88
+ ```
89
+
90
+ ### Batch Query Protocol
91
+
92
+ For audit queries checking a setting across many users (e.g., "which users don't have voicemail?"):
93
+
94
+ 1. **Count first:** `wxcli people list -o json` → count results
95
+ 2. **If ≤ 50 users:** Fetch settings for each user sequentially
96
+ 3. **If > 50 users:** Note upfront: "Checking [N] users — this will take a moment." Batch in groups of 20 with brief progress updates every 20 users.
97
+ 4. **Report:** "Checked all [N] users at [location]. [X] of [N] don't have voicemail enabled."
98
+
99
+ ## Step 4: Format the response
100
+
101
+ ### Formatting Principles
102
+
103
+ - **Lead with the direct answer**, then supporting details
104
+ - **Use the admin's language**: "voicemail" not "voicemailEnabled", "forwarding" not "callForwarding"
105
+ - **Include counts and context**: "3 of 12 users" not just "3 users"
106
+ - **Be specific about what was checked**: "I checked all 45 users at the Austin location"
107
+
108
+ ### Format by Query Type
109
+
110
+ **Membership queries** ("Who's in the Sales hunt group?"):
111
+ ```
112
+ Sales Hunt Group has 4 members:
113
+ - Jane Smith (ext 2001, Austin)
114
+ - Bob Lee (ext 2002, Austin)
115
+ - Maria Garcia (ext 2003, Denver)
116
+ - Tom Chen (ext 2004, Denver)
117
+
118
+ Ring pattern: Simultaneous
119
+ No-answer action: Forward to Sales voicemail after 20 seconds
120
+ ```
121
+
122
+ **Yes/no queries** ("Does John have voicemail enabled?"):
123
+ ```
124
+ Yes, John Smith has voicemail enabled.
125
+ - Messages sent to: john.smith@acme.com
126
+ - PIN required: Yes
127
+ - Greeting: Custom greeting uploaded
128
+ ```
129
+
130
+ **Inventory/audit queries** ("Which users at Austin don't have voicemail?"):
131
+ ```
132
+ 12 of 45 users at Austin don't have voicemail enabled:
133
+ - Alice Johnson (ext 3001)
134
+ - Brian Kim (ext 3002)
135
+ - Carol Davis (ext 3003)
136
+ ... and 9 more
137
+
138
+ Note: I checked all 45 Webex Calling-licensed users at the Austin location.
139
+ ```
140
+
141
+ **Large result sets (> 10 items):**
142
+ - Show first 10 with "...and N more" note
143
+ - Include summary count at top
144
+ - Offer to show full list if needed
145
+
146
+ ### Disambiguation format:
147
+ ```
148
+ I found 2 queues matching "Sales":
149
+ 1. Sales - East (Austin, 5 agents)
150
+ 2. Sales - West (Denver, 3 agents)
151
+
152
+ Which one?
153
+ ```
154
+
155
+ ## Safety Guardrails
156
+
157
+ ### Read-Only Enforcement
158
+
159
+ **Only use these command verbs:** `list`, `show`, `test`
160
+
161
+ **Blocklisted verbs — NEVER use these in query mode:**
162
+ `create`, `add`, `update`, `modify`, `delete`, `remove`, `assign`, `enable`, `disable`, `configure`
163
+
164
+ If the user requests a change, respond with:
165
+ 1. The current state (the query result)
166
+ 2. "I can look things up but can't make changes in query mode."
167
+ 3. Where in Control Hub they'd make the change, OR offer to switch to build mode
168
+
169
+ ### Scope Limiting
170
+
171
+ - Operate within the org authenticated via `wxcli configure`
172
+ - If a partner/multi-org token is active, query the currently-selected org only
173
+ - No cross-org queries or comparisons
174
+
175
+ ### Error Handling
176
+
177
+ | Error | Response |
178
+ |-------|----------|
179
+ | 401 Unauthorized | "Your session may have expired. Run `wxcli configure` to re-authenticate." |
180
+ | 403 Forbidden | "Your account doesn't have permission to view [resource]. Contact your org admin." |
181
+ | 404 Not Found | "I couldn't find [resource]. It may have been deleted or the name might be different." |
182
+ | 429 Rate Limited | "The API is rate-limiting requests. Try again in a minute." |
183
+ | Timeout | "The request timed out. The org may have a large number of [resources]. Try narrowing your query to a specific location." |