@salesforce/afv-skills 1.46.0 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-observe/SKILL.md +32 -4
  3. package/skills/agentforce-observe/references/ahm-alerts.md +719 -0
  4. package/skills/consumer-goods-promotion-bo-api-deploy/SKILL.md +275 -0
  5. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/README.md +32 -0
  6. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/SetCommentValue.cls +75 -0
  7. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/SetCommentValue.cls-meta.xml +5 -0
  8. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/interview-answers.json +13 -0
  9. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/copy.json +10 -0
  10. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/create.json +20 -0
  11. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/update.json +16 -0
  12. package/skills/consumer-goods-promotion-bo-api-deploy/references/conventions-and-payload-rules.md +273 -0
  13. package/skills/consumer-goods-promotion-bo-api-deploy/references/generate-and-wire.md +236 -0
  14. package/skills/consumer-goods-promotion-bo-api-deploy/references/reference-example-set-comment-value.md +132 -0
  15. package/skills/consumer-goods-promotion-bo-api-deploy/references/smoke-and-verify.md +211 -0
  16. package/skills/dx-devops-project-manage/SKILL.md +197 -0
  17. package/skills/dx-devops-project-manage/examples/common-workflows.md +197 -0
  18. package/skills/dx-devops-project-manage/references/cli-commands.md +295 -0
  19. package/skills/dx-devops-project-manage/scripts/create-project.sh +48 -0
  20. package/skills/dx-devops-project-manage/scripts/list-projects.sh +51 -0
  21. package/skills/dx-devops-project-manage/scripts/update-project.sh +96 -0
  22. package/skills/education-cloud-academic-calendar-generate/SKILL.md +225 -0
  23. package/skills/education-cloud-academic-calendar-generate/examples/quarter-calendar.json +47 -0
  24. package/skills/education-cloud-academic-calendar-generate/examples/sample-output.md +57 -0
  25. package/skills/education-cloud-academic-calendar-generate/examples/semester-calendar.json +54 -0
  26. package/skills/education-cloud-academic-calendar-generate/references/calendar-systems.md +127 -0
  27. package/skills/education-cloud-academic-calendar-generate/references/date-validation.md +222 -0
  28. package/skills/education-cloud-academic-calendar-generate/references/foundation_prerequisites.md +40 -0
  29. package/skills/education-cloud-academic-calendar-generate/scripts/validate_calendar_dates.py +143 -0
  30. package/skills/education-cloud-course-catalog-migrate/SKILL.md +321 -0
  31. package/skills/education-cloud-course-catalog-migrate/references/gotchas-detail.md +16 -0
  32. package/skills/education-cloud-course-catalog-migrate/references/gotchas.md +16 -0
  33. package/skills/education-cloud-course-catalog-migrate/references/large-catalog-handling.md +42 -0
  34. package/skills/education-cloud-course-catalog-migrate/scripts/batch_courses.py +36 -0
  35. package/skills/education-cloud-course-catalog-migrate/scripts/detect_linked_courses.py +51 -0
  36. package/skills/education-cloud-course-catalog-migrate/scripts/detect_modality_variants.py +48 -0
  37. package/skills/education-cloud-course-catalog-migrate/scripts/resolve_api_version.py +43 -0
  38. package/skills/education-cloud-course-catalog-migrate/scripts/split_course_code.py +39 -0
  39. package/skills/education-cloud-course-catalog-migrate/scripts/validate_completeness.py +54 -0
  40. package/skills/education-cloud-domain-configure/SKILL.md +234 -0
  41. package/skills/education-cloud-domain-configure/references/dependent-features.md +198 -0
  42. package/skills/education-cloud-domain-configure/references/domain-features/academic-operations.md +386 -0
  43. package/skills/education-cloud-domain-configure/references/domain-features/alumni-relations.md +155 -0
  44. package/skills/education-cloud-domain-configure/references/domain-features/cross-domain-dependencies.md +18 -0
  45. package/skills/education-cloud-domain-configure/references/domain-features/industriessettings-toggle-reference.md +43 -0
  46. package/skills/education-cloud-domain-configure/references/domain-features/mentoring.md +198 -0
  47. package/skills/education-cloud-domain-configure/references/domain-features/recruitment-admissions.md +315 -0
  48. package/skills/education-cloud-domain-configure/references/domain-features/student-management.md +155 -0
  49. package/skills/education-cloud-domain-configure/references/domain-features/student-success.md +249 -0
  50. package/skills/education-cloud-domain-configure/references/domain-features.md +27 -0
  51. package/skills/education-cloud-domain-configure/references/gotchas-extended.md +23 -0
  52. package/skills/education-cloud-domain-configure/references/toggle-write-path.md +67 -0
  53. package/skills/education-cloud-domain-configure/scripts/check_license_provisioned.py +62 -0
  54. package/skills/education-cloud-domain-configure/scripts/check_org_edition.py +44 -0
  55. package/skills/education-cloud-domain-configure/scripts/check_permission_assigned.py +39 -0
  56. package/skills/education-cloud-multi-campus-configure/SKILL.md +7 -0
  57. package/skills/education-cloud-multi-campus-configure/references/foundation_prerequisites.md +1 -2
  58. package/skills/education-cloud-student-recruitment-agent-configure/SKILL.md +177 -0
  59. package/skills/education-cloud-student-recruitment-agent-configure/references/agent-and-subagents.md +151 -0
  60. package/skills/education-cloud-student-recruitment-agent-configure/references/customer-narration.md +34 -0
  61. package/skills/education-cloud-student-recruitment-agent-configure/references/execution-model.md +54 -0
  62. package/skills/education-cloud-student-recruitment-agent-configure/references/flows.md +82 -0
  63. package/skills/education-cloud-student-recruitment-agent-configure/references/grounding.md +199 -0
  64. package/skills/education-cloud-student-recruitment-agent-configure/references/permissions.md +183 -0
  65. package/skills/education-cloud-student-recruitment-agent-configure/references/platform-enablement.md +82 -0
  66. package/skills/education-cloud-student-recruitment-agent-configure/references/prerequisites.md +158 -0
  67. package/skills/education-cloud-student-recruitment-agent-configure/references/routing.md +141 -0
  68. package/skills/experience-cms-brand-apply/SKILL.md +5 -5
  69. package/skills/experience-cms-brand-create/SKILL.md +2 -2
  70. package/skills/experience-cms-content-generate/SKILL.md +1 -0
  71. package/skills/experience-cms-content-render/SKILL.md +173 -0
  72. package/skills/experience-cms-content-render/assets/angular/DetailPage.component.ts +25 -0
  73. package/skills/experience-cms-content-render/assets/angular/MediaRenderer.component.ts +133 -0
  74. package/skills/experience-cms-content-render/assets/angular/TypeList.component.ts +38 -0
  75. package/skills/experience-cms-content-render/assets/angular/TypeRenderer.component.ts +90 -0
  76. package/skills/experience-cms-content-render/assets/angular/cms-content.component.ts +248 -0
  77. package/skills/experience-cms-content-render/assets/angular/cms-item.service.ts +100 -0
  78. package/skills/experience-cms-content-render/assets/react/DetailPage.tsx +20 -0
  79. package/skills/experience-cms-content-render/assets/react/MediaRenderer.tsx +129 -0
  80. package/skills/experience-cms-content-render/assets/react/TypeList.tsx +40 -0
  81. package/skills/experience-cms-content-render/assets/react/TypeRenderer.tsx +64 -0
  82. package/skills/experience-cms-content-render/assets/react/heuristicRenderer.tsx +310 -0
  83. package/skills/experience-cms-content-render/assets/react/useCmsItem.ts +129 -0
  84. package/skills/experience-cms-content-render/assets/shared/cmsContentType.ts +49 -0
  85. package/skills/experience-cms-content-render/assets/shared/cmsCore.types.ts +96 -0
  86. package/skills/experience-cms-content-render/assets/shared/externalRefs.ts +55 -0
  87. package/skills/experience-cms-content-render/references/bulk-loading.md +60 -0
  88. package/skills/experience-cms-content-render/references/codegen-guardrails.md +111 -0
  89. package/skills/experience-cms-content-render/references/detail-pages.md +87 -0
  90. package/skills/experience-cms-content-render/references/embed-recipes.md +127 -0
  91. package/skills/experience-cms-content-render/references/failure-modes.md +96 -0
  92. package/skills/experience-cms-content-render/references/heuristic-render-rules.md +131 -0
  93. package/skills/experience-cms-content-render/references/init-scaffold.md +122 -0
  94. package/skills/experience-cms-content-render/references/interaction-model.md +173 -0
  95. package/skills/experience-cms-content-render/references/package-api.md +106 -0
  96. package/skills/experience-cms-content-render/references/schema-sync.md +114 -0
  97. package/skills/experience-cms-content-render/references/styling-scopes.md +65 -0
  98. package/skills/experience-cms-content-render/references/verify.md +49 -0
  99. package/skills/experience-cms-content-type-generate/SKILL.md +2 -2
  100. package/skills/experience-content-media-stock-image-search/SKILL.md +5 -4
  101. package/skills/experience-search-coordinate/SKILL.md +198 -0
  102. package/skills/experience-search-coordinate/assets/search-payload-template.json +25 -0
  103. package/skills/experience-search-coordinate/references/content-route.md +313 -0
  104. package/skills/experience-search-coordinate/references/content-type-discovery.md +57 -0
  105. package/skills/experience-search-coordinate/references/media-route.md +172 -0
  106. package/skills/experience-search-coordinate/references/scope-resolution.md +14 -0
  107. package/skills/experience-ui-bundle-localize/SKILL.md +1 -1
  108. package/skills/experience-ui-bundle-localize/references/i18n-setup.md +5 -3
  109. package/skills/experience-ui-bundle-project-generate/SKILL.md +18 -14
  110. package/skills/experience-ui-bundle-project-generate/references/angular-project-generate.md +22 -0
  111. package/skills/experience-ui-bundle-project-generate/references/react-project-generate.md +20 -0
  112. package/skills/experience-ui-bundle-salesforce-data-access/SKILL.md +58 -54
  113. package/skills/experience-ui-bundle-salesforce-data-access/references/caching.md +6 -0
  114. package/skills/experience-ui-bundle-salesforce-data-access/references/graphiti-cli.md +2 -2
  115. package/skills/experience-ui-bundle-salesforce-data-access/references/migration.md +6 -0
  116. package/skills/experience-ui-bundle-salesforce-data-access/references/rest-and-integration.md +2 -1
  117. package/skills/experience-ui-bundle-salesforce-data-access/references/sdk-api.md +6 -0
  118. package/skills/experience-ui-bundle-site-generate/SKILL.md +59 -8
  119. package/skills/experience-ui-bundle-site-generate/references/configure-metadata-digital-experience.md +8 -3
  120. package/skills/experience-ui-bundle-site-generate/references/configure-metadata-language-settings.md +120 -0
  121. package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +336 -0
  122. package/skills/life-sciences-fieldsalesrep-coordinate/references/orchestration-flow.md +143 -0
  123. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-application-flexipage-mapping.md +127 -0
  124. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-deploy-commands.md +116 -0
  125. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-lifesci-metadata-deploy.md +111 -0
  126. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-overview.md +312 -0
  127. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-profile-layout-assignments.md +171 -0
  128. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-state-tracking.md +64 -0
  129. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-2-starter-config-trigger-handlers.md +122 -0
  130. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-4-user-provisioning-overview.md +335 -0
  131. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-4-user-provisioning-user-provisioning-details.md +140 -0
  132. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-execution-state-and-recovery.md +196 -0
  133. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-metadata-cache-generation.md +155 -0
  134. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-overview.md +307 -0
  135. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-visit-creation-data.md +211 -0
  136. package/skills/life-sciences-fieldsalesrep-coordinate/references/state-machine-and-changes.md +108 -0
  137. package/skills/life-sciences-kam-coordinate/SKILL.md +241 -0
  138. package/skills/life-sciences-kam-coordinate/references/orchestration-flow.md +152 -0
  139. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-application-flexipage-mapping.md +79 -0
  140. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-deploy-commands.md +131 -0
  141. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-kam-config-records.md +85 -0
  142. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-lifesci-metadata-deploy.md +112 -0
  143. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-overview.md +202 -0
  144. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-profile-layout-assignments.md +67 -0
  145. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-state-tracking.md +65 -0
  146. package/skills/life-sciences-kam-coordinate/references/stage-2-starter-config-trigger-handlers.md +123 -0
  147. package/skills/life-sciences-kam-coordinate/references/stage-4-participant-role-and-sprint.md +89 -0
  148. package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +337 -0
  149. package/skills/life-sciences-kam-coordinate/references/stage-5-data-creation-data.md +248 -0
  150. package/skills/life-sciences-kam-coordinate/references/stage-6-ipad-validation-script.md +35 -0
  151. package/skills/life-sciences-kam-coordinate/references/stage-6-metadata-cache-generation.md +155 -0
  152. package/skills/life-sciences-kam-coordinate/references/stage-6-user-provisioning-details.md +146 -0
  153. package/skills/life-sciences-kam-coordinate/references/stage-6-user-provisioning-overview.md +89 -0
  154. package/skills/life-sciences-kam-coordinate/references/state-machine-and-changes.md +114 -0
  155. package/skills/life-sciences-prerequisites-validate/SKILL.md +138 -0
  156. package/skills/life-sciences-prerequisites-validate/references/checks-org-settings.md +190 -0
  157. package/skills/life-sciences-prerequisites-validate/references/checks-user-and-package.md +211 -0
  158. package/skills/life-sciences-territory-configure/SKILL.md +217 -0
  159. package/skills/life-sciences-territory-configure/references/territory-metadata.md +262 -0
  160. package/skills/platform-dsar-policy-manage/SKILL.md +272 -0
  161. package/skills/platform-dsar-policy-manage/references/configure.md +106 -0
  162. package/skills/platform-dsar-policy-manage/references/export-and-history.md +123 -0
  163. package/skills/platform-dsar-policy-manage/references/gap-analysis-guide.md +150 -0
  164. package/skills/platform-dsar-policy-manage/references/gap-scan.md +129 -0
  165. package/skills/platform-dsar-policy-manage/references/headless-sor.md +59 -0
  166. package/skills/platform-dsar-policy-manage/references/report-format.md +59 -0
  167. package/skills/platform-dsar-policy-manage/scripts/tests/__init__.py +0 -0
  168. package/skills/platform-dsar-policy-manage/scripts/tests/test_validate_policy_tree.py +76 -0
  169. package/skills/platform-dsar-policy-manage/scripts/validate-policy-tree.py +130 -0
  170. package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +359 -0
  171. package/skills/platform-salesforce-connect-adapter-generate/references/official-examples.md +69 -0
  172. package/skills/platform-salesforce-connect-adapter-generate/references/scenarios.md +187 -0
  173. package/skills/service-agentforce-channel-configure/SKILL.md +33 -28
  174. package/skills/service-agentforce-human-escalation-configure/SKILL.md +205 -0
  175. package/skills/service-agentforce-human-escalation-configure/assets/escalation-thresholds.instructions.md +37 -0
  176. package/skills/service-agentforce-human-escalation-configure/assets/force-app/main/default/flows/Human_Escalation_Outbound_Flow.flow-meta.xml +173 -0
  177. package/skills/service-agentforce-human-escalation-configure/assets/package.xml +8 -0
  178. package/skills/service-agentforce-human-escalation-configure/assets/sfdx-project.json +5 -0
  179. package/skills/service-agentforce-human-escalation-configure/references/classifier-contracts.md +103 -0
  180. package/skills/service-agentforce-human-escalation-configure/references/escalation-mechanism.md +63 -0
  181. package/skills/service-agentforce-human-escalation-configure/references/failure-policy.md +44 -0
  182. package/skills/service-agentforce-human-escalation-configure/references/nga-escalation.md +57 -0
  183. package/skills/service-agentforce-human-escalation-configure/references/runtime-verification.md +72 -0
  184. package/skills/service-agentforce-human-escalation-configure/scripts/classify-agent-active.mjs +49 -0
  185. package/skills/service-agentforce-human-escalation-configure/scripts/classify-nga-escalation.mjs +166 -0
  186. package/skills/service-agentforce-human-escalation-configure/scripts/extract-outbound-route.mjs +67 -0
  187. package/skills/service-agentforce-human-escalation-configure/scripts/patch-escalation-surfaces.mjs +131 -0
  188. package/skills/service-agentforce-human-escalation-configure/scripts/tests/__init__.py +0 -0
  189. package/skills/service-agentforce-human-escalation-configure/scripts/tests/_bootstrap.py +249 -0
  190. package/skills/service-agentforce-human-escalation-configure/scripts/tests/test_escalation_contracts.py +899 -0
  191. package/skills/service-agentforce-human-escalation-configure/scripts/verify-and-configure.sh +705 -0
  192. package/skills/service-agentforce-human-escalation-configure/scripts/verify-escalation-config.mjs +89 -0
  193. package/skills/service-de-channel-routing-configure/SKILL.md +13 -5
  194. package/skills/service-de-channel-routing-configure/scripts/tests/test_skill_contract.py +25 -0
  195. package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +23 -10
  196. package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +63 -48
  197. package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs +6 -2
  198. package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +20 -27
  199. package/skills/service-native-voice-recording-transcription-configure/SKILL.md +47 -27
  200. package/skills/service-native-voice-recording-transcription-configure/references/thunderbird-voice-settings.md +13 -9
  201. package/skills/service-native-voice-recording-transcription-configure/scripts/enable-recording-transcription.sh +104 -45
  202. package/skills/service-omni-agent-users-create/SKILL.md +96 -0
  203. package/skills/service-omni-agent-users-create/assets/create-users.apex.template +80 -0
  204. package/skills/service-omni-agent-users-create/references/apex-patterns.md +135 -0
  205. package/skills/service-omni-agent-users-create/references/apex-template-notes.md +40 -0
  206. package/skills/service-omni-agent-users-create/scripts/detect-and-create.sh +206 -0
  207. package/skills/service-omni-agent-users-create/scripts/detect-existing.sh +122 -0
  208. package/skills/service-omni-agent-users-create/scripts/run-create.sh +298 -0
  209. package/skills/service-omni-agent-users-create/scripts/tests/test_user_create_security.py +171 -0
  210. package/skills/service-omni-agent-work-sharing-configure/SKILL.md +78 -0
  211. package/skills/service-omni-agent-work-sharing-configure/references/api-notes.md +31 -0
  212. package/skills/service-omni-agent-work-sharing-configure/scripts/configure-and-report.sh +186 -0
  213. package/skills/service-omni-agent-work-sharing-configure/scripts/tests/_bootstrap.py +120 -0
  214. package/skills/service-omni-agent-work-sharing-configure/scripts/tests/test_agent_work_sharing_contracts.py +93 -0
  215. package/skills/service-omni-base-settings-configure/SKILL.md +77 -0
  216. package/skills/service-omni-base-settings-configure/assets/force-app/main/default/settings/OmniChannel.settings-meta.xml +8 -0
  217. package/skills/service-omni-base-settings-configure/assets/package.xml +8 -0
  218. package/skills/service-omni-base-settings-configure/assets/sfdx-project.json +12 -0
  219. package/skills/service-omni-base-settings-configure/references/api-notes.md +121 -0
  220. package/skills/service-omni-base-settings-configure/scripts/configure-and-report.sh +164 -0
  221. package/skills/service-omni-base-settings-configure/scripts/detect-existing.sh +69 -0
  222. package/skills/service-omni-channel-setup-coordinate/SKILL.md +168 -0
  223. package/skills/service-omni-channel-setup-coordinate/examples/output-templates.md +161 -0
  224. package/skills/service-omni-channel-setup-coordinate/references/gap-catalog.md +99 -0
  225. package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +1542 -0
  226. package/skills/service-omni-channel-setup-coordinate/scripts/tests/__init__.py +0 -0
  227. package/skills/service-omni-channel-setup-coordinate/scripts/tests/_bootstrap.py +223 -0
  228. package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +804 -0
  229. package/skills/service-omni-command-center-analyze/SKILL.md +84 -0
  230. package/skills/service-omni-command-center-analyze/references/api-notes.md +54 -0
  231. package/skills/service-omni-command-center-analyze/scripts/analyze.sh +198 -0
  232. package/skills/service-omni-command-center-analyze/scripts/tests/_bootstrap.py +115 -0
  233. package/skills/service-omni-command-center-analyze/scripts/tests/test_command_center_analyze_contracts.py +165 -0
  234. package/skills/service-omni-permission-set-assign/SKILL.md +88 -0
  235. package/skills/service-omni-permission-set-assign/assets/package.xml +8 -0
  236. package/skills/service-omni-permission-set-assign/references/api-notes.md +143 -0
  237. package/skills/service-omni-permission-set-assign/scripts/verify-and-assign.sh +397 -0
  238. package/skills/service-omni-presence-status-deploy/SKILL.md +87 -0
  239. package/skills/service-omni-presence-status-deploy/assets/package.xml +12 -0
  240. package/skills/service-omni-presence-status-deploy/references/api-notes.md +115 -0
  241. package/skills/service-omni-presence-status-deploy/scripts/deploy-and-report.sh +422 -0
  242. package/skills/service-omni-presence-user-config-deploy/SKILL.md +80 -0
  243. package/skills/service-omni-presence-user-config-deploy/references/api-notes.md +60 -0
  244. package/skills/service-omni-presence-user-config-deploy/scripts/deploy-and-report.sh +261 -0
  245. package/skills/service-omni-presence-user-config-deploy/scripts/tests/_bootstrap.py +106 -0
  246. package/skills/service-omni-presence-user-config-deploy/scripts/tests/test_presence_user_config_contracts.py +142 -0
  247. package/skills/service-omni-queue-deploy/SKILL.md +91 -0
  248. package/skills/service-omni-queue-deploy/references/api-notes.md +140 -0
  249. package/skills/service-omni-queue-deploy/scripts/verify-and-align.sh +470 -0
  250. package/skills/service-omni-queue-members-assign/SKILL.md +93 -0
  251. package/skills/service-omni-queue-members-assign/references/api-notes.md +144 -0
  252. package/skills/service-omni-queue-members-assign/scripts/tests/_bootstrap.py +67 -0
  253. package/skills/service-omni-queue-members-assign/scripts/tests/test_queue_members_contracts.py +73 -0
  254. package/skills/service-omni-queue-members-assign/scripts/verify-and-bind.sh +362 -0
  255. package/skills/service-omni-queue-routing-config-deploy/SKILL.md +101 -0
  256. package/skills/service-omni-queue-routing-config-deploy/references/api-notes.md +127 -0
  257. package/skills/service-omni-queue-routing-config-deploy/scripts/tests/_bootstrap.py +90 -0
  258. package/skills/service-omni-queue-routing-config-deploy/scripts/tests/test_queue_routing_config_contracts.py +70 -0
  259. package/skills/service-omni-queue-routing-config-deploy/scripts/upsert-and-report.sh +538 -0
  260. package/skills/service-omni-routing-flow-deploy/SKILL.md +111 -0
  261. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_Case_Trigger.SkillsBased.flow-meta.xml +94 -0
  262. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_Case_Trigger.flow-meta.xml +88 -0
  263. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_Cases.flow-meta.xml +144 -0
  264. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_VoiceCall_Trigger.SkillsBased.flow-meta.xml +94 -0
  265. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_VoiceCall_Trigger.flow-meta.xml +88 -0
  266. package/skills/service-omni-routing-flow-deploy/assets/force-app/main/default/flows/Omni_Route_VoiceCalls.flow-meta.xml +144 -0
  267. package/skills/service-omni-routing-flow-deploy/assets/package.xml +11 -0
  268. package/skills/service-omni-routing-flow-deploy/assets/sfdx-project.json +11 -0
  269. package/skills/service-omni-routing-flow-deploy/references/api-notes.md +265 -0
  270. package/skills/service-omni-routing-flow-deploy/scripts/deploy-and-report.sh +684 -0
  271. package/skills/service-omni-service-channel-configure/SKILL.md +83 -0
  272. package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/Cases.serviceChannel-meta.xml +9 -0
  273. package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/Incidents.serviceChannel-meta.xml +9 -0
  274. package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/MessagingSessions.serviceChannel-meta.xml +9 -0
  275. package/skills/service-omni-service-channel-configure/assets/force-app/main/default/serviceChannels/VoiceCalls.serviceChannel-meta.xml +9 -0
  276. package/skills/service-omni-service-channel-configure/assets/package.xml +11 -0
  277. package/skills/service-omni-service-channel-configure/assets/sfdx-project.json +12 -0
  278. package/skills/service-omni-service-channel-configure/references/api-notes.md +84 -0
  279. package/skills/service-omni-service-channel-configure/scripts/deploy-and-report.sh +383 -0
  280. package/skills/service-omni-sidebar-configure/SKILL.md +77 -0
  281. package/skills/service-omni-sidebar-configure/references/api-notes.md +51 -0
  282. package/skills/service-omni-sidebar-configure/scripts/enable-and-report.sh +315 -0
  283. package/skills/service-omni-sidebar-configure/scripts/tests/_bootstrap.py +142 -0
  284. package/skills/service-omni-sidebar-configure/scripts/tests/test_sidebar_contracts.py +139 -0
  285. package/skills/service-omni-skills-based-routing-configure/SKILL.md +81 -0
  286. package/skills/service-omni-skills-based-routing-configure/references/api-notes.md +50 -0
  287. package/skills/service-omni-skills-based-routing-configure/scripts/configure-and-report.sh +270 -0
  288. package/skills/service-omni-skills-based-routing-configure/scripts/tests/_bootstrap.py +120 -0
  289. package/skills/service-omni-skills-based-routing-configure/scripts/tests/test_sbr_contracts.py +129 -0
  290. package/skills/service-omni-supervisor-config-deploy/SKILL.md +97 -0
  291. package/skills/service-omni-supervisor-config-deploy/assets/force-app/main/default/omniSupervisorConfigs/Omni_Supervisor.omniSupervisorConfig-meta.xml +9 -0
  292. package/skills/service-omni-supervisor-config-deploy/assets/package.xml +8 -0
  293. package/skills/service-omni-supervisor-config-deploy/assets/sfdx-project.json +12 -0
  294. package/skills/service-omni-supervisor-config-deploy/references/api-notes.md +205 -0
  295. package/skills/service-omni-supervisor-config-deploy/scripts/deploy-and-report.sh +586 -0
  296. package/skills/service-omni-supervisor-config-deploy/scripts/tests/_bootstrap.py +153 -0
  297. package/skills/service-omni-supervisor-config-deploy/scripts/tests/test_supervisor_config_contracts.py +116 -0
  298. package/skills/service-omni-supervisor-permset-assign/SKILL.md +88 -0
  299. package/skills/service-omni-supervisor-permset-assign/references/api-notes.md +48 -0
  300. package/skills/service-omni-supervisor-permset-assign/scripts/verify-and-assign.sh +316 -0
  301. package/skills/service-omni-supervisor-surface-deploy/SKILL.md +85 -0
  302. package/skills/service-omni-supervisor-surface-deploy/references/api-notes.md +47 -0
  303. package/skills/service-omni-supervisor-surface-deploy/scripts/deploy-and-report.sh +216 -0
  304. package/skills/service-omni-supervisor-surface-deploy/scripts/tests/_bootstrap.py +95 -0
  305. package/skills/service-omni-supervisor-surface-deploy/scripts/tests/test_supervisor_surface_contracts.py +154 -0
  306. package/skills/service-omni-supervisor-users-create/SKILL.md +92 -0
  307. package/skills/service-omni-supervisor-users-create/assets/create-supervisors.apex.template +72 -0
  308. package/skills/service-omni-supervisor-users-create/references/apex-patterns.md +73 -0
  309. package/skills/service-omni-supervisor-users-create/references/apex-template-notes.md +41 -0
  310. package/skills/service-omni-supervisor-users-create/scripts/detect-and-create.sh +197 -0
  311. package/skills/service-omni-supervisor-users-create/scripts/detect-existing.sh +112 -0
  312. package/skills/service-omni-supervisor-users-create/scripts/run-create.sh +296 -0
  313. package/skills/service-omni-work-skill-routing-configure/SKILL.md +80 -0
  314. package/skills/service-omni-work-skill-routing-configure/references/api-notes.md +67 -0
  315. package/skills/service-omni-work-skill-routing-configure/scripts/configure-and-report.sh +262 -0
  316. package/skills/service-omni-work-skill-routing-configure/scripts/tests/_bootstrap.py +121 -0
  317. package/skills/service-omni-work-skill-routing-configure/scripts/tests/test_work_skill_routing_contracts.py +161 -0
@@ -0,0 +1,335 @@
1
+ # Stage 4 — User Provisioning
2
+
3
+ Creates an active Field Sales Representative user for Life Sciences Cloud, assigns the required profile and permission sets, and assigns both the new user and the admin to the level-3 territory. This is Stage 4 of the `life-sciences-fieldsalesrep-coordinate` workflow; the coordinator invokes it after the territory model (Stage 3) is active.
4
+
5
+ ## Stage Scope
6
+
7
+ - **In scope**: Creating an active user, assigning LSC Custom Profile, assigning permission sets, assigning users to territories, setting the user's password so they can log in
8
+ - **Out of scope**: Creating the profile (Stage 2), creating territories (Stage 3), validating prerequisites (Stage 1)
9
+
10
+ ---
11
+
12
+ ## Prerequisites
13
+
14
+ These must exist in the org before this stage runs (the coordinator sequences the earlier stages so they do):
15
+
16
+ | Prerequisite | Created by |
17
+ |---|---|
18
+ | `LSC Custom Profile` profile | Stage 2 (Starter Config Deploy) (Step 6) |
19
+ | Level-3 territory (e.g., `TMSPCSanFranciscoNorth20D02T11`) | Stage 3 (`life-sciences-territory-configure`) |
20
+ | Active Territory Model | Stage 3 (`life-sciences-territory-configure`, Phase 4) |
21
+
22
+ ---
23
+
24
+ ## Required Inputs
25
+
26
+ Gather before proceeding:
27
+
28
+ - **Target org**: The org alias or username (from `sf config get target-org` or user-specified)
29
+ - **New user details** (ask the user for each):
30
+ - First Name
31
+ - Last Name
32
+ - Email
33
+ - Username (must be globally unique — suggest `<email>.lsc` or similar if user is unsure)
34
+ - Alias (max 8 chars — default to first initial + last name truncated)
35
+
36
+ ---
37
+
38
+ ## Workflow
39
+
40
+ ### Phase 1 — Validate Prerequisites
41
+
42
+ 1. **Verify the LSC Custom Profile exists** in the org:
43
+ ```bash
44
+ sf data query --query "SELECT Id, Name FROM Profile WHERE Name = 'LSC Custom Profile'" --target-org <org> --json
45
+ ```
46
+ If it returns zero records, **stop** and tell the user to run Stage 2 (Starter Config Deploy) first.
47
+
48
+ 2. **Verify the level-3 territory exists** and the model is Active:
49
+ ```bash
50
+ sf data query --query "SELECT Id, DeveloperName, Territory2Model.State FROM Territory2 WHERE ParentTerritory2.ParentTerritory2Id != null AND Territory2Model.State = 'Active'" --target-org <org> --json
51
+ ```
52
+ If no results, try querying all territories to find the hierarchy:
53
+ ```bash
54
+ sf data query --query "SELECT Id, DeveloperName, Name, ParentTerritory2.DeveloperName FROM Territory2 WHERE Territory2Model.State = 'Active'" --target-org <org> --json
55
+ ```
56
+ Identify the level-3 territory (the one whose parent also has a parent). If none found, **stop** and tell the user to run `life-sciences-territory-configure` first.
57
+
58
+ 3. **Identify the admin user** (the currently logged-in user):
59
+ ```bash
60
+ sf org display --target-org <org> --json
61
+ ```
62
+ Extract the username, then query the User ID:
63
+ ```bash
64
+ sf data query --query "SELECT Id, Username, Name FROM User WHERE Username = '<admin-username>'" --target-org <org> --json
65
+ ```
66
+
67
+ ### Phase 2 — Collect User Details and Confirm
68
+
69
+ 4. **Ask the user** for the new rep's details:
70
+ - First Name
71
+ - Last Name
72
+ - Email
73
+ - Username (suggest: `<firstname>.<lastname>@<orgdomain>.lsc`)
74
+ - Alias (suggest: first initial + up to 7 chars of last name)
75
+
76
+ 5. **Show a preview** of what will be created:
77
+
78
+ ```text
79
+ === New User ===
80
+ First Name: <firstName>
81
+ Last Name: <lastName>
82
+ Email: <email>
83
+ Username: <username>
84
+ Alias: <alias>
85
+ Profile: LSC Custom Profile
86
+ Active: true
87
+
88
+ === Permission Sets to Assign ===
89
+ 1. Life Sciences Core
90
+ 2. Life Sciences Field Sales Representative
91
+ 3. Health Cloud Starter
92
+ 4. Life Sciences Key Account Management
93
+
94
+ === Territory Assignment ===
95
+ Territory: <level-3 territory name> (<DeveloperName>)
96
+ Users to assign: <new user>, <admin user>
97
+ ```
98
+
99
+ 6. **Ask for confirmation**: "Ready to create this user and assign permissions? (yes/no)"
100
+
101
+ ### Phase 3 — Create the User
102
+
103
+ 7. **Get the Profile ID** for LSC Custom Profile (already queried in Phase 1, reuse the ID).
104
+
105
+ 8. **Create the user** using `sf data create record`:
106
+ ```bash
107
+ sf data create record --sobject User --values "FirstName='<firstName>' LastName='<lastName>' Email='<email>' Username='<username>' Alias='<alias>' ProfileId='<profileId>' IsActive=true TimeZoneSidKey='America/Los_Angeles' LocaleSidKey='en_US' EmailEncodingKey='UTF-8' LanguageLocaleKey='en_US'" --target-org <org> --json
108
+ ```
109
+
110
+ 9. **Verify creation** — extract the new user's record ID from the response. If it fails, show the error and suggest remediation (e.g., duplicate username, invalid email).
111
+
112
+ ### Phase 4 — Assign Permission Sets
113
+
114
+ 10. **Query the permission set IDs**:
115
+ ```bash
116
+ sf data query --query "SELECT Id, Name FROM PermissionSet WHERE Name IN ('LifeSciencesCore', 'LifeSciencesFieldSalesRepresentative', 'HealthCloudStarter', 'LifeSciencesKeyAccountManager')" --target-org <org> --json
117
+ ```
118
+
119
+ > **Note:** Permission set API names may differ from labels. If the above returns fewer than 4 results, try querying by label:
120
+ ```bash
121
+ sf data query --query "SELECT Id, Label, Name FROM PermissionSet WHERE Label IN ('Life Sciences Core', 'Life Sciences Field Sales Representative', 'Health Cloud Starter', 'Life Sciences Key Account Management')" --target-org <org> --json
122
+ ```
123
+
124
+ > **STOP-GATE (found count).** The four permission sets are ALL required — `LifeSciencesCore`, `LifeSciencesFieldSalesRepresentative`, `HealthCloudStarter`, and `LifeSciencesKeyAccountManager`. If the combined result of the two queries above yields **fewer than 4 distinct IDs**, do NOT proceed. Report exactly which of the four are missing from the org and stop — a missing permission set is an org-provisioning gap, not something to skip past. Do not assign a subset and continue.
125
+
126
+ 11. **Create PermissionSetAssignment records** — one per permission set. Collect the four IDs from step 10 into an explicit list and assign **all four**; do not stop after the two obviously-named ("core", "field sales rep") sets:
127
+ ```bash
128
+ sf data create record --sobject PermissionSetAssignment --values "AssigneeId='<newUserId>' PermissionSetId='<permSetId>'" --target-org <org> --json
129
+ ```
130
+ Run this once for **each of the 4** permission set IDs. Track how many succeeded (treat a `DUPLICATE_VALUE` error as an already-assigned success, not a failure).
131
+
132
+ 12. **Verify assignments (hard count gate)** — filter out the profile-owned permission set so only the explicitly-assigned sets show:
133
+ ```bash
134
+ sf data query --query "SELECT PermissionSet.Name, PermissionSet.Label FROM PermissionSetAssignment WHERE AssigneeId = '<newUserId>' AND PermissionSet.IsOwnedByProfile = false" --target-org <org> --json
135
+ ```
136
+
137
+ > Every user has a hidden PermissionSet owned by their profile. Without `AND PermissionSet.IsOwnedByProfile = false`, this query returns 5 rows (the 4 assigned + the profile's) — the filter makes the result match the sets you assigned.
138
+
139
+ > **STOP-GATE (assigned count).** This query MUST return **exactly 4 rows**, and the set of names MUST equal `{LifeSciencesCore, LifeSciencesFieldSalesRepresentative, HealthCloudStarter, LifeSciencesKeyAccountManager}`. If it returns fewer than 4, the assignment is INCOMPLETE — identify the missing set(s) by name, re-run step 11 for each missing ID, and re-run this verify until it returns 4. Do NOT advance to Phase 5 (territory assignment) or report success while the count is < 4. "Some permsets assigned" is a failure state, not a partial success.
140
+
141
+ ### Phase 5 — Assign Users to Territory
142
+
143
+ 13. **Assign the new user** to the level-3 territory:
144
+ ```bash
145
+ sf data create record --sobject UserTerritory2Association --values "UserId='<newUserId>' Territory2Id='<territory2Id>'" --target-org <org> --json
146
+ ```
147
+
148
+ 14. **Assign the admin user** to the same level-3 territory:
149
+ ```bash
150
+ sf data create record --sobject UserTerritory2Association --values "UserId='<adminUserId>' Territory2Id='<territory2Id>'" --target-org <org> --json
151
+ ```
152
+
153
+ > If the admin is already assigned (duplicate error), report that it's already assigned and continue.
154
+
155
+ 15. **Verify territory assignments**:
156
+ ```bash
157
+ sf data query --query "SELECT User.Name, Territory2.Name FROM UserTerritory2Association WHERE Territory2Id = '<territory2Id>'" --target-org <org> --json
158
+ ```
159
+
160
+ ### Phase 6 — Grant Login Access (Set Password)
161
+
162
+ > **Creating a user via `sf data create record` sends NO welcome or set-password email, and the user has no usable password.** The user cannot log in until you set one. Do NOT tell the user to expect an email — none is sent by API creation.
163
+
164
+ 16. **Set a password** for the new user. Use anonymous Apex `System.setPassword` — this is the reliable method for an API-created user. Write the Apex to a **project-local** temp file (a relative path in the CWD — never `/tmp` or any path outside the project) and delete it right after:
165
+ ```bash
166
+ echo "System.setPassword('<newUserId>', '<password>');" > .lsc-setpw.apex
167
+ sf apex run --file .lsc-setpw.apex --target-org <org> --json
168
+ rm -f .lsc-setpw.apex
169
+ ```
170
+ Choose a password meeting the org's policy (≥8 chars, mixed case, number, symbol — e.g. `Lsc!Rep2026`). Confirm `compiled: true` and `success: true` in the response. Deleting the file afterward avoids leaving the password on disk.
171
+
172
+ > **Do NOT use `sf org generate password --on-behalf-of <username>` for this user.** That command only works for users the CLI holds a local auth entry for (e.g. created via `sf org create user`); for an API-created user it fails with `NamedOrgNotFoundError: No authorization information found for <username>`. As an alternative to setting a password directly, an admin can use Setup → Users → <user> → Reset Password to email a branded set-password link to the user's Email address.
173
+
174
+ 17. **Get the login URL** (org instance URL) for the summary:
175
+ ```bash
176
+ sf org display --target-org <org> --json
177
+ ```
178
+ Use the `instanceUrl` field.
179
+
180
+ ### Phase 7 — Report
181
+
182
+ 18. **Display success summary** (include the password and login URL so the user can hand off credentials — this is the one place the password is shown, since the admin needs it to log in as the rep):
183
+
184
+ ```text
185
+ Life Sciences User Provisioning Complete
186
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
187
+
188
+ User Created:
189
+ Name: <firstName> <lastName>
190
+ Username: <username>
191
+ Password: <password>
192
+ Email: <email>
193
+ Profile: LSC Custom Profile
194
+ Status: Active
195
+
196
+ Permission Sets Assigned:
197
+ - Life Sciences Core
198
+ - Life Sciences Field Sales Representative
199
+ - Health Cloud Starter
200
+ - Life Sciences Key Account Management
201
+
202
+ Territory Assignment:
203
+ Territory: <territory name> (<DeveloperName>)
204
+ - <new user name> — assigned
205
+ - <admin user name> — assigned
206
+
207
+ Login URL: <instanceUrl>
208
+ ```
209
+
210
+ > The user will be prompted to change this password on first login. No email is sent automatically — deliver the credentials to the new user directly.
211
+
212
+ ---
213
+
214
+ ## Mid-Flow Change Requests (Impact Assessment)
215
+
216
+ If the user requests a change to inputs provided in an earlier phase while a later phase is in progress or completed, perform an impact assessment before applying.
217
+
218
+ ### Behavior
219
+
220
+ 1. **Acknowledge** the change request without applying it.
221
+ 2. **Assess impact** — determine what must be undone or redone:
222
+
223
+ ```text
224
+ Change Request Impact Assessment
225
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
226
+
227
+ Requested change: <describe>
228
+
229
+ Impact:
230
+ <list affected phases and what happens to each>
231
+
232
+ Action required:
233
+ <what will be undone/redone>
234
+ ```
235
+
236
+ 3. **Present options** and wait for the user's decision before acting.
237
+
238
+ ### Impact Matrix
239
+
240
+ | Change requested | When (phase already done) | Impact | Action |
241
+ |---|---|---|---|
242
+ | Username or email | After Phase 3 (user created) | Old user becomes orphaned | Deactivate old user (`IsActive=false`) — this auto-removes its territory assignment — then create new user and re-assign permsets and territory |
243
+ | First/Last name | After Phase 3 (user created) | Name mismatch | Update existing user record in-place (no new user needed) |
244
+ | Permission sets | After Phase 4 (permsets assigned) | Wrong permsets on user | Remove unwanted assignments, add new ones |
245
+ | Territory | After Phase 5 (territory assigned) | User in wrong territory | Remove old `UserTerritory2Association`, create new one |
246
+ | Profile | After Phase 3 (user created) | Wrong profile on user | Update user's `ProfileId` in-place |
247
+
248
+ ### Superseded User Deactivation
249
+
250
+ When a change requires creating a **new** user (username/email change after the original was already created):
251
+
252
+ 1. **Deactivate the old user** immediately:
253
+ ```bash
254
+ sf data update record --sobject User --record-id <oldUserId> --values "IsActive=false" --target-org <org> --json
255
+ ```
256
+
257
+ 2. **Confirm the old user's territory assignment is gone.** Deactivating a user (`IsActive=false`) **auto-cascades** the deletion of their `UserTerritory2Association` records — you do NOT need to (and usually cannot) delete them explicitly. Verify rather than delete:
258
+ ```bash
259
+ sf data query --query "SELECT Id FROM UserTerritory2Association WHERE UserId = '<oldUserId>'" --target-org <org> --json
260
+ ```
261
+ Expect `totalSize: 0`. If any remain (rare), delete them:
262
+ ```bash
263
+ sf data delete record --sobject UserTerritory2Association --record-id <associationId> --target-org <org> --json
264
+ ```
265
+ > **Do not delete first / do not treat a failed delete as an error.** After deactivation the association is already gone, so an explicit delete targeting the old association Id fails with `INSUFFICIENT_ACCESS_OR_READONLY: insufficient access rights on object id` — a misleading message that actually means "record no longer exists." Treat that as success (the assignment is removed), not a failure to recover from.
266
+
267
+ 3. **Report the deactivation** in the impact summary:
268
+ ```text
269
+ Superseded user handled:
270
+ Deactivated: <oldUsername> (IsActive = false)
271
+ Removed from territory: <territory name>
272
+ New user will be created with updated details.
273
+ ```
274
+
275
+ 4. **Proceed** to create the new user through Phases 3–6 with the updated details.
276
+
277
+ > **Why deactivate, not delete:** Salesforce does not allow deleting User records. Deactivation (`IsActive=false`) prevents login and removes the user from active license counts while preserving audit history.
278
+
279
+ ---
280
+
281
+ ## Rules / Constraints
282
+
283
+ | Constraint | Rationale |
284
+ |-----------|-----------|
285
+ | Validate prerequisites before creating the user | Avoids creating a user that can't be properly configured |
286
+ | User must be Active (`IsActive=true`) | Required for the field sales rep to log in and work |
287
+ | Always assign LSC Custom Profile | This profile has the required object and field permissions for LSC |
288
+ | Assign all 4 permission sets | Each provides distinct capabilities needed for field sales workflows |
289
+ | Assign both new user AND admin to territory | Admin needs territory access for management; rep needs it for account access |
290
+ | Use `--target-org` for every command | Explicit org targeting prevents accidental operations |
291
+ | Confirm details before creating | User creation is not easily reversible |
292
+ | Deactivate superseded users when a change requires a new user | Prevents orphaned active accounts consuming licenses |
293
+ | Perform impact assessment before applying mid-flow changes | User must understand what gets undone before committing |
294
+ | Never delete User records | Salesforce does not support User deletion — deactivate instead |
295
+ | Set a password after creating the user (Phase 6) and never promise a welcome email | API creation sends no email and leaves no usable password; the user cannot log in until a password is set |
296
+
297
+ ---
298
+
299
+ ## Gotchas
300
+
301
+ | Issue | Resolution |
302
+ |-------|------------|
303
+ | Username must be globally unique across all Salesforce orgs | Suggest appending `.lsc` or org-specific suffix |
304
+ | Permission set API names differ from labels | Query by both `Name` and `Label` as fallback |
305
+ | Admin already assigned to territory | Catch duplicate error and continue — not a failure |
306
+ | Profile not found | User must run Stage 2 (Starter Config Deploy) first |
307
+ | Territory not found or model not Active | User must run `life-sciences-territory-configure` first |
308
+ | User creation fails with "DUPLICATE_USERNAME" | Ask user for a different username |
309
+ | Permission set assignment fails with "DUPLICATE_VALUE" | Permission set already assigned — skip and continue |
310
+ | User changes username after user created | Deactivate old user, remove territory assignment, create new user with full provisioning |
311
+ | User changes name (not username) after user created | Update in-place with `sf data update record` — no new user needed |
312
+ | Cannot delete old user | Salesforce prohibits User deletion; deactivation is the only option |
313
+ | `INSUFFICIENT_ACCESS_OR_READONLY: insufficient access rights on object id` when deleting a deactivated user's `UserTerritory2Association` | Deactivating the user already cascade-deleted the association; the record is gone. Treat as success — verify with a query returning `totalSize: 0` instead of deleting |
314
+ | New user got no email / can't log in | Expected — `sf data create record` sends no welcome email and sets no password. Set a password in Phase 6 (`System.setPassword` via `sf apex run`) and deliver credentials directly |
315
+ | `sf org generate password` fails with `NamedOrgNotFoundError: No authorization information found for <username>` | That command only works for users with a local CLI auth entry, not API-created users. Use `System.setPassword` via anonymous Apex, or reset the password from the Setup UI |
316
+
317
+ ---
318
+
319
+ ## Output Expectations
320
+
321
+ Deliverables:
322
+ - Active user created with LSC Custom Profile
323
+ - All 4 permission sets assigned to the new user
324
+ - New user assigned to the level-3 territory
325
+ - Admin user assigned to the level-3 territory
326
+ - Password set for the new user (so they can log in — no email is sent by API creation)
327
+ - Confirmation summary including username, password, email, profile, territory, and login URL (the password is shown here so the admin can log in as the rep)
328
+
329
+ ---
330
+
331
+ ## Reference File Index
332
+
333
+ | File | When to read |
334
+ |------|-------------|
335
+ | `references/stage-4-user-provisioning-user-provisioning-details.md` | During all phases — contains permission set API names, required user field defaults, and territory assignment details |
@@ -0,0 +1,140 @@
1
+ # User Provisioning Details
2
+
3
+ ## Required Permission Sets
4
+
5
+ | Permission Set Label | Expected API Name | Purpose |
6
+ |---------------------|-------------------|---------|
7
+ | Life Sciences Core | LifeSciencesCore | Core LSC platform permissions |
8
+ | Life Sciences Field Sales Representative | LifeSciencesFieldSalesRepresentative | Field sales workflow permissions |
9
+ | Health Cloud Starter | HealthCloudStarter | Health Cloud foundation permissions |
10
+ | Life Sciences Key Account Management | LifeSciencesKeyAccountManager | Key account management permissions |
11
+
12
+ ### Querying Permission Sets
13
+
14
+ Permission sets from managed packages may have namespace-prefixed API names. If the standard names don't return results, try:
15
+
16
+ ```bash
17
+ sf data query --query "SELECT Id, Name, NamespacePrefix, Label FROM PermissionSet WHERE Label LIKE '%Life Sciences%' OR Label LIKE '%Health Cloud%'" --target-org <org> --json
18
+ ```
19
+
20
+ ---
21
+
22
+ ## Required User Fields
23
+
24
+ When creating a user via `sf data create record`, these fields are mandatory:
25
+
26
+ | Field | Description | Default Value |
27
+ |-------|-------------|---------------|
28
+ | `FirstName` | User's first name | (user-provided) |
29
+ | `LastName` | User's last name | (user-provided) |
30
+ | `Email` | User's email address | (user-provided) |
31
+ | `Username` | Globally unique username | (user-provided) |
32
+ | `Alias` | Max 8 characters | First initial + last name (truncated) |
33
+ | `ProfileId` | 18-char record ID | (queried from org) |
34
+ | `IsActive` | Must be `true` | `true` |
35
+ | `TimeZoneSidKey` | User's timezone | `America/Los_Angeles` |
36
+ | `LocaleSidKey` | User's locale | `en_US` |
37
+ | `EmailEncodingKey` | Email encoding | `UTF-8` |
38
+ | `LanguageLocaleKey` | Language | `en_US` |
39
+
40
+ ### Optional Fields
41
+
42
+ These can be set if the user provides them:
43
+
44
+ | Field | Description |
45
+ |-------|-------------|
46
+ | `Title` | Job title (e.g., "Field Sales Representative") |
47
+ | `Department` | Department name |
48
+ | `Phone` | Phone number |
49
+ | `MobilePhone` | Mobile phone number |
50
+
51
+ ---
52
+
53
+ ## Territory Assignment
54
+
55
+ ### UserTerritory2Association Fields
56
+
57
+ | Field | Description |
58
+ |-------|-------------|
59
+ | `UserId` | 18-char User record ID |
60
+ | `Territory2Id` | 18-char Territory2 record ID |
61
+ | `RoleInTerritory2` | Optional — leave blank unless user specifies |
62
+
63
+ ### Identifying the Level-3 Territory
64
+
65
+ The level-3 territory is the leaf node in the 3-level hierarchy created by `life-sciences-territory-configure`:
66
+
67
+ ```text
68
+ Level 1 (Region): RD - West 20D
69
+ └── Level 2 (District): DM - San Francisco 20D02
70
+ └── Level 3 (Territory): TM - SPC - San Francisco North 20D02T11 ← assign here
71
+ ```
72
+
73
+ Query to find territories with two levels of parents (i.e., level-3):
74
+
75
+ ```bash
76
+ sf data query --query "SELECT Id, Name, DeveloperName, ParentTerritory2.Name, ParentTerritory2.ParentTerritory2.Name FROM Territory2 WHERE ParentTerritory2.ParentTerritory2Id != null AND Territory2Model.State = 'Active'" --target-org <org> --json
77
+ ```
78
+
79
+ If the territory model has only one level-3 territory, use it directly. If multiple exist, present them to the user and ask which one to use.
80
+
81
+ ---
82
+
83
+ ## Error Handling
84
+
85
+ ### Common Errors and Remediation
86
+
87
+ | Error | Cause | Fix |
88
+ |-------|-------|-----|
89
+ | `DUPLICATE_USERNAME` | Username exists in another org | Append a unique suffix (e.g., `.lsc`, `.dev`) |
90
+ | `DUPLICATE_VALUE` on PermissionSetAssignment | Permission set already assigned | Skip — not an error |
91
+ | `DUPLICATE_VALUE` on UserTerritory2Association | User already assigned to territory | Skip — not an error |
92
+ | `INVALID_CROSS_REFERENCE_KEY` on ProfileId | Profile ID is wrong or from different org | Re-query the profile ID |
93
+ | `FIELD_INTEGRITY_EXCEPTION` on Username | Username format invalid | Must be email-like format (contains `@`) |
94
+ | `REQUIRED_FIELD_MISSING` | A mandatory field was omitted | Check all required fields are provided |
95
+
96
+ ---
97
+
98
+ ## Setting the User's Password (Phase 6)
99
+
100
+ A user created via `sf data create record` has **no password and receives no email** — they cannot log in until a password is set. Set one with anonymous Apex, writing the temp file to a **project-local** relative path (never `/tmp` or any path outside the project) and removing it right after:
101
+
102
+ ```bash
103
+ echo "System.setPassword('<newUserId>', '<password>');" > .lsc-setpw.apex
104
+ sf apex run --file .lsc-setpw.apex --target-org <org> --json
105
+ rm -f .lsc-setpw.apex
106
+ ```
107
+
108
+ Confirm `compiled: true` and `success: true`. The password must meet the org's policy (default: ≥8 chars, mixed case, at least one number and one symbol). The user is prompted to change it on first login.
109
+
110
+ **Do not use `sf org generate password --on-behalf-of <username>`** — it only works for users with a local CLI auth entry (e.g. created via `sf org create user`) and fails for API-created users with `NamedOrgNotFoundError`. Alternatively, an admin can reset the password from Setup → Users → <user> → Reset Password to email a set-password link.
111
+
112
+ Get the login URL for the credential handoff:
113
+
114
+ ```bash
115
+ sf org display --target-org <org> --json # use the instanceUrl field
116
+ ```
117
+
118
+ ---
119
+
120
+ ## Verification Queries
121
+
122
+ ### Verify user was created correctly
123
+
124
+ ```bash
125
+ sf data query --query "SELECT Id, Name, Username, Profile.Name, IsActive FROM User WHERE Username = '<username>'" --target-org <org> --json
126
+ ```
127
+
128
+ ### Verify permission set assignments
129
+
130
+ Filter out the profile-owned permission set (`IsOwnedByProfile = false`) so the result matches the 4 sets you assigned rather than returning a 5th hidden profile-owned row:
131
+
132
+ ```bash
133
+ sf data query --query "SELECT PermissionSet.Label, PermissionSet.Name FROM PermissionSetAssignment WHERE AssigneeId = '<userId>' AND PermissionSet.IsOwnedByProfile = false" --target-org <org> --json
134
+ ```
135
+
136
+ ### Verify territory assignments
137
+
138
+ ```bash
139
+ sf data query --query "SELECT User.Name, User.Username, Territory2.Name, Territory2.DeveloperName FROM UserTerritory2Association WHERE Territory2Id = '<territoryId>'" --target-org <org> --json
140
+ ```