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,627 @@
1
+ ---
2
+ name: configure-routing
3
+ description: |
4
+ Create, modify, or delete Webex Calling routing infrastructure using wxcli CLI commands: Trunks, Route Groups,
5
+ Route Lists, Dial Plans, Translation Patterns (digit manipulation, strip/add digits, country codes),
6
+ and PSTN Connection settings. Guides the user from prerequisites through the full dependency chain
7
+ and verification.
8
+ Use for: create, update, delete, remove, list, or troubleshoot any Calling routing component.
9
+ NOT for: Contact Center dial plans or DN-to-entry-point mapping (use contact-center skill).
10
+ allowed-tools: Read, Grep, Glob, Bash
11
+ argument-hint: [routing-component]
12
+ ---
13
+
14
+ <!-- Created 2026-03-19 -->
15
+
16
+ # Configure Call Routing Workflow
17
+
18
+ **Checkpoint — do NOT proceed until you can answer these:**
19
+ 1. What is the creation dependency chain for routing? (Answer: Trunk → Route Group → then Dial Plan AND Route List in parallel. Each dial plan has ONE route target, so different patterns routing to different trunks/groups need separate dial plans.)
20
+ 2. Do routing delete commands use singular or plural names? (Answer: plural — `delete-route-groups`, `delete-trunks`, `delete-route-lists`.)
21
+
22
+ If you cannot answer both, you skipped reading this skill. Go back and read it.
23
+
24
+ ## When to Use This Skill
25
+
26
+ - Setting up PSTN connectivity for a location (local gateway, cloud-connected PSTN)
27
+ - Creating or modifying dial plans and dial patterns
28
+ - Configuring trunks to on-premises SBCs or local gateways
29
+ - Building route groups for trunk failover/load distribution
30
+ - Creating route lists for Dedicated Instance cloud PSTN
31
+ - Adding translation patterns for digit manipulation
32
+ - Validating or testing call routing end-to-end
33
+
34
+ ## Step 1: Load references
35
+
36
+ 1. Read `docs/reference/call-routing.md` for full API detail, data models, and gotchas
37
+
38
+ **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.
39
+
40
+ ## Step 2: Verify auth token
41
+
42
+ Before any API calls, confirm the user has a working auth token:
43
+
44
+ ```bash
45
+ wxcli whoami
46
+ ```
47
+
48
+ If this fails, stop and resolve authentication first (`wxcli configure`). Required scopes for routing:
49
+
50
+ - **Read**: `spark-admin:telephony_config_read`
51
+ - **Write**: `spark-admin:telephony_config_write`
52
+ - **PSTN Read**: `spark-admin:telephony_pstn_read`
53
+ - **PSTN Write**: `spark-admin:telephony_pstn_write`
54
+
55
+ ## Step 3: Interview -- what routing does the user need?
56
+
57
+ Ask the user what they want to accomplish. Present this decision matrix if they are unsure:
58
+
59
+ | Need | Component(s) |
60
+ |------|-------------|
61
+ | Connect a location to PSTN via on-premises SBC/gateway | **Trunk** + **PSTN Connection** |
62
+ | Failover between multiple SBCs across locations | **Trunk(s)** + **Route Group** + **Dial Plan** |
63
+ | Route outbound calls by dialed pattern (e.g., +1! to US trunk) | **Dial Plan** (requires existing trunk or route group) |
64
+ | Rewrite/manipulate digits before routing (strip prefix, add prefix) | **Translation Pattern** (org-level or location-level) |
65
+ | Provide cloud PSTN numbers to Dedicated Instance | **Route List** (requires route group) |
66
+ | Verify that a number routes correctly end-to-end | **Test Call Routing** |
67
+ | Set up full premises-based PSTN from scratch | All: Trunk -> Route Group -> Dial Plan -> PSTN Connection |
68
+
69
+ ## Step 4: Prerequisites
70
+
71
+ ### 4a. Location exists
72
+
73
+ Trunks, route lists, and PSTN connections are location-scoped. Confirm the target location:
74
+
75
+ ```bash
76
+ wxcli locations list --output json
77
+ ```
78
+
79
+ Capture the `location_id` for the target location.
80
+
81
+ ### 4b. PSTN provider / SBC credentials ready
82
+
83
+ For premises-based PSTN (local gateway trunks), the user needs:
84
+
85
+ | Trunk Type | Requirements |
86
+ |-----------|-------------|
87
+ | **Registering** (`REGISTERING`) | Cisco CUBE Local Gateway. Needs a password for SIP registration. |
88
+ | **Certificate-based** (`CERTIFICATE_BASED`) | Cisco UBE, Oracle ACME, AudioCodes, or Ribbon SBC. Needs FQDN/SRV address, domain, port, and max concurrent calls. |
89
+
90
+ For cloud-connected PSTN (CCP), the provider must already be set up in Control Hub.
91
+
92
+ ### 4c. Existing routing components (if building on top of them)
93
+
94
+ Check what already exists:
95
+
96
+ ```bash
97
+ # List existing trunks
98
+ wxcli call-routing list-trunks --output json
99
+
100
+ # List existing route groups
101
+ wxcli call-routing list-route-groups --output json
102
+
103
+ # List existing dial plans
104
+ wxcli call-routing list-dial-plans --output json
105
+
106
+ # List existing translation patterns
107
+ wxcli call-routing list-translation-patterns --output json
108
+
109
+ # List existing route lists
110
+ wxcli call-routing list-route-lists --output json
111
+
112
+ # Check current PSTN connection for a location
113
+ wxcli pstn list-connection LOCATION_ID --output json
114
+ ```
115
+
116
+ ### 4d. Dependency chain -- `[STRICT ORDER]`
117
+
118
+ Routing components have hard dependencies. You **must** create them in this order:
119
+
120
+ ```
121
+ 1: Trunk (SIP connection to SBC/LGW)
122
+ |
123
+ 2: Route Group (optional -- bundles trunks for failover)
124
+ |
125
+ +---> 3a: Dial Plan (pattern matching -> trunk or route group)
126
+ |
127
+ +---> 3b: Route List (optional -- for Dedicated Instance cloud PSTN)
128
+ |
129
+ 4: PSTN Connection (points a location to trunk or route group)
130
+ |
131
+ 5: Translation Pattern (independent -- digit rewrite before outbound routing)
132
+ |
133
+ 6: Test Call Routing (validate the configuration)
134
+ ```
135
+
136
+ **Why this order matters:**
137
+ - A Dial Plan requires an existing trunk or route group as its route choice -- you cannot create a dial plan without one.
138
+ - A Route Group requires existing trunk(s) -- you cannot create a route group without trunks.
139
+ - A Route List requires an existing route group.
140
+ - Dial Plans and Route Lists are parallel branches from Route Group -- neither depends on the other.
141
+ - PSTN Connection points to either a trunk or route group -- they must exist first.
142
+ - Translation Patterns have no dependencies -- they can be created at any point.
143
+ - **Each dial plan has exactly one route target** (one trunk or one route group). To route different patterns to different targets, create separate dial plans.
144
+
145
+ **Deletion order (reverse):**
146
+
147
+ When tearing down routing, delete in reverse: PSTN Connection → Route Lists → Dial Plans → Route Groups → Trunks. A trunk cannot be deleted if it's referenced by a route group; a route group cannot be deleted if it's referenced by a dial plan or route list. The API returns error 27350 when you try to delete a component that's still referenced.
148
+
149
+ ### 4e. Component CLI reference -- Trunks
150
+
151
+ A trunk is a SIP connection between Webex Calling and an on-premises local gateway or SBC.
152
+
153
+ **List available trunk types:**
154
+
155
+ ```bash
156
+ wxcli call-routing list-trunk-types --output json
157
+ ```
158
+
159
+ **Create a registering trunk (Cisco CUBE):**
160
+
161
+ ```bash
162
+ wxcli call-routing create-trunks \
163
+ --name "HQ-LGW-01" \
164
+ --location-id LOCATION_ID \
165
+ --password "SecurePass123!" \
166
+ --trunk-type REGISTERING
167
+ ```
168
+
169
+ **Create a certificate-based trunk (third-party SBC):**
170
+
171
+ ```bash
172
+ wxcli call-routing create-trunks \
173
+ --name "HQ-SBC-01" \
174
+ --location-id LOCATION_ID \
175
+ --password "SecurePass123!" \
176
+ --trunk-type CERTIFICATE_BASED \
177
+ --address "sbc.example.com" \
178
+ --domain "example.com" \
179
+ --port 5061 \
180
+ --max-concurrent-calls 100
181
+ ```
182
+
183
+ **View trunk details and status:**
184
+
185
+ ```bash
186
+ wxcli call-routing show-trunks TRUNK_ID --output json
187
+ ```
188
+
189
+ The response includes `status` (online/offline/unknown), `sipAuthenticationUserName`, `linePort`, and `otgDtgId` -- all needed for SBC configuration.
190
+
191
+ **Check trunk usage (what's connected to it):**
192
+
193
+ ```bash
194
+ wxcli call-routing show TRUNK_ID --output json
195
+ ```
196
+
197
+ **Delete a trunk:**
198
+
199
+ ```bash
200
+ wxcli call-routing delete-trunks TRUNK_ID
201
+ ```
202
+
203
+ **Trunk limitations:**
204
+ - You cannot change `trunkType`, `locationId`, or `deviceType` after creation. Delete and recreate instead.
205
+ - `name` and `password` are always required on updates.
206
+
207
+ ### 4f. Component CLI reference -- Route Groups
208
+
209
+ A route group bundles up to 10 trunks (from different locations) with priority-based failover.
210
+
211
+ **Create a route group:**
212
+
213
+ ```bash
214
+ wxcli call-routing create-route-groups \
215
+ --name "US-East-RG" \
216
+ --json-body '{"localGateways": [{"id": "TRUNK_ID_1", "priority": 1}, {"id": "TRUNK_ID_2", "priority": 2}]}'
217
+ ```
218
+
219
+ > **NOTE:** The `localGateways` array requires `--json-body` because it's a nested object the CLI cannot express as flat options. Each entry uses `id` (not `trunkId`) for the trunk identifier.
220
+
221
+ **View route group details:**
222
+
223
+ ```bash
224
+ wxcli call-routing show-route-groups ROUTE_GROUP_ID --output json
225
+ ```
226
+
227
+ **Check route group usage:**
228
+
229
+ ```bash
230
+ wxcli call-routing show-usage ROUTE_GROUP_ID --output json
231
+ ```
232
+
233
+ **Delete a route group:**
234
+
235
+ ```bash
236
+ wxcli call-routing delete-route-groups ROUTE_GROUP_ID
237
+ ```
238
+
239
+ ### 4g. Component CLI reference -- Dial Plans
240
+
241
+ Dial plans route outbound calls by matching dialed patterns to a trunk or route group. They are **org-wide** (not per-location).
242
+
243
+ **Dial pattern rules:**
244
+ - `!` matches any sequence of digits. Can only appear once at the end. Only valid in E.164 patterns.
245
+ - `X` matches a single digit (0-9).
246
+ - Example E.164: `+1408!` matches any number starting with +1408.
247
+ - Example short: `9XXX` matches any 4-digit string starting with 9.
248
+
249
+ **Create a dial plan:**
250
+
251
+ ```bash
252
+ wxcli call-routing create \
253
+ --name "US-Outbound" \
254
+ --route-id TRUNK_OR_ROUTE_GROUP_ID \
255
+ --route-type TRUNK
256
+ ```
257
+
258
+ `--route-type` is either `TRUNK` or `ROUTE_GROUP`.
259
+
260
+ **Add dial patterns to a dial plan:**
261
+
262
+ ```bash
263
+ wxcli call-routing update DIAL_PLAN_ID \
264
+ --json-body '{"dialPatterns": [{"dialPattern": "+1!", "action": "ADD"}]}'
265
+ ```
266
+
267
+ **Multi-destination routing (different patterns → different trunks/groups):**
268
+
269
+ Each dial plan has exactly one route target. To route US and UK calls to different trunks:
270
+
271
+ ```bash
272
+ # Dial plan 1: US calls → US route group (with failover)
273
+ wxcli call-routing create --name "US-Outbound" --route-id US_ROUTE_GROUP_ID --route-type ROUTE_GROUP
274
+ wxcli call-routing update US_DP_ID --json-body '{"dialPatterns": [{"dialPattern": "+1!", "action": "ADD"}]}'
275
+
276
+ # Dial plan 2: UK calls → UK trunk (direct)
277
+ wxcli call-routing create --name "UK-Outbound" --route-id UK_TRUNK_ID --route-type TRUNK
278
+ wxcli call-routing update UK_DP_ID --json-body '{"dialPatterns": [{"dialPattern": "+44!", "action": "ADD"}]}'
279
+ ```
280
+
281
+ **Validate dial patterns before adding:**
282
+
283
+ ```bash
284
+ wxcli call-routing validate-a-dial --json-body '{"dialPatterns": ["+1408!", "+44!", "9XXX"]}'
285
+ ```
286
+
287
+ **View a dial plan:**
288
+
289
+ ```bash
290
+ wxcli call-routing show-dial-plans DIAL_PLAN_ID --output json
291
+ ```
292
+
293
+ **List which dial plans use a trunk:**
294
+
295
+ ```bash
296
+ wxcli call-routing list TRUNK_ID --output json
297
+ ```
298
+
299
+ > This lists dial plans that reference the given trunk — not patterns within a dial plan. To see a dial plan's details (including its route choice), use `show-dial-plans`.
300
+
301
+ **Modify a dial plan's route target (name, route-id, route-type):**
302
+
303
+ ```bash
304
+ wxcli call-routing update-dial-plans DIAL_PLAN_ID \
305
+ --route-id NEW_TRUNK_OR_ROUTE_GROUP_ID \
306
+ --route-type ROUTE_GROUP
307
+ ```
308
+
309
+ **Delete a dial plan:**
310
+
311
+ ```bash
312
+ wxcli call-routing delete DIAL_PLAN_ID
313
+ ```
314
+
315
+ ### 4h. Component CLI reference -- Route Lists
316
+
317
+ Route lists are lists of phone numbers reachable via a route group. Used for Dedicated Instance cloud PSTN connectivity.
318
+
319
+ **Create a route list:**
320
+
321
+ ```bash
322
+ wxcli call-routing create-route-lists \
323
+ --name "US-East-Numbers" \
324
+ --location-id LOCATION_ID \
325
+ --route-group-id ROUTE_GROUP_ID
326
+ ```
327
+
328
+ **Add numbers to a route list:**
329
+
330
+ ```bash
331
+ wxcli call-routing update-numbers ROUTE_LIST_ID \
332
+ --json-body '{"numbers": [{"number": "+19195551234", "action": "ADD"}, {"number": "+19195555678", "action": "ADD"}]}'
333
+ ```
334
+
335
+ **List numbers on a route list:**
336
+
337
+ ```bash
338
+ wxcli call-routing list-numbers ROUTE_LIST_ID --output json
339
+ ```
340
+
341
+ **View route list details:**
342
+
343
+ ```bash
344
+ wxcli call-routing show-route-lists ROUTE_LIST_ID --output json
345
+ ```
346
+
347
+ **Delete a route list:**
348
+
349
+ ```bash
350
+ wxcli call-routing delete-route-lists ROUTE_LIST_ID
351
+ ```
352
+
353
+ ### 4i. Component CLI reference -- Translation Patterns
354
+
355
+ Translation patterns rewrite dialed digits **before routing** (outbound calls only). They can be org-level or location-level.
356
+
357
+ **Common use cases:**
358
+
359
+ | Pattern | Matching | Replacement | Purpose |
360
+ |---------|----------|-------------|---------|
361
+ | Strip access code | `9XXX` | `XXX` | Remove leading '9' prefix for external dialing |
362
+ | Add country code | `XXXXXXXXXX` | `+1XXXXXXXXXX` | Prepend +1 to 10-digit national numbers |
363
+ | Site-specific rewrite | `+1919555XXXX` | `+19196660000` | Redirect a number range to a specific destination |
364
+ | Short code to E.164 | `411` | `+18005551212` | Map short codes to full numbers |
365
+
366
+ **Create org-level translation pattern:**
367
+
368
+ ```bash
369
+ wxcli call-routing create-translation-patterns-call-routing \
370
+ --name "Strip-9-Prefix" \
371
+ --matching-pattern "9XXX" \
372
+ --replacement-pattern "XXX"
373
+ ```
374
+
375
+ **Create location-level translation pattern:**
376
+
377
+ ```bash
378
+ wxcli call-routing create-translation-patterns-call-routing-1 \
379
+ --name "Local-Rewrite" \
380
+ --matching-pattern "+1919555XXXX" \
381
+ --replacement-pattern "+19196660000" \
382
+ --location-id LOCATION_ID
383
+ ```
384
+
385
+ **View translation patterns:**
386
+
387
+ ```bash
388
+ # List all translation patterns (org and location)
389
+ wxcli call-routing list-translation-patterns --output json
390
+
391
+ # Show a specific org-level pattern
392
+ wxcli call-routing show-translation-patterns-call-routing PATTERN_ID --output json
393
+
394
+ # Show a specific location-level pattern
395
+ wxcli call-routing show-translation-patterns-call-routing-1 PATTERN_ID --location-id LOCATION_ID --output json
396
+ ```
397
+
398
+ **Delete translation patterns:**
399
+
400
+ ```bash
401
+ # Org-level
402
+ wxcli call-routing delete-translation-patterns-call-routing PATTERN_ID
403
+
404
+ # Location-level
405
+ wxcli call-routing delete-translation-patterns-call-routing-1 PATTERN_ID --location-id LOCATION_ID
406
+ ```
407
+
408
+ ### 4j. Component CLI reference -- PSTN Connection (per-location)
409
+
410
+ The PSTN connection setting determines which provider handles calls for a specific location.
411
+
412
+ **PSTN connection types:**
413
+
414
+ | Type | Value | API Configurable? | Notes |
415
+ |------|-------|:-----------------:|-------|
416
+ | Local Gateway | `LOCAL_GATEWAY` | Yes | Points to a trunk or route group |
417
+ | Non-Integrated CCP | `NON_INTEGRATED_CCP` | Yes | Points to a CCP provider ID |
418
+ | Integrated CCP | `INTEGRATED_CCP` | No | Must be configured via Control Hub |
419
+ | Cisco PSTN | `CISCO_PSTN` | No | Must be configured via Control Hub |
420
+
421
+ **Check available PSTN options for a location:**
422
+
423
+ ```bash
424
+ wxcli pstn list LOCATION_ID --output json
425
+ ```
426
+
427
+ **Read current PSTN connection:**
428
+
429
+ ```bash
430
+ wxcli pstn list-connection LOCATION_ID --output json
431
+ ```
432
+
433
+ **Set PSTN connection to a trunk:**
434
+
435
+ ```bash
436
+ wxcli pstn update LOCATION_ID \
437
+ --json-body '{"premiseRouteType": "TRUNK", "premiseRouteId": "TRUNK_ID"}'
438
+ ```
439
+
440
+ **Set PSTN connection to a route group:**
441
+
442
+ ```bash
443
+ wxcli pstn update LOCATION_ID \
444
+ --json-body '{"premiseRouteType": "ROUTE_GROUP", "premiseRouteId": "ROUTE_GROUP_ID"}'
445
+ ```
446
+
447
+ ## Step 5: Build and present deployment plan -- [SHOW BEFORE EXECUTING]
448
+
449
+ Before executing any commands, present the full plan to the user:
450
+
451
+ ```
452
+ ROUTING DEPLOYMENT PLAN
453
+ =======================
454
+ Objective: [what the user wants to accomplish]
455
+ Location: [name] ([location_id])
456
+
457
+ Components to create (in dependency order):
458
+
459
+ 1. Trunk: [name]
460
+ Type: [REGISTERING / CERTIFICATE_BASED]
461
+ Location: [location_name]
462
+ [FQDN/Port if certificate-based]
463
+
464
+ 2. Route Group: [name] (if applicable)
465
+ Trunks: [trunk_1 (priority 1), trunk_2 (priority 2)]
466
+
467
+ 3. Dial Plan: [name]
468
+ Route Choice: [trunk or route group name] ([type])
469
+ Patterns: [+1!, +44!, etc.]
470
+
471
+ 4. Translation Patterns: (if applicable)
472
+ [matching_pattern] -> [replacement_pattern] ([org/location level])
473
+
474
+ 5. PSTN Connection:
475
+ Location: [location_name]
476
+ Route Type: [TRUNK / ROUTE_GROUP]
477
+ Route Target: [trunk or route group name]
478
+
479
+ Prerequisites verified:
480
+ [check] Location exists
481
+ [check] SBC/gateway credentials available
482
+ [check] No conflicting dial patterns
483
+
484
+ Commands to execute:
485
+ wxcli call-routing create-trunks ...
486
+ wxcli call-routing create-route-groups ...
487
+ wxcli call-routing create ...
488
+ wxcli pstn update ...
489
+
490
+ Proceed? (yes/no)
491
+ ```
492
+
493
+ **Wait for user confirmation before executing.**
494
+
495
+ > **WARNING:** Routing changes can affect live calls. Modifying dial plans, trunks, or PSTN connections on a production organization can immediately disrupt call routing for all users. Always confirm with the user and prefer off-hours changes for production environments.
496
+
497
+ ## Step 6: Execute via wxcli
498
+
499
+ ### 6a. Run commands in dependency order
500
+
501
+ Execute commands in strict dependency order (Step 4d): Trunk -> Route Group -> Dial Plan -> Translation Pattern -> PSTN Connection -> Route List.
502
+
503
+ Capture the ID returned by each create command -- subsequent commands need it as input.
504
+
505
+ ### 6b. Handle errors
506
+
507
+ - **401/403**: Token expired or insufficient scopes -- run `wxcli configure`
508
+ - **400**: Validation error -- read the error message, common causes:
509
+ - Invalid dial pattern syntax
510
+ - Trunk name already exists
511
+ - Route group references a non-existent trunk
512
+ - **404**: Referenced resource doesn't exist -- verify IDs
513
+ - **409**: Name conflict -- ask user for alternate name
514
+
515
+ ## Step 7: Verify the configuration
516
+
517
+ ### Verify each component was created
518
+
519
+ ```bash
520
+ # Verify trunk (check status: online/offline)
521
+ wxcli call-routing show-trunks TRUNK_ID --output json
522
+
523
+ # Verify route group (check localGateways populated)
524
+ wxcli call-routing show-route-groups ROUTE_GROUP_ID --output json
525
+
526
+ # Verify dial plan (check routeId and routeType)
527
+ wxcli call-routing show-dial-plans DIAL_PLAN_ID --output json
528
+
529
+ # Verify PSTN connection
530
+ wxcli pstn list-connection LOCATION_ID --output json
531
+ ```
532
+
533
+ ### Test call routing end-to-end
534
+
535
+ The test call routing command simulates routing without placing an actual call:
536
+
537
+ ```bash
538
+ wxcli call-routing test-call-routing \
539
+ --originator-id PERSON_ID \
540
+ --originator-type PEOPLE \
541
+ --destination "+19195551234"
542
+ ```
543
+
544
+ Check the response for:
545
+ - `destinationType` -- should be `PSTN_NUMBER` for external calls
546
+ - `isRejected` -- should be `false`
547
+ - `routingAddress` -- the resolved address
548
+ - `callSourceInfo.dialPlanName` -- confirms which dial plan matched
549
+
550
+ To include translation pattern details in the test:
551
+
552
+ ```bash
553
+ wxcli call-routing test-call-routing \
554
+ --originator-id PERSON_ID \
555
+ --originator-type PEOPLE \
556
+ --destination "+19195551234" \
557
+ --include-applied-services true
558
+ ```
559
+
560
+ ## Step 8: Report results
561
+
562
+ Present the creation results:
563
+
564
+ ```
565
+ ROUTING CONFIGURED
566
+ ==================
567
+ Location: [location_name]
568
+
569
+ Components created:
570
+ Trunk: [name] (ID: [trunk_id], Status: [online/offline])
571
+ Route Group: [name] (ID: [rg_id], Trunks: [count])
572
+ Dial Plan: [name] (ID: [dp_id], Patterns: [count])
573
+ PSTN Connection: [type] -> [target_name]
574
+
575
+ Test Routing Result:
576
+ +19195551234 -> PSTN_NUMBER via [trunk_name]
577
+ Rejected: false
578
+
579
+ Next steps:
580
+ - Monitor trunk status (should show "online" once SBC registers)
581
+ - Add additional dial patterns as needed
582
+ - Configure translation patterns for digit manipulation
583
+ - Set up additional locations with PSTN connections
584
+ ```
585
+
586
+ ---
587
+
588
+ ## Critical Rules
589
+
590
+ 1. **Strict dependency order.** Create Trunk → Route Group → then Dial Plan and Route List (parallel) → PSTN Connection. Reversing the order will fail because each component references the one before it.
591
+ 2. **Always show the deployment plan** (Step 5) and wait for user confirmation before executing. Routing changes can affect live calls immediately.
592
+ 3. **Dial plans require an existing trunk or route group.** You cannot create a standalone dial plan without a route choice.
593
+ 4. **Trunk type, location, and device type are immutable after creation.** To change any of these, delete and recreate the trunk.
594
+ 5. **Trunk updates always require name + password.** Even if you're only changing one field, both must be sent.
595
+ 6. **Route groups are limited to 10 trunks** from different locations.
596
+ 7. **Translation pattern E.164 replacements must use fully specified digits.** `+1919666XXXX` is rejected as a replacement pattern -- use `+19196660000` instead. `X` wildcards ARE valid in non-E.164 replacements (e.g., `9XXX` -> `XXX`).
597
+ 8. **Only LOCAL_GATEWAY and NON_INTEGRATED_CCP are API-configurable** for PSTN connections. INTEGRATED_CCP and CISCO_PSTN must be configured via Control Hub.
598
+ 9. **Test call routing requires a calling-enabled user as originator.** Passing a non-calling user's ID returns 404.
599
+ 10. **Dial plans are org-wide, not per-location.** A dial plan applies to all users across all locations in the organization.
600
+ 11. **Route group `--json-body` is required** for specifying trunks with priorities. The CLI cannot express the nested `localGateways` array as flat options.
601
+ 12. **Translation patterns are outbound only.** They manipulate digits before outbound routing. They do not affect inbound call routing.
602
+ 13. **Raw HTTP URL prefixes differ by component.** Dial plans/trunks/route groups/route lists use `/premisePstn/`. Translation patterns use `/callRouting/`. PSTN connections use `/telephony/pstn/`. Getting the prefix wrong returns 404. See `docs/reference/call-routing.md` for full URL tables.
603
+ 14. **Production routing changes should be done off-hours.** Modifying dial plans, trunks, or PSTN connections can immediately disrupt live call routing.
604
+ 15. **Dial plan `dialPatterns` format differs between CREATE and MODIFY.** CREATE (POST) takes a plain string array: `["pattern1", "pattern2"]`. MODIFY (PUT on `/{id}/dialPatterns`) takes objects with action: `[{"dialPattern": "+1!", "action": "ADD"}]`. Using the modify format on create returns 400 "Invalid field value: dialPatterns".
605
+ 16. **Delete command names use plural suffixes.** `delete-trunks`, `delete-route-groups`, `delete-route-lists`. Dial plan delete is just `delete` (no suffix). Translation pattern delete is `delete-translation-patterns-call-routing`. Always check `wxcli call-routing --help` if unsure.
606
+
607
+ ---
608
+
609
+ ## Scope Quick Reference
610
+
611
+ | Operation | Scope |
612
+ |-----------|-------|
613
+ | Read trunks, route groups, dial plans, route lists, translation patterns | `spark-admin:telephony_config_read` |
614
+ | Create/update/delete trunks, route groups, dial plans, route lists, translation patterns | `spark-admin:telephony_config_write` |
615
+ | Test call routing | `spark-admin:telephony_config_write` |
616
+ | Validate phone numbers | `spark-admin:telephony_config_write` |
617
+ | Read PSTN connection settings | `spark-admin:telephony_pstn_read` |
618
+ | Configure PSTN connection settings | `spark-admin:telephony_pstn_write` |
619
+
620
+ ---
621
+
622
+ ## Context Compaction Recovery
623
+
624
+ If context compacts mid-execution, recover by:
625
+ 1. Read the deployment plan from `docs/plans/` to recover what was planned
626
+ 2. Check what's already been created: run the relevant `list` commands for each component
627
+ 3. Resume from the first incomplete step in the dependency chain