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,407 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: device-platform
|
|
3
|
+
description: |
|
|
4
|
+
Manage PhoneOS/RoomOS device configurations, workspace personalization, and xAPI device control
|
|
5
|
+
using wxcli CLI commands. Covers device software configuration templates, user-to-workspace
|
|
6
|
+
personalization, and programmatic device command execution and status queries.
|
|
7
|
+
Also covers 9800-series phones (9811, 9821, 9841, 9851, 9861, 9871) which use PhoneOS config keys.
|
|
8
|
+
Guides the user from prerequisites through execution and verification.
|
|
9
|
+
NOT for: device provisioning, activation codes, DECT, or line key templates (use manage-devices skill).
|
|
10
|
+
allowed-tools: Read, Grep, Glob, Bash
|
|
11
|
+
argument-hint: [device-platform-operation]
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Device Platform Workflow
|
|
15
|
+
|
|
16
|
+
**Checkpoint — do NOT proceed until you can answer these:**
|
|
17
|
+
1. Do 9800-series phones (9811/9821/9841/9851/9861/9871) use telephony device settings or RoomOS config keys? (Answer: RoomOS config keys — they are NOT configured via `wxcli device-settings` or telephony settings APIs.)
|
|
18
|
+
2. What CLI group handles xAPI commands for device control? (Answer: `wxcli xapi` — covers both command execution and status queries on devices.)
|
|
19
|
+
|
|
20
|
+
If you cannot answer both, you skipped reading this skill. Go back and read it.
|
|
21
|
+
|
|
22
|
+
## Step 1: Load references
|
|
23
|
+
|
|
24
|
+
1. Read `docs/reference/devices-platform.md` for device configurations, workspace personalization, xAPI commands and status queries
|
|
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 device-configurations update --help` and `wxcli xapi --help` — config-key names are firmware-dependent and the schema differs by device/PhoneOS version, known issue #10). 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`). Required scopes vary by operation:
|
|
37
|
+
|
|
38
|
+
| Operation | Read Scope | Write Scope |
|
|
39
|
+
|-----------|-----------|-------------|
|
|
40
|
+
| Device configurations | `spark-admin:devices_read` | `spark-admin:devices_write` |
|
|
41
|
+
| Workspace personalization | `spark-admin:workspaces_read` | `spark-admin:workspaces_write` |
|
|
42
|
+
| xAPI status queries | `spark:xapi_statuses` | -- |
|
|
43
|
+
| xAPI command execution | -- | `spark:xapi_commands` |
|
|
44
|
+
|
|
45
|
+
> **NOTE:** xAPI scopes are user-level (`spark:`), not admin-level (`spark-admin:`). Admin tokens with `spark-admin:devices_read`/`spark-admin:devices_write` are **NOT** a substitute for xAPI scopes. A token may have device-config scopes but not xAPI scopes, or vice versa. Diagnose scope issues early.
|
|
46
|
+
>
|
|
47
|
+
|
|
48
|
+
## Step 3: Identify which device platform operation to perform
|
|
49
|
+
|
|
50
|
+
Ask the user what they want to do. Present this decision matrix if they are unsure:
|
|
51
|
+
|
|
52
|
+
| Need | Operation | CLI Group |
|
|
53
|
+
|------|-----------|-----------|
|
|
54
|
+
| Read/set RoomOS configuration keys on a device | Device configurations | `wxcli device-configurations` |
|
|
55
|
+
| Deploy configuration templates across multiple devices | Device configurations (bulk) | `wxcli device-configurations` + loop |
|
|
56
|
+
| Personalize a workspace device for a specific user | Workspace personalization | `wxcli workspace-personalization` |
|
|
57
|
+
| Send a command to a RoomOS device (dial, volume, standby, etc.) | xAPI command execution | `wxcli xapi create` |
|
|
58
|
+
| Query device status (volume, call state, network, room analytics) | xAPI status query | `wxcli xapi show` |
|
|
59
|
+
| Build a device automation/integration | xAPI (combination) | `wxcli xapi show` + `wxcli xapi create` |
|
|
60
|
+
|
|
61
|
+
**If the user asks about MPP phone (68xx/78xx/88xx) provisioning, activation codes, DECT, line keys, or hot desking**, redirect them to the `manage-devices` skill. Note: 9800-series phones (9811, 9821, 9841, 9851, 9861, 9871) are handled HERE — they use RoomOS config keys despite being `productType: phone`. This skill covers device SOFTWARE (RoomOS configs, personalization, xAPI), not device HARDWARE provisioning.
|
|
62
|
+
|
|
63
|
+
## Step 4: Check prerequisites
|
|
64
|
+
|
|
65
|
+
### 4a. Device exists and uses RoomOS configuration model
|
|
66
|
+
|
|
67
|
+
All 3 APIs require a device ID. Get it from `wxcli devices list`:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
wxcli devices list --output json
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- Confirm the target device uses the RoomOS configuration model. Valid devices:
|
|
74
|
+
- **RoomOS devices:** Room, Board, or Desk series (`productType: roomdesk`)
|
|
75
|
+
- **9800-series phones:** Cisco 9811, 9821, 9841, 9851, 9861, 9871 (`productType: phone` but runs PhoneOS/RoomOS)
|
|
76
|
+
- **MPP phones (68xx, 78xx, 88xx) and ATAs do NOT use this API.** Redirect to `manage-devices` skill for those.
|
|
77
|
+
- Capture `device_id` for use in subsequent commands
|
|
78
|
+
- If the user does not have any devices, direct them to the `manage-devices` skill to create or activate one first
|
|
79
|
+
|
|
80
|
+
### 4b. For workspace personalization: workspace exists with a device
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
wxcli workspaces list --output json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
- Capture `workspace_id` for the target workspace
|
|
87
|
+
- If the workspace does not exist, direct the user to the `manage-devices` skill to create it first
|
|
88
|
+
|
|
89
|
+
### 4c. For xAPI: device is online and reachable
|
|
90
|
+
|
|
91
|
+
Test reachability with a status query:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
wxcli xapi show --device-id DEVICE_ID --name "SystemUnit.State.System"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- If this returns data, the device is online and xAPI-capable
|
|
98
|
+
- If this errors, the device may be offline, not cloud-registered, or not a RoomOS device
|
|
99
|
+
|
|
100
|
+
### 4d. Operation-specific prerequisites
|
|
101
|
+
|
|
102
|
+
| Operation | Prerequisites |
|
|
103
|
+
|-----------|--------------|
|
|
104
|
+
| **Device configurations (read)** | Device ID, device must be cloud-registered RoomOS |
|
|
105
|
+
| **Device configurations (write)** | Device ID, configuration key path must be valid and editable |
|
|
106
|
+
| **Workspace personalization** | Workspace ID, workspace must have a device assigned, device must be online |
|
|
107
|
+
| **xAPI status query** | Device ID, device must be online and RoomOS |
|
|
108
|
+
| **xAPI command execution** | Device ID, device must be online and RoomOS, command name must be valid |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Step 5: Build and present deployment plan -- [SHOW BEFORE EXECUTING]
|
|
113
|
+
|
|
114
|
+
Before executing any commands, present the full plan to the user:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
DEPLOYMENT PLAN
|
|
118
|
+
===============
|
|
119
|
+
Operation: [device platform operation type]
|
|
120
|
+
Device: [device display name] ([device_id])
|
|
121
|
+
Device Type: [Room Kit / Board / Desk Pro / etc.]
|
|
122
|
+
|
|
123
|
+
Operation Details:
|
|
124
|
+
[Operation-specific details listed here]
|
|
125
|
+
- For device configs: key(s) to read or update, new value(s)
|
|
126
|
+
- For personalization: workspace name, user email
|
|
127
|
+
- For xAPI: command name or status expression(s)
|
|
128
|
+
|
|
129
|
+
Prerequisites verified:
|
|
130
|
+
[check] Device exists and is RoomOS
|
|
131
|
+
[check] Device is cloud-registered
|
|
132
|
+
[check] Auth token has required scopes
|
|
133
|
+
[check] [Operation-specific prereqs]
|
|
134
|
+
|
|
135
|
+
Commands to execute:
|
|
136
|
+
wxcli [group] [command] ...
|
|
137
|
+
[Verification command]
|
|
138
|
+
|
|
139
|
+
Proceed? (yes/no)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Wait for user confirmation before executing.**
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Step 6: Execute via wxcli
|
|
147
|
+
|
|
148
|
+
### 6a. Device Configurations
|
|
149
|
+
|
|
150
|
+
**Read configuration keys:**
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Read all configurations for a device
|
|
154
|
+
wxcli device-configurations show --device-id DEVICE_ID
|
|
155
|
+
|
|
156
|
+
# Filter by key pattern (wildcard)
|
|
157
|
+
wxcli device-configurations show --device-id DEVICE_ID --key "Audio.Ultrasound.*"
|
|
158
|
+
|
|
159
|
+
# Filter by exact key
|
|
160
|
+
wxcli device-configurations show --device-id DEVICE_ID --key "Conference.MaxReceiveCallRate"
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Update configuration keys:**
|
|
164
|
+
|
|
165
|
+
> **WARNING:** The `--op` and `--path` flags on the update command are broken -- they cannot set a value and do not produce a valid JSON Patch array. **Always use `--json-body` for this command.**
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# Set a configuration value (replace operation)
|
|
169
|
+
wxcli device-configurations update --device-id DEVICE_ID --json-body '[{"op": "replace", "path": "Audio.Ultrasound.MaxVolume/sources/configured/value", "value": 70}]'
|
|
170
|
+
|
|
171
|
+
# Revert a configuration to its schema default (remove operation)
|
|
172
|
+
wxcli device-configurations update --device-id DEVICE_ID --json-body '[{"op": "remove", "path": "Audio.Ultrasound.MaxVolume/sources/configured/value"}]'
|
|
173
|
+
|
|
174
|
+
# Multiple changes in one request
|
|
175
|
+
wxcli device-configurations update --device-id DEVICE_ID --json-body '[
|
|
176
|
+
{"op": "replace", "path": "Audio.Ultrasound.MaxVolume/sources/configured/value", "value": 70},
|
|
177
|
+
{"op": "replace", "path": "Conference.MaxReceiveCallRate/sources/configured/value", "value": 6000}
|
|
178
|
+
]'
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Key path rules:**
|
|
182
|
+
- Key filter uses `.` as separator: `Audio.Ultrasound.MaxVolume`
|
|
183
|
+
- Update path uses `/` after the key name: `Audio.Ultrasound.MaxVolume/sources/configured/value`
|
|
184
|
+
- All update paths must end in `/sources/configured/value`
|
|
185
|
+
- `op` is either `replace` (set value) or `remove` (revert to default)
|
|
186
|
+
|
|
187
|
+
### 6b. Workspace Personalization
|
|
188
|
+
|
|
189
|
+
Workspace personalization is an **async** operation. It temporarily pushes a user's speed dials, favorites, and call history to a shared workspace device.
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# Personalize a workspace for a user
|
|
193
|
+
wxcli workspace-personalization create WORKSPACE_ID --email user@example.com
|
|
194
|
+
|
|
195
|
+
# Poll for task completion
|
|
196
|
+
wxcli workspace-personalization show WORKSPACE_ID
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- `create` takes `WORKSPACE_ID` as a positional argument and `--email` as a required option
|
|
200
|
+
- `show` takes `WORKSPACE_ID` as a positional argument
|
|
201
|
+
- The `show` response contains `success: true` or `success: false` with an `errorDescription`
|
|
202
|
+
- Common error: "Device is offline" -- the workspace device must be online and registered
|
|
203
|
+
- **Do not tell the user it is done until `show` returns `success: true`**
|
|
204
|
+
|
|
205
|
+
### 6c. xAPI -- Status Queries
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
# Query a single status value
|
|
209
|
+
wxcli xapi show --device-id DEVICE_ID --name "Audio.Volume"
|
|
210
|
+
|
|
211
|
+
# Query multiple status values (comma-separated, max 10)
|
|
212
|
+
wxcli xapi show --device-id DEVICE_ID --name "Audio.Volume,SystemUnit.State.NumberOfActiveCalls"
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
- `--device-id` and `--name` are both required
|
|
216
|
+
- `--name` accepts dot-notation status paths
|
|
217
|
+
- Returns current real-time values from the device
|
|
218
|
+
|
|
219
|
+
**Common status queries:**
|
|
220
|
+
|
|
221
|
+
| Status Path | Returns |
|
|
222
|
+
|-------------|---------|
|
|
223
|
+
| `Audio.Volume` | Current volume level |
|
|
224
|
+
| `SystemUnit.State.NumberOfActiveCalls` | Active call count |
|
|
225
|
+
| `Network[1].IPv4.Address` | Device IP address |
|
|
226
|
+
| `RoomAnalytics.PeopleCount.Current` | People in the room |
|
|
227
|
+
| `Peripherals.ConnectedDevice[*].Name` | Connected peripherals |
|
|
228
|
+
| `Standby.State` | Standby/active state |
|
|
229
|
+
|
|
230
|
+
### 6d. xAPI -- Command Execution
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
# Simple command with no arguments (deviceId auto-populated from --device-id)
|
|
234
|
+
wxcli xapi create Standby.Activate --device-id DEVICE_ID
|
|
235
|
+
|
|
236
|
+
# Command with arguments (must include deviceId in JSON body)
|
|
237
|
+
wxcli xapi create Audio.Volume.Set --device-id DEVICE_ID --json-body '{"deviceId": "DEVICE_ID", "arguments": {"Level": 50}}'
|
|
238
|
+
|
|
239
|
+
# Another example: display an on-screen message
|
|
240
|
+
wxcli xapi create UserInterface.Message.Alert.Display --device-id DEVICE_ID --json-body '{"deviceId": "DEVICE_ID", "arguments": {"Title": "IT Notice", "Text": "Maintenance at 5pm", "Duration": 30}}'
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
> **IMPORTANT:** When using `--json-body`, the CLI does NOT auto-inject `--device-id` into the body. You must include `"deviceId"` in the JSON body yourself. Without `--json-body`, the CLI auto-populates `deviceId` from `--device-id` (works for no-argument commands like `Standby.Activate`).
|
|
244
|
+
|
|
245
|
+
- `command_name` is a positional argument (dot-notation, e.g., `Audio.Volume.Set`)
|
|
246
|
+
- `--device-id` identifies the target device (always required as a CLI flag)
|
|
247
|
+
- `--json-body` passes the request body including `deviceId` and `arguments`
|
|
248
|
+
|
|
249
|
+
**Common xAPI commands (representative, not exhaustive):**
|
|
250
|
+
|
|
251
|
+
| Command | Arguments | Use Case |
|
|
252
|
+
|---------|-----------|----------|
|
|
253
|
+
| `Audio.Volume.Set` | `Level` (0-100) | Set volume |
|
|
254
|
+
| `Audio.Volume.Mute` | -- | Mute microphone |
|
|
255
|
+
| `Call.Dial` | `Number` | Initiate a call |
|
|
256
|
+
| `Call.Disconnect` | `CallId` | End a call |
|
|
257
|
+
| `Standby.Activate` | -- | Put device in standby |
|
|
258
|
+
| `Standby.Deactivate` | -- | Wake device |
|
|
259
|
+
| `Bookings.List` | `Days`, `Offset` | Get calendar bookings |
|
|
260
|
+
| `Message.Send` | `Text` | Display on-screen message |
|
|
261
|
+
| `UserInterface.Message.Alert.Display` | `Title`, `Text`, `Duration` | Show alert popup |
|
|
262
|
+
|
|
263
|
+
**Do not enumerate the full xAPI namespace.** The namespace is huge. Ask the user what they want to DO, then look up the specific command name. Point them to https://roomos.cisco.com/xapi for the full reference.
|
|
264
|
+
|
|
265
|
+
### Error handling
|
|
266
|
+
|
|
267
|
+
| Error | Cause | Fix |
|
|
268
|
+
|-------|-------|-----|
|
|
269
|
+
| 401/403 | Token expired or insufficient scopes | Run `wxcli configure` to re-authenticate |
|
|
270
|
+
| 400 "device not found" | Invalid device ID or device not cloud-registered | Verify with `wxcli devices list` |
|
|
271
|
+
| 400 on xAPI command | Device offline, wrong command name, or missing arguments | Check device is online, verify command name at roomos.cisco.com/xapi |
|
|
272
|
+
| 400 on device-configurations update | Invalid path, bad JSON Patch format, or non-editable key | Verify path ends in `/sources/configured/value`, check key is editable |
|
|
273
|
+
| Personalization "Device is offline" | Workspace device not online | Device must be powered on and cloud-registered |
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Step 7: Verify
|
|
278
|
+
|
|
279
|
+
After execution, read back results and confirm the operation succeeded.
|
|
280
|
+
|
|
281
|
+
### Device configurations
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
# Re-read the config key to confirm the new value took effect
|
|
285
|
+
wxcli device-configurations show --device-id DEVICE_ID --key "Audio.Ultrasound.MaxVolume"
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Verify the `source` shows `configured` (not `default`) and the value matches what was set.
|
|
289
|
+
|
|
290
|
+
### Workspace personalization
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
# Check task status
|
|
294
|
+
wxcli workspace-personalization show WORKSPACE_ID
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Verify `success: true` in the response. If `success: false`, check the `errorDescription` and troubleshoot.
|
|
298
|
+
|
|
299
|
+
### xAPI
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
# For status queries: result is immediate in the response
|
|
303
|
+
# For commands: check the response for success or error
|
|
304
|
+
|
|
305
|
+
# Example: verify volume was set
|
|
306
|
+
wxcli xapi show --device-id DEVICE_ID --name "Audio.Volume"
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## Step 8: Report results
|
|
312
|
+
|
|
313
|
+
Present the results:
|
|
314
|
+
|
|
315
|
+
```
|
|
316
|
+
DEVICE PLATFORM OPERATION COMPLETE
|
|
317
|
+
====================================
|
|
318
|
+
Operation: [type -- config read/write, personalization, xAPI command/status]
|
|
319
|
+
Device: [device display name] ([device_id])
|
|
320
|
+
Device Type: [Room Kit / Board / Desk Pro / etc.]
|
|
321
|
+
|
|
322
|
+
Results:
|
|
323
|
+
[Operation-specific results]
|
|
324
|
+
- For config read: key values and their sources
|
|
325
|
+
- For config write: confirmed new values
|
|
326
|
+
- For personalization: task status (success/failure)
|
|
327
|
+
- For xAPI status: returned status values
|
|
328
|
+
- For xAPI command: command result
|
|
329
|
+
|
|
330
|
+
Next steps:
|
|
331
|
+
- [Operation-specific next steps]
|
|
332
|
+
- [e.g., "Deploy same config to other devices in the org"]
|
|
333
|
+
- [e.g., "Set up a scheduled automation for this xAPI command"]
|
|
334
|
+
- [e.g., "Check personalization task again if still in progress"]
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## Critical Rules
|
|
340
|
+
|
|
341
|
+
1. **xAPI only works on RoomOS devices.** If the user asks to send an xAPI command to an MPP phone, stop and explain. MPP phones use `device-settings` (see `manage-devices` skill), not xAPI. RoomOS devices include Room, Board, and Desk series.
|
|
342
|
+
|
|
343
|
+
2. **9800-series phones straddle both skills.** 9800-series phones (9811/9821/9841/9851/9861/9871) use this skill (device-platform) for **PhoneOS** config keys, BUT they also support some telephony device-settings commands via the `manage-devices` skill. **IMPORTANT: 9800-series runs PhoneOS, not RoomOS. PhoneOS is RoomOS-derived but is a distinct OS — Room/Board/Desk series run RoomOS; 9800-series runs PhoneOS. The Device Configurations API surface is shared, but the schemas differ. Do not call 9800-series "RoomOS devices".**
|
|
344
|
+
- **Line Key Templates** -- model string is `"Cisco 98xx"` (no `"DMS"` prefix; older MPP phones use `"DMS Cisco 88xx"` format)
|
|
345
|
+
- **Device member management** -- add/remove lines on ports
|
|
346
|
+
- **Person-level device settings** -- limited fields like compression
|
|
347
|
+
|
|
348
|
+
Rule of thumb: PhoneOS config keys on 9800-series or RoomOS config keys on Room/Board/Desk (software settings, UI, audio, video, line labels, wallpaper) -> this skill. Line key templates, device members, telephony device settings -> `manage-devices` skill.
|
|
349
|
+
|
|
350
|
+
3. **Always get a device ID first.** All 3 APIs require a device ID. The user may not have one -- guide them through `wxcli devices list` to find it. For workspace personalization, also get the workspace ID via `wxcli workspaces list`.
|
|
351
|
+
|
|
352
|
+
4. **Workspace personalization is async.** After creating a personalization request, always poll with `wxcli workspace-personalization show WORKSPACE_ID` until the task completes. Do not tell the user it is done until `success: true` is returned. Typical completion time is ~30 seconds.
|
|
353
|
+
|
|
354
|
+
5. **Device must be online for xAPI.** xAPI commands fail silently or with unhelpful errors on offline devices. Always check reachability first with a status query (`wxcli xapi show --device-id DEVICE_ID --name "SystemUnit.State.System"`).
|
|
355
|
+
|
|
356
|
+
6. **Configuration update PATCH content type.** The API uses `application/json-patch+json`, not `application/json`. The CLI handles this automatically. If the user falls back to raw HTTP (curl), they must set the `Content-Type` header correctly.
|
|
357
|
+
|
|
358
|
+
7. **Do not enumerate xAPI commands.** The xAPI namespace is huge. Ask the user what they want to DO, then look up the specific command name. Point them to https://roomos.cisco.com/xapi for the full command reference.
|
|
359
|
+
|
|
360
|
+
8. **Scope mismatch between device-configurations and xAPI.** Device configurations use admin scopes (`spark-admin:devices_read`/`spark-admin:devices_write`). xAPI uses user-level scopes (`spark:xapi_statuses`/`spark:xapi_commands`). A token may have one set but not the other. Diagnose scope issues early in Step 2.
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## CLI Bug Notes
|
|
365
|
+
|
|
366
|
+
1. **`device-configurations update` -- `--op` and `--path` flags are broken.** These flags exist but cannot set a value and do not produce a valid JSON Patch array. **Always use `--json-body`** for configuration updates.
|
|
367
|
+
|
|
368
|
+
2. **`xapi create` -- `--json-body` does not auto-inject `deviceId`.** When you use `--json-body`, the CLI does NOT copy `--device-id` into the body. You must include `"deviceId"` in the JSON body manually. Without `--json-body` (for no-argument commands), the CLI auto-populates `deviceId` from `--device-id`.
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## Scope Quick Reference
|
|
373
|
+
|
|
374
|
+
| CLI Group | Read Scope | Write Scope |
|
|
375
|
+
|-----------|-----------|-------------|
|
|
376
|
+
| `wxcli device-configurations` | `spark-admin:devices_read` | `spark-admin:devices_write` |
|
|
377
|
+
| `wxcli workspace-personalization` | `spark-admin:workspaces_read` | `spark-admin:workspaces_write` |
|
|
378
|
+
| `wxcli xapi` (status) | `spark:xapi_statuses` | -- |
|
|
379
|
+
| `wxcli xapi` (commands) | -- | `spark:xapi_commands` |
|
|
380
|
+
|
|
381
|
+
> Admin tokens with `spark-admin:devices_read`/`spark-admin:devices_write` do NOT work for xAPI operations. xAPI requires user-level scopes: `spark:xapi_statuses` (for status queries) and `spark:xapi_commands` (for command execution). See devices-platform.md scope table.
|
|
382
|
+
>
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## Cross-References
|
|
387
|
+
|
|
388
|
+
- **Device CRUD, activation codes, MAC provisioning** -- use the `manage-devices` skill (`.claude/skills/manage-devices/SKILL.md`)
|
|
389
|
+
- **Workspace creation** -- use the `manage-devices` skill (Step 7: Workspace devices)
|
|
390
|
+
- **DECT networks, base stations, handsets** -- use the `manage-devices` skill (Step 6: DECT workflow)
|
|
391
|
+
- **Phone settings, line keys, device members** -- use the `manage-devices` skill (Step 9: Device settings)
|
|
392
|
+
- **Hot desking on MPP phones** -- use the `manage-devices` skill (Step 10: Hot desking)
|
|
393
|
+
- **Hot desking vs. workspace personalization** -- hot desking is a telephony feature on MPP phones (voice portal sign-in); workspace personalization pushes user preferences to RoomOS collaboration devices. Different mechanisms, similar concept, different device types.
|
|
394
|
+
- **Reference docs**: `docs/reference/devices-platform.md` (this skill's reference), `docs/reference/devices-core.md`, `docs/reference/devices-dect.md`, `docs/reference/devices-workspaces.md`
|
|
395
|
+
- **Full xAPI reference**: https://roomos.cisco.com/xapi
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## Context Compaction Recovery
|
|
400
|
+
|
|
401
|
+
If context compacts mid-execution, recover by:
|
|
402
|
+
1. Read the deployment plan from `docs/plans/` to recover what was planned
|
|
403
|
+
2. Check what has already been done:
|
|
404
|
+
- For device configs: `wxcli device-configurations show --device-id DEVICE_ID` to see current state
|
|
405
|
+
- For personalization: `wxcli workspace-personalization show WORKSPACE_ID` to check task status
|
|
406
|
+
- For xAPI: re-run the status query to confirm current device state
|
|
407
|
+
3. Resume from the first incomplete step
|