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,365 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: messaging-bots
|
|
3
|
+
description: |
|
|
4
|
+
Build Webex bots and automated workflows: send notifications, create interactive
|
|
5
|
+
adaptive card flows, set up webhooks, embed room tabs, and bridge calling + messaging.
|
|
6
|
+
Guides from bot setup through card recipe selection, webhook configuration, and verification.
|
|
7
|
+
NOT for: managing spaces/teams/memberships (use messaging-spaces skill) or
|
|
8
|
+
telephony webhooks/call events (use call-control skill).
|
|
9
|
+
allowed-tools: Read, Grep, Glob, Bash
|
|
10
|
+
argument-hint: [bot-task-type]
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Messaging Bots Workflow
|
|
14
|
+
|
|
15
|
+
**Checkpoint — do NOT proceed until you can answer these:**
|
|
16
|
+
1. What token does a bot use to send messages? (Answer: The bot's own access token from developer.webex.com — not an admin token. Each bot has a unique, non-expiring token generated at creation.)
|
|
17
|
+
2. How does a bot receive user interactions with adaptive cards? (Answer: Via `attachmentActions` webhook — the bot registers a webhook for `attachmentActions` resource with `created` event, then receives the card submission data.)
|
|
18
|
+
|
|
19
|
+
If you cannot answer both, you skipped reading this skill. Go back and read it.
|
|
20
|
+
|
|
21
|
+
## Step 1: Load references
|
|
22
|
+
|
|
23
|
+
1. Read `docs/reference/messaging-bots.md` for bot patterns, card recipes, attachment actions, room tabs
|
|
24
|
+
2. Read `docs/reference/webhooks-events.md` for webhook CRUD, messaging event payloads, bot webhook patterns (sections 4b and 6b)
|
|
25
|
+
|
|
26
|
+
**Mandatory --help verification:** Before constructing any wxcli command, run `wxcli <group> --help` to verify the subcommand exists, then `wxcli <group> <subcommand> --help` to verify the exact flags (e.g. `wxcli messages create --help` and `wxcli webhooks create --help`). Do NOT rely on examples in this skill or reference docs — the CLI is auto-generated and flag names may differ from what documentation suggests.
|
|
27
|
+
|
|
28
|
+
## Step 2: Verify auth token
|
|
29
|
+
|
|
30
|
+
Before any API calls, confirm the user has a working auth token:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
wxcli whoami
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
If this fails, stop and resolve authentication first (`wxcli configure`).
|
|
37
|
+
|
|
38
|
+
### Token type detection
|
|
39
|
+
|
|
40
|
+
The `/people/me` response includes a `type` field:
|
|
41
|
+
|
|
42
|
+
| Token Type | `type` field | Suitable For |
|
|
43
|
+
|-----------|-------------|-------------|
|
|
44
|
+
| Bot | `bot` | Sending messages, receiving webhooks, card interactions |
|
|
45
|
+
| User | `person` | Testing, room tabs (requires moderator), all bot operations |
|
|
46
|
+
| Admin (personal) | `person` | CAN post to spaces if admin is a member — same as user token with elevated scopes |
|
|
47
|
+
| Service App | `appuser` | NOT suitable for sending messages — service app tokens cannot post to spaces |
|
|
48
|
+
|
|
49
|
+
### Bot token scopes (fixed, cannot be expanded)
|
|
50
|
+
|
|
51
|
+
- `spark:messages_read` / `spark:messages_write` — read and send messages
|
|
52
|
+
- `spark:rooms_read` — list and read space details
|
|
53
|
+
- `spark:memberships_read` — list space members
|
|
54
|
+
- `spark:kms` — E2E encryption key management
|
|
55
|
+
|
|
56
|
+
**Warning:** If the user has a service app token and wants to send messages, they need to switch to a bot or user token. Service app tokens get 403 on message creation. Personal admin tokens (which are user tokens with elevated scopes) CAN post to spaces if the admin is a member of the space.
|
|
57
|
+
|
|
58
|
+
### Scope verification
|
|
59
|
+
|
|
60
|
+
After identifying the token type, verify the token has the scopes required for the user's task:
|
|
61
|
+
|
|
62
|
+
| Task Type | Required Scopes |
|
|
63
|
+
|-----------|----------------|
|
|
64
|
+
| Send notification | `spark:messages_write`, `spark:rooms_read` |
|
|
65
|
+
| Card interaction | `spark:messages_write`, `spark:rooms_read` + webhook callback URL |
|
|
66
|
+
| Webhook setup | `spark:messages_read` or `spark:rooms_read` (depends on resource) |
|
|
67
|
+
| Room tab | `spark:rooms_read`, `spark:rooms_write` (user token only) |
|
|
68
|
+
| Cross-domain (calling + messaging) | `spark:messages_write` + `spark:calls_read` (may need two tokens) |
|
|
69
|
+
|
|
70
|
+
**How to check:** Run `wxcli whoami` to confirm identity. `wxcli whoami` does not support `--output json` — it displays a formatted summary. For detailed token inspection, use `wxcli people show-me --output json`. Bot tokens have a fixed scope set (see above). For user/admin tokens, the scopes depend on the OAuth grant.
|
|
71
|
+
|
|
72
|
+
**If scopes are missing:**
|
|
73
|
+
- **Bot token:** Bot scopes are fixed at creation time. If the bot lacks a required scope, the user must create a new bot with the correct scopes at developer.webex.com.
|
|
74
|
+
- **User token:** The user must re-authorize with the required scopes in their OAuth flow.
|
|
75
|
+
- **Cross-domain:** If the task needs both messaging and calling scopes, the user likely needs two tokens — a bot token for messaging and a user/admin token for calling webhooks.
|
|
76
|
+
|
|
77
|
+
## Step 3: Identify task type
|
|
78
|
+
|
|
79
|
+
Ask the user what they want to build. Present this decision matrix if they are unsure:
|
|
80
|
+
|
|
81
|
+
| User Wants To | Task Type | Prerequisites |
|
|
82
|
+
|--------------|-----------|---------------|
|
|
83
|
+
| Send alerts/notifications to a space | **Send notification** | Bot/user token + bot is member of target space |
|
|
84
|
+
| Build an interactive card flow (approve/reject, forms) | **Card interaction** | Bot token + webhook callback URL + target space |
|
|
85
|
+
| Subscribe to messaging events | **Webhook setup** | Bot/user token + publicly accessible HTTPS webhook URL |
|
|
86
|
+
| Embed a web app in a space's tab bar | **Room tab** | User token (moderator) — NOT bot token |
|
|
87
|
+
| Bridge calling events to messaging | **Cross-domain** | Bot token + calling webhook + target space |
|
|
88
|
+
|
|
89
|
+
## Step 4: Check prerequisites
|
|
90
|
+
|
|
91
|
+
Before executing, verify these are in place:
|
|
92
|
+
|
|
93
|
+
### 4a. Bot token configured
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
wxcli whoami
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
If the response shows a bot display name and `type: bot`, the token is configured. If not:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
wxcli configure
|
|
103
|
+
# Enter the bot's access token (from developer.webex.com → My Apps → Bot)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 4b. Bot is a member of the target space
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
wxcli memberships list --room-id ROOM_ID --output json
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Look for the bot's person ID in the membership list. If the bot is NOT a member, a **user** must add it:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
wxcli memberships create --room-id ROOM_ID --person-email bot-name@webex.bot
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Critical:** Bots cannot add themselves to spaces. A user must invite the bot.
|
|
119
|
+
|
|
120
|
+
### 4c. Webhook callback URL available (for interactive bots)
|
|
121
|
+
|
|
122
|
+
The user must have a publicly accessible HTTPS endpoint to receive webhook events. Options:
|
|
123
|
+
- **Development:** ngrok (`ngrok http 8080` → use the HTTPS URL)
|
|
124
|
+
- **Production:** Cloud function (AWS Lambda, Google Cloud Functions), any HTTPS server
|
|
125
|
+
|
|
126
|
+
Ask: "Do you have a webhook callback URL? If not, we can set up notifications only (no interactive cards)."
|
|
127
|
+
|
|
128
|
+
### 4d. Target space exists
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
wxcli rooms show ROOM_ID --output json
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
If the space doesn't exist, create one:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
wxcli rooms create --title "Bot Space"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Then add the bot to the new space (see 4b).
|
|
141
|
+
|
|
142
|
+
### 4e. Select card recipe (if applicable)
|
|
143
|
+
|
|
144
|
+
If the user's task involves sending rich messages or interactive cards, guide them to the right recipe:
|
|
145
|
+
|
|
146
|
+
| Use Case | Recipe | Interactive? |
|
|
147
|
+
|----------|--------|-------------|
|
|
148
|
+
| "Alert when X happens" | **Notification** — TextBlock + FactSet + Action.OpenUrl | No |
|
|
149
|
+
| "Get approval for X" | **Approval Flow** — FactSet + Action.Submit ×2 (Approve/Reject) | Yes |
|
|
150
|
+
| "Collect information from users" | **Form/Survey** — Input.Text + Input.ChoiceSet + Action.Submit | Yes |
|
|
151
|
+
| "Show status of X" | **Status Dashboard** — ColumnSet + styled TextBlocks | No |
|
|
152
|
+
| "Alert on-call engineer" | **Incident Alert** — Attention style + Action.Submit (Acknowledge) | Yes |
|
|
153
|
+
| "Let user pick from options" | **Dropdown Menu** — Input.ChoiceSet + Action.Submit | Yes |
|
|
154
|
+
|
|
155
|
+
#### After recipe selection
|
|
156
|
+
|
|
157
|
+
1. Load the complete JSON payload from `docs/reference/messaging-bots.md` Section 3
|
|
158
|
+
2. Customize placeholder values: room ID, field names, button labels, URLs
|
|
159
|
+
3. Build the `wxcli messages create --json-body '...'` command
|
|
160
|
+
4. **If the recipe is interactive** (uses Action.Submit): also set up webhooks (Step 6) and explain the attachment action response flow
|
|
161
|
+
|
|
162
|
+
#### Sending the card
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
wxcli messages create --json-body '{
|
|
166
|
+
"roomId": "ROOM_ID",
|
|
167
|
+
"text": "Fallback text for clients that cannot render cards",
|
|
168
|
+
"attachments": [{
|
|
169
|
+
"contentType": "application/vnd.microsoft.card.adaptive",
|
|
170
|
+
"content": { ... customized card payload ... }
|
|
171
|
+
}]
|
|
172
|
+
}'
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**Critical:** The `text` field is REQUIRED even when sending a card. It's the fallback for email notifications and clients that can't render adaptive cards.
|
|
176
|
+
|
|
177
|
+
## Step 5: Build and present deployment plan [SHOW BEFORE EXECUTING]
|
|
178
|
+
|
|
179
|
+
Before executing any commands, compile a deployment plan and present it to the user for approval.
|
|
180
|
+
|
|
181
|
+
The plan must include:
|
|
182
|
+
|
|
183
|
+
1. **Task summary** — what we are building (task type from Step 3, card recipe from Step 4e if applicable)
|
|
184
|
+
2. **Token type** — bot / user / admin, and any scope gaps identified in Step 2
|
|
185
|
+
3. **Target space** — space name and ID
|
|
186
|
+
4. **Commands to execute** — the exact `wxcli` commands in execution order:
|
|
187
|
+
- Message/card creation commands
|
|
188
|
+
- Webhook creation commands (if interactive)
|
|
189
|
+
- Room tab commands (if applicable)
|
|
190
|
+
- Cross-domain calling webhook commands (if applicable)
|
|
191
|
+
5. **Verification steps** — what we will check after execution
|
|
192
|
+
6. **Risks or warnings** — scope gaps, rate limiting concerns, cross-domain token requirements
|
|
193
|
+
|
|
194
|
+
**Present the plan and wait for user approval before proceeding to Step 6.**
|
|
195
|
+
|
|
196
|
+
## Step 6: Execute via wxcli
|
|
197
|
+
|
|
198
|
+
After the user approves the deployment plan, execute the commands:
|
|
199
|
+
|
|
200
|
+
### 6a. Set up webhooks (if applicable)
|
|
201
|
+
|
|
202
|
+
For interactive bots that need to receive events:
|
|
203
|
+
|
|
204
|
+
**Create webhook for messages (so bot can "hear"):**
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
wxcli webhooks create \
|
|
208
|
+
--name "Bot Messages" \
|
|
209
|
+
--target-url "https://your-bot.com/webhook" \
|
|
210
|
+
--resource messages \
|
|
211
|
+
--event created
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Create webhook for card responses (if using adaptive cards with Action.Submit):**
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
wxcli webhooks create \
|
|
218
|
+
--name "Bot Card Responses" \
|
|
219
|
+
--target-url "https://your-bot.com/webhook" \
|
|
220
|
+
--resource attachmentActions \
|
|
221
|
+
--event created
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Verify webhooks are active:**
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
wxcli webhooks list --output json
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Check that both webhooks show `"status": "active"`.
|
|
231
|
+
|
|
232
|
+
### 6b. Send messages and cards
|
|
233
|
+
|
|
234
|
+
Execute the message/card creation commands from the deployment plan. For cards, use the customized JSON payload built in Step 4e.
|
|
235
|
+
|
|
236
|
+
### 6c. The bot interaction loop
|
|
237
|
+
|
|
238
|
+
**Messages:**
|
|
239
|
+
1. User sends message mentioning @bot → webhook fires with message metadata (NO text for bot tokens)
|
|
240
|
+
2. Bot calls `wxcli messages show MESSAGE_ID` to get the actual message text
|
|
241
|
+
3. Bot processes and responds: `wxcli messages create --room-id ROOM_ID --text "Response"`
|
|
242
|
+
|
|
243
|
+
**Card responses:**
|
|
244
|
+
1. User clicks Action.Submit on a card → webhook fires with action metadata
|
|
245
|
+
2. Bot calls `wxcli attachment-actions show ACTION_ID` to get the user's input values
|
|
246
|
+
3. Bot processes inputs and responds
|
|
247
|
+
|
|
248
|
+
For full webhook CRUD, HMAC verification, auto-deactivation handling, and advanced filtering, see `docs/reference/webhooks-events.md`.
|
|
249
|
+
|
|
250
|
+
### 6d. Cross-domain dispatch (if applicable)
|
|
251
|
+
|
|
252
|
+
When the user's objective involves both Webex Calling and Messaging:
|
|
253
|
+
|
|
254
|
+
1. **Identify the calling component** — e.g., "monitor call queue overflow", "detect voicemail", "analyze CDR"
|
|
255
|
+
2. **Identify the messaging component** — e.g., "post alert to ops space", "send notification card", "create incident space"
|
|
256
|
+
3. **Load the appropriate calling skill** for the calling component:
|
|
257
|
+
- Queue/feature monitoring → read `configure-features` skill
|
|
258
|
+
- Call control/webhooks → read `call-control` skill
|
|
259
|
+
- CDR/reporting → read `reporting` skill
|
|
260
|
+
4. **Use this skill** for the messaging component (card selection, webhook setup, message sending)
|
|
261
|
+
|
|
262
|
+
The cross-domain recipes in `docs/reference/messaging-bots.md` Section 7 provide the glue patterns:
|
|
263
|
+
- **Queue Alert → Space:** telephony_calls webhook → detect threshold → send incident card to ops space
|
|
264
|
+
- **Voicemail → Notification:** telephony_mwi webhook → send notification card to user's 1:1 space
|
|
265
|
+
- **Incident Response:** detect issue → create space → add responders → post diagnostics card
|
|
266
|
+
|
|
267
|
+
**Important:** Calling webhooks require `spark:calls_read` scope, which is separate from bot messaging scopes. The user may need two different tokens (bot token for messaging, user/admin token for calling webhooks) or a user token that has both scope sets.
|
|
268
|
+
|
|
269
|
+
## Step 7: Verify
|
|
270
|
+
|
|
271
|
+
### For notification bots (no interaction)
|
|
272
|
+
|
|
273
|
+
1. Send a test message:
|
|
274
|
+
```bash
|
|
275
|
+
wxcli messages create --room-id ROOM_ID --text "Test notification from bot"
|
|
276
|
+
```
|
|
277
|
+
2. Verify the message appears in the Webex App
|
|
278
|
+
3. Send a test card (if applicable):
|
|
279
|
+
```bash
|
|
280
|
+
wxcli messages create --json-body '{ ... card payload ... }'
|
|
281
|
+
```
|
|
282
|
+
4. Verify the card renders correctly in the Webex App
|
|
283
|
+
|
|
284
|
+
### For interactive bots
|
|
285
|
+
|
|
286
|
+
1. Send a card with Action.Submit buttons
|
|
287
|
+
2. Click a button in the Webex App
|
|
288
|
+
3. Verify the webhook received the attachment action event (user must check their webhook endpoint)
|
|
289
|
+
4. Retrieve the action to confirm input capture:
|
|
290
|
+
```bash
|
|
291
|
+
wxcli attachment-actions show ACTION_ID --output json
|
|
292
|
+
```
|
|
293
|
+
5. Verify the `inputs` field contains the expected key-value pairs
|
|
294
|
+
|
|
295
|
+
### For room tabs
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
wxcli room-tabs create --room-id ROOM_ID --content-url "https://your-app.com/dashboard" --display-name "Dashboard"
|
|
299
|
+
wxcli room-tabs list --room-id ROOM_ID --output json
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
Verify the tab appears in the space's tab bar in the Webex App.
|
|
303
|
+
|
|
304
|
+
## Step 8: Report results
|
|
305
|
+
|
|
306
|
+
```
|
|
307
|
+
BOT DEPLOYMENT COMPLETE
|
|
308
|
+
Task type: [notification / card interaction / webhook setup / room tab / cross-domain]
|
|
309
|
+
Token type: [bot / user]
|
|
310
|
+
|
|
311
|
+
Resources created:
|
|
312
|
+
- Webhooks: [count] ([names])
|
|
313
|
+
- Cards sent: [count] to [space name]
|
|
314
|
+
- Room tabs: [count]
|
|
315
|
+
|
|
316
|
+
Verification:
|
|
317
|
+
- Messages delivered: [✓/✗]
|
|
318
|
+
- Cards rendered: [✓/✗]
|
|
319
|
+
- Webhooks active: [✓/✗]
|
|
320
|
+
- Card responses captured: [✓/✗] (if interactive)
|
|
321
|
+
|
|
322
|
+
Next steps:
|
|
323
|
+
- [Context-specific follow-up, e.g., "Implement webhook handler at your callback URL"]
|
|
324
|
+
- [Additional cards or spaces to configure]
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Wait for user confirmation before proceeding to any additional steps.
|
|
328
|
+
|
|
329
|
+
## Critical Rules
|
|
330
|
+
|
|
331
|
+
These are non-negotiable. Violating them causes silent failures or broken bot behavior.
|
|
332
|
+
|
|
333
|
+
1. **Always verify bot is a member** of the target space before sending messages. Sending to a space the bot isn't in returns 403.
|
|
334
|
+
|
|
335
|
+
2. **Bot tokens cannot add themselves to spaces.** A user must invite the bot. Don't attempt `wxcli memberships create` with a bot token to add the bot itself.
|
|
336
|
+
|
|
337
|
+
3. **Adaptive cards REQUIRE the `text` field** as fallback. Never send a card without `text` — email notifications and older clients won't show anything.
|
|
338
|
+
|
|
339
|
+
4. **Card payloads must be under 4KB.** Cards exceeding this silently fail to render. If a card is too large, split into multiple messages or simplify the layout.
|
|
340
|
+
|
|
341
|
+
5. **`Action.Execute` (Adaptive Cards 1.4+) is NOT supported** by Webex. Use `Action.Submit` instead. Cards with Action.Execute will render but the button won't work.
|
|
342
|
+
|
|
343
|
+
6. **Webhook `targetUrl` must be publicly accessible HTTPS.** No HTTP, no localhost (unless tunneled via ngrok or similar). Webhooks to unreachable URLs silently fail.
|
|
344
|
+
|
|
345
|
+
7. **Bot `messages` webhooks do NOT include message text.** This is a Webex security measure. The bot must call `wxcli messages show MESSAGE_ID` to get the actual content. This is THE standard bot pattern — don't skip it.
|
|
346
|
+
|
|
347
|
+
8. **Webhooks auto-deactivate after repeated delivery failures.** If the callback URL returns errors, Webex sets the webhook to `inactive`. Reactivate with `wxcli webhooks update WEBHOOK_ID --status active`. Monitor webhook status periodically.
|
|
348
|
+
|
|
349
|
+
9. **Cross-domain calling webhooks need `spark:calls_read` scope.** This is separate from bot messaging scopes. A bot token doesn't have this scope — the user may need a separate user token for calling webhooks.
|
|
350
|
+
|
|
351
|
+
10. **Room tabs require a moderator-level user token, NOT a bot token.** Bot tokens get 403 on room tab operations. Always use a user token for tab management.
|
|
352
|
+
|
|
353
|
+
11. **Rate limiting:** Add `sleep 1` between rapid message sends or webhook creates. Webex messaging APIs enforce rate limits (~5 requests/second for bots). Exceeding the limit returns 429.
|
|
354
|
+
|
|
355
|
+
## Context Compaction Recovery
|
|
356
|
+
|
|
357
|
+
If context compacts during a session:
|
|
358
|
+
|
|
359
|
+
1. Read `docs/plans/` to find the current deployment plan
|
|
360
|
+
2. Check what webhooks exist: `wxcli webhooks list --output json`
|
|
361
|
+
3. Check what messages were sent (if tracking IDs in the plan)
|
|
362
|
+
4. Resume from the next pending step
|
|
363
|
+
5. Tell the user:
|
|
364
|
+
|
|
365
|
+
> "I recovered from a context reset. Based on your deployment plan at [path], we've completed steps 1-N and need to resume at step N+1: [description]. Ready to continue?"
|