@salesforce/afv-skills 1.63.0 → 1.65.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 (484) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-gpt-email-generation-configure/SKILL.md +312 -0
  3. package/skills/agentforce-offline-experimentation-run/SKILL.md +253 -0
  4. package/skills/agentforce-offline-experimentation-run/scripts/build_report.py +796 -0
  5. package/skills/agentforce-offline-experimentation-run/scripts/resolve-token.sh +111 -0
  6. package/skills/agentforce-offline-experimentation-run/scripts/sfap_replay.py +1053 -0
  7. package/skills/agentforce-wizard-ui-forecasting-analytics-components-configure/SKILL.md +64 -0
  8. package/skills/agentforce-wizard-ui-sales-einstein-components-configure/SKILL.md +46 -0
  9. package/skills/automation-company-profile-info-query/SKILL.md +51 -0
  10. package/skills/automation-digital-wallet-configure/SKILL.md +689 -0
  11. package/skills/automation-flow-coordinate/SKILL.md +95 -0
  12. package/skills/automation-flow-coordinate/references/elements/action-call/action-call.md +1569 -0
  13. package/skills/automation-flow-coordinate/references/elements/action-call/conversation-messaging.md +96 -0
  14. package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-sms-message.json +23 -0
  15. package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-to-journey-no-fields.json +31 -0
  16. package/skills/automation-flow-coordinate/references/elements/action-call/send-to-journey.md +179 -0
  17. package/skills/automation-flow-coordinate/references/elements/exit-rule/examples/event-email-link-click.json +13 -0
  18. package/skills/automation-flow-coordinate/references/elements/exit-rule/exit-rule.md +83 -0
  19. package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/examples/forward-to-bot-or-agent.json +69 -0
  20. package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/forward-to-bot-or-agent.md +274 -0
  21. package/skills/automation-flow-coordinate/references/elements/start/audience-common.md +192 -0
  22. package/skills/automation-flow-coordinate/references/elements/start/automation-event-triggered.md +130 -0
  23. package/skills/automation-flow-coordinate/references/elements/start/data-cloud-data-change-triggered.md +92 -0
  24. package/skills/automation-flow-coordinate/references/elements/start/form-submission-triggered.md +88 -0
  25. package/skills/automation-flow-coordinate/references/elements/start/segment-triggered.md +152 -0
  26. package/skills/automation-flow-coordinate/references/elements/start/start.md +539 -0
  27. package/skills/automation-flow-coordinate/references/elements/subflow/subflow.md +152 -0
  28. package/skills/automation-flow-coordinate/references/elements/wait/wait.md +497 -0
  29. package/skills/automation-flow-coordinate/references/recipes/author/author.md +868 -0
  30. package/skills/automation-flow-coordinate/references/recipes/summarize/element-generic.md +300 -0
  31. package/skills/automation-flow-coordinate/references/recipes/summarize/reference-resolution.md +292 -0
  32. package/skills/automation-flow-coordinate/references/recipes/summarize/summarize.md +323 -0
  33. package/skills/automation-flow-coordinate/references/recipes/testing/examples/debug-output-template.md +109 -0
  34. package/skills/automation-flow-coordinate/references/recipes/testing/shape.md +219 -0
  35. package/skills/automation-flow-coordinate/references/recipes/testing/shared-stages/intent-analyzer.md +180 -0
  36. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/debug.md +175 -0
  37. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/promote.md +255 -0
  38. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/save-debug.md +212 -0
  39. package/skills/automation-flow-coordinate/references/resources/variable/variable.md +171 -0
  40. package/skills/automation-flow-coordinate/references/shared/anti-patterns.md +786 -0
  41. package/skills/automation-flow-coordinate/references/shared/end/end.md +267 -0
  42. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/README.md +69 -0
  43. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/predictions.jsonl +80 -0
  44. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/prompts.jsonl +116 -0
  45. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/flow-type-resolver.md +321 -0
  46. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/taxonomy.json +320 -0
  47. package/skills/automation-flow-coordinate/references/shared/server-functions.md +597 -0
  48. package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +21 -11
  49. package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +10 -0
  50. package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +33 -1
  51. package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +44 -1
  52. package/skills/automation-sandbox-post-copy-configure/SKILL.md +132 -124
  53. package/skills/automation-sandbox-post-copy-configure/references/flow_activation_path.md +151 -0
  54. package/skills/automation-sandbox-post-copy-configure/references/scheduled_apex_path.md +55 -9
  55. package/skills/automotive-cloud-appraisal-management-settings-configure/SKILL.md +69 -0
  56. package/skills/automotive-cloud-dealer-essentials-configure/SKILL.md +78 -0
  57. package/skills/automotive-cloud-ground-agent-data-pipelines-configure/SKILL.md +373 -0
  58. package/skills/automotive-cloud-ground-mfg-agent-data-pipelines-configure/SKILL.md +273 -0
  59. package/skills/automotive-cloud-mfg-agent-data-pipelines-configure/SKILL.md +259 -0
  60. package/skills/automotive-cloud-mfg-sales-concierge-agent-create/SKILL.md +369 -0
  61. package/skills/automotive-cloud-mfg-sales-concierge-foundation-configure/SKILL.md +542 -0
  62. package/skills/automotive-cloud-mfg-sales-concierge-foundation-coordinate/SKILL.md +159 -0
  63. package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-agent-create/SKILL.md +349 -0
  64. package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-configure/SKILL.md +505 -0
  65. package/skills/automotive-cloud-sales-concierge-agent-create/SKILL.md +380 -0
  66. package/skills/automotive-cloud-sales-concierge-foundation-configure/SKILL.md +567 -0
  67. package/skills/automotive-cloud-sales-concierge-foundation-coordinate/SKILL.md +159 -0
  68. package/skills/automotive-cloud-sales-concierge-orchestrator-agent-create/SKILL.md +360 -0
  69. package/skills/automotive-cloud-sales-concierge-orchestrator-configure/SKILL.md +539 -0
  70. package/skills/automotive-cloud-sales-concierge-search-grounding-configure/SKILL.md +358 -0
  71. package/skills/commerce-b2b-merchant-quote-configure/SKILL.md +602 -0
  72. package/skills/commerce-b2b-store-configure/SKILL.md +251 -0
  73. package/skills/commerce-credit-memo-create/SKILL.md +139 -0
  74. package/skills/commerce-delivery-business-hours-configure/SKILL.md +277 -0
  75. package/skills/commerce-delivery-estimation-apply/SKILL.md +155 -0
  76. package/skills/commerce-delivery-estimation-configure/SKILL.md +377 -0
  77. package/skills/commerce-delivery-routing-specs-integrate/SKILL.md +174 -0
  78. package/skills/commerce-estimate-bopis-query/SKILL.md +279 -0
  79. package/skills/commerce-estimate-delivery-date-query/SKILL.md +349 -0
  80. package/skills/commerce-fees-apply/SKILL.md +227 -0
  81. package/skills/commerce-fulfillment-routing-analyze/SKILL.md +200 -0
  82. package/skills/commerce-guest-buyer-create/SKILL.md +173 -0
  83. package/skills/commerce-location-bopis-configure/SKILL.md +378 -0
  84. package/skills/commerce-location-business-hours-configure/SKILL.md +235 -0
  85. package/skills/commerce-location-delivery-processing-time-configure/SKILL.md +309 -0
  86. package/skills/commerce-location-graph-integrate/SKILL.md +131 -0
  87. package/skills/commerce-location-shipping-carrier-method-configure/SKILL.md +755 -0
  88. package/skills/commerce-location-temporary-operating-hours-configure/SKILL.md +331 -0
  89. package/skills/commerce-merchant-buyer-groups-configure/SKILL.md +579 -0
  90. package/skills/commerce-merchant-buyer-user-onboarding-create/SKILL.md +626 -0
  91. package/skills/commerce-merchant-catalog-configure/SKILL.md +614 -0
  92. package/skills/commerce-merchant-extension-provider-configure/SKILL.md +368 -0
  93. package/skills/commerce-merchant-insights-account-health-churn-analyze/SKILL.md +118 -0
  94. package/skills/commerce-merchant-insights-inventory-returns-analyze/SKILL.md +65 -0
  95. package/skills/commerce-merchant-insights-order-shopper-get/SKILL.md +90 -0
  96. package/skills/commerce-merchant-insights-product-performance-analyze/SKILL.md +72 -0
  97. package/skills/commerce-merchant-insights-query/SKILL.md +279 -0
  98. package/skills/commerce-merchant-storefront-guest-access-configure/SKILL.md +656 -0
  99. package/skills/commerce-order-summary-change-apply/SKILL.md +375 -0
  100. package/skills/commerce-product-details-get/SKILL.md +363 -0
  101. package/skills/commerce-product-search/SKILL.md +563 -0
  102. package/skills/commerce-react-storefront-create/SKILL.md +350 -0
  103. package/skills/commerce-return-order-summary-create/SKILL.md +513 -0
  104. package/skills/commerce-search-relevance-analyze/SKILL.md +757 -0
  105. package/skills/commerce-temporary-processing-time-override-create/SKILL.md +274 -0
  106. package/skills/communications-initial-setup-configure/SKILL.md +630 -0
  107. package/skills/communications-multisite-configure/SKILL.md +571 -0
  108. package/skills/communications-revenue-cloud-settings-configure/SKILL.md +74 -0
  109. package/skills/communications-smb-fiber-catalog-create/SKILL.md +413 -0
  110. package/skills/communications-tmf-integrate/SKILL.md +1368 -0
  111. package/skills/consumer-goods-promotion-bo-api-deploy/SKILL.md +54 -107
  112. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/copy.json +1 -1
  113. package/skills/consumer-goods-promotion-bo-api-deploy/references/conventions-and-payload-rules.md +82 -5
  114. package/skills/consumer-goods-promotion-bo-api-deploy/references/generate-and-wire.md +35 -2
  115. package/skills/consumer-goods-promotion-bo-api-deploy/references/preflight-and-seed-queries.md +149 -0
  116. package/skills/consumer-goods-promotion-bo-api-deploy/references/smoke-and-verify.md +17 -1
  117. package/skills/consumer-goods-visit-activity-act4-questions-assign/SKILL.md +448 -0
  118. package/skills/consumer-goods-visit-activity-act5-standard-create/SKILL.md +269 -0
  119. package/skills/consumer-goods-visit-activity-act6-assortment-configure/SKILL.md +271 -0
  120. package/skills/consumer-goods-visit-activity-act7-account-scoping-create/SKILL.md +382 -0
  121. package/skills/consumer-goods-visit-activity-act8-plan-attach-create/SKILL.md +373 -0
  122. package/skills/consumer-goods-visit-activity-act9-proof-validate/SKILL.md +389 -0
  123. package/skills/consumer-goods-visit-and-activity-act1-specification-create/SKILL.md +338 -0
  124. package/skills/consumer-goods-visit-and-activity-act2-template-create/SKILL.md +547 -0
  125. package/skills/consumer-goods-visit-and-activity-act3-definition-create/SKILL.md +346 -0
  126. package/skills/consumer-goods-visit-and-activity-configure/SKILL.md +1110 -0
  127. package/skills/crm-analytics-adoption-insights-configure/SKILL.md +224 -0
  128. package/skills/crm-analytics-custom-report-type-lightning-configure/SKILL.md +418 -0
  129. package/skills/crm-analytics-dashboards-configure/SKILL.md +731 -0
  130. package/skills/crm-analytics-operational-analytics-metadata-bridge-migrate/SKILL.md +233 -0
  131. package/skills/crm-analytics-report-notifications-ui-configure/SKILL.md +184 -0
  132. package/skills/crm-analytics-sharing-inheritance-coverage-analyze/SKILL.md +167 -0
  133. package/skills/crm-analytics-sonic-getting-started-configure/SKILL.md +55 -0
  134. package/skills/crm-analytics-tableau-next-app-deploy/SKILL.md +1350 -0
  135. package/skills/crm-analytics-tableau-next-c360-basemodel-validate/SKILL.md +1862 -0
  136. package/skills/crm-analytics-tableau-next-datacloud-validate/SKILL.md +83 -0
  137. package/skills/crm-analytics-tableau-next-provisioning-validate/SKILL.md +81 -0
  138. package/skills/data360-activation-create/SKILL.md +104 -0
  139. package/skills/data360-activation-external-platform-get/SKILL.md +49 -0
  140. package/skills/data360-activation-target-create/SKILL.md +93 -0
  141. package/skills/data360-activation-v2-create/SKILL.md +456 -0
  142. package/skills/data360-audience-dmo-get/SKILL.md +38 -0
  143. package/skills/data360-calculated-affinity-create/SKILL.md +82 -0
  144. package/skills/data360-calculated-insight-create/SKILL.md +148 -0
  145. package/skills/data360-catalog-metadata-create/SKILL.md +183 -0
  146. package/skills/data360-code-extension-create/SKILL.md +115 -0
  147. package/skills/data360-communication-capping-create/SKILL.md +227 -0
  148. package/skills/data360-connection-create/SKILL.md +491 -0
  149. package/skills/data360-content-lens-create/SKILL.md +181 -0
  150. package/skills/data360-data-action-create/SKILL.md +126 -0
  151. package/skills/data360-data-action-target-create/SKILL.md +181 -0
  152. package/skills/data360-data-clean-room-create/SKILL.md +238 -0
  153. package/skills/data360-data-governance-create/SKILL.md +746 -0
  154. package/skills/data360-data-graph-create/SKILL.md +82 -0
  155. package/skills/data360-data-harmonized-model-object-reference-create/SKILL.md +38 -0
  156. package/skills/data360-data-lake-object-create/SKILL.md +207 -0
  157. package/skills/data360-data-model-object-catalog-get/SKILL.md +49 -0
  158. package/skills/data360-data-model-object-create/SKILL.md +128 -0
  159. package/skills/data360-data-model-object-mapping-create/SKILL.md +106 -0
  160. package/skills/data360-data-space-create/SKILL.md +161 -0
  161. package/skills/data360-data-streams-create/SKILL.md +324 -0
  162. package/skills/data360-engagement-signal-get/SKILL.md +38 -0
  163. package/skills/data360-experiment-create/SKILL.md +82 -0
  164. package/skills/data360-goal-based-campaign-create/SKILL.md +192 -0
  165. package/skills/data360-harmonization-process-history-get/SKILL.md +38 -0
  166. package/skills/data360-harmonized-unstructured-dmo-create/SKILL.md +84 -0
  167. package/skills/data360-identity-resolution-create/SKILL.md +115 -0
  168. package/skills/data360-intelligent-document-processing-create/SKILL.md +148 -0
  169. package/skills/data360-knowledge-graph-construction-create/SKILL.md +93 -0
  170. package/skills/data360-knowledge-graph-create/SKILL.md +216 -0
  171. package/skills/data360-knowledge-space-mcp-configure/SKILL.md +475 -0
  172. package/skills/data360-machine-learning-mcp-configure/SKILL.md +697 -0
  173. package/skills/data360-multi-org-mcp-configure/SKILL.md +117 -0
  174. package/skills/data360-secondary-index-mcp-configure/SKILL.md +126 -0
  175. package/skills/data360-segment-mcp-configure/SKILL.md +159 -0
  176. package/skills/data360-semantic-calculated-dimension-mcp-configure/SKILL.md +93 -0
  177. package/skills/data360-semantic-calculated-measurement-mcp-configure/SKILL.md +93 -0
  178. package/skills/data360-semantic-data-object-mcp-configure/SKILL.md +93 -0
  179. package/skills/data360-semantic-dimension-mcp-configure/SKILL.md +38 -0
  180. package/skills/data360-semantic-engine-mcp-configure/SKILL.md +62 -0
  181. package/skills/data360-semantic-measurement-mcp-configure/SKILL.md +38 -0
  182. package/skills/data360-semantic-metric-mcp-configure/SKILL.md +93 -0
  183. package/skills/data360-semantic-model-mcp-configure/SKILL.md +115 -0
  184. package/skills/data360-standard-mapping-mcp-configure/SKILL.md +38 -0
  185. package/skills/data360-tenant-lifecycle-mcp-configure/SKILL.md +73 -0
  186. package/skills/dx-devops-conflict-resolve/SKILL.md +1 -5
  187. package/skills/dx-devops-pipeline-manage/SKILL.md +1 -5
  188. package/skills/dx-devops-project-manage/SKILL.md +1 -5
  189. package/skills/dx-devops-promote/SKILL.md +1 -5
  190. package/skills/dx-devops-request-status/SKILL.md +1 -5
  191. package/skills/dx-lifecycle-center/SKILL.md +120 -0
  192. package/skills/dx-lifecycle-center/examples/workflows.md +175 -0
  193. package/skills/dx-lifecycle-center/references/connect-api.md +123 -0
  194. package/skills/dx-lifecycle-center/references/connect-org.md +184 -0
  195. package/skills/dx-lifecycle-center/references/deploy.md +153 -0
  196. package/skills/dx-lifecycle-center/references/error-handling.md +21 -0
  197. package/skills/dx-lifecycle-center/references/hub-org.md +37 -0
  198. package/skills/dx-lifecycle-center/references/list-orgs.md +99 -0
  199. package/skills/dx-lifecycle-center/references/request-body.md +75 -0
  200. package/skills/dx-lifecycle-center/references/troubleshooting.md +31 -0
  201. package/skills/dx-lifecycle-center/scripts/poll-deploy-status.sh +200 -0
  202. package/skills/dx-lifecycle-center/scripts/resolve-environment.sh +120 -0
  203. package/skills/dx-org-devhub-configure/SKILL.md +1 -3
  204. package/skills/dx-org-shape-manage/SKILL.md +1 -5
  205. package/skills/dx-org-snapshot-manage/SKILL.md +1 -3
  206. package/skills/education-cloud-academic-calendar-generate/SKILL.md +1 -3
  207. package/skills/education-cloud-course-catalog-migrate/SKILL.md +1 -3
  208. package/skills/education-cloud-domain-configure/SKILL.md +1 -3
  209. package/skills/education-cloud-multi-campus-configure/SKILL.md +1 -3
  210. package/skills/education-cloud-student-recruitment-agent-configure/SKILL.md +1 -5
  211. package/skills/experience-afv-query/SKILL.md +234 -0
  212. package/skills/experience-agentforce-vibes-in-react-configure/SKILL.md +63 -0
  213. package/skills/experience-apex-components-configure/SKILL.md +69 -0
  214. package/skills/experience-apex-pages-configure/SKILL.md +107 -0
  215. package/skills/experience-app-home-configure/SKILL.md +76 -0
  216. package/skills/experience-aura-lightning-out-access-configure/SKILL.md +58 -0
  217. package/skills/experience-briefcase-configure/SKILL.md +287 -0
  218. package/skills/experience-community-flexi-page-list-create/SKILL.md +74 -0
  219. package/skills/experience-community-template-definition-list-query/SKILL.md +48 -0
  220. package/skills/experience-community-theme-definition-list-query/SKILL.md +38 -0
  221. package/skills/experience-content-assets-configure/SKILL.md +86 -0
  222. package/skills/experience-custom-domain-create/SKILL.md +727 -0
  223. package/skills/experience-defer-rendering-workspace-page-setup-configure/SKILL.md +41 -0
  224. package/skills/experience-field-service-app-builder-configure/SKILL.md +187 -0
  225. package/skills/experience-flow-category-configure/SKILL.md +117 -0
  226. package/skills/experience-formula-configure/SKILL.md +358 -0
  227. package/skills/experience-global-actions-configure/SKILL.md +69 -0
  228. package/skills/experience-global-publisher-layouts-configure/SKILL.md +79 -0
  229. package/skills/experience-instrumentation-configure/SKILL.md +64 -0
  230. package/skills/experience-lex-engagement-configure/SKILL.md +50 -0
  231. package/skills/experience-lightning-bolt-open/SKILL.md +12 -0
  232. package/skills/experience-lightning-out-configure/SKILL.md +129 -0
  233. package/skills/experience-lightning-preview-configure/SKILL.md +67 -0
  234. package/skills/experience-lightning-types-query/SKILL.md +98 -0
  235. package/skills/experience-malware-scan-configure/SKILL.md +71 -0
  236. package/skills/experience-my-salesforce-configure/SKILL.md +126 -0
  237. package/skills/experience-navigation-menus-configure/SKILL.md +235 -0
  238. package/skills/experience-notification-types-configure/SKILL.md +206 -0
  239. package/skills/experience-notifications-configure/SKILL.md +75 -0
  240. package/skills/experience-record-discovery-query/SKILL.md +227 -0
  241. package/skills/experience-regenerate-previews-open/SKILL.md +94 -0
  242. package/skills/experience-sales-cloud-mab-configure/SKILL.md +254 -0
  243. package/skills/experience-schema-builder-open/SKILL.md +38 -0
  244. package/skills/experience-simple-record-home-configure/SKILL.md +110 -0
  245. package/skills/experience-static-resources-configure/SKILL.md +74 -0
  246. package/skills/experience-ui-bundle-2gp-deploy/SKILL.md +1 -3
  247. package/skills/experience-ui-bundle-features-generate/SKILL.md +1 -5
  248. package/skills/experience-ui-bundle-mfa-configure/SKILL.md +1 -3
  249. package/skills/field-service-data-capture-form-deployer-configure/SKILL.md +23 -2
  250. package/skills/field-service-data-capture-form-designer-configure/SKILL.md +13 -3
  251. package/skills/field-service-data-capture-migrate/SKILL.md +1 -3
  252. package/skills/field-service-mobile-branding-configure/SKILL.md +17 -3
  253. package/skills/field-service-objective-designer-configure/SKILL.md +72 -379
  254. package/skills/field-service-prework-brief-deployer-configure/SKILL.md +10 -537
  255. package/skills/field-service-scheduling-policy-designer-query/SKILL.md +65 -1093
  256. package/skills/{field-service-setup-orchestrator-get → field-service-setup-coordinate}/SKILL.md +18 -3
  257. package/skills/field-service-sobject-create-configure/SKILL.md +13 -213
  258. package/skills/field-service-voice-to-form-configure/SKILL.md +40 -11
  259. package/skills/field-service-work-plan-configure/SKILL.md +253 -0
  260. package/skills/field-service-work-rule-designer-configure/SKILL.md +121 -95
  261. package/skills/fsc-actionable-segmentation-settings-configure/SKILL.md +180 -0
  262. package/skills/fsc-digital-origination-bre-decision-matrix-foundation-create/SKILL.md +196 -0
  263. package/skills/fsc-digital-origination-bre-disclosures-consent-configure/SKILL.md +106 -0
  264. package/skills/fsc-digital-origination-bre-document-upload-configure/SKILL.md +96 -0
  265. package/skills/fsc-digital-origination-bre-permissions-assign/SKILL.md +111 -0
  266. package/skills/fsc-digital-origination-bre-setup-coordinate/SKILL.md +250 -0
  267. package/skills/fsc-digital-origination-bre-stp-eligibility-configure/SKILL.md +122 -0
  268. package/skills/fsc-digital-origination-coordinate/SKILL.md +653 -0
  269. package/skills/fsc-digital-origination-demo-run/SKILL.md +225 -0
  270. package/skills/fsc-digital-origination-execution-guardrails-validate/SKILL.md +112 -0
  271. package/skills/fsc-digital-origination-initial-setup-configure/SKILL.md +396 -0
  272. package/skills/fsc-digital-origination-pricing-setup-coordinate/SKILL.md +336 -0
  273. package/skills/fsc-digital-origination-pricing-setup-data-foundation-create/SKILL.md +208 -0
  274. package/skills/fsc-digital-origination-pricing-setup-procedure-create/SKILL.md +375 -0
  275. package/skills/fsc-digital-origination-product-setup-act1-permissions-assign/SKILL.md +83 -0
  276. package/skills/fsc-digital-origination-product-setup-coordinate/SKILL.md +248 -0
  277. package/skills/fsc-digital-origination-sample-data-create/SKILL.md +206 -0
  278. package/skills/fsc-document-checklist-settings-configure/SKILL.md +57 -0
  279. package/skills/fsc-flexible-hierarchy-configure/SKILL.md +148 -0
  280. package/skills/fsc-flexible-hierarchy-foundation-configure/SKILL.md +1430 -0
  281. package/skills/fsc-flexible-hierarchy-graph-config-create/SKILL.md +471 -0
  282. package/skills/fsc-flexible-hierarchy-rule-based-graph-deploy/SKILL.md +429 -0
  283. package/skills/fsc-pricing-product-configurator-configure/SKILL.md +150 -0
  284. package/skills/fsc-pricing-salesforce-omnistudio-switch/SKILL.md +123 -0
  285. package/skills/fsc-product-act2-catalog-categories-create/SKILL.md +82 -0
  286. package/skills/fsc-product-act3-attributes-create/SKILL.md +249 -0
  287. package/skills/fsc-product-act4-classification-assignment-create/SKILL.md +196 -0
  288. package/skills/fsc-product-act5-considerations-get/SKILL.md +44 -0
  289. package/skills/fsc-stage-management-apex-flow-deploy/SKILL.md +384 -0
  290. package/skills/fsc-stage-management-compliant-data-sharing-configure/SKILL.md +144 -0
  291. package/skills/fsc-stage-management-decision-matrices-create/SKILL.md +107 -0
  292. package/skills/fsc-stage-management-definition-assignments-create/SKILL.md +189 -0
  293. package/skills/fsc-stage-management-definition-create/SKILL.md +108 -0
  294. package/skills/fsc-stage-management-permissions-assign/SKILL.md +143 -0
  295. package/skills/fsc-stage-management-transitions-configure/SKILL.md +139 -0
  296. package/skills/health-cloud-appt-booking-config-configure/SKILL.md +135 -0
  297. package/skills/health-cloud-appt-booking-url-config-configure/SKILL.md +134 -0
  298. package/skills/health-cloud-care-provider-affl-role-config-configure/SKILL.md +136 -0
  299. package/skills/health-cloud-care-provider-search-config-configure/SKILL.md +134 -0
  300. package/skills/health-cloud-care-requests-create/SKILL.md +178 -0
  301. package/skills/health-cloud-initial-configure/SKILL.md +511 -0
  302. package/skills/health-cloud-patient-appointment-scheduling-configure/SKILL.md +1374 -0
  303. package/skills/health-cloud-provider-search-settings-configure/SKILL.md +924 -0
  304. package/skills/health-cloud-referral-management-coordinate/SKILL.md +513 -0
  305. package/skills/health-cloud-timeline-configure/SKILL.md +622 -0
  306. package/skills/health-cloud-virtual-visit-config-configure/SKILL.md +135 -0
  307. package/skills/industries-account-score-settings-query/SKILL.md +78 -0
  308. package/skills/industries-actionable-list-data-sources-dmo-configure/SKILL.md +177 -0
  309. package/skills/industries-ad-product-availability-search/SKILL.md +399 -0
  310. package/skills/industries-advanced-account-forecast-settings-configure/SKILL.md +628 -0
  311. package/skills/industries-advanced-therapy-management-settings-configure/SKILL.md +73 -0
  312. package/skills/industries-atm-settings-starter-configure/SKILL.md +76 -0
  313. package/skills/industries-batch-document-ai-configure/SKILL.md +196 -0
  314. package/skills/industries-behavioral-health-app-settings-configure/SKILL.md +71 -0
  315. package/skills/industries-branch-management-settings-configure/SKILL.md +89 -0
  316. package/skills/industries-bre-decision-table-access-configure/SKILL.md +367 -0
  317. package/skills/industries-brokerage-settings-configure/SKILL.md +41 -0
  318. package/skills/industries-calendar-sync-settings-configure/SKILL.md +89 -0
  319. package/skills/industries-care-request-settings-configure/SKILL.md +218 -0
  320. package/skills/industries-case-management-intelligence-settings-configure/SKILL.md +54 -0
  321. package/skills/industries-catalog-process-attributes-products-configure/SKILL.md +380 -0
  322. package/skills/industries-catalog-process-fulfillment-configure/SKILL.md +216 -0
  323. package/skills/industries-catalog-process-intake-configure/SKILL.md +219 -0
  324. package/skills/industries-catalog-process-knowledge-configure/SKILL.md +153 -0
  325. package/skills/industries-catalog-process-preprocessor-configure/SKILL.md +168 -0
  326. package/skills/industries-cds-general-settings-configure/SKILL.md +69 -0
  327. package/skills/industries-claim-financial-settings-configure/SKILL.md +169 -0
  328. package/skills/industries-clinical-data-model-settings-configure/SKILL.md +136 -0
  329. package/skills/industries-clinical-data-model-settings-starter-configure/SKILL.md +105 -0
  330. package/skills/industries-collection-plan-settings-configure/SKILL.md +132 -0
  331. package/skills/industries-comms-service-console-settings-configure/SKILL.md +159 -0
  332. package/skills/industries-compliance-configure/SKILL.md +102 -0
  333. package/skills/industries-compliance-document-extraction-setup-configure/SKILL.md +76 -0
  334. package/skills/industries-contact-center-app-layout-configure/SKILL.md +88 -0
  335. package/skills/industries-contact-center-components-configure/SKILL.md +96 -0
  336. package/skills/industries-contact-center-path-knowledge-configure/SKILL.md +95 -0
  337. package/skills/industries-contact-center-user-access-assign/SKILL.md +96 -0
  338. package/skills/industries-course-waitlist-config-configure/SKILL.md +162 -0
  339. package/skills/industries-crisis-center-settings-configure/SKILL.md +84 -0
  340. package/skills/industries-custom-object-settings-configure/SKILL.md +94 -0
  341. package/skills/industries-data-cloud-integration-configure/SKILL.md +88 -0
  342. package/skills/industries-data-space-feature-mappings-configure/SKILL.md +245 -0
  343. package/skills/industries-decision-matrix-builder-configure/SKILL.md +78 -0
  344. package/skills/industries-decision-table-hbase-configure/SKILL.md +87 -0
  345. package/skills/industries-decision-table-version-configure/SKILL.md +74 -0
  346. package/skills/industries-decision-tables-builder-configure/SKILL.md +253 -0
  347. package/skills/industries-decision-tables-configure/SKILL.md +439 -0
  348. package/skills/industries-energy-utilities-configure/SKILL.md +251 -0
  349. package/skills/industries-eu-cloud-multisite-configure/SKILL.md +1008 -0
  350. package/skills/industries-eu-new-connections-configure/SKILL.md +30 -0
  351. package/skills/industries-explainability-msg-template-configure/SKILL.md +135 -0
  352. package/skills/industries-expression-set-message-token-configure/SKILL.md +135 -0
  353. package/skills/industries-field-service-settings-configure/SKILL.md +82 -0
  354. package/skills/industries-form-framework-settings-configure/SKILL.md +30 -0
  355. package/skills/industries-fsc-ai-settings-configure/SKILL.md +57 -0
  356. package/skills/industries-fsc-association-engine-settings-configure/SKILL.md +172 -0
  357. package/skills/industries-fsc-b2b-settings-configure/SKILL.md +61 -0
  358. package/skills/industries-fsc-insurance-settings-configure/SKILL.md +58 -0
  359. package/skills/industries-fsc-visa-fulfillment-setup-configure/SKILL.md +103 -0
  360. package/skills/industries-fsc-wealth-agent-settings-configure/SKILL.md +117 -0
  361. package/skills/industries-fsc-wealth-settings-configure/SKILL.md +99 -0
  362. package/skills/industries-fundraising-gift-entry-settings-configure/SKILL.md +120 -0
  363. package/skills/industries-fundraising-rfm-configure/SKILL.md +128 -0
  364. package/skills/industries-fundraising-settings-configure/SKILL.md +145 -0
  365. package/skills/industries-fundraising-source-code-gen-configure/SKILL.md +299 -0
  366. package/skills/industries-google-maps-api-key-settings-configure/SKILL.md +87 -0
  367. package/skills/industries-grantmaking-intelligence-settings-open/SKILL.md +58 -0
  368. package/skills/industries-hc-score-category-settings-configure/SKILL.md +167 -0
  369. package/skills/industries-health-engagement-settings-configure/SKILL.md +218 -0
  370. package/skills/industries-home-health-agentforce-setup-configure/SKILL.md +131 -0
  371. package/skills/industries-home-health-bundling-policy-create/SKILL.md +50 -0
  372. package/skills/industries-home-health-entity-labels-configure/SKILL.md +29 -0
  373. package/skills/industries-home-health-fsl-package-deploy/SKILL.md +71 -0
  374. package/skills/industries-home-health-fsl-settings-validate/SKILL.md +27 -0
  375. package/skills/industries-home-health-guided-setup-care-and-skill-get/SKILL.md +80 -0
  376. package/skills/industries-home-health-guided-setup-configure/SKILL.md +836 -0
  377. package/skills/industries-home-health-guided-setup-enable-org-fsl-get/SKILL.md +55 -0
  378. package/skills/industries-home-health-guided-setup-get-org-ready-get/SKILL.md +61 -0
  379. package/skills/industries-home-health-licenses-assign/SKILL.md +27 -0
  380. package/skills/industries-home-health-operating-hours-create/SKILL.md +40 -0
  381. package/skills/industries-home-health-scheduling-policy-create/SKILL.md +41 -0
  382. package/skills/industries-home-health-service-objective-create/SKILL.md +22 -0
  383. package/skills/industries-home-health-skills-create/SKILL.md +31 -0
  384. package/skills/industries-home-health-users-create/SKILL.md +29 -0
  385. package/skills/industries-icm-act3-toggles-configure/SKILL.md +198 -0
  386. package/skills/industries-icm-act5-genai-suggested-assessments-configure/SKILL.md +361 -0
  387. package/skills/industries-icm-act6-mcg-integration-configure/SKILL.md +550 -0
  388. package/skills/industries-integrated-care-management-configure/SKILL.md +168 -0
  389. package/skills/industries-object-enablement-configure/SKILL.md +86 -0
  390. package/skills/industries-tpm-system-processing-service-configure/SKILL.md +64 -0
  391. package/skills/insurance-brokerage-agency-billing-configure/SKILL.md +1 -3
  392. package/skills/integration-apex-settings-configure/SKILL.md +61 -0
  393. package/skills/marketing-e360-email-archiving-configure/SKILL.md +73 -0
  394. package/skills/marketing-message-test/SKILL.md +1 -3
  395. package/skills/nonprofit-fundraising-configure/SKILL.md +240 -0
  396. package/skills/nonprofit-fundraising-configure/references/gotchas.md +26 -0
  397. package/skills/nonprofit-fundraising-configure/references/mcp-invocation.md +678 -0
  398. package/skills/nonprofit-fundraising-configure/references/permission-targeting.md +35 -0
  399. package/skills/nonprofit-volunteer-management-model-get/SKILL.md +166 -0
  400. package/skills/nonprofit-volunteer-management-model-get/references/entities.md +315 -0
  401. package/skills/nonprofit-volunteer-management-model-get/references/relationships.md +175 -0
  402. package/skills/nonprofit-volunteer-management-model-get/references/themes.md +143 -0
  403. package/skills/nonprofit-volunteer-management-records-create/SKILL.md +121 -0
  404. package/skills/nonprofit-volunteer-management-records-create/references/field-guide.md +284 -0
  405. package/skills/nonprofit-volunteer-management-records-create/references/mcp-invocation.md +248 -0
  406. package/skills/nonprofit-volunteer-management-records-create/references/review-format.md +140 -0
  407. package/skills/nonprofit-volunteer-management-records-create/scripts/expand-series.py +632 -0
  408. package/skills/nonprofit-volunteer-management-records-create/scripts/render-review-table.py +419 -0
  409. package/skills/nonprofit-volunteer-management-records-create/scripts/tests/test_expand_series.py +690 -0
  410. package/skills/nonprofit-volunteer-management-records-create/scripts/tests/test_render_review_table.py +421 -0
  411. package/skills/nonprofit-volunteer-management-structure-generate/SKILL.md +119 -0
  412. package/skills/nonprofit-volunteer-management-structure-generate/references/configuration-decisions.md +159 -0
  413. package/skills/nonprofit-volunteer-management-structure-generate/references/discovery-interview.md +137 -0
  414. package/skills/nonprofit-volunteer-management-structure-generate/references/edge-cases.md +48 -0
  415. package/skills/nonprofit-volunteer-management-structure-generate/references/mcp-invocation.md +75 -0
  416. package/skills/nonprofit-volunteer-management-structure-generate/references/plan-output.md +141 -0
  417. package/skills/platform-custom-field-generate/SKILL.md +1 -0
  418. package/skills/platform-custom-field-generate/references/advanced-picklists.md +5 -5
  419. package/skills/platform-custom-metadata-type-generate/SKILL.md +3 -0
  420. package/skills/platform-custom-object-generate/SKILL.md +4 -0
  421. package/skills/platform-custom-permissions-configure/SKILL.md +687 -0
  422. package/skills/platform-custom-setting-generate/SKILL.md +3 -0
  423. package/skills/platform-datamask-run/SKILL.md +1 -5
  424. package/skills/platform-label-workbench-import-create/SKILL.md +67 -0
  425. package/skills/platform-permission-set-generate/SKILL.md +3 -0
  426. package/skills/platform-privacy-agent-settings-configure/SKILL.md +752 -0
  427. package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +1 -3
  428. package/skills/platform-sandbox-configure/SKILL.md +1 -3
  429. package/skills/platform-value-set-generate/SKILL.md +3 -0
  430. package/skills/sales-call-scoring-configure/SKILL.md +1 -5
  431. package/skills/service-agentforce-channel-configure/SKILL.md +1 -3
  432. package/skills/service-agentforce-human-escalation-configure/SKILL.md +1 -3
  433. package/skills/service-catalog-template-coordinate/SKILL.md +1 -3
  434. package/skills/service-concierge-portal-generate/SKILL.md +1 -3
  435. package/skills/service-email-to-case-configure/SKILL.md +1 -5
  436. package/skills/service-itsm-agentic-setup-agent-runtime-access-assign/SKILL.md +1 -3
  437. package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +1 -3
  438. package/skills/service-itsm-agentic-setup-agentforce-studio-configure/SKILL.md +1 -3
  439. package/skills/service-itsm-agentic-setup-agentforce-studio-validate/SKILL.md +1 -3
  440. package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +1 -3
  441. package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +1 -5
  442. package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +1 -3
  443. package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +1 -3
  444. package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +1 -3
  445. package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +1 -3
  446. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +1 -3
  447. package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +1 -0
  448. package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/SKILL.md +1 -3
  449. package/skills/service-itsm-agentic-setup-uel-user-create/SKILL.md +1 -9
  450. package/skills/service-itsm-incident-mgmt-configure/SKILL.md +1 -5
  451. package/skills/service-itsm-incident-priority-configure/SKILL.md +1 -3
  452. package/skills/service-itsm-slack-itservice-configure/SKILL.md +1 -3
  453. package/skills/service-itsm-swarming-configure/SKILL.md +1 -3
  454. package/skills/service-itsm-teams-configure/SKILL.md +1 -3
  455. package/skills/service-itsm-teams-debug/SKILL.md +1 -3
  456. package/skills/service-itsm-teams-employee-agent-configure/SKILL.md +1 -3
  457. package/skills/service-itsm-teams-itdesk-configure/SKILL.md +1 -3
  458. package/skills/service-itsm-teams-itservice-configure/SKILL.md +1 -3
  459. package/skills/service-native-voice-recording-transcription-configure/SKILL.md +1 -3
  460. package/skills/service-omni-agent-users-create/SKILL.md +1 -3
  461. package/skills/service-omni-agent-work-sharing-configure/SKILL.md +1 -3
  462. package/skills/service-omni-attribute-routing-configure/SKILL.md +1 -3
  463. package/skills/service-omni-base-settings-configure/SKILL.md +1 -3
  464. package/skills/service-omni-channel-inventory-analyze/SKILL.md +1 -3
  465. package/skills/service-omni-channel-limits-analyze/SKILL.md +1 -3
  466. package/skills/service-omni-channel-setup-coordinate/SKILL.md +1 -3
  467. package/skills/service-omni-command-center-analyze/SKILL.md +1 -3
  468. package/skills/service-omni-command-center-configure/SKILL.md +1 -3
  469. package/skills/service-omni-permission-set-assign/SKILL.md +1 -3
  470. package/skills/service-omni-presence-status-deploy/SKILL.md +1 -3
  471. package/skills/service-omni-presence-user-config-deploy/SKILL.md +1 -3
  472. package/skills/service-omni-queue-deploy/SKILL.md +1 -3
  473. package/skills/service-omni-queue-members-assign/SKILL.md +1 -3
  474. package/skills/service-omni-queue-routing-config-deploy/SKILL.md +1 -3
  475. package/skills/service-omni-routing-flow-deploy/SKILL.md +1 -3
  476. package/skills/service-omni-service-channel-configure/SKILL.md +1 -3
  477. package/skills/service-omni-sidebar-configure/SKILL.md +1 -3
  478. package/skills/service-omni-skills-based-routing-configure/SKILL.md +1 -3
  479. package/skills/service-omni-supervisor-config-deploy/SKILL.md +1 -3
  480. package/skills/service-omni-supervisor-permset-assign/SKILL.md +1 -3
  481. package/skills/service-omni-supervisor-surface-deploy/SKILL.md +1 -3
  482. package/skills/service-omni-supervisor-users-create/SKILL.md +1 -3
  483. package/skills/service-omni-work-skill-routing-configure/SKILL.md +1 -3
  484. package/skills/tableau-next-asset-create/README.md +0 -65
@@ -0,0 +1,419 @@
1
+ #!/usr/bin/env python3
2
+ """Render one entity's "Records to insert" review table with a fixed column order.
3
+
4
+ The review table is the user's last look before a write, so a cell that lands under the
5
+ wrong header (a Status value showing under Description) is a real defect, not cosmetics.
6
+ That happens when rows are typed out by hand, cell by cell, and the fields of each record
7
+ arrive in a different order. This script removes the hand step: the agent passes the
8
+ entity's records as data (field -> value + origin tag) and the script prints the markdown
9
+ table. The column order is decided once, for every row:
10
+
11
+ 1. ``Record`` — row number and the record's name;
12
+ 2. the entity's non-lookup fields, in ``references/field-guide.md`` tier order
13
+ (T1, then T2, then T3; ties keep the field guide's row order), then any custom fields;
14
+ 3. lookup fields last, in the same tier order.
15
+
16
+ Field facts (API names, tiers, which fields are lookups, which are schema-required) are read
17
+ from ``references/field-guide.md`` so the table and the field guide can't drift apart.
18
+ Headers are field labels ("Parent Volunteer Initiative"), never API names: a label passed in
19
+ ``labels`` (from a live describe, so an admin rename wins) is used first; otherwise the label
20
+ is spelled out from the field guide's field name.
21
+
22
+ USAGE
23
+ -----
24
+ python3 scripts/render-review-table.py < records.json
25
+ python3 scripts/render-review-table.py --expand < records.json # list grouped rows one by one
26
+
27
+ SPEC (stdin JSON)
28
+ -----------------
29
+ {
30
+ "entity": "JobPosition",
31
+ "records": [
32
+ {"fields": {
33
+ "Name": {"value": "Greeter — Eastside", "origin": "given"},
34
+ "Title": {"value": "Greeter", "origin": "generated"},
35
+ "Status": {"value": "Upcoming", "origin": "default"},
36
+ "VolunteerInitiativeId": {"value": "Food Pantry 2027", "origin": "new"}
37
+ }}
38
+ ],
39
+ "labels": {"VolunteerInitiativeId": "Related Volunteer Initiative"}, # optional
40
+ "requiredCustomFields": ["Region__c"], # optional
41
+ "title": "Records to insert — 12 Job Position Shifts (1 series)" # optional
42
+ }
43
+
44
+ * Fields are keyed by API name (``VolunteerInitiativeId``) or by the field guide's
45
+ relationship name (``VolunteerInitiative``); both resolve to the same column.
46
+ * ``origin`` is one of: given, default, generated, reuse, new, needs-input. A lookup cell
47
+ is tagged ``reuse`` (an existing record) or ``new`` (created this run) and shows the
48
+ referenced record's Name, never an Id. The origin is checked, but only ``reuse`` and
49
+ ``needs-input`` are printed: every other value is reviewed the same way whatever its
50
+ origin.
51
+ * A record may carry ``"label"`` to name its row; otherwise the row uses its ``Name`` value.
52
+ * A required field (schema-required or always-set in the field guide) always gets a column.
53
+ When a record has no value for it the cell shows ``needs-input``. A field that is always
54
+ set but not schema-required (e.g. an Address street) may be left blank on purpose by
55
+ passing it with an empty value and a non-``needs-input`` origin; the cell shows ``—``.
56
+ * An optional field gets a column only when at least one record has a value for it.
57
+ * When every row's label is its ``Name``, the Name column is dropped (the Record cell shows
58
+ the name) so the name isn't printed twice.
59
+ * With more than one row, a column whose cell is the same on every row moves into one
60
+ ``Same on every row: …`` line above the table. A ``needs-input`` column always stays.
61
+ * Consecutive rows whose field cells are all identical collapse into one group row
62
+ (``say "show all N"``); ``--expand`` lists them one by one.
63
+ * ``title`` replaces the default ``Records to insert — N <Object>`` heading — use it when a
64
+ row stands for a whole shift series, so the heading counts shifts, not rows.
65
+
66
+ Exit non-zero with a message on any spec error (unknown entity, a field the field guide
67
+ doesn't document, a system-managed field, a bad origin tag, a raw Id in a lookup cell, ...).
68
+ """
69
+
70
+ import argparse
71
+ import json
72
+ import os
73
+ import re
74
+ import sys
75
+
76
+ HERE = os.path.dirname(os.path.abspath(__file__))
77
+ DEFAULT_FIELD_GUIDE = os.path.join(os.path.dirname(HERE), "references", "field-guide.md")
78
+
79
+ ORIGINS = ("given", "default", "generated", "reuse", "new", "needs-input")
80
+ LOOKUP_ORIGINS = ("reuse", "new")
81
+ NEEDS_INPUT = "needs-input"
82
+ BLANK = "—"
83
+ # Tiers 4 and 5 are system-managed or belong to another feature — never written.
84
+ WRITABLE_TIERS = (1, 2, 3)
85
+
86
+ ENTITY_HEADING = re.compile(r"^###\s+(\w+)\s+—")
87
+ RELATIONSHIP_CELL = re.compile(r"^`(\w+)`\s*\(`(\w+)`\)")
88
+ BACKTICKED = re.compile(r"`(\w+)`")
89
+ # A 15- or 18-character record Id: alphanumeric with several digits. Names rarely look
90
+ # like this; Ids almost always do.
91
+ RECORD_ID = re.compile(r"^[A-Za-z0-9]{15}(?:[A-Za-z0-9]{3})?$")
92
+
93
+
94
+ def fail(msg):
95
+ sys.stderr.write("render-review-table: %s\n" % msg)
96
+ sys.exit(1)
97
+
98
+
99
+ def spell_out(name):
100
+ """``ParentVolunteerInitiative`` -> ``Parent Volunteer Initiative``."""
101
+ if name.endswith("__c"):
102
+ name = name[:-3]
103
+ name = name.replace("_", " ")
104
+ return re.sub(r"(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])", " ", name).strip()
105
+
106
+
107
+ def plural(label):
108
+ if label.endswith("Hours"):
109
+ return label
110
+ if label.endswith("s"):
111
+ return label + "es"
112
+ if label.endswith("y") and label[-2:-1] not in "aeiou":
113
+ return label[:-1] + "ies"
114
+ return label + "s"
115
+
116
+
117
+ def parse_field_guide(path):
118
+ """Return {entity: [field, ...]} in field-guide row order.
119
+
120
+ Each field is a dict: api, name (the field guide's display name), tier, lookup,
121
+ schema_required, order.
122
+ """
123
+ try:
124
+ with open(path, encoding="utf-8") as fh:
125
+ lines = fh.read().splitlines()
126
+ except OSError as e:
127
+ fail("cannot read the field guide at %s: %s" % (path, e))
128
+ entities = {}
129
+ current = None
130
+ for line in lines:
131
+ heading = ENTITY_HEADING.match(line)
132
+ if heading:
133
+ current = heading.group(1)
134
+ entities[current] = []
135
+ continue
136
+ if line.startswith("## "):
137
+ current = None
138
+ continue
139
+ if current is None or not line.startswith("| `"):
140
+ continue
141
+ cells = [c.strip() for c in line.strip().strip("|").split("|")]
142
+ if len(cells) < 4:
143
+ continue
144
+ field_cell, type_cell, req_cell, tier_cell = cells[:4]
145
+ tier_match = re.search(r"T(\d)", tier_cell)
146
+ if not tier_match:
147
+ continue
148
+ tier = int(tier_match.group(1))
149
+ lookup = bool(re.search(r"(?i)lookup|master-detail", type_cell))
150
+ schema_required = req_cell.strip("* ").lower() == "yes"
151
+ rel = RELATIONSHIP_CELL.match(field_cell)
152
+ if rel:
153
+ pairs = [(rel.group(2), rel.group(1))]
154
+ else:
155
+ pairs = [(name, name) for name in BACKTICKED.findall(field_cell)]
156
+ for api, name in pairs:
157
+ entities[current].append({
158
+ "api": api, "name": name, "tier": tier, "lookup": lookup,
159
+ "schema_required": schema_required, "order": len(entities[current]),
160
+ })
161
+ return entities
162
+
163
+
164
+ def resolve_columns(spec, guide):
165
+ entity = spec.get("entity")
166
+ if entity not in guide:
167
+ fail("unknown entity %r — use one documented in field-guide.md (%s)"
168
+ % (entity, ", ".join(sorted(guide))))
169
+ fields = guide[entity]
170
+ by_key = {}
171
+ for f in fields:
172
+ by_key[f["api"]] = f
173
+ by_key[f["name"]] = f
174
+ return entity, fields, by_key
175
+
176
+
177
+ def cell_text(value):
178
+ if isinstance(value, bool):
179
+ return "Yes" if value else "No"
180
+ text = str(value)
181
+ return text.replace("|", "\\|").replace("\n", " ")
182
+
183
+
184
+ def is_empty(value):
185
+ return value is None or (isinstance(value, str) and not value.strip())
186
+
187
+
188
+ def normalize_record(index, record, by_key, custom_required):
189
+ """Return (row_label, {api: (value, origin)}, custom_apis) for one record."""
190
+ if not isinstance(record, dict) or not isinstance(record.get("fields"), dict):
191
+ fail("records[%d] must be an object with a 'fields' map" % index)
192
+ out = {}
193
+ customs = []
194
+ for key, entry in record["fields"].items():
195
+ where = "records[%d].%s" % (index, key)
196
+ if not isinstance(entry, dict) or "origin" not in entry:
197
+ fail("%s must be an object with 'value' and 'origin'" % where)
198
+ origin = entry["origin"]
199
+ if origin not in ORIGINS:
200
+ fail("%s origin %r is not one of %s" % (where, origin, ", ".join(ORIGINS)))
201
+ value = entry.get("value")
202
+ field = by_key.get(key)
203
+ if field is None:
204
+ if not key.endswith("__c"):
205
+ fail("%s is not in field-guide.md for this entity — never assume a field "
206
+ "exists (custom fields end in __c)" % where)
207
+ api = key
208
+ customs.append(api)
209
+ lookup = False
210
+ else:
211
+ api = field["api"]
212
+ lookup = field["lookup"]
213
+ if field["tier"] not in WRITABLE_TIERS:
214
+ fail("%s is system-managed or owned by another feature (tier T%d) — never "
215
+ "set it" % (where, field["tier"]))
216
+ if api in out:
217
+ fail("%s duplicates a field already given for this record" % where)
218
+ if origin != NEEDS_INPUT and not is_empty(value):
219
+ if lookup and origin not in LOOKUP_ORIGINS:
220
+ fail("%s is a lookup — tag it 'reuse' (existing record) or 'new' (created "
221
+ "this run)" % where)
222
+ if not lookup and origin in LOOKUP_ORIGINS:
223
+ fail("%s is not a lookup — 'reuse'/'new' tags are only for lookup cells"
224
+ % where)
225
+ if lookup and isinstance(value, str) and RECORD_ID.match(value) \
226
+ and sum(ch.isdigit() for ch in value) >= 3:
227
+ fail("%s looks like a record Id — show the referenced record's Name; Ids "
228
+ "appear only in the final insert report" % where)
229
+ out[api] = (value, origin)
230
+ label = record.get("label")
231
+ if is_empty(label):
232
+ name = out.get("Name", (None, None))[0]
233
+ label = name if not is_empty(name) else ""
234
+ return str(label), out, customs
235
+
236
+
237
+ def build_table(spec, guide, expand=False):
238
+ entity, fields, by_key = resolve_columns(spec, guide)
239
+ records = spec.get("records")
240
+ if not isinstance(records, list) or not records:
241
+ fail("records must be a non-empty list")
242
+ labels = spec.get("labels") or {}
243
+ if not isinstance(labels, dict):
244
+ fail("labels must be a map of API name -> label")
245
+ custom_required = spec.get("requiredCustomFields") or []
246
+ if not isinstance(custom_required, list) or any(
247
+ not isinstance(c, str) or not c.endswith("__c") for c in custom_required):
248
+ fail("requiredCustomFields must be a list of custom field API names ending in __c")
249
+
250
+ rows = []
251
+ custom_seen = []
252
+ for i, rec in enumerate(records):
253
+ label, values, customs = normalize_record(i, rec, by_key, custom_required)
254
+ rows.append((label, values))
255
+ for c in customs:
256
+ if c not in custom_seen:
257
+ custom_seen.append(c)
258
+ for c in custom_required:
259
+ if c not in custom_seen:
260
+ custom_seen.append(c)
261
+
262
+ def has_value(api):
263
+ return any(api in v and v[api][1] != NEEDS_INPUT for _, v in rows)
264
+
265
+ def required(f):
266
+ return f["schema_required"] or f["tier"] == 1
267
+
268
+ writable = [f for f in fields if f["tier"] in WRITABLE_TIERS]
269
+ plain = sorted((f for f in writable if not f["lookup"]),
270
+ key=lambda f: (f["tier"], f["order"]))
271
+ lookups = sorted((f for f in writable if f["lookup"]),
272
+ key=lambda f: (f["tier"], f["order"]))
273
+ columns = [] # (api, header, required, schema_required)
274
+ for f in plain:
275
+ if required(f) or has_value(f["api"]):
276
+ columns.append((f["api"], labels.get(f["api"]) or spell_out(f["name"]),
277
+ required(f), f["schema_required"]))
278
+ for c in custom_seen:
279
+ if c in custom_required or has_value(c):
280
+ columns.append((c, labels.get(c) or spell_out(c), c in custom_required,
281
+ c in custom_required))
282
+ for f in lookups:
283
+ if required(f) or has_value(f["api"]):
284
+ columns.append((f["api"], labels.get(f["api"]) or spell_out(f["name"]),
285
+ required(f), f["schema_required"]))
286
+
287
+ missing = {} # header -> [row numbers]
288
+
289
+ def render_cell(row_no, values, api, header, is_required, schema_required):
290
+ entry = values.get(api)
291
+ if entry is None or entry[1] == NEEDS_INPUT:
292
+ if is_required:
293
+ missing.setdefault(header, []).append(row_no)
294
+ return "`%s`" % NEEDS_INPUT
295
+ return BLANK
296
+ value, origin = entry
297
+ if is_empty(value):
298
+ if schema_required:
299
+ missing.setdefault(header, []).append(row_no)
300
+ return "`%s`" % NEEDS_INPUT
301
+ return BLANK
302
+ # Only a reused lookup is tagged: it attaches the new records to data already in the
303
+ # org, which the user should notice. Every other value is reviewed the same way
304
+ # whatever its origin, so its tag would only widen the row.
305
+ if origin == "reuse":
306
+ return "%s `reuse`" % cell_text(value)
307
+ return cell_text(value)
308
+
309
+ body = []
310
+ for n, (label, values) in enumerate(rows, 1):
311
+ cells = [render_cell(n, values, *col) for col in columns]
312
+ body.append((n, label, cells))
313
+
314
+ # The row label already shows the Name, so a Name column would repeat it. The label
315
+ # still keeps records with different names from grouping.
316
+ name_dropped = False
317
+ if "Name" in [c[0] for c in columns] and all(
318
+ "Name" in v and v["Name"][1] != NEEDS_INPUT and not is_empty(v["Name"][0])
319
+ and str(v["Name"][0]) == label for label, v in rows):
320
+ name_dropped = True
321
+ idx = [c[0] for c in columns].index("Name")
322
+ columns.pop(idx)
323
+ for _, _, cells in body:
324
+ cells.pop(idx)
325
+
326
+ # A column with the same value on every row is stated once above the table instead of
327
+ # widening every row. A needs-input column stays so the gap is visible on its rows.
328
+ shared = []
329
+ if len(body) > 1:
330
+ keep = []
331
+ for i, col in enumerate(columns):
332
+ first = body[0][2][i]
333
+ if first != "`%s`" % NEEDS_INPUT and all(b[2][i] == first for b in body):
334
+ shared.append("%s %s" % (col[1], first))
335
+ else:
336
+ keep.append(i)
337
+ if shared:
338
+ columns = [columns[i] for i in keep]
339
+ body = [(n, label, [cells[i] for i in keep]) for n, label, cells in body]
340
+
341
+ lines = []
342
+ entity_label = spell_out(entity)
343
+ title = spec.get("title")
344
+ if title is not None and (not isinstance(title, str) or not title.strip()):
345
+ fail("title must be a non-empty string")
346
+ lines.append(title or "Records to insert — %d %s"
347
+ % (len(rows), entity_label if len(rows) == 1 else plural(entity_label)))
348
+ lines.append("")
349
+ if shared:
350
+ lines.append("Same on every row: " + " · ".join(shared))
351
+ lines.append("")
352
+ headers = ["Record"] + [c[1] for c in columns]
353
+ lines.append("| " + " | ".join(headers) + " |")
354
+ lines.append("|" + "|".join("---" for _ in headers) + "|")
355
+
356
+ def record_cell(n, label):
357
+ return "%d · %s" % (n, cell_text(label)) if label else str(n)
358
+
359
+ def same_row(a, b):
360
+ return a[2] == b[2] and (not name_dropped or a[1] == b[1])
361
+
362
+ i = 0
363
+ while i < len(body):
364
+ j = i
365
+ while not expand and j + 1 < len(body) and same_row(body[j + 1], body[i]):
366
+ j += 1
367
+ if j > i:
368
+ size = j - i + 1
369
+ n_first, label, cells = body[i]
370
+ first = "Rows %d–%d" % (n_first, body[j][0])
371
+ if label:
372
+ first += " · %s" % cell_text(label)
373
+ first += " (%d identical — say \"show all %d\")" % (size, size)
374
+ lines.append("| " + " | ".join([first] + cells) + " |")
375
+ else:
376
+ n, label, cells = body[i]
377
+ lines.append("| " + " | ".join([record_cell(n, label)] + cells) + " |")
378
+ i = j + 1
379
+
380
+ rendered = "\n".join(lines)
381
+ notes = []
382
+ if "`reuse`" in rendered:
383
+ notes.append("`reuse` = links to a record already in your org")
384
+ if missing:
385
+ notes.append("`needs-input` = required, still missing")
386
+ lines.append("")
387
+ if notes:
388
+ lines.append(" · ".join(notes))
389
+ if missing:
390
+ parts = ["%s (row%s %s)" % (h, "s" if len(r) > 1 else "", ", ".join(map(str, r)))
391
+ for h, r in missing.items()]
392
+ lines.append("Still needed before this can be written: " + "; ".join(parts))
393
+ return "\n".join(lines) + "\n"
394
+
395
+
396
+ def main():
397
+ ap = argparse.ArgumentParser(description="Render a VM records review table.")
398
+ ap.add_argument("--expand", action="store_true",
399
+ help="list identical rows one by one instead of grouping them")
400
+ ap.add_argument("--field-guide", default=DEFAULT_FIELD_GUIDE,
401
+ help="path to field-guide.md (default: the skill's references copy)")
402
+ args = ap.parse_args()
403
+
404
+ raw = sys.stdin.read()
405
+ if not raw.strip():
406
+ fail("no spec on stdin — pipe a JSON spec (see the module docstring)")
407
+ try:
408
+ spec = json.loads(raw)
409
+ except json.JSONDecodeError as e:
410
+ fail("spec is not valid JSON: %s" % e)
411
+ if not isinstance(spec, dict):
412
+ fail("spec must be a JSON object (got %s)" % type(spec).__name__)
413
+
414
+ guide = parse_field_guide(args.field_guide)
415
+ sys.stdout.write(build_table(spec, guide, expand=args.expand))
416
+
417
+
418
+ if __name__ == "__main__":
419
+ main()