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.
- wxcli/__init__.py +4 -0
- wxcli/_playbook/.claude/agents/migration-advisor.md +239 -0
- wxcli/_playbook/.claude/agents/wxc-calling-builder.md +946 -0
- wxcli/_playbook/.claude/rules/cleanup.md +29 -0
- wxcli/_playbook/.claude/rules/cucm-migration.md +58 -0
- wxcli/_playbook/.claude/rules/org-health.md +14 -0
- wxcli/_playbook/.claude/settings.json +8 -0
- wxcli/_playbook/.claude/skills/audit-compliance/SKILL.md +515 -0
- wxcli/_playbook/.claude/skills/call-control/SKILL.md +747 -0
- wxcli/_playbook/.claude/skills/configure-features/SKILL.md +623 -0
- wxcli/_playbook/.claude/skills/configure-routing/SKILL.md +627 -0
- wxcli/_playbook/.claude/skills/contact-center/SKILL.md +1181 -0
- wxcli/_playbook/.claude/skills/cucm-migrate/SKILL.md +820 -0
- wxcli/_playbook/.claude/skills/customer-assist/SKILL.md +443 -0
- wxcli/_playbook/.claude/skills/device-platform/SKILL.md +407 -0
- wxcli/_playbook/.claude/skills/manage-call-settings/SKILL.md +757 -0
- wxcli/_playbook/.claude/skills/manage-devices/SKILL.md +790 -0
- wxcli/_playbook/.claude/skills/manage-identity/SKILL.md +638 -0
- wxcli/_playbook/.claude/skills/manage-licensing/SKILL.md +528 -0
- wxcli/_playbook/.claude/skills/manage-meetings/SKILL.md +708 -0
- wxcli/_playbook/.claude/skills/messaging-bots/SKILL.md +365 -0
- wxcli/_playbook/.claude/skills/messaging-spaces/SKILL.md +520 -0
- wxcli/_playbook/.claude/skills/org-health/SKILL.md +159 -0
- wxcli/_playbook/.claude/skills/provision-calling/SKILL.md +421 -0
- wxcli/_playbook/.claude/skills/query-live/SKILL.md +183 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-flow-trace.md +223 -0
- wxcli/_playbook/.claude/skills/query-live/domains/call-history.md +44 -0
- wxcli/_playbook/.claude/skills/query-live/domains/features.md +169 -0
- wxcli/_playbook/.claude/skills/query-live/domains/numbers.md +93 -0
- wxcli/_playbook/.claude/skills/query-live/domains/people-and-settings.md +146 -0
- wxcli/_playbook/.claude/skills/query-live/domains/routing.md +124 -0
- wxcli/_playbook/.claude/skills/reporting/SKILL.md +501 -0
- wxcli/_playbook/.claude/skills/reporting/references/cdr-recipes.md +1628 -0
- wxcli/_playbook/.claude/skills/reporting-cc/SKILL.md +251 -0
- wxcli/_playbook/.claude/skills/reporting-meetings/SKILL.md +290 -0
- wxcli/_playbook/.claude/skills/teardown/SKILL.md +214 -0
- wxcli/_playbook/.claude/skills/video-mesh/SKILL.md +379 -0
- wxcli/_playbook/.claude/skills/wxc-calling-debug/SKILL.md +475 -0
- wxcli/_playbook/CLAUDE.md +373 -0
- wxcli/_playbook/docs/reference/CLAUDE.md +25 -0
- wxcli/_playbook/docs/reference/admin-apps-data.md +643 -0
- wxcli/_playbook/docs/reference/admin-audit-security.md +322 -0
- wxcli/_playbook/docs/reference/admin-hybrid.md +383 -0
- wxcli/_playbook/docs/reference/admin-identity-scim.md +1007 -0
- wxcli/_playbook/docs/reference/admin-licensing.md +414 -0
- wxcli/_playbook/docs/reference/admin-org-management.md +586 -0
- wxcli/_playbook/docs/reference/admin-partner.md +357 -0
- wxcli/_playbook/docs/reference/archive/wxc-sdk-patterns.md +1229 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-advanced.md +835 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-core.md +743 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-devices-workspaces.md +1305 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-features.md +849 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-locations.md +938 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-person.md +1255 -0
- wxcli/_playbook/docs/reference/archive/wxcadm-routing.md +1262 -0
- wxcli/_playbook/docs/reference/authentication.md +965 -0
- wxcli/_playbook/docs/reference/call-control.md +1205 -0
- wxcli/_playbook/docs/reference/call-features-additional.md +2541 -0
- wxcli/_playbook/docs/reference/call-features-major.md +1320 -0
- wxcli/_playbook/docs/reference/call-routing.md +2304 -0
- wxcli/_playbook/docs/reference/contact-center-analytics.md +1049 -0
- wxcli/_playbook/docs/reference/contact-center-core.md +1614 -0
- wxcli/_playbook/docs/reference/contact-center-journey.md +457 -0
- wxcli/_playbook/docs/reference/contact-center-routing.md +1138 -0
- wxcli/_playbook/docs/reference/devices-core.md +1869 -0
- wxcli/_playbook/docs/reference/devices-dect.md +1150 -0
- wxcli/_playbook/docs/reference/devices-platform.md +467 -0
- wxcli/_playbook/docs/reference/devices-workspaces.md +1426 -0
- wxcli/_playbook/docs/reference/emergency-services.md +1122 -0
- wxcli/_playbook/docs/reference/location-calling-core.md +2037 -0
- wxcli/_playbook/docs/reference/location-calling-media.md +1334 -0
- wxcli/_playbook/docs/reference/location-recording-advanced.md +1482 -0
- wxcli/_playbook/docs/reference/meetings-content.md +473 -0
- wxcli/_playbook/docs/reference/meetings-core.md +903 -0
- wxcli/_playbook/docs/reference/meetings-infrastructure.md +899 -0
- wxcli/_playbook/docs/reference/meetings-settings.md +850 -0
- wxcli/_playbook/docs/reference/messaging-bots.md +1091 -0
- wxcli/_playbook/docs/reference/messaging-spaces.md +695 -0
- wxcli/_playbook/docs/reference/person-call-settings-behavior.md +1639 -0
- wxcli/_playbook/docs/reference/person-call-settings-handling.md +1394 -0
- wxcli/_playbook/docs/reference/person-call-settings-media.md +1898 -0
- wxcli/_playbook/docs/reference/person-call-settings-permissions.md +1329 -0
- wxcli/_playbook/docs/reference/provisioning.md +1366 -0
- wxcli/_playbook/docs/reference/reporting-analytics.md +1318 -0
- wxcli/_playbook/docs/reference/self-service-call-settings.md +1020 -0
- wxcli/_playbook/docs/reference/virtual-lines.md +1132 -0
- wxcli/_playbook/docs/reference/webhooks-events.md +1444 -0
- wxcli/_playbook/docs/reference/wxcadm-xsi-realtime.md +953 -0
- wxcli/_version.py +24 -0
- wxcli/auth.py +137 -0
- wxcli/commands/__init__.py +0 -0
- wxcli/commands/_registry.py +181 -0
- wxcli/commands/activation_email.py +103 -0
- wxcli/commands/admin_recordings.py +585 -0
- wxcli/commands/analytics.py +105 -0
- wxcli/commands/announcement_playlists.py +219 -0
- wxcli/commands/announcements.py +519 -0
- wxcli/commands/archive_users.py +36 -0
- wxcli/commands/attachment_actions.py +60 -0
- wxcli/commands/audit_events.py +83 -0
- wxcli/commands/authorizations.py +113 -0
- wxcli/commands/auto_attendant.py +642 -0
- wxcli/commands/broadworks_billing_reports.py +126 -0
- wxcli/commands/broadworks_enterprises.py +160 -0
- wxcli/commands/broadworks_subscribers.py +319 -0
- wxcli/commands/broadworks_workspaces.py +108 -0
- wxcli/commands/call_controls.py +1304 -0
- wxcli/commands/call_park.py +494 -0
- wxcli/commands/call_pickup.py +229 -0
- wxcli/commands/call_queue.py +1878 -0
- wxcli/commands/call_recording.py +707 -0
- wxcli/commands/call_routing.py +1610 -0
- wxcli/commands/call_settings_for_me_phase_5.py +212 -0
- wxcli/commands/caller_reputation.py +169 -0
- wxcli/commands/calling_service.py +305 -0
- wxcli/commands/cc_address_book.py +770 -0
- wxcli/commands/cc_agent_greetings.py +242 -0
- wxcli/commands/cc_agent_summaries.py +39 -0
- wxcli/commands/cc_agent_wellbeing.py +216 -0
- wxcli/commands/cc_agents.py +425 -0
- wxcli/commands/cc_ai_assistant.py +55 -0
- wxcli/commands/cc_ai_feature.py +294 -0
- wxcli/commands/cc_audio_files.py +149 -0
- wxcli/commands/cc_auto_csat.py +311 -0
- wxcli/commands/cc_aux_code.py +458 -0
- wxcli/commands/cc_business_hour.py +353 -0
- wxcli/commands/cc_call_monitoring.py +228 -0
- wxcli/commands/cc_callbacks.py +194 -0
- wxcli/commands/cc_campaign.py +212 -0
- wxcli/commands/cc_captures.py +39 -0
- wxcli/commands/cc_contact_list.py +169 -0
- wxcli/commands/cc_contact_number.py +295 -0
- wxcli/commands/cc_data_sources.py +235 -0
- wxcli/commands/cc_desktop_layout.py +380 -0
- wxcli/commands/cc_desktop_profile.py +322 -0
- wxcli/commands/cc_dial_number.py +511 -0
- wxcli/commands/cc_dial_plan.py +347 -0
- wxcli/commands/cc_dnc.py +101 -0
- wxcli/commands/cc_entry_point.py +545 -0
- wxcli/commands/cc_ewt.py +51 -0
- wxcli/commands/cc_flow.py +477 -0
- wxcli/commands/cc_global_vars.py +430 -0
- wxcli/commands/cc_holiday_list.py +335 -0
- wxcli/commands/cc_journey.py +1261 -0
- wxcli/commands/cc_legacy_flows.py +49 -0
- wxcli/commands/cc_multimedia_profile.py +436 -0
- wxcli/commands/cc_notification.py +51 -0
- wxcli/commands/cc_outdial_ani.py +604 -0
- wxcli/commands/cc_overrides.py +341 -0
- wxcli/commands/cc_queue.py +1083 -0
- wxcli/commands/cc_queue_stats.py +55 -0
- wxcli/commands/cc_realtime.py +51 -0
- wxcli/commands/cc_resource_collection.py +312 -0
- wxcli/commands/cc_search.py +46 -0
- wxcli/commands/cc_site.py +400 -0
- wxcli/commands/cc_skill.py +350 -0
- wxcli/commands/cc_skill_profile.py +289 -0
- wxcli/commands/cc_subscriptions.py +426 -0
- wxcli/commands/cc_summaries.py +130 -0
- wxcli/commands/cc_tasks.py +844 -0
- wxcli/commands/cc_team.py +325 -0
- wxcli/commands/cc_user_profiles.py +349 -0
- wxcli/commands/cc_users.py +701 -0
- wxcli/commands/cc_work_types.py +363 -0
- wxcli/commands/cdr.py +89 -0
- wxcli/commands/classifications.py +38 -0
- wxcli/commands/cleanup.py +1427 -0
- wxcli/commands/client_settings.py +72 -0
- wxcli/commands/conference.py +328 -0
- wxcli/commands/configure.py +72 -0
- wxcli/commands/converged_recordings.py +347 -0
- wxcli/commands/converged_recordings_export.py +310 -0
- wxcli/commands/cq_playlists.py +42 -0
- wxcli/commands/cucm.py +2794 -0
- wxcli/commands/cucm_config.py +129 -0
- wxcli/commands/customer_assist.py +373 -0
- wxcli/commands/data_sources.py +227 -0
- wxcli/commands/dect_devices.py +787 -0
- wxcli/commands/device_configurations.py +77 -0
- wxcli/commands/device_dynamic_settings.py +320 -0
- wxcli/commands/device_settings.py +1489 -0
- wxcli/commands/devices.py +280 -0
- wxcli/commands/domains.py +142 -0
- wxcli/commands/ecm.py +178 -0
- wxcli/commands/emergency_services.py +827 -0
- wxcli/commands/events.py +83 -0
- wxcli/commands/external_voicemail.py +52 -0
- wxcli/commands/groups.py +206 -0
- wxcli/commands/guest_management.py +76 -0
- wxcli/commands/hds.py +340 -0
- wxcli/commands/hot_desk.py +67 -0
- wxcli/commands/hot_desking_members.py +118 -0
- wxcli/commands/hot_desking_portal.py +124 -0
- wxcli/commands/hunt_group.py +577 -0
- wxcli/commands/hybrid_clusters.py +71 -0
- wxcli/commands/hybrid_connectors.py +67 -0
- wxcli/commands/identity_org.py +159 -0
- wxcli/commands/init_playbook.py +155 -0
- wxcli/commands/licenses.py +106 -0
- wxcli/commands/live_monitoring.py +40 -0
- wxcli/commands/location_call_handling.py +577 -0
- wxcli/commands/location_schedules.py +341 -0
- wxcli/commands/location_settings.py +1297 -0
- wxcli/commands/location_voicemail.py +494 -0
- wxcli/commands/locations.py +336 -0
- wxcli/commands/meeting_captions.py +110 -0
- wxcli/commands/meeting_chats.py +63 -0
- wxcli/commands/meeting_invitees.py +234 -0
- wxcli/commands/meeting_messages.py +28 -0
- wxcli/commands/meeting_participants.py +278 -0
- wxcli/commands/meeting_polls.py +111 -0
- wxcli/commands/meeting_preferences.py +515 -0
- wxcli/commands/meeting_qa.py +78 -0
- wxcli/commands/meeting_qualities.py +43 -0
- wxcli/commands/meeting_reports.py +101 -0
- wxcli/commands/meeting_session_types.py +105 -0
- wxcli/commands/meeting_site.py +57 -0
- wxcli/commands/meeting_slido.py +44 -0
- wxcli/commands/meeting_summaries.py +92 -0
- wxcli/commands/meeting_tracking_codes.py +233 -0
- wxcli/commands/meeting_transcripts.py +230 -0
- wxcli/commands/meetings.py +1997 -0
- wxcli/commands/memberships.py +164 -0
- wxcli/commands/messages.py +213 -0
- wxcli/commands/mode_management.py +244 -0
- wxcli/commands/my_call_settings.py +3577 -0
- wxcli/commands/numbers.py +405 -0
- wxcli/commands/operating_modes.py +410 -0
- wxcli/commands/org_contacts.py +284 -0
- wxcli/commands/org_health_cli.py +55 -0
- wxcli/commands/org_settings.py +71 -0
- wxcli/commands/organizations.py +83 -0
- wxcli/commands/paging_group.py +257 -0
- wxcli/commands/partner_admins.py +141 -0
- wxcli/commands/partner_reports.py +188 -0
- wxcli/commands/partner_tags.py +216 -0
- wxcli/commands/people.py +279 -0
- wxcli/commands/person_call_settings.py +71 -0
- wxcli/commands/pstn.py +280 -0
- wxcli/commands/recording_report.py +154 -0
- wxcli/commands/report_templates.py +38 -0
- wxcli/commands/reports.py +144 -0
- wxcli/commands/resource_group_memberships.py +160 -0
- wxcli/commands/resource_groups.py +67 -0
- wxcli/commands/roles.py +63 -0
- wxcli/commands/room_tabs.py +160 -0
- wxcli/commands/rooms.py +225 -0
- wxcli/commands/scim_bulk.py +46 -0
- wxcli/commands/scim_groups.py +246 -0
- wxcli/commands/scim_schemas.py +82 -0
- wxcli/commands/scim_users.py +283 -0
- wxcli/commands/security_audit.py +54 -0
- wxcli/commands/service_apps.py +51 -0
- wxcli/commands/single_number_reach.py +209 -0
- wxcli/commands/team_memberships.py +155 -0
- wxcli/commands/teams.py +153 -0
- wxcli/commands/ucm_profile.py +42 -0
- wxcli/commands/update.py +219 -0
- wxcli/commands/user_settings.py +5116 -0
- wxcli/commands/video_mesh.py +1090 -0
- wxcli/commands/virtual_extensions.py +502 -0
- wxcli/commands/virtual_line_settings.py +2072 -0
- wxcli/commands/webhooks.py +176 -0
- wxcli/commands/wholesale_billing_reports.py +147 -0
- wxcli/commands/wholesale_provisioning.py +523 -0
- wxcli/commands/workspace_locations.py +339 -0
- wxcli/commands/workspace_metrics.py +103 -0
- wxcli/commands/workspace_personalization.py +70 -0
- wxcli/commands/workspace_settings.py +3347 -0
- wxcli/commands/workspaces.py +279 -0
- wxcli/commands/xapi.py +114 -0
- wxcli/config.py +139 -0
- wxcli/errors.py +77 -0
- wxcli/main.py +210 -0
- wxcli/migration/CLAUDE.md +106 -0
- wxcli/migration/__init__.py +1 -0
- wxcli/migration/advisory/CLAUDE.md +196 -0
- wxcli/migration/advisory/__init__.py +46 -0
- wxcli/migration/advisory/advisor.py +107 -0
- wxcli/migration/advisory/advisory_patterns.py +2552 -0
- wxcli/migration/advisory/recommendation_rules.py +835 -0
- wxcli/migration/cucm/CLAUDE.md +74 -0
- wxcli/migration/cucm/__init__.py +5 -0
- wxcli/migration/cucm/connection.py +265 -0
- wxcli/migration/cucm/discovery.py +225 -0
- wxcli/migration/cucm/extractors/__init__.py +1 -0
- wxcli/migration/cucm/extractors/announcements.py +92 -0
- wxcli/migration/cucm/extractors/base.py +90 -0
- wxcli/migration/cucm/extractors/device_profiles.py +98 -0
- wxcli/migration/cucm/extractors/devices.py +193 -0
- wxcli/migration/cucm/extractors/e911.py +103 -0
- wxcli/migration/cucm/extractors/features.py +309 -0
- wxcli/migration/cucm/extractors/helpers.py +73 -0
- wxcli/migration/cucm/extractors/informational.py +295 -0
- wxcli/migration/cucm/extractors/locations.py +221 -0
- wxcli/migration/cucm/extractors/moh.py +100 -0
- wxcli/migration/cucm/extractors/remote_destinations.py +96 -0
- wxcli/migration/cucm/extractors/routing.py +493 -0
- wxcli/migration/cucm/extractors/shared_lines.py +146 -0
- wxcli/migration/cucm/extractors/templates.py +229 -0
- wxcli/migration/cucm/extractors/tier4.py +173 -0
- wxcli/migration/cucm/extractors/users.py +240 -0
- wxcli/migration/cucm/extractors/voicemail.py +243 -0
- wxcli/migration/cucm/extractors/workspaces.py +88 -0
- wxcli/migration/cucm/unity_connection.py +304 -0
- wxcli/migration/execute/CLAUDE.md +372 -0
- wxcli/migration/execute/__init__.py +303 -0
- wxcli/migration/execute/batch.py +277 -0
- wxcli/migration/execute/dependency.py +483 -0
- wxcli/migration/execute/engine.py +964 -0
- wxcli/migration/execute/handlers.py +2232 -0
- wxcli/migration/execute/planner.py +1939 -0
- wxcli/migration/execute/runtime.py +571 -0
- wxcli/migration/export/CLAUDE.md +49 -0
- wxcli/migration/export/__init__.py +8 -0
- wxcli/migration/export/csv_export.py +126 -0
- wxcli/migration/export/deployment_plan.py +479 -0
- wxcli/migration/export/json_export.py +60 -0
- wxcli/migration/models.py +941 -0
- wxcli/migration/phone_models.py +50 -0
- wxcli/migration/preflight/CLAUDE.md +52 -0
- wxcli/migration/preflight/__init__.py +89 -0
- wxcli/migration/preflight/checks.py +911 -0
- wxcli/migration/preflight/runner.py +293 -0
- wxcli/migration/rate_limiter.py +144 -0
- wxcli/migration/report/CLAUDE.md +245 -0
- wxcli/migration/report/__init__.py +7 -0
- wxcli/migration/report/appendix.py +2437 -0
- wxcli/migration/report/assembler.py +183 -0
- wxcli/migration/report/charts.py +263 -0
- wxcli/migration/report/executive.py +776 -0
- wxcli/migration/report/explainer.py +704 -0
- wxcli/migration/report/helpers.py +74 -0
- wxcli/migration/report/ingest.py +152 -0
- wxcli/migration/report/notice_templates.py +192 -0
- wxcli/migration/report/score.py +375 -0
- wxcli/migration/report/styles.py +1052 -0
- wxcli/migration/report/user_diff.py +1052 -0
- wxcli/migration/report/user_notice.py +425 -0
- wxcli/migration/state.py +139 -0
- wxcli/migration/store.py +860 -0
- wxcli/migration/transform/CLAUDE.md +107 -0
- wxcli/migration/transform/__init__.py +12 -0
- wxcli/migration/transform/analysis_pipeline.py +453 -0
- wxcli/migration/transform/analyzers/__init__.py +142 -0
- wxcli/migration/transform/analyzers/css_permission.py +189 -0
- wxcli/migration/transform/analyzers/css_routing.py +335 -0
- wxcli/migration/transform/analyzers/device_compatibility.py +122 -0
- wxcli/migration/transform/analyzers/dn_ambiguity.py +131 -0
- wxcli/migration/transform/analyzers/duplicate_user.py +221 -0
- wxcli/migration/transform/analyzers/extension_conflict.py +173 -0
- wxcli/migration/transform/analyzers/feature_approximation.py +227 -0
- wxcli/migration/transform/analyzers/layout_overflow.py +174 -0
- wxcli/migration/transform/analyzers/location_ambiguity.py +184 -0
- wxcli/migration/transform/analyzers/missing_data.py +300 -0
- wxcli/migration/transform/analyzers/selective_call_handling.py +394 -0
- wxcli/migration/transform/analyzers/shared_line.py +170 -0
- wxcli/migration/transform/analyzers/voicemail_compatibility.py +267 -0
- wxcli/migration/transform/analyzers/workspace_license.py +212 -0
- wxcli/migration/transform/cross_reference.py +1136 -0
- wxcli/migration/transform/cucm_pattern.py +246 -0
- wxcli/migration/transform/decisions.py +301 -0
- wxcli/migration/transform/e164.py +145 -0
- wxcli/migration/transform/engine.py +256 -0
- wxcli/migration/transform/mappers/CLAUDE.md +123 -0
- wxcli/migration/transform/mappers/__init__.py +76 -0
- wxcli/migration/transform/mappers/announcement_mapper.py +122 -0
- wxcli/migration/transform/mappers/base.py +190 -0
- wxcli/migration/transform/mappers/button_template_mapper.py +186 -0
- wxcli/migration/transform/mappers/call_forwarding_mapper.py +228 -0
- wxcli/migration/transform/mappers/call_settings_mapper.py +144 -0
- wxcli/migration/transform/mappers/css_mapper.py +868 -0
- wxcli/migration/transform/mappers/dect_mapper.py +367 -0
- wxcli/migration/transform/mappers/device_layout_mapper.py +289 -0
- wxcli/migration/transform/mappers/device_mapper.py +227 -0
- wxcli/migration/transform/mappers/device_profile_mapper.py +190 -0
- wxcli/migration/transform/mappers/device_settings_mapper.py +464 -0
- wxcli/migration/transform/mappers/e911_mapper.py +129 -0
- wxcli/migration/transform/mappers/ecbn_mapper.py +263 -0
- wxcli/migration/transform/mappers/executive_assistant_mapper.py +156 -0
- wxcli/migration/transform/mappers/feature_mapper.py +1179 -0
- wxcli/migration/transform/mappers/line_mapper.py +310 -0
- wxcli/migration/transform/mappers/location_mapper.py +235 -0
- wxcli/migration/transform/mappers/moh_mapper.py +114 -0
- wxcli/migration/transform/mappers/monitoring_mapper.py +221 -0
- wxcli/migration/transform/mappers/receptionist_mapper.py +245 -0
- wxcli/migration/transform/mappers/routing_mapper.py +821 -0
- wxcli/migration/transform/mappers/snr_mapper.py +201 -0
- wxcli/migration/transform/mappers/softkey_mapper.py +205 -0
- wxcli/migration/transform/mappers/user_mapper.py +264 -0
- wxcli/migration/transform/mappers/voicemail_group_mapper.py +286 -0
- wxcli/migration/transform/mappers/voicemail_mapper.py +514 -0
- wxcli/migration/transform/mappers/workspace_mapper.py +464 -0
- wxcli/migration/transform/normalizers.py +2008 -0
- wxcli/migration/transform/pattern_converter.py +106 -0
- wxcli/migration/transform/pipeline.py +271 -0
- wxcli/migration/transform/rules.py +255 -0
- wxcli/org_health/CLAUDE.md +63 -0
- wxcli/org_health/__init__.py +7 -0
- wxcli/org_health/analyze.py +93 -0
- wxcli/org_health/checks.py +458 -0
- wxcli/org_health/collector.py +62 -0
- wxcli/org_health/models.py +78 -0
- wxcli/org_health/report.py +300 -0
- wxcli/output.py +101 -0
- wxcli-1.2.0.dist-info/METADATA +505 -0
- wxcli-1.2.0.dist-info/RECORD +413 -0
- wxcli-1.2.0.dist-info/WHEEL +5 -0
- wxcli-1.2.0.dist-info/entry_points.txt +2 -0
- wxcli-1.2.0.dist-info/licenses/LICENSE +191 -0
- wxcli-1.2.0.dist-info/scm_file_list.json +751 -0
- wxcli-1.2.0.dist-info/scm_version.json +8 -0
- wxcli-1.2.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# report/ — CUCM Migration Assessment Reports
|
|
2
|
+
|
|
3
|
+
Generates professional HTML/PDF assessment reports from the CUCM migration pipeline's SQLite store. Designed for Sales Engineers to hand to customers showing that CUCM-to-Webex migration isn't as hard as they think.
|
|
4
|
+
|
|
5
|
+
**Strategic purpose:** Prevent customers from migrating to Microsoft Teams by demystifying the migration path with data-backed evidence.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
SQLite store (post-analyze) → score.py → charts.py + explainer.py → executive.py + appendix.py → assembler.py → HTML/PDF
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The report reads from the same SQLite store that the migration pipeline populates. It does NOT modify the store — it's a read-only view. The `wxcli cucm report` CLI command generates the report after running `discover → normalize → map → analyze`.
|
|
14
|
+
|
|
15
|
+
## Files
|
|
16
|
+
|
|
17
|
+
| File | Purpose |
|
|
18
|
+
|------|---------|
|
|
19
|
+
| `helpers.py` | Customer-facing text formatting: `strip_canonical_id()` (removes internal prefixes), `friendly_site_name()` (DP-HQ-Phones → HQ). |
|
|
20
|
+
| `ingest.py` | Reads collector output files (.json.gz/.json) into discovery raw_data format. Maps AXL object names to extractor group keys. |
|
|
21
|
+
| `score.py` | Migration Complexity Score (0-100). 7 weighted factors with `display_name` field (customer-friendly names). Returns `ScoreResult` dataclass. `DISPLAY_NAMES` maps internal factor names → display names. |
|
|
22
|
+
| `charts.py` | SVG/HTML chart generators: `gauge_chart()` (compact 200x155 viewBox), `donut_chart()`, `horizontal_bar_chart()`, `stacked_bar_chart()` (HTML divs with legend). Pure functions, no store dependency. |
|
|
23
|
+
| `explainer.py` | Translates `DecisionType` + context into plain-English dicts. Also: `generate_verdict()` (one-paragraph summary), `generate_key_findings()` (3-4 bullet findings), `DECISION_TYPE_DISPLAY_NAMES` (22 types mapped). |
|
|
24
|
+
| `styles.py` | `REPORT_CSS` + `GOOGLE_FONTS_LINKS` — v4 editorial CSS design system. Lora/Source Sans 3/IBM Plex Mono, teal primary (#00897B), warm neutrals, 320px sidebar, score-layout 2-column grid, effort-band/verdict/cta-box components, print optimization. Legacy CSS variable aliases for backward compat. |
|
|
25
|
+
| `executive.py` | 4-page executive summary with direct h2 headings (no section kickers). Page 1 (Migration Complexity Assessment — tier-colored gauge+factor bars with "Complexity Impact" Low/High scale, key findings, stat grid), Page 2 (What You Have — People/Devices with floated donut chart/Features/Sites; includes Custom MoH Sources and Announcement Files stat cards with callout pointing to Audio Assets appendix), Page 3 (What Needs Attention — decision stats + effort bands: auto/planning/manual), Page 4 (Next Steps — prerequisites, planning, CTA). Gauge uses tier-based color (green/amber/red). Factor bars sorted by score descending, highest in teal, rest gray, no bare numbers. |
|
|
26
|
+
| `appendix.py` | Technical appendix: 27 lettered sections A-AA as collapsed `<details>` elements (Object Inventory, Decision Detail, CSS/Partitions, Device Inventory, DN Analysis, User/Device Map, Routing, H. Voicemail Analysis (with custom greeting count + email template), I. Audio Assets (custom MoH sources + announcement files requiring manual download/upload), J. Data Coverage, K. Gateways, L. Call Features, M. Button Templates, N. Device Layouts, O. Softkeys, P. Cloud-Managed Resources, Q. Feature Gaps, R. Manual Reconfiguration, S. Planning Inputs, T. Call Recording, U. Single Number Reach, V. Caller ID Transformations, W. Extension Mobility, X. DECT Networks, Y. Intercept Candidates, Z. Executive/Assistant Pairings, AA. Receptionist Users). All canonical IDs stripped via helpers. |
|
|
27
|
+
| `assembler.py` | Full HTML document with 320px sidebar nav (step-icon circles, numbered 1-4 exec + lettered A-AA tech), page-header (slate-900 bg), IntersectionObserver scroll tracking, no summary bar or dark interstitial, footer inside detail-panel. |
|
|
28
|
+
| `user_diff.py` | Per-user CUCM-vs-Webex migration diff: `build_user_diffs()` joins 10 object types into `UserDiffRecord` per user, `render_html()` (self-contained page with search/filter), `render_csv()` (UTF-8 BOM, one row per setting per user). |
|
|
29
|
+
| `notice_templates.py` | Scenario metadata (7 scenarios) + paragraph templates + generic section templates (intro, timeline, footer). Audience filter definitions. |
|
|
30
|
+
| `user_notice.py` | User communication notice generator: `_build_scenario_matrix()` classifies users into scenarios from store data, `generate_user_notice()` assembles HTML or plain text. Email-safe single-column layout (640px max-width, inline CSS, system fonts). |
|
|
31
|
+
|
|
32
|
+
## Key Data Access Patterns
|
|
33
|
+
|
|
34
|
+
### Store API
|
|
35
|
+
|
|
36
|
+
- `store.count_by_type("user")` → `int` — count of objects by type
|
|
37
|
+
- `store.get_objects("device")` → `list[dict]` — deserialized dicts (NOT Pydantic models)
|
|
38
|
+
- `store.get_all_decisions()` → `list[dict]` — all decisions with `type`, `severity`, `chosen_option`, `context`, `options`
|
|
39
|
+
- `store.get_cross_refs(relationship="css_contains_partition")` → `list[dict]` — cross-reference edges
|
|
40
|
+
|
|
41
|
+
### Device Compatibility
|
|
42
|
+
|
|
43
|
+
`compatibility_tier` is a **lowercase string** in store dicts, not the enum:
|
|
44
|
+
- `"native_mpp"` — direct migration
|
|
45
|
+
- `"convertible"` — needs firmware flash
|
|
46
|
+
- `"webex_app"` — software phone transitioning to Webex App (no device needed)
|
|
47
|
+
- `"incompatible"` — needs hardware replacement
|
|
48
|
+
- `"dect"` — DECT handset, compatible hardware, needs DECT network provisioning
|
|
49
|
+
|
|
50
|
+
### CSS/Partition Types
|
|
51
|
+
|
|
52
|
+
CSS and partition are intermediate object types using the `canonical_id` prefix convention:
|
|
53
|
+
- `css:CSS-Internal`, `partition:PT-Internal`
|
|
54
|
+
- Query with `store.count_by_type("css")` / `store.get_objects("css")`
|
|
55
|
+
|
|
56
|
+
### ScoreResult
|
|
57
|
+
|
|
58
|
+
`ScoreResult` is a dataclass (not a dict):
|
|
59
|
+
```python
|
|
60
|
+
from wxcli.migration.report.score import compute_complexity_score, ScoreResult
|
|
61
|
+
result = compute_complexity_score(store)
|
|
62
|
+
result.score # int, 0-100
|
|
63
|
+
result.label # "Straightforward" | "Moderate" | "Complex"
|
|
64
|
+
result.color # "#2E7D32" | "#F57C00" | "#C62828"
|
|
65
|
+
result.factors # list[dict] with keys: name, display_name, weight, raw_score, weighted_score, detail
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Thresholds: 0-30 green, 31-55 amber, 56-100 red.
|
|
69
|
+
|
|
70
|
+
## Chart Functions
|
|
71
|
+
|
|
72
|
+
All chart functions HTML-escape labels internally — do NOT double-escape.
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
from wxcli.migration.report.charts import gauge_chart, donut_chart, horizontal_bar_chart, stacked_bar_chart
|
|
76
|
+
|
|
77
|
+
gauge_chart(score=34, color="#2E7D32", label="Straightforward") # → SVG string (compact 200x155)
|
|
78
|
+
donut_chart([{"label": "Native MPP", "value": 40, "color": "#2E7D32"}, ...]) # → SVG string
|
|
79
|
+
horizontal_bar_chart([{"label": "Users", "value": 50, "color": "#0277BD"}, ...]) # → SVG string
|
|
80
|
+
stacked_bar_chart([{"label": "Native", "value": 40, "color": "#2E7D32"}, ...]) # → HTML divs
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Explainer
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
from wxcli.migration.report.explainer import (
|
|
87
|
+
explain_decision, generate_verdict, generate_key_findings,
|
|
88
|
+
DECISION_TYPE_DISPLAY_NAMES,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
result = explain_decision(
|
|
92
|
+
decision_type="CSS_ROUTING_MISMATCH",
|
|
93
|
+
severity="HIGH", # must be LOW/MEDIUM/HIGH/CRITICAL (case-insensitive)
|
|
94
|
+
summary="CSS-0 routing scope differs",
|
|
95
|
+
context={"css_name": "CSS-Dallas", "partitions": ["PT-Internal", "PT-LD"]}
|
|
96
|
+
)
|
|
97
|
+
# Returns: {"title": "...", "explanation": "...", "reassurance": "..."}
|
|
98
|
+
|
|
99
|
+
verdict = generate_verdict(score_result, store) # → HTML string with <strong> tags
|
|
100
|
+
findings = generate_key_findings(store) # → list of {"icon": "!"/"✓", "text": "..."}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Handles all 22 `DecisionType` values. `DECISION_TYPE_DISPLAY_NAMES` maps all types to customer-friendly names.
|
|
104
|
+
|
|
105
|
+
## Helpers
|
|
106
|
+
|
|
107
|
+
```python
|
|
108
|
+
from wxcli.migration.report.helpers import strip_canonical_id, friendly_site_name
|
|
109
|
+
|
|
110
|
+
strip_canonical_id("css:Standard-CSS") # → "Standard-CSS"
|
|
111
|
+
strip_canonical_id("dn:1001:PT-Internal") # → "1001 (PT-Internal)"
|
|
112
|
+
friendly_site_name("DP-HQ-Phones") # → "HQ"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## CSS Design System (v4 — Editorial + v3 Data)
|
|
116
|
+
|
|
117
|
+
Design philosophy: Warm editorial design merged with v3's data-rich components. Combines v1's Lora/Source Sans typography and teal primary with v3's score-layout, effort-bands, and data tables.
|
|
118
|
+
|
|
119
|
+
- **Typography:** Lora (display/headings, serif) + Source Sans 3 (body, sans-serif) + IBM Plex Mono (data) via Google Fonts. 17px base. Headings: Lora semibold (600).
|
|
120
|
+
- **Layout (screen):** Slate-900 page-header + 320px white sidebar (sticky, right border) with step-icon circles (teal exec, gray tech) + scrolling detail-panel. Score section uses 2-column grid (gauge left, factor bars right). IntersectionObserver highlights active nav on scroll.
|
|
121
|
+
- **Colors:** Primary teal #00897B, Success #2E7D32, Warning #EF6C00, Critical #C62828. Warm neutral bg #fdf8f3. Slate text hierarchy (#242a33 / #636e7e / #8e97a5). Legacy aliases map to new tokens.
|
|
122
|
+
- **Heading pattern:** Direct h2 topic headings (no section kickers). H2 has border-bottom warm-200.
|
|
123
|
+
- **Chart language:** Teal for focal data (highest-scoring factor), slate-400 for the rest. Gauge arc uses tier-based color (green/amber/red from `result.color`). Factor bars have "Complexity Impact" scale header with Low/High labels (no bare numbers). Donut chart floated right in executive Section 2 (`.env-donut`, 420px), stacked bar in appendix device section.
|
|
124
|
+
- **Components:** `.score-layout` (2-col grid), `.step-item` / `.step-icon` (sidebar nav), `.effort-band` (left-border + tint bg), `.score-breakdown` (factor bars + `.factor-scale` header), `.key-findings`, `.verdict`, `.cta-box`, `.stat-card` (warm-100 bg), `.env-donut` (floated right), `.callout`, `.badge-*`, `.css-topology` (nested list with teal dots)
|
|
125
|
+
- **Print:** Sidebar/page-header hidden, `<details>` forced open, page breaks between sections, 9.5pt font size, footer fixed to bottom
|
|
126
|
+
- **Tables:** No vertical borders, uppercase small headers, warm-200 bottom borders, hover: warm-100
|
|
127
|
+
- **Legacy aliases:** `--color-primary`, `--color-success`, `--color-warning`, `--color-critical`, `--color-text`, `--color-text-muted`, `--color-text-light`, `--color-bg`, `--color-border` all alias to v4 tokens so charts.py and explainer.py work without changes.
|
|
128
|
+
|
|
129
|
+
Google Fonts loaded via `GOOGLE_FONTS_LINKS` constant in `styles.py`, injected by `assembler.py` in `<head>`.
|
|
130
|
+
|
|
131
|
+
## Known Polish Items (Future Iteration)
|
|
132
|
+
|
|
133
|
+
These were identified during the v4 visual review and deferred:
|
|
134
|
+
|
|
135
|
+
- **Stat card zero values:** "0" for Native MPP still renders — should suppress zero-count stat cards
|
|
136
|
+
- **Print optimization:** Not re-verified after v4 changes — needs a print-to-PDF test pass
|
|
137
|
+
- **Logo/partner branding:** `--logo` flag not yet implemented
|
|
138
|
+
- **Score calibration:** No real CUCM environments tested yet — manual validation needed
|
|
139
|
+
|
|
140
|
+
## CLI Usage
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# After running the pipeline:
|
|
144
|
+
wxcli cucm report --brand "Customer Name" --prepared-by "SE Name"
|
|
145
|
+
wxcli cucm report --brand "..." --prepared-by "..." --pdf # also generate PDF
|
|
146
|
+
wxcli cucm report --brand "..." --prepared-by "..." --executive-only # skip appendix
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Prerequisite: `analyze` stage must be complete. Does NOT require `plan` or `preflight`.
|
|
150
|
+
|
|
151
|
+
## Per-User Diff
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
wxcli cucm user-diff # HTML, all users with changes
|
|
155
|
+
wxcli cucm user-diff --format csv # CSV for Excel review
|
|
156
|
+
wxcli cucm user-diff --user "user:jsmith" # single user
|
|
157
|
+
wxcli cucm user-diff --location "loc:dallas-hq" # one location
|
|
158
|
+
wxcli cucm user-diff --include-no-change # include unchanged users
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Prerequisite: `analyze` stage must be complete (same as `report`).
|
|
162
|
+
|
|
163
|
+
### Data Join Pattern
|
|
164
|
+
|
|
165
|
+
`build_user_diffs()` bulk-loads all relevant object types once, builds O(1) index maps, then iterates users:
|
|
166
|
+
|
|
167
|
+
- `device` → user via `owner_canonical_id`
|
|
168
|
+
- `call_forwarding` → user via `user_canonical_id`
|
|
169
|
+
- `voicemail_profile` → user via `user_canonical_id`
|
|
170
|
+
- `monitoring_list` → user via `user_canonical_id`
|
|
171
|
+
- `device_layout` → user via `owner_canonical_id`
|
|
172
|
+
- `shared_line` → user via `owner_canonical_ids` (list)
|
|
173
|
+
- `calling_permission` → user via `assigned_users` (list)
|
|
174
|
+
- `decisions` → user via `context` dict keys
|
|
175
|
+
- `css` → user via `user_has_css` cross-ref
|
|
176
|
+
|
|
177
|
+
## Voicemail Greeting Report Sections
|
|
178
|
+
|
|
179
|
+
Custom voicemail greetings stored in Unity Connection do not migrate to Webex Calling. The report surfaces this in two places so the information reaches both the operator and the customer.
|
|
180
|
+
|
|
181
|
+
### Appendix H — Voicemail Analysis
|
|
182
|
+
|
|
183
|
+
`appendix.py` renders Appendix H ("Voicemail Analysis") as a collapsed `<details>` section. It contains:
|
|
184
|
+
|
|
185
|
+
- **Custom greeting count** — number of users whose `voicemail_profile` has `has_custom_greeting=True` in the store. Sourced from `store.get_objects("voicemail_profile")`, filtered on that flag.
|
|
186
|
+
- **Email template** — a pre-written plain-text notice for the operator to copy, fill in the voicemail access number, and send to affected users before migration day. The template is static text rendered inline by `appendix.py`; the canonical IDs are stripped via `strip_canonical_id()` before any user data is embedded.
|
|
187
|
+
|
|
188
|
+
If no users have custom greetings, the section still renders but the count reads 0 and the template is suppressed (zero-count suppression for the body paragraph only — the section heading always appears).
|
|
189
|
+
|
|
190
|
+
### Executive Summary Page 2 Callout
|
|
191
|
+
|
|
192
|
+
`executive.py` renders a conditional "Custom Greetings" stat card on Page 2 ("What You Have") when the custom greeting count is non-zero. This stat card includes a `.callout` component that points the reader to Appendix H for the email template. The callout uses the standard `.callout` CSS class from `styles.py` — bordered left, tinted background, short one-sentence prompt.
|
|
193
|
+
|
|
194
|
+
The Page 2 stat card is rendered alongside the Custom MoH Sources and Announcement Files cards (→ `executive.py:_page_environment`). All three point to their respective appendix sections. The callout text is hardcoded in `executive.py` rather than sourced from `explainer.py` because it is always the same message regardless of decision context.
|
|
195
|
+
|
|
196
|
+
## User Communication
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
wxcli cucm user-notice --brand "Customer Name" --migration-date "January 15, 2027" --helpdesk "x5000"
|
|
200
|
+
wxcli cucm user-notice --brand "..." --migration-date "..." --helpdesk "..." --text-only
|
|
201
|
+
wxcli cucm user-notice --brand "..." --migration-date "..." --helpdesk "..." --audience phone-upgrade
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Generates a branded user-facing notice covering only the scenarios detected in the store. 7 scenarios: phone upgrade (convertible), Webex App transition, device replacement (incompatible), forwarding simplified, voicemail re-record, layout changes, exec/assistant. Audience filter narrows output to a user segment.
|
|
205
|
+
|
|
206
|
+
Prerequisite: `analyze` stage must be complete. Same as the assessment report.
|
|
207
|
+
|
|
208
|
+
## File Ingestion (--from-file)
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
wxcli cucm discover --from-file customer-extract.json.gz
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Reads collector output files and writes `raw_data.json` in the same format as live AXL extraction. The `COLLECTOR_TO_RAW_DATA_MAP` in `ingest.py` maps AXL object names (e.g., `endUser`, `phone`, `css`) to the extractor group/sub-key pairs that `normalize_discovery()` expects.
|
|
215
|
+
|
|
216
|
+
## Tests
|
|
217
|
+
|
|
218
|
+
- `tests/migration/report/conftest.py` — `populated_store` fixture (3 sites, 50 users, 45 devices, 6 decisions) + `sample_collector_file` fixture
|
|
219
|
+
- `tests/migration/report/test_helpers.py` — strip_canonical_id, friendly_site_name
|
|
220
|
+
- `tests/migration/report/test_from_file.py` — collector file ingestion
|
|
221
|
+
- `tests/migration/report/test_score.py` — complexity score algorithm + display_name field
|
|
222
|
+
- `tests/migration/report/test_charts.py` — gauge, donut, bar, stacked bar charts
|
|
223
|
+
- `tests/migration/report/test_explainer.py` — decision templates + verdict + key findings + type display names
|
|
224
|
+
- `tests/migration/report/test_executive.py` — 4-page executive summary (verdict, environment, scope, next steps)
|
|
225
|
+
- `tests/migration/report/test_appendix.py` — 6 topic groups, decision aggregation, no canonical IDs
|
|
226
|
+
- `tests/migration/report/test_assembler.py` — sidebar nav, dark interstitial, summary bar, max-width
|
|
227
|
+
- `tests/migration/report/test_e2e.py` — end-to-end pipeline (ingest → normalize → map → analyze → report)
|
|
228
|
+
- `tests/migration/report/test_appendix_tier3.py` — Tier 3 informational appendix sections O-R
|
|
229
|
+
- `tests/migration/report/test_tier4_appendix.py` — Tier 4 appendix sections S-V (recording, SNR, transformations, extension mobility)
|
|
230
|
+
- `tests/migration/report/test_cli_integration.py` — CLI command integration
|
|
231
|
+
- `tests/migration/report/test_dect_appendix.py` — Section W DECT Networks appendix tests
|
|
232
|
+
- `tests/migration/report/test_user_diff.py` — dataclass construction, data join (18 tests), CSV rendering (5 tests), HTML rendering (10 tests), CLI integration (4 tests)
|
|
233
|
+
- `tests/migration/report/test_user_notice.py` — scenario detection, HTML/text generation, audience filtering, CLI integration
|
|
234
|
+
|
|
235
|
+
## Design Spec
|
|
236
|
+
|
|
237
|
+
- **v1 spec:** `docs/superpowers/specs/2026-03-24-cucm-assess-design.md` — strategic context, competitive analysis
|
|
238
|
+
- **v2 spec:** `docs/superpowers/specs/2026-03-25-assessment-report-v2-design.md` — narrative redesign, effort bands, customer-centric layout (content structure — still authoritative)
|
|
239
|
+
- **v3 spec:** `docs/superpowers/specs/2026-03-25-assessment-report-v3-visual-design.md` — "Authority Minimal" visual redesign (superseded by v4)
|
|
240
|
+
- **v4 spec:** `docs/superpowers/specs/2026-03-26-assessment-report-v4-design.md` — merges v1 editorial warmth with v3 data richness
|
|
241
|
+
- **v4 plan:** `docs/superpowers/plans/2026-03-26-assessment-report-v4.md` — 6-task implementation plan
|
|
242
|
+
|
|
243
|
+
v4 merges v1's warm editorial design (Lora serif, Source Sans 3, teal primary, warm neutrals, 320px sidebar with step-icons) with v3's data components (score-layout, effort-bands, decision stats). The v3 "Authority Minimal" style (IBM Plex, navy+blue, dark sidebar) was too corporate — the editorial warmth better matches the SE-to-customer delivery context.
|
|
244
|
+
|
|
245
|
+
Future SaaS platform plan: `docs/plans/cucm-assess-saas-future.md`
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""CUCM migration assessment report package."""
|
|
2
|
+
|
|
3
|
+
from wxcli.migration.report.ingest import ingest_collector_file
|
|
4
|
+
from wxcli.migration.report.assembler import assemble_report
|
|
5
|
+
from wxcli.migration.report.user_notice import generate_user_notice
|
|
6
|
+
|
|
7
|
+
__all__ = ["ingest_collector_file", "assemble_report", "generate_user_notice"]
|