@salesforce/afv-skills 1.37.0 → 1.38.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.
- package/package.json +1 -1
- package/skills/agentforce-generate/README.md +20 -3
- package/skills/agentforce-generate/SKILL.md +253 -440
- package/skills/agentforce-generate/assets/agent-spec-template.md +6 -2
- package/skills/agentforce-generate/assets/agents/order-service.agent +16 -12
- package/skills/agentforce-generate/assets/agents/production-faq.agent +4 -4
- package/skills/agentforce-generate/assets/agents/router-first.agent +5 -5
- package/skills/agentforce-generate/assets/agents/template-single-subagent.agent +4 -4
- package/skills/agentforce-generate/assets/agents/verification-gate.agent +8 -6
- package/skills/agentforce-generate/assets/agents/voice-knowledge-grounded.agent +9 -9
- package/skills/agentforce-generate/assets/agents/voice-service-agent.agent +7 -7
- package/skills/agentforce-generate/assets/patterns/README.md +3 -3
- package/skills/agentforce-generate/assets/patterns/action-callbacks.agent +5 -5
- package/skills/agentforce-generate/assets/patterns/advanced-input-bindings.agent +6 -8
- package/skills/agentforce-generate/assets/patterns/bidirectional-routing.agent +11 -13
- package/skills/agentforce-generate/assets/patterns/critical-input-collection.agent +11 -16
- package/skills/agentforce-generate/assets/patterns/lifecycle-events.agent +2 -3
- package/skills/agentforce-generate/assets/patterns/llm-controlled-actions.agent +6 -7
- package/skills/agentforce-generate/assets/patterns/open-gate-routing.agent +3 -3
- package/skills/agentforce-generate/assets/patterns/prompt-template-action.agent +14 -19
- package/skills/agentforce-generate/assets/patterns/system-instruction-overrides.agent +11 -20
- package/skills/agentforce-generate/references/actions-reference.md +2 -2
- package/skills/agentforce-generate/references/agent-audit-and-repair.md +135 -0
- package/skills/agentforce-generate/references/agent-audit-candidate-verification.md +160 -0
- package/skills/agentforce-generate/references/agent-audit-diagnostic-catalog.md +156 -0
- package/skills/agentforce-generate/references/agent-audit-diagnostics-actions-state.md +176 -0
- package/skills/agentforce-generate/references/agent-audit-diagnostics-architecture-evaluation.md +68 -0
- package/skills/agentforce-generate/references/agent-audit-diagnostics-instructions-routing.md +283 -0
- package/skills/agentforce-generate/references/agent-audit-evaluation-loop.md +191 -0
- package/skills/agentforce-generate/references/agent-audit-repair-report.md +143 -0
- package/skills/agentforce-generate/references/agent-audit-scope-path-review.md +180 -0
- package/skills/agentforce-generate/references/agent-design-and-spec-creation.md +105 -59
- package/skills/agentforce-generate/references/agent-script-core-language.md +144 -61
- package/skills/agentforce-generate/references/agent-subagent-map-diagrams.md +33 -23
- package/skills/agentforce-generate/references/agent-validation-and-debugging.md +37 -11
- package/skills/agentforce-generate/references/agentscript-toolchain.md +112 -0
- package/skills/agentforce-generate/references/architecture-patterns.md +81 -18
- package/skills/agentforce-generate/references/common-control-flow-pitfalls.md +255 -0
- package/skills/agentforce-generate/references/control-flow-actions-sequencing.md +198 -0
- package/skills/agentforce-generate/references/control-flow-lifecycle-side-effects.md +87 -0
- package/skills/agentforce-generate/references/examples.md +22 -22
- package/skills/agentforce-generate/references/instruction-resolution.md +123 -83
- package/skills/agentforce-generate/references/known-issues.md +1 -2
- package/skills/agentforce-generate/references/optimization-pattern-1-data-flow.md +4 -0
- package/skills/agentforce-generate/references/optimization-pattern-2-deterministic-logic.md +33 -0
- package/skills/agentforce-generate/references/optimization-pattern-3-reference-syntax.md +32 -3
- package/skills/agentforce-generate/references/optimization-pattern-4-escalation.md +2 -2
- package/skills/agentforce-generate/references/patterns-by-requirement.md +3 -1
- package/skills/agentforce-generate/references/posture-and-determinism.md +103 -22
- package/skills/agentforce-generate/references/reference-map.md +19 -3
- package/skills/agentforce-generate/references/scoring-rubric.md +1 -1
- package/skills/agentforce-generate/references/voice-latency-heuristics.md +4 -0
- package/skills/agentforce-generate/references/voice-modality-reference.md +4 -4
- package/skills/agentforce-generate/references/zen-of-agentscript.md +139 -23
- package/skills/agentforce-generate/scripts/agentscript-sdk-loader.mjs +133 -0
- package/skills/agentforce-generate/scripts/index-agent.mjs +141 -0
- package/skills/agentforce-generate/scripts/setup-agentscript-sdk.mjs +337 -0
- package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +1 -1
- package/skills/automation-sandbox-post-copy-configure/SKILL.md +433 -0
- package/skills/automation-sandbox-post-copy-configure/assets/api_request_templates.json +89 -0
- package/skills/automation-sandbox-post-copy-configure/examples/sample_config_input.json +40 -0
- package/skills/automation-sandbox-post-copy-configure/examples/sample_execution_summary.md +79 -0
- package/skills/automation-sandbox-post-copy-configure/references/api_endpoints.md +273 -0
- package/skills/automation-sandbox-post-copy-configure/references/authentication.md +94 -0
- package/skills/automation-sandbox-post-copy-configure/references/execution_phasing.md +93 -0
- package/skills/automation-sandbox-post-copy-configure/references/rules_gotchas.md +35 -0
- package/skills/automation-sandbox-post-copy-configure/scripts/classify-patch-result.mjs +88 -0
- package/skills/automation-sandbox-post-copy-configure/scripts/map-metadata-key.mjs +98 -0
- package/skills/automation-sandbox-post-copy-configure/scripts/plan-phases.mjs +98 -0
- package/skills/automation-sandbox-post-copy-configure/scripts/resolve-target-org.mjs +56 -0
- package/skills/design-systems-slds-validate/SKILL.md +14 -13
- package/skills/dx-code-analyzer-custom-rule-create/examples/xpath-examples.md +1 -1
- package/skills/dx-code-analyzer-custom-rule-create/references/xpath-patterns-security.md +1 -1
- package/skills/dx-org-devhub-configure/SKILL.md +268 -0
- package/skills/dx-org-devhub-configure/examples/status-output.md +39 -0
- package/skills/dx-org-devhub-configure/scripts/devhub.sh +650 -0
- package/skills/dx-org-devhub-configure/scripts/test-devhub.sh +116 -0
- package/skills/dx-org-manage/SKILL.md +135 -42
- package/skills/dx-org-manage/assets/derive-alias.sh +95 -0
- package/skills/dx-org-manage/assets/scratch-def.seed.json +6 -0
- package/skills/dx-org-manage/examples/README.md +1 -1
- package/skills/dx-org-manage/examples/scratch-orgs/delete_output.json +8 -0
- package/skills/dx-org-manage/examples/scratch-orgs/display_output.json +23 -0
- package/skills/dx-org-manage/examples/scratch-orgs/list_output.json +58 -0
- package/skills/dx-org-manage/examples/scratch-orgs/resume_output.json +38 -0
- package/skills/dx-org-manage/examples/scratch-orgs/success_definition_file.json +1 -1
- package/skills/dx-org-manage/examples/scratch-orgs/success_edition.json +1 -1
- package/skills/dx-org-manage/examples/scratch-orgs/success_shape.json +41 -0
- package/skills/dx-org-manage/examples/scratch-orgs/success_snapshot.json +1 -1
- package/skills/dx-org-manage/examples/snapshots/error_output.json +3 -3
- package/skills/dx-org-manage/references/creating-scratch-org.md +2 -2
- package/skills/dx-org-manage/references/creating-snapshot.md +1 -2
- package/skills/dx-org-manage/references/definition_file_options.md +24 -0
- package/skills/dx-org-manage/references/edition_types.md +10 -8
- package/skills/dx-org-manage/references/opening-org.md +11 -12
- package/skills/dx-org-manage/references/scratch-org-create.md +303 -0
- package/skills/dx-org-manage/references/scratch-org-operations.md +135 -0
- package/skills/experience-aura-lwc-migrate/SKILL.md +120 -0
- package/skills/experience-aura-lwc-migrate/references/aura-api-expert.md +170 -0
- package/skills/experience-aura-lwc-migrate/references/aura-data-expert.md +172 -0
- package/skills/experience-aura-lwc-migrate/references/aura-migration-guidelines.md +299 -0
- package/skills/experience-aura-lwc-migrate/references/aura-prd-framework.md +79 -0
- package/skills/experience-aura-lwc-migrate/references/aura-redundant-code-expert.md +24 -0
- package/skills/experience-aura-lwc-migrate/references/aura-reference-expert.md +140 -0
- package/skills/experience-aura-lwc-migrate/references/aura-resolver-expert.md +115 -0
- package/skills/experience-aura-lwc-migrate/references/aura-slots-expert.md +67 -0
- package/skills/experience-aura-lwc-migrate/references/aura-style-expert.md +62 -0
- package/skills/experience-aura-lwc-migrate/references/aura-to-lwc-completeness-checklist.md +188 -0
- package/skills/experience-aura-lwc-migrate/references/aura-values-expert.md +67 -0
- package/skills/experience-content-media-search/SKILL.md +17 -12
- package/skills/experience-content-media-stock-image-search/SKILL.md +192 -0
- package/skills/experience-content-media-stock-image-search/scripts/download-stock-image.py +102 -0
- package/skills/experience-lds-best-practices-apply/SKILL.md +245 -0
- package/skills/experience-lds-best-practices-apply/references/adapter-apis.md +1640 -0
- package/skills/experience-lds-best-practices-apply/references/lds-data-consistency.md +126 -0
- package/skills/experience-lds-best-practices-apply/references/lds-expert.md +429 -0
- package/skills/experience-lds-best-practices-apply/references/lds-referential-integrity.md +322 -0
- package/skills/experience-lds-best-practices-apply/references/wire-adapter-types.md +1511 -0
- package/skills/experience-lds-graphql-generate/SKILL.md +222 -0
- package/skills/experience-lds-graphql-generate/references/generation-guide.md +236 -0
- package/skills/experience-lds-graphql-generate/references/generation-mutation.md +277 -0
- package/skills/experience-lds-graphql-generate/references/generation-query.md +237 -0
- package/skills/experience-lds-graphql-generate/scripts/fetch-lds-graphql-schema.sh +230 -0
- package/skills/experience-lds-graphql-generate/scripts/test-lds-graphql-query.sh +128 -0
- package/skills/experience-lwc-accessibility-validate/SKILL.md +112 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-1-1-1-non-text-content.md +88 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-1-3-1-i-lists.md +52 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-1-3-1-ii-tables.md +106 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-1-3-1-iii-form-labels.md +78 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-1-3-1-iv-regions.md +26 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-1-3-1-v-groups.md +66 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-1-3-5-identify-input.md +70 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-1-4-3-contrast.md +115 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-2-1-1-keyboard.md +47 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-2-4-4-link-purpose.md +39 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-2-4-6-headings-labels.md +50 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-2-5-1-pointer-gestures.md +54 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-2-5-2-pointer-cancellation.md +49 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-2-5-3-label-in-name.md +77 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-2-5-7-dragging-movement.md +45 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-3-2-1-on-focus.md +55 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-3-2-2-on-input.md +51 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-3-3-1-error-identification.md +84 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-3-3-2-labels-instructions.md +50 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-3-3-3-error-suggestion.md +64 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-4-1-2-i-name.md +105 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-4-1-2-ii-role.md +99 -0
- package/skills/experience-lwc-accessibility-validate/references/reviewers/sc-4-1-2-iii-value.md +97 -0
- package/skills/experience-lwc-accessibility-validate/references/vision/sc-1-1-1-non-text-content.md +83 -0
- package/skills/experience-lwc-accessibility-validate/references/vision/sc-1-4-1-use-of-color.md +62 -0
- package/skills/experience-lwc-accessibility-validate/references/vision/sc-1-4-10-resize-reflow.md +18 -0
- package/skills/experience-lwc-accessibility-validate/references/vision/sc-1-4-11-non-text-contrast.md +43 -0
- package/skills/experience-lwc-accessibility-validate/references/vision/sc-1-4-3-contrast.md +25 -0
- package/skills/experience-lwc-accessibility-validate/scripts/contrast-ratio.py +153 -0
- package/skills/experience-lwc-design-generate/SKILL.md +261 -0
- package/skills/experience-lwc-design-generate/references/figma-to-prd-blueprint.md +66 -0
- package/skills/experience-lwc-design-generate/references/prd-analysis-template.md +17 -0
- package/skills/experience-lwc-design-generate/scripts/check-component-name.sh +75 -0
- package/skills/experience-lwc-design-generate/scripts/detect-project-tools.sh +97 -0
- package/skills/experience-lwc-runtime-observe/SKILL.md +244 -0
- package/skills/experience-lwc-runtime-observe/examples/component-preview-and-dom.md +41 -0
- package/skills/experience-lwc-runtime-observe/scripts/extract-dom.sh +79 -0
- package/skills/experience-lwc-runtime-observe/scripts/open-frontdoor.sh +46 -0
- package/skills/experience-lwc-runtime-observe/scripts/verify-toolchain.sh +48 -0
- package/skills/experience-lwc-security-validate/SKILL.md +151 -0
- package/skills/experience-lwc-security-validate/examples/review-report.md +6 -0
- package/skills/experience-lwc-security-validate/examples/score-report.sarif.json +32 -0
- package/skills/experience-lwc-security-validate/references/lws-security-expert.md +986 -0
- package/skills/experience-lwc-security-validate/references/security-analysis.md +611 -0
- package/skills/experience-lwc-security-validate/scripts/check-lwc-import.sh +166 -0
- package/skills/experience-lwc-security-validate/scripts/validate-sarif.sh +131 -0
- package/skills/experience-ui-bundle-2gp-deploy/SKILL.md +454 -0
- package/skills/experience-ui-bundle-2gp-deploy/assets/CustomApplication.app-meta.xml +12 -0
- package/skills/experience-ui-bundle-2gp-deploy/assets/PermissionSet.permissionset-meta.xml +9 -0
- package/skills/experience-ui-bundle-2gp-deploy/scripts/find-bundle-package-dir.sh +53 -0
- package/skills/experience-ui-bundle-agentforce-client-generate/SKILL.md +104 -26
- package/skills/experience-ui-bundle-agentforce-client-generate/references/constraints.md +35 -24
- package/skills/experience-ui-bundle-agentforce-client-generate/references/examples.md +92 -1
- package/skills/experience-ui-bundle-agentforce-client-generate/references/style-tokens.md +2 -0
- package/skills/experience-ui-bundle-agentforce-client-generate/references/troubleshooting.md +14 -1
- package/skills/experience-ui-bundle-agentforce-client-generate/scripts/detect-framework.sh +67 -0
- package/skills/experience-ui-bundle-deploy/SKILL.md +83 -14
- package/skills/experience-ui-bundle-deploy/assets/Communities.settings-meta.xml +19 -0
- package/skills/experience-ui-bundle-deploy/assets/org-setup.config.template.json +5 -0
- package/skills/experience-ui-bundle-deploy/assets/social-login-auth-providers.apex +158 -0
- package/skills/experience-ui-bundle-deploy/references/config-scaffold.md +13 -1
- package/skills/experience-ui-bundle-deploy/references/social-login.md +179 -0
- package/skills/experience-ui-bundle-frontend-generate/SKILL.md +14 -0
- package/skills/experience-ui-bundle-mfa-configure/SKILL.md +6 -5
- package/skills/experience-ui-bundle-mfa-configure/references/social-login.md +15 -7
- package/skills/experience-ui-bundle-salesforce-data-access/SKILL.md +41 -5
- package/skills/experience-ui-bundle-salesforce-data-access/references/caching.md +10 -22
- package/skills/experience-ui-bundle-salesforce-data-access/references/graphql-hand-authoring.md +4 -19
- package/skills/experience-ui-bundle-salesforce-data-access/references/migration.md +5 -0
- package/skills/experience-ui-bundle-salesforce-data-access/references/sdk-api.md +33 -150
- package/skills/mobile-platform-native-capabilities-integrate/references/nfc.md +35 -0
- package/skills/platform-apex-generate/SKILL.md +8 -7
- package/skills/platform-apex-test-generate/SKILL.md +3 -1
- package/skills/platform-apex-test-run/SKILL.md +9 -8
- package/skills/platform-lightning-type-widget-coordinate/SKILL.md +1 -1
- package/skills/platform-lightning-type-widget-coordinate/examples/existing-lightning-type-with-widget-prompt.md +1 -1
- package/skills/platform-lightning-type-widget-coordinate/examples/new-lightning-type-with-widget-prompt.md +1 -1
- package/skills/platform-lightning-type-widget-coordinate/references/validation-gates.md +3 -3
- package/skills/platform-mcp-tool-widget-coordinate/SKILL.md +43 -67
- package/skills/platform-mcp-tool-widget-coordinate/examples/action-name-source-prompt.md +1 -2
- package/skills/platform-mcp-tool-widget-coordinate/examples/apex-invocable-source-prompt.md +2 -3
- package/skills/platform-mcp-tool-widget-coordinate/examples/nested-object-list-source-prompt.md +163 -0
- package/skills/platform-mcp-tool-widget-coordinate/examples/nested-object-single-source-prompt.md +198 -0
- package/skills/platform-mcp-tool-widget-coordinate/examples/pasted-tool-output-prompt.md +0 -1
- package/skills/platform-mcp-tool-widget-coordinate/references/build-plan-format.md +17 -11
- package/skills/platform-mcp-tool-widget-coordinate/references/mcp-tool-output-discovery.md +48 -15
- package/skills/platform-mcp-tool-widget-coordinate/references/two-clt-modeling.md +73 -10
- package/skills/platform-mcp-tool-widget-coordinate/references/validation-gates.md +48 -8
- package/skills/platform-policy-rule-generate/SKILL.md +22 -12
- package/skills/platform-policy-rule-generate/references/deploy-errors.md +1 -1
- package/skills/platform-policy-rule-generate/references/policy-schema-full.md +8 -29
- package/skills/platform-policy-rule-generate/references/templates-advanced.md +1 -1
- package/skills/platform-sharing-owd-configure/SKILL.md +20 -8
- package/skills/platform-sharing-owd-configure/references/access_levels.md +14 -1
- package/skills/platform-sharing-rules-generate/SKILL.md +67 -35
- package/skills/platform-sharing-rules-generate/examples/create-cases.md +16 -17
- package/skills/platform-sharing-rules-generate/examples/delete-cases.md +34 -79
- package/skills/platform-sharing-rules-generate/examples/edit-cases.md +13 -26
- package/skills/platform-sharing-rules-generate/scripts/count-remaining-rules.sh +33 -0
- package/skills/platform-widget-generate/SKILL.md +3 -5
- package/skills/platform-widget-generate/examples/conditional.json +18 -13
- package/skills/platform-widget-generate/examples/list-with-foreach.json +2 -2
- package/skills/platform-widget-generate/examples/single-object.json +2 -2
- package/skills/platform-widget-generate/references/schema-from-lightning-type.md +27 -6
- package/skills/platform-widget-generate/references/widget-bundle-layout.md +4 -3
- package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +287 -0
- package/skills/service-itsm-agentic-setup-cmdb-access-assign/references/mcp-invocation.md +260 -0
- package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +252 -0
- package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/references/mcp-invocation.md +204 -0
- package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +259 -0
- package/skills/service-itsm-agentic-setup-cmdb-configure/references/mcp-invocation.md +188 -0
- package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +197 -0
- package/skills/service-itsm-agentic-setup-cmdb-coordinate/examples/output-templates.md +77 -0
- package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +316 -0
- package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/references/mcp-invocation.md +221 -0
- package/skills/service-itsm-incident-priority-configure/SKILL.md +168 -0
- package/skills/service-itsm-incident-priority-configure/examples/matrix-operations.md +200 -0
- package/skills/service-itsm-incident-priority-configure/examples/render-matrix.md +54 -0
- package/skills/service-itsm-incident-priority-configure/examples/seed-full-matrix.md +52 -0
- package/skills/service-itsm-incident-priority-configure/references/sf-cli-invocation.md +264 -0
- package/skills/platform-mcp-tool-widget-coordinate/examples/nested-object-source-prompt.md +0 -191
- package/skills/platform-policy-rule-generate/references/fixtures-index.md +0 -29
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# MCP Invocation Reference — CMDB User Access (Layer 3)
|
|
2
|
+
|
|
3
|
+
Every operation dispatches through the **Salesforce-hosted `headless-360`** MCP server, which exposes
|
|
4
|
+
four meta-tools:
|
|
5
|
+
|
|
6
|
+
- `mcp__headless-360__discover(query)` — semantic search over the indexed operation catalog
|
|
7
|
+
- `mcp__headless-360__describe(id)` — pull the schema and canonical route for one operation
|
|
8
|
+
- `mcp__headless-360__dispatch_readonly({url, method, queryParams?, body?})` — GET / read-only HTTP
|
|
9
|
+
- `mcp__headless-360__dispatch({url, method, body?, queryParams?})` — POST / PATCH / DELETE HTTP
|
|
10
|
+
|
|
11
|
+
**Dispatch takes raw HTTP**, not `{operation_id, arguments}`. Give it the full `url`
|
|
12
|
+
(`/services/data/v67.0/...`), `method`, optional `body`, and optional `queryParams` (camelCase — the
|
|
13
|
+
tool rejects `query_params`) — the server signs the request with the JWT bound to the current MCP
|
|
14
|
+
session and forwards it to the org. The skill never handles credentials or an org alias — everything
|
|
15
|
+
is derived from the session.
|
|
16
|
+
|
|
17
|
+
**A `discover` miss does NOT mean the route is absent.** The standard `/query` and `/sobjects/...`
|
|
18
|
+
REST routes this skill uses are not always ranked first (or indexed) in the discovery corpus —
|
|
19
|
+
`describe` on the canonical operation still returns the schema, and `dispatch*` on the exact path
|
|
20
|
+
still works. Only if the GET/POST itself returns 404 should you treat the route as unavailable on this
|
|
21
|
+
org.
|
|
22
|
+
|
|
23
|
+
## Response envelope
|
|
24
|
+
|
|
25
|
+
The `/query` and `/sobjects/…` REST endpoints are **standard REST** — the `dispatch*` tool returns the
|
|
26
|
+
REST response singly wrapped:
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{ "status_code": 200, "body": { "totalSize": 1, "records": [ { "Id": "0PS..." } ] } }
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Read the relevant field from `body`. (Only `/headless/invoke/…` Aura-controller routes are doubly
|
|
33
|
+
wrapped as `body.body`; this skill uses none.) Status codes: `200` read success; `201` record created;
|
|
34
|
+
`400` bad body or a business-rule rejection — read `body[0].errorCode` (e.g. `DUPLICATE_VALUE`); `403
|
|
35
|
+
FUNCTIONALITY_NOT_ENABLED` the CMDB gate is closed (the org feature is not enabled, or this user has
|
|
36
|
+
no CMDB access yet); `404` the endpoint/impl is not present on this org; `500` a downstream dependency
|
|
37
|
+
issue. Minimum API version is **67.0** — `headless-360` currently only routes `v67.0+`.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Discovery — optional, for confirmation
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
mcp__headless-360__discover(query="permission set assignment")
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`discover` returns matching operation ids; pipe one into `describe` to pull its input schema and
|
|
48
|
+
canonical route:
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
mcp__headless-360__describe(id="<operation id from discover>")
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The `/query` and `/sobjects/...` routes this skill uses are standard REST — if `discover` returns
|
|
55
|
+
nothing, dispatch the exact paths below directly; only treat a route as unavailable if the dispatch
|
|
56
|
+
itself 404s.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## The four CMDB permission sets
|
|
61
|
+
|
|
62
|
+
| Role | PermissionSet `Name` | Backing PSL `DeveloperName` |
|
|
63
|
+
|------|----------------------|-----------------------------|
|
|
64
|
+
| Reader | `ItSrvcCnfgItmReadPermissionSet` | `ItSrvcCnfgItmReadPsl` |
|
|
65
|
+
| Owner | `ItSrvcCnfgItmOwnerPermissionSet` | `ItSrvcCnfgItmOwnerPsl` |
|
|
66
|
+
| Type Reader | `ItSrvcCnfgItmTypReadPermissionSet` | `ItSrvcCnfgItmTypReadPsl` |
|
|
67
|
+
| Type Manager | `ItSrvcCnfgItmTypManagerPermissionSet` | `ItSrvcCnfgItmTypMgrPsl` |
|
|
68
|
+
|
|
69
|
+
Resolve the permission set's `Id` and its `LicenseId` at runtime (Step 3) rather than hardcoding IDs —
|
|
70
|
+
IDs differ per org.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Step 1 — Confirm the org feature is enabled (read, prerequisite)
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
mcp__headless-360__dispatch_readonly({
|
|
78
|
+
"url": "/services/data/v67.0/connect/setup/discovery/feature/service-cloud-itsm-cmdb-integration/status",
|
|
79
|
+
"method": "GET"
|
|
80
|
+
})
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Response: `{ apiName, status, enableBlockedReasons, ... }`. Proceed only when `status == ENABLED`. A
|
|
84
|
+
`403 FUNCTIONALITY_NOT_ENABLED` here means the org gate is not lifted — stop and route the user to the
|
|
85
|
+
feature-enable skill. User-level access assignment has no effect until this is `ENABLED`.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Step 2 — Resolve the target user (read)
|
|
90
|
+
|
|
91
|
+
### Resolve "the current user" / "me" / "my own user" — use the API-root identity URL
|
|
92
|
+
|
|
93
|
+
Do **NOT** use `USER_ID()` (Apex-only — the REST query API rejects it with `MALFORMED_QUERY`), and do
|
|
94
|
+
**NOT** depend on `/chatter/users/me` or `/connect/user-profiles/me` (they return `403
|
|
95
|
+
FUNCTIONALITY_NOT_ENABLED` on orgs where Chatter/Communities are off). The always-available path is the
|
|
96
|
+
API root, whose `identity` field carries the running user's Id:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
mcp__headless-360__dispatch_readonly({
|
|
100
|
+
"url": "/services/data/v67.0/",
|
|
101
|
+
"method": "GET"
|
|
102
|
+
})
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Response `body.identity` is a URL like
|
|
106
|
+
`https://login.../id/<orgId>/005SB00000jbY2QYAU` — the **last path segment** is the current user Id
|
|
107
|
+
(18 chars, starts with `005`). Use it directly as `AssigneeId`, or confirm it:
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
mcp__headless-360__dispatch_readonly({
|
|
111
|
+
"url": "/services/data/v67.0/query",
|
|
112
|
+
"method": "GET",
|
|
113
|
+
"queryParams": { "q": "SELECT Id, Username, Name, IsActive FROM User WHERE Id = '<userId>'" }
|
|
114
|
+
})
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Resolve a named user (username / email supplied)
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
mcp__headless-360__dispatch_readonly({
|
|
121
|
+
"url": "/services/data/v67.0/query",
|
|
122
|
+
"method": "GET",
|
|
123
|
+
"queryParams": { "q": "SELECT Id, Username, Name, IsActive FROM User WHERE Username = '<username>'" }
|
|
124
|
+
})
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
- `totalSize == 1` → capture `records[0].Id`.
|
|
128
|
+
- `totalSize == 0` → no such user; ask the user to confirm the username.
|
|
129
|
+
- `totalSize > 1` → ambiguous; list `Name` + `Username` and ask which one.
|
|
130
|
+
|
|
131
|
+
Escape single quotes in any user-supplied value.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Step 3 — Resolve each requested permission set (read)
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
mcp__headless-360__dispatch_readonly({
|
|
139
|
+
"url": "/services/data/v67.0/query",
|
|
140
|
+
"method": "GET",
|
|
141
|
+
"queryParams": { "q": "SELECT Id, Name, LicenseId FROM PermissionSet WHERE Name = 'ItSrvcCnfgItmReadPermissionSet'" }
|
|
142
|
+
})
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Capture `records[0].Id` (permission set) and `records[0].LicenseId` (the PSL to assign). Repeat per
|
|
146
|
+
requested role, or use `Name IN (...)` to resolve several at once. `totalSize == 0` for a role means
|
|
147
|
+
the org is not CMDB-licensed — stop and report.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Step 4 — Check existing assignments (read — idempotency)
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
mcp__headless-360__dispatch_readonly({
|
|
155
|
+
"url": "/services/data/v67.0/query",
|
|
156
|
+
"method": "GET",
|
|
157
|
+
"queryParams": { "q": "SELECT Id FROM PermissionSetAssignment WHERE AssigneeId = '<userId>' AND PermissionSetId = '<psId>'" }
|
|
158
|
+
})
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
mcp__headless-360__dispatch_readonly({
|
|
163
|
+
"url": "/services/data/v67.0/query",
|
|
164
|
+
"method": "GET",
|
|
165
|
+
"queryParams": { "q": "SELECT Id FROM PermissionSetLicenseAssign WHERE AssigneeId = '<userId>' AND PermissionSetLicenseId = '<pslId>'" }
|
|
166
|
+
})
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
`totalSize == 1` on both → that role is already assigned; skip its writes. Otherwise assign what is
|
|
170
|
+
missing (PSL and/or permission set).
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Step 5 — Assign the license, then the permission set (write — confirm first)
|
|
175
|
+
|
|
176
|
+
### Assign the permission-set license first
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
mcp__headless-360__dispatch({
|
|
180
|
+
"url": "/services/data/v67.0/sobjects/PermissionSetLicenseAssign",
|
|
181
|
+
"method": "POST",
|
|
182
|
+
"body": { "AssigneeId": "<userId>", "PermissionSetLicenseId": "<pslId>" }
|
|
183
|
+
})
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Then assign the permission set
|
|
187
|
+
|
|
188
|
+
```json
|
|
189
|
+
mcp__headless-360__dispatch({
|
|
190
|
+
"url": "/services/data/v67.0/sobjects/PermissionSetAssignment",
|
|
191
|
+
"method": "POST",
|
|
192
|
+
"body": { "AssigneeId": "<userId>", "PermissionSetId": "<psId>" }
|
|
193
|
+
})
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Response on success: `{ "id": "0Pa...", "success": true }` (`201`). On `400`, read
|
|
197
|
+
`body[0].errorCode`:
|
|
198
|
+
|
|
199
|
+
- `DUPLICATE_VALUE` → the user already has it; treat as already-assigned success.
|
|
200
|
+
- a limit/seat error → the CMDB license has no free seats (see the seat query below); stop for that
|
|
201
|
+
role and report. Do not retry.
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Step 6 — Verify (read)
|
|
206
|
+
|
|
207
|
+
Re-run the Step 4 queries. A role counts as assigned only when **both** the `PermissionSetAssignment`
|
|
208
|
+
and the `PermissionSetLicenseAssign` return `totalSize == 1` for the user. Report per role.
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## License-seat query (for seat-exhaustion errors)
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
mcp__headless-360__dispatch_readonly({
|
|
216
|
+
"url": "/services/data/v67.0/query",
|
|
217
|
+
"method": "GET",
|
|
218
|
+
"queryParams": { "q": "SELECT DeveloperName, TotalLicenses, UsedLicenses FROM PermissionSetLicense WHERE DeveloperName = 'ItSrvcCnfgItmReadPsl'" }
|
|
219
|
+
})
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
`UsedLicenses == TotalLicenses` → no free seats; a seat must be released (or more licenses added)
|
|
223
|
+
before the assignment can succeed.
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Idempotency
|
|
228
|
+
|
|
229
|
+
- Every read (Steps 1–4, 6) is safe to repeat.
|
|
230
|
+
- Assignment (Step 5) is per-user: if the user already holds the permission set / license, the POST
|
|
231
|
+
returns `400 DUPLICATE_VALUE` — treat as already-assigned, not a failure. Always run Step 4 first so
|
|
232
|
+
you only POST what is missing.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Dead ends — do NOT do these
|
|
237
|
+
|
|
238
|
+
- **Do NOT:** assign the permission set without its license — a license-backed permission set will not
|
|
239
|
+
take effect (or the assign is rejected) unless the user holds the backing PSL seat.
|
|
240
|
+
- **Do NOT:** create or edit a permission set to grant CMDB access — the four standard CMDB permission
|
|
241
|
+
sets already exist in a licensed org; this skill only assigns them.
|
|
242
|
+
- **Do NOT:** assign CMDB access to work around a closed org gate — if the feature status is not
|
|
243
|
+
`ENABLED`, user access is inert; enable the feature first (separate skill).
|
|
244
|
+
- **Do NOT:** retry a POST that failed with a seat/limit error — the seat shortage is real; surface it.
|
|
245
|
+
- **Do NOT:** pass `dispatch` the `{operation_id, arguments}` shape — it takes raw HTTP
|
|
246
|
+
(`{url, method, body?, queryParams?}`).
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Error table
|
|
251
|
+
|
|
252
|
+
| Status / code | Meaning | Resolution |
|
|
253
|
+
|---------------|---------|------------|
|
|
254
|
+
| Feature `status != ENABLED` / `403` on the status read | Org-level CMDB gate not lifted | Enable the CMDB feature for the org first (feature-enable skill), then return |
|
|
255
|
+
| `400 DUPLICATE_VALUE` on assign | User already has that access | Idempotent success — report the role as already assigned |
|
|
256
|
+
| `400` seat/limit error on assign | CMDB permission-set license seats exhausted | Report used vs total seats; free a seat or add licenses, then retry |
|
|
257
|
+
| `PermissionSet` query `totalSize == 0` | Org not CMDB-licensed / not set up | CMDB is not available on this org; confirm it is licensed and enabled |
|
|
258
|
+
| `User` query `totalSize == 0` / `> 1` | User not found / ambiguous | Ask the user to confirm the username, or pick from the listed candidates |
|
|
259
|
+
| `403 FUNCTIONALITY_NOT_ENABLED` on a bundle-management read (`bundles/details`, `bundleListView`) after assign | User lacks **Type Manager** — bundle operations require it, Reader/Owner/Type Reader do not clear it | Assign the **Type Manager** role (PS `ItSrvcCnfgItmTypManagerPermissionSet` + its own PSL `ItSrvcCnfgItmTypMgrPsl`), then re-verify via Step 6 |
|
|
260
|
+
| `dispatch*` auth error | headless-360 MCP session not authenticated / token expired | Re-authenticate the headless-360 MCP connection; confirm the session points at the intended org |
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: service-itsm-agentic-setup-cmdb-bundle-deploy
|
|
3
|
+
description: "Deploy (install) the CMDB Foundation base content bundle in Service Cloud ITSM against a production or sandbox org, after the CMDB feature is enabled. Use when the user asks to install the CMDB bundle, deploy CMDB Foundation, set up the CMDB base content, install CMDB out-of-the-box content, or finish CMDB setup with the base bundle. Triggers on: install CMDB bundle, deploy CMDB Foundation, CMDB base content, CMDB content bundle, bundleInstallation, finish CMDB setup. DO NOT TRIGGER when: the user wants to enable the CMDB feature for the org (that is the CMDB feature-enable skill), assign CMDB permission sets to a user (that is the CMDB access-assign skill), install optional non-base add-on bundles, deploy general (non-CMDB) metadata or packages, or work with CMDB records directly."
|
|
4
|
+
metadata:
|
|
5
|
+
version: "1.0"
|
|
6
|
+
minApiVersion: "67.0"
|
|
7
|
+
relatedSkills:
|
|
8
|
+
- "service-itsm-agentic-setup-cmdb-access-assign"
|
|
9
|
+
- "service-itsm-agentic-setup-cmdb-configure"
|
|
10
|
+
mcpTools:
|
|
11
|
+
headless-360:
|
|
12
|
+
tools: ["describe", "discover", "dispatch", "dispatch_readonly"]
|
|
13
|
+
semver: ">=1.0.0"
|
|
14
|
+
accessCheck:
|
|
15
|
+
- type: "orgPerm"
|
|
16
|
+
value: "ITSrvcsCnfgMgmnt"
|
|
17
|
+
- type: "orgPref"
|
|
18
|
+
value: "CMDBEnabled"
|
|
19
|
+
allowed-tools: |
|
|
20
|
+
Read AskUserQuestion
|
|
21
|
+
mcp__headless-360__discover
|
|
22
|
+
mcp__headless-360__describe
|
|
23
|
+
mcp__headless-360__dispatch
|
|
24
|
+
mcp__headless-360__dispatch_readonly
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# Deploy the CMDB Foundation Bundle (Service Cloud ITSM)
|
|
28
|
+
|
|
29
|
+
Installs the **CMDB Foundation (base)** content bundle — the out-of-the-box configuration-item types,
|
|
30
|
+
schema, and content that make CMDB usable. This is **Layer 4**, the final layer of the CMDB setup
|
|
31
|
+
stack, and it requires the CMDB feature to already be enabled (Layer 2). Every call runs through the
|
|
32
|
+
**Salesforce-hosted Headless-360 MCP server** (server key `headless-360`) via its four meta-tools
|
|
33
|
+
(`discover`, `describe`, `dispatch_readonly`, `dispatch`). The org is derived from the OAuth JWT bound
|
|
34
|
+
to the current MCP session — the skill never handles an org id, alias, or credentials — so this works
|
|
35
|
+
identically against **production** and sandbox with no per-user MCP install.
|
|
36
|
+
|
|
37
|
+
## Scope
|
|
38
|
+
|
|
39
|
+
- **In scope**: confirming CMDB is enabled, reading the live bundle catalog, resolving the exact
|
|
40
|
+
version of the base bundle, installing the **base** (`CMDB Foundation`) bundle, and verifying.
|
|
41
|
+
- **Out of scope**: enabling the CMDB feature / provisioning the ITOM tenant (Layers 0–2 —
|
|
42
|
+
`service-itsm-agentic-setup-cmdb-configure`), assigning permission sets (Layer 3 —
|
|
43
|
+
`service-itsm-agentic-setup-cmdb-access-assign`), installing **optional add-on** bundles (e.g.
|
|
44
|
+
Component Identification Rules), CMDB record CRUD, or Discovery.
|
|
45
|
+
|
|
46
|
+
This skill installs the **base bundle only**. Optional add-ons are intentionally out of scope.
|
|
47
|
+
|
|
48
|
+
## Why order matters
|
|
49
|
+
|
|
50
|
+
The bundle Connect APIs (`bundleListView`, `bundles/details`, `bundleInstallation`) are gated by
|
|
51
|
+
`orgHasCMDBEnabled`. Until the CMDB feature is enabled they return `403 FUNCTIONALITY_NOT_ENABLED`, so
|
|
52
|
+
this skill **must** run after the CMDB feature-enable skill has turned the feature on.
|
|
53
|
+
|
|
54
|
+
On top of the org gate, these reads also enforce the **running user's own CMDB access**, so a
|
|
55
|
+
`403 FUNCTIONALITY_NOT_ENABLED` here has two distinct causes — feature-off **or** user-has-no-access.
|
|
56
|
+
Step 1 disambiguates them via the feature status before sending the user anywhere; never assume a 403
|
|
57
|
+
means the feature is off.
|
|
58
|
+
|
|
59
|
+
## Mechanism
|
|
60
|
+
|
|
61
|
+
All operations dispatch through **headless-360** MCP tools. Reads go through
|
|
62
|
+
`mcp__headless-360__dispatch_readonly`, writes through `mcp__headless-360__dispatch` — both take raw
|
|
63
|
+
HTTP: `{"url": "<path>", "method": "GET|POST", "body"?: {...}, "queryParams"?: {...}}` — **not**
|
|
64
|
+
`{operation_id, arguments}`. See `references/mcp-invocation.md` for the exact `url` / `method` / `body`
|
|
65
|
+
of every call. The four tools:
|
|
66
|
+
|
|
67
|
+
- `mcp__headless-360__discover` — semantic search over the indexed operation catalog (discovery /
|
|
68
|
+
confirmation only).
|
|
69
|
+
- `mcp__headless-360__describe` — pull the full input schema and canonical route before the install POST.
|
|
70
|
+
- `mcp__headless-360__dispatch_readonly` — the dispatcher for every read (GET).
|
|
71
|
+
- `mcp__headless-360__dispatch` — the dispatcher for every write (POST/PATCH).
|
|
72
|
+
|
|
73
|
+
The skill never handles credentials — the org is bound to the current OAuth session. If a `dispatch*`
|
|
74
|
+
call returns an auth error, tell the user to re-authenticate the headless-360 MCP connection (and
|
|
75
|
+
confirm the session points at the intended org), then stop.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Clarifying questions
|
|
80
|
+
|
|
81
|
+
Ask only what you cannot infer from conversation:
|
|
82
|
+
|
|
83
|
+
- **Which org?** Confirm the target org and state plainly that **content will be installed into this
|
|
84
|
+
org** (a write). For production, get explicit confirmation.
|
|
85
|
+
|
|
86
|
+
Do not re-ask for anything the user already provided; pre-populate and note "(from conversation)".
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Workflow
|
|
91
|
+
|
|
92
|
+
Sequential. **Always read before you write** — read the catalog and resolve the exact version before
|
|
93
|
+
installing. Never guess a version string.
|
|
94
|
+
|
|
95
|
+
### Step 1 — Confirm CMDB is enabled (read, gate)
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
dispatch_readonly({ "url": "/services/data/v67.0/connect/cmdb/bundleListView", "method": "GET" })
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
- `200` → CMDB is enabled; the response lists available bundles and their install status. Proceed.
|
|
102
|
+
- `403 FUNCTIONALITY_NOT_ENABLED` → **ambiguous — disambiguate before telling the user CMDB is off.**
|
|
103
|
+
This read enforces **both** the org gate **and** the running user's own CMDB access, so a 403 has
|
|
104
|
+
two possible causes. Check the feature status to tell them apart:
|
|
105
|
+
```text
|
|
106
|
+
dispatch_readonly({ "url": "/services/data/v67.0/connect/setup/discovery/feature/service-cloud-itsm-cmdb-integration/status", "method": "GET" })
|
|
107
|
+
```
|
|
108
|
+
- `status != ENABLED` → the **CMDB feature isn't enabled**. STOP and route the user to the CMDB
|
|
109
|
+
feature-enable skill (`service-itsm-agentic-setup-cmdb-configure`) first.
|
|
110
|
+
- `status == ENABLED` → the feature **is** enabled; the running user simply **lacks CMDB permission
|
|
111
|
+
sets**. STOP and route the user to the CMDB access-assign skill
|
|
112
|
+
(`service-itsm-agentic-setup-cmdb-access-assign`) to grant themselves CMDB access — at minimum the
|
|
113
|
+
read set, plus **Type Manager** for bundle management — then retry. Do NOT send them to the
|
|
114
|
+
feature-enable skill; CMDB is already enabled.
|
|
115
|
+
|
|
116
|
+
From the `bundleListView` response, identify the base bundle (CMDB Foundation) and note its
|
|
117
|
+
`currentInstalledVersion`. If it is already installed at the latest version, tell the user there is
|
|
118
|
+
nothing to do.
|
|
119
|
+
|
|
120
|
+
### Step 2 — Resolve the exact base version (read)
|
|
121
|
+
|
|
122
|
+
Do NOT guess or hard-code the version. Read the authoritative version from bundle details:
|
|
123
|
+
|
|
124
|
+
```text
|
|
125
|
+
dispatch_readonly({ "url": "/services/data/v67.0/connect/cmdb/bundles/details", "method": "GET", "queryParams": { "bundleIdentifier": "base" } })
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Read `latestVersion` from the catalog and use that string **verbatim** for the install — do NOT strip,
|
|
129
|
+
add, or reformat any characters (including a leading `v`). The install endpoint matches the version by
|
|
130
|
+
exact string equality against the registry, and the registry stores versions exactly as the catalog
|
|
131
|
+
reports them (e.g. `"v3.0"`), so the value must be passed through unchanged.
|
|
132
|
+
|
|
133
|
+
**You may only install the latest version.** The install endpoint rejects any non-latest version
|
|
134
|
+
(`"Target version <x> is not the latest available version"`) — it does not support installing or
|
|
135
|
+
rolling back to an older version, so always resolve `latestVersion` and install exactly that. If
|
|
136
|
+
`installedVersion` already equals `latestVersion`, stop — the base bundle is up to date.
|
|
137
|
+
|
|
138
|
+
> **If `bundles/details` returns `403 FUNCTIONALITY_NOT_ENABLED`** while `bundleListView` (Step 1)
|
|
139
|
+
> returned `200`: the org gate is fine, but the running user lacks the bundle-management permission.
|
|
140
|
+
> `bundles/details` requires the **Type Manager** role — the Reader / Owner / Type Reader sets are not
|
|
141
|
+
> sufficient. Route the user to the CMDB access-assign skill to grant Type Manager, then retry. As a
|
|
142
|
+
> fallback, `bundleListView` already returns the base bundle's `currentInstalledVersion` and
|
|
143
|
+
> `latestVersion`, so you can resolve the version from Step 1's response if Type Manager cannot be
|
|
144
|
+
> assigned.
|
|
145
|
+
|
|
146
|
+
### Step 3 — Confirm with the user (before the write)
|
|
147
|
+
|
|
148
|
+
Show the base bundle name, the version to be installed, and the target org. Get explicit confirmation
|
|
149
|
+
before the write. State plainly that this installs out-of-the-box CMDB content into the org.
|
|
150
|
+
|
|
151
|
+
### Step 4 — Install the base bundle (write)
|
|
152
|
+
|
|
153
|
+
Call `discover(query="cmdb bundle installation")` then `describe(id=<bundleInstallation operation id>)`
|
|
154
|
+
to confirm the input schema, then install:
|
|
155
|
+
|
|
156
|
+
```text
|
|
157
|
+
dispatch({ "url": "/services/data/v67.0/connect/cmdb/bundleInstallation", "method": "POST", "body": { "bundleIdentifier": "base", "version": "<latestVersion from Step 2, verbatim>" } })
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Both `bundleIdentifier` and `version` are required, and `version` must be the catalog's `latestVersion`
|
|
161
|
+
string passed through unchanged. A `success: true` response means the installation was **initiated** —
|
|
162
|
+
it may complete asynchronously.
|
|
163
|
+
|
|
164
|
+
### Step 5 — Verify (read — do NOT trust the install response alone)
|
|
165
|
+
|
|
166
|
+
Re-read bundle details and confirm the base bundle now reports the installed version:
|
|
167
|
+
|
|
168
|
+
```text
|
|
169
|
+
dispatch_readonly({ "url": "/services/data/v67.0/connect/cmdb/bundles/details", "method": "GET", "queryParams": { "bundleIdentifier": "base" } })
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
`installedVersion` should equal the version you installed. If installation is async and it has not
|
|
173
|
+
updated yet, tell the user it is in progress and how to re-check.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Rules / Constraints
|
|
178
|
+
|
|
179
|
+
| Constraint | Rationale |
|
|
180
|
+
|-----------|-----------|
|
|
181
|
+
| Read `bundleListView` first as the enablement gate | A 403 here means either CMDB isn't enabled or the user lacks CMDB access — disambiguate via feature status before acting |
|
|
182
|
+
| Resolve the version from `bundles/details`; never guess; pass `latestVersion` verbatim | The install endpoint matches the version by exact string equality against the registry, which stores it exactly as the catalog reports (e.g. `"v3.0"`) — do not strip or reformat any characters |
|
|
183
|
+
| Install only the latest version | The endpoint rejects any non-latest version (`"Target version <x> is not the latest available version"`); it cannot install or roll back to an older version |
|
|
184
|
+
| Install `base` only | This skill is scoped to the CMDB Foundation base bundle; optional add-ons are out of scope |
|
|
185
|
+
| Confirm the target org and the install with the user | Installing content is a real, hard-to-reverse write on a live org |
|
|
186
|
+
| Skip if already installed at latest | Avoid redundant installs; report "already up to date" |
|
|
187
|
+
| Treat `success: true` as "initiated"; verify separately | Installation can be asynchronous |
|
|
188
|
+
| Never expose internal jargon to the user | Keep record IDs, HTTP status codes (403/400/500), API error codes (`FUNCTIONALITY_NOT_ENABLED`, …), endpoint names (`bundleListView`, `bundles/details`, `bundleInstallation`), developer names, and tooling internals (`dispatch`, `headless-360`) out of user-facing output. Use bundle names and versions and plain language |
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Verification checklist
|
|
193
|
+
|
|
194
|
+
- [ ] `bundleListView` returned `200` (CMDB is enabled and the user has access)?
|
|
195
|
+
- [ ] Resolved `latestVersion` for `base` from `bundles/details` (not guessed)?
|
|
196
|
+
- [ ] Skipped if already at the latest version?
|
|
197
|
+
- [ ] Confirmed the target org + install with the user before writing?
|
|
198
|
+
- [ ] `bundleInstallation` returned `success: true`?
|
|
199
|
+
- [ ] Verified `installedVersion` matches (or reported async in-progress)?
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Output expectations
|
|
204
|
+
|
|
205
|
+
```text
|
|
206
|
+
CMDB Bundle Deploy — Complete (via service-itsm-agentic-setup-cmdb-bundle-deploy)
|
|
207
|
+
|
|
208
|
+
Target org: <org>
|
|
209
|
+
|
|
210
|
+
Bundle: CMDB Foundation (base)
|
|
211
|
+
Version: <version>
|
|
212
|
+
Status: Installation initiated — success
|
|
213
|
+
|
|
214
|
+
CMDB now has its base content installed. Combined with the enabled feature and assigned user
|
|
215
|
+
access, CMDB is ready end-to-end.
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Keep internal jargon out of user-facing output (no record IDs, HTTP status codes, error codes, or
|
|
219
|
+
endpoint names). If any step fails, stop and tell the user — in plain language — what didn't succeed
|
|
220
|
+
and what it means for them (e.g. "CMDB isn't turned on for this org yet, so the content can't be
|
|
221
|
+
installed" rather than echoing a 403 code), then point to the fix.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Common failures (surface these in plain language)
|
|
226
|
+
|
|
227
|
+
| Symptom | Likely cause | What to tell the user |
|
|
228
|
+
|---------|--------------|-----------------------|
|
|
229
|
+
| `403` on the catalog read **and** feature not enabled | CMDB feature not enabled for the org | CMDB must be turned on for the org first; that's a separate setup step — point to the feature-enable skill |
|
|
230
|
+
| `403` on the catalog read **but** feature is enabled | Feature is on; the running user lacks CMDB access (this read enforces user-level access too) | Grant the user CMDB access first (a separate setup step), then try again — the feature itself is already on |
|
|
231
|
+
| `403` on the version read **but** the catalog read succeeded | The user lacks the CMDB bundle-management role (Type Manager) | Grant the user the CMDB Type Manager role (a separate access step), then retry; the org itself is set up correctly |
|
|
232
|
+
| Install rejected — bundle/version doesn't exist | Wrong version string | Re-read the catalog and use the exact latest version it reports |
|
|
233
|
+
| Install reported success but the version hasn't changed | Installation is running in the background | It's in progress; check again shortly to confirm it finished |
|
|
234
|
+
| Downstream error on install | Temporary platform dependency issue | Try again; if it keeps failing, this needs Salesforce support |
|
|
235
|
+
| Connection/authentication error | The org connection isn't set up or has expired | Re-authenticate the org connection and confirm it points at the intended org, then retry |
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Cross-skill integration
|
|
240
|
+
|
|
241
|
+
| When | Skill |
|
|
242
|
+
|------|-------|
|
|
243
|
+
| The org CMDB feature is not enabled yet (org gate still closed) | `service-itsm-agentic-setup-cmdb-configure` (Layers 0–2 — enable the feature first, then return here) |
|
|
244
|
+
| The running user lacks CMDB access, or lacks **Type Manager** for bundle management | `service-itsm-agentic-setup-cmdb-access-assign` (Layer 3 — grant the user CMDB access, including Type Manager, then return here) |
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Reference file index
|
|
249
|
+
|
|
250
|
+
| File | When to read |
|
|
251
|
+
|------|--------------|
|
|
252
|
+
| `references/mcp-invocation.md` | Exact `mcp__headless-360__*` call shapes for the bundle catalog + install calls, response envelopes, the install schema lookup, and the error table |
|