@salesforce/afv-skills 1.40.0 → 1.41.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/automation-flow-generate/SKILL.md +32 -43
- package/skills/experience-portal-create/SKILL.md +497 -0
- package/skills/experience-portal-create/assets/report-template.md +30 -0
- package/skills/experience-portal-create/references/mcp-invocation.md +288 -0
- package/skills/experience-portal-create/references/post-creation-activate-publish.md +165 -0
- package/skills/experience-portal-create/references/templates.md +253 -0
- package/skills/experience-ui-bundle-features-generate/SKILL.md +5 -1
- package/skills/experience-ui-bundle-frontend-generate/SKILL.md +2 -0
- package/skills/experience-ui-bundle-frontend-generate/references/page.md +1 -0
- package/skills/platform-datamask-run/SKILL.md +345 -0
- package/skills/platform-datamask-run/references/api-surface.md +130 -0
- package/skills/platform-datamask-run/references/policy-authoring.md +185 -0
- package/skills/platform-datamask-run/references/run-and-abort.md +116 -0
- package/skills/platform-datamask-run/scripts/poll-job.sh +115 -0
- package/skills/platform-dataspace-access-configure/SKILL.md +51 -3
- package/skills/platform-dataspace-access-configure/scripts/inspect-dataspace-scopes.sh +56 -0
- package/skills/platform-lightning-type-widget-coordinate/references/build-plan-format.md +1 -0
- package/skills/platform-sandbox-configure/SKILL.md +17 -2
- package/skills/platform-trial-org-create/SKILL.md +175 -0
- package/skills/platform-trial-org-create/examples/create_request.json +9 -0
- package/skills/platform-trial-org-create/examples/error_response.json +41 -0
- package/skills/platform-trial-org-create/examples/success_response.json +27 -0
- package/skills/platform-trial-org-create/references/error_codes.md +42 -0
- package/skills/platform-trial-org-create/references/signup_request_fields.md +69 -0
- package/skills/platform-trial-org-create/scripts/create_signup_request.sh +175 -0
- package/skills/platform-trial-org-create/scripts/get_signup_request.sh +155 -0
- package/skills/platform-widget-generate/SKILL.md +47 -6
- package/skills/platform-widget-generate/examples/conditional.json +3 -3
- 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/widget-bundle-layout.md +1 -1
- package/skills/service-agentforce-channel-configure/SKILL.md +271 -0
- package/skills/service-agentforce-channel-configure/references/agent-wiring.md +97 -0
- package/skills/service-agentforce-channel-configure/references/channel-branch-email.md +145 -0
- package/skills/service-agentforce-channel-configure/references/channel-branch-voice.md +69 -0
- package/skills/service-agentforce-channel-configure/references/channel-types.md +61 -0
- package/skills/service-agentforce-channel-configure/references/live-traffic-gate.md +86 -0
- package/skills/service-agentforce-channel-configure/references/queue-resolution.md +135 -0
- package/skills/service-agentforce-channel-configure/references/routing-flow.md +384 -0
- package/skills/service-catalog-template-deploy/SKILL.md +310 -0
- package/skills/service-catalog-template-deploy/references/cli-invocation.md +258 -0
- package/skills/service-catalog-template-deploy/scripts/activate-verify.mjs +164 -0
- package/skills/service-catalog-template-deploy/scripts/build-deploy-payload.mjs +94 -0
- package/skills/service-catalog-template-deploy/scripts/resolve-template.mjs +331 -0
- package/skills/service-catalog-template-search/SKILL.md +212 -0
- package/skills/service-catalog-template-search/references/cli-invocation.md +128 -0
- package/skills/service-catalog-template-search/scripts/classify-catalog.mjs +205 -0
- package/skills/service-concierge-portal-generate/SKILL.md +126 -0
- package/skills/service-concierge-portal-generate/references/portal-deploy-runbook.md +1428 -0
- package/skills/service-digital-engagement-channel-configure/SKILL.md +46 -6
- package/skills/service-digital-engagement-channel-configure/assets/messaging_channel_template.xml +2 -1
- package/skills/service-digital-engagement-channel-configure/examples/asa_agent_channel.xml +4 -1
- package/skills/service-helpagent-coordinate/README.md +8 -2
- package/skills/service-helpagent-coordinate/SKILL.md +126 -130
- package/skills/service-helpagent-coordinate/assets/help-agent-spec.md +70 -53
- package/skills/service-helpagent-coordinate/references/agent-script.md +571 -457
- package/skills/service-helpagent-coordinate/references/channel-voice.md +38 -9
- package/skills/service-helpagent-coordinate/references/channel-web-chat.md +173 -49
- package/skills/service-helpagent-coordinate/references/output-report-format.md +126 -0
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +153 -0
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +79 -0
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs +35 -0
- package/skills/service-itsm-agentic-setup-agentforce-studio-configure/SKILL.md +271 -0
- package/skills/service-itsm-agentic-setup-agentforce-studio-configure/references/cli-invocation.md +265 -0
- package/skills/service-itsm-agentic-setup-agentforce-studio-configure/scripts/classify-enable-plan.mjs +220 -0
- package/skills/service-itsm-agentic-setup-agentforce-studio-configure/scripts/classify-final-report.mjs +102 -0
- package/skills/service-itsm-agentic-setup-agentforce-studio-configure/scripts/record-enable-result.mjs +73 -0
- package/skills/service-itsm-agentic-setup-agentforce-studio-validate/SKILL.md +206 -0
- package/skills/service-itsm-agentic-setup-agentforce-studio-validate/references/cli-invocation.md +194 -0
- package/skills/service-itsm-agentic-setup-agentforce-studio-validate/scripts/classify-readiness.mjs +223 -0
- package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +45 -7
- package/skills/service-itsm-agentic-setup-cmdb-configure/references/mcp-invocation.md +45 -5
- package/skills/service-itsm-agentic-setup-configure/SKILL.md +116 -0
- package/skills/service-itsm-agentic-setup-configure/examples/output-templates.md +64 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +158 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/cli-invocation.md +361 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/error-taxonomy.md +44 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/reactivation.md +66 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/report-format.md +66 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/specialized-templates.md +148 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/workflow-detail.md +169 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/build-create-body.mjs +116 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/classify-agent-existence.mjs +185 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/classify-preflight.mjs +168 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/create-scratch-dir.mjs +58 -0
- package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/render-report.mjs +197 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +186 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/action-availability.md +51 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/cli-invocation.md +345 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/error-taxonomy.md +44 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/reactivation.md +63 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/report-format.md +44 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/workflow-detail.md +149 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/build-create-body.mjs +110 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/classify-action-availability.mjs +201 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/classify-activate-result.mjs +135 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/classify-agent-existence.mjs +194 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/classify-preflight.mjs +158 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/create-scratch-dir.mjs +58 -0
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/render-report.mjs +191 -0
- package/skills/service-itsm-agentic-setup-incident-management/SKILL.md +133 -0
- package/skills/service-itsm-agentic-setup-incident-management/examples/output-templates.md +71 -0
- package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +308 -0
- package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone.json +23 -0
- package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/milestone-patterns.md +193 -0
- package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/output-templates.md +57 -0
- package/skills/service-itsm-agentic-setup-incident-sla-configure/references/mcp-invocation.md +394 -0
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/SKILL.md +266 -0
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/references/cli-invocation.md +106 -0
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/references/helper-contracts.md +142 -0
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/references/permset-topology.md +82 -0
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/scripts/classify-action-surface.mjs +137 -0
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/scripts/classify-assignment-state.mjs +99 -0
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/scripts/classify-permset-availability.mjs +120 -0
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/scripts/resolve-target-user.mjs +86 -0
- package/skills/service-itsm-agentic-setup-uel-user-create/SKILL.md +284 -0
- package/skills/service-itsm-agentic-setup-uel-user-create/references/mcp-invocation.md +302 -0
- package/skills/service-itsm-channels-coordinate/SKILL.md +472 -0
- package/skills/service-itsm-incident-mgmt-configure/SKILL.md +212 -0
- package/skills/service-itsm-incident-mgmt-configure/references/mcp-invocation.md +225 -0
- package/skills/service-itsm-incident-priority-configure/SKILL.md +53 -12
- package/skills/service-itsm-swarming-configure/SKILL.md +212 -0
- package/skills/service-itsm-teams-configure/SKILL.md +395 -0
- package/skills/service-itsm-teams-configure/references/azure-credential-population.md +213 -0
- package/skills/service-itsm-teams-configure/references/gotchas.md +23 -0
- package/skills/service-itsm-teams-coordinate/SKILL.md +175 -0
- package/skills/service-itsm-teams-coordinate/examples/output-templates.md +85 -0
- package/skills/service-itsm-teams-debug/SKILL.md +144 -0
- package/skills/service-itsm-teams-debug/references/configuration-checklists.md +277 -0
- package/skills/service-itsm-teams-debug/references/report-generation.md +95 -0
- package/skills/service-itsm-teams-employee-agent-configure/SKILL.md +139 -0
- package/skills/service-itsm-teams-employee-agent-configure/assets/Teams_AgentForce.EmbeddedServiceConfig-meta.xml +43 -0
- package/skills/service-itsm-teams-employee-agent-configure/references/teams-embedded-employee-agent.md +480 -0
- package/skills/service-itsm-teams-itdesk-configure/SKILL.md +232 -0
- package/skills/service-itsm-teams-itservice-configure/SKILL.md +391 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Output Templates — service-itsm-agentic-setup-agentforce-coordinate
|
|
2
|
+
|
|
3
|
+
Emit one of these text blocks at the corresponding step in the workflow. Only features with a
|
|
4
|
+
working child skill appear — hide placeholder rows.
|
|
5
|
+
|
|
6
|
+
## Feature menu (Behavior step 2)
|
|
7
|
+
|
|
8
|
+
```text
|
|
9
|
+
Agentforce for ITSM Setup (via service-itsm-agentic-setup-agentforce-coordinate)
|
|
10
|
+
|
|
11
|
+
Here are the features available for Agentforce ITSM. Select one or more to configure:
|
|
12
|
+
|
|
13
|
+
┌───┬───────────────────────────────┬──────────────────────────────────────────────────┬──────────┐
|
|
14
|
+
│ # │ Feature │ Description │ Status │
|
|
15
|
+
├───┼───────────────────────────────┼──────────────────────────────────────────────────┼──────────┤
|
|
16
|
+
│ 1 │ Agentforce Studio enablement │ Turn on org-level Agentforce, Einstein GenAI, │ Not done │
|
|
17
|
+
│ │ │ and IT Service agent features │ │
|
|
18
|
+
│ 2 │ Fulfiller Agent lifecycle │ Create the IT Service Fulfiller agent from │ Not done │
|
|
19
|
+
│ │ │ template, commit, and activate a version │ │
|
|
20
|
+
│ 3 │ Employee Agent lifecycle │ Create the IT Service Employee agent from │ Not done │
|
|
21
|
+
│ │ │ template, commit, and activate a version │ │
|
|
22
|
+
└───┴───────────────────────────────┴──────────────────────────────────────────────────┴──────────┘
|
|
23
|
+
|
|
24
|
+
Reply with the numbers of the features you want to set up (one or more, e.g. `1` or `1, 2`).
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Post-feature progress (Behavior step 4)
|
|
28
|
+
|
|
29
|
+
Example after Agentforce Studio enablement completes:
|
|
30
|
+
|
|
31
|
+
```text
|
|
32
|
+
Agentforce Studio — enabled successfully
|
|
33
|
+
(via service-itsm-agentic-setup-agentforce-studio-configure)
|
|
34
|
+
|
|
35
|
+
┌───┬───────────────────────────────┬──────────┐
|
|
36
|
+
│ # │ Feature │ Status │
|
|
37
|
+
├───┼───────────────────────────────┼──────────┤
|
|
38
|
+
│ 1 │ Agentforce Studio enablement │ Done │
|
|
39
|
+
│ 2 │ Fulfiller Agent lifecycle │ Not done │
|
|
40
|
+
│ 3 │ Employee Agent lifecycle │ Not done │
|
|
41
|
+
└───┴───────────────────────────────┴──────────┘
|
|
42
|
+
|
|
43
|
+
Agentforce Studio is enabled. Next up: create and activate the IT Service
|
|
44
|
+
Fulfiller and Employee agents — the Fulfiller agent gives IT technicians an
|
|
45
|
+
assistant for triage, case summaries, and record automations, while the
|
|
46
|
+
Employee agent gives requesters self-service help with their own requests.
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Completion summary (Behavior step 5)
|
|
50
|
+
|
|
51
|
+
The completion summary fires either (a) after every feature completes, or (b) when the user says
|
|
52
|
+
they are finished — even if some features are still `Not done`. When rendering:
|
|
53
|
+
|
|
54
|
+
- Substitute each feature's row with its actual tracked status: `Done`, `In progress`, or `Not done`.
|
|
55
|
+
Do NOT hard-code `Done`.
|
|
56
|
+
- Choose the header line based on whether every feature is `Done`:
|
|
57
|
+
- All features `Done` → `Agentforce for ITSM Setup — Complete`
|
|
58
|
+
- Any feature still `Not done` or `In progress` → `Agentforce for ITSM Setup — Finished`
|
|
59
|
+
- Choose the closing line based on state:
|
|
60
|
+
- All `Done` → `Your Agentforce for ITSM setup is complete.`
|
|
61
|
+
- Otherwise → `You have finished the features you selected. The remaining features can be resumed later by re-invoking this orchestrator.`
|
|
62
|
+
|
|
63
|
+
Example — user finished after only enabling Agentforce Studio (Fulfiller and Employee Agent lifecycles stayed `Not done`):
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
Agentforce for ITSM Setup — Finished
|
|
67
|
+
(via service-itsm-agentic-setup-agentforce-coordinate)
|
|
68
|
+
|
|
69
|
+
┌───────────────────────────────┬──────────┐
|
|
70
|
+
│ Feature │ Status │
|
|
71
|
+
├───────────────────────────────┼──────────┤
|
|
72
|
+
│ Agentforce Studio enablement │ Done │
|
|
73
|
+
│ Fulfiller Agent lifecycle │ Not done │
|
|
74
|
+
│ Employee Agent lifecycle │ Not done │
|
|
75
|
+
└───────────────────────────────┴──────────┘
|
|
76
|
+
|
|
77
|
+
You have finished the features you selected. The remaining features can be
|
|
78
|
+
resumed later by re-invoking this orchestrator.
|
|
79
|
+
```
|
package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Deterministic queue-advancement gate (authoring standard A9). Each child
|
|
3
|
+
// skill already emits its own machine-readable verdict — Studio's `overall`
|
|
4
|
+
// from classify-final-report.mjs, Fulfiller/Employee's Phase 8 aggregate — so
|
|
5
|
+
// this script only maps those fixed value sets to an advance/stop decision.
|
|
6
|
+
// It must not be re-derived in prose; the coordinator runs this and reads the
|
|
7
|
+
// exit code.
|
|
8
|
+
//
|
|
9
|
+
// Usage:
|
|
10
|
+
// node verify-child-verdict.mjs <studio|fulfiller|employee> <verdict>
|
|
11
|
+
//
|
|
12
|
+
// Exit 0 -> child succeeded, safe to advance the queue.
|
|
13
|
+
// Exit 1 -> child failed or only partially succeeded, stop the queue.
|
|
14
|
+
// Exit 2 -> usage error (bad args).
|
|
15
|
+
|
|
16
|
+
const SUCCESS_VALUES = {
|
|
17
|
+
studio: new Set(['SUCCESS']),
|
|
18
|
+
fulfiller: new Set(['CREATED', 'ALREADY-CREATED', 'ACTIVATED']),
|
|
19
|
+
employee: new Set(['CREATED', 'ALREADY-CREATED', 'ACTIVATED']),
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const [child, verdict] = process.argv.slice(2);
|
|
23
|
+
|
|
24
|
+
if (!child || !verdict || !SUCCESS_VALUES[child]) {
|
|
25
|
+
process.stderr.write('usage: node verify-child-verdict.mjs <studio|fulfiller|employee> <verdict>\n');
|
|
26
|
+
process.exit(2);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (SUCCESS_VALUES[child].has(verdict)) {
|
|
30
|
+
process.stdout.write(`ADVANCE: ${child} verdict "${verdict}" is a success value.\n`);
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
process.stdout.write(`STOP: ${child} verdict "${verdict}" is not a success value — do not advance the queue.\n`);
|
|
35
|
+
process.exit(1);
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: service-itsm-agentic-setup-agentforce-studio-configure
|
|
3
|
+
description: "Enable the Agentforce for IT Service Salesforce Go feature toggles (Agentforce Studio, Einstein Generative AI, the parent umbrella, and the Fulfiller/Employee agent templates) using the Salesforce CLI (sf). Turns ON org prefs via the Setup Discovery feature/{apiName}/enable Connect API route. Write-capable, idempotent, dependency-ordered, confirm-to-write required. Use when asked to enable Agentforce Studio, turn on Agentforce for IT Service, enable Einstein generative AI, or configure the org-level Agentforce for IT Service prerequisites. Triggers: enable agentforce studio, turn on agentforce for it service, enable einstein generative ai, configure agentforce org prefs. DO NOT TRIGGER: read-only prerequisite check (service-itsm-agentic-setup-agentforce-studio-validate), create/activate an agent (service-itsm-agentic-setup-fulfiller-agent-configure), or assigning permission sets."
|
|
4
|
+
metadata:
|
|
5
|
+
version: "1.0"
|
|
6
|
+
domains: ["Service", "Agentforce"]
|
|
7
|
+
minApiVersion: "67.0"
|
|
8
|
+
relatedSkills:
|
|
9
|
+
- "service-itsm-agentic-setup-agentforce-studio-validate"
|
|
10
|
+
- "service-itsm-agentic-setup-employee-agent-configure"
|
|
11
|
+
- "service-itsm-agentic-setup-fulfiller-agent-configure"
|
|
12
|
+
cliTools:
|
|
13
|
+
- tool: ["node"]
|
|
14
|
+
semver: ">=18.0.0"
|
|
15
|
+
- tool: ["sf"]
|
|
16
|
+
semver: ">=2.0.0"
|
|
17
|
+
accessCheck:
|
|
18
|
+
- type: "license"
|
|
19
|
+
value: "Agentforce"
|
|
20
|
+
allowed-tools: |
|
|
21
|
+
Bash
|
|
22
|
+
Read
|
|
23
|
+
AskUserQuestion
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Enable Agentforce for IT Service Prerequisites
|
|
27
|
+
|
|
28
|
+
Enable the **Agentforce for IT Service** Salesforce Go feature toggles — **Einstein Generative AI**, **Agentforce Studio**, the **parent umbrella**, and the path-specific agent template (**Fulfiller** or **Employee**) — entirely through the **Salesforce CLI (`sf`)**. This is the **write-capable** step in a three-skill flow; every write goes through the Setup Discovery `POST /connect/setup/discovery/feature/{apiName}/enable` Connect API route — the only correct write path for these toggles. Each toggle is enabled **idempotently** (skipped if already `ENABLED`), dependencies are enabled first, and explicit confirmation is required before any write.
|
|
29
|
+
|
|
30
|
+
| Step | Skill | What it does |
|
|
31
|
+
|------|-------|--------------|
|
|
32
|
+
| 1. Validate | `service-itsm-agentic-setup-agentforce-studio-validate` | Read the toggles → READY / NOT-READY (no writes) |
|
|
33
|
+
| 2. Configure (this skill) | `service-itsm-agentic-setup-agentforce-studio-configure` | Turn the disabled toggles ON |
|
|
34
|
+
| 3. Create agent | `service-itsm-agentic-setup-fulfiller-agent-configure` | Create + activate the Fulfiller agent |
|
|
35
|
+
|
|
36
|
+
This skill is typically reached via hand-off from the validate skill's NOT-READY report, but can also be run directly.
|
|
37
|
+
|
|
38
|
+
A helper script — `scripts/classify-enable-plan.mjs` — reads the batched `/features/status` response and deterministically computes the dependency-ordered enable plan (before writing) and the final per-feature verdict (after writing). This mirrors the validate skill's `classify-readiness.mjs` contract (authoring standard A9): the decision logic lives in a script, not in prose.
|
|
39
|
+
|
|
40
|
+
## Scope
|
|
41
|
+
|
|
42
|
+
- **In scope**: Enabling Einstein Generative AI (`sales-cloud-einstein-generative-ai`), Agentforce Studio (`sales-cloud-agent-studio`), the parent umbrella (`service-cloud-agentforce-for-itsm`), and the path-specific template (`service-cloud-it-fulfiller-agent` for fulfiller; `service-cloud-requestor-agent` + `service-cloud-it-service-employee-agent` for employee) via `POST .../feature/{apiName}/enable`; reading live per-org state from `/features/status` before and after each write; enabling dependencies first; confirming enablement stuck via re-query; surfacing an ENABLED / ALREADY-ENABLED / FAILED verdict per feature. Writes are idempotent — skip if already `ENABLED`.
|
|
43
|
+
- **Out of scope**: Provisioning Agentforce licenses (Setup > Company Information > Permission Set Licenses); assigning permission sets to users; creating, configuring, or activating an agent (`service-itsm-agentic-setup-fulfiller-agent-configure`); read-only prerequisite validation without writes (`service-itsm-agentic-setup-agentforce-studio-validate`); the org-wide multi-agent orchestration toggle (a Headless360-only pref, not a Connect feature).
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Which path?
|
|
48
|
+
|
|
49
|
+
Determine whether the user is enabling prerequisites for the **fulfiller** agent or an **employee** agent. If unclear, ask (`AskUserQuestion`) — same path selection the validate skill uses:
|
|
50
|
+
|
|
51
|
+
- **fulfiller** → `sales-cloud-einstein-generative-ai` → `sales-cloud-agent-studio` → `service-cloud-agentforce-for-itsm` → `service-cloud-it-fulfiller-agent`
|
|
52
|
+
- **employee** → `sales-cloud-einstein-generative-ai` → `sales-cloud-agent-studio` → `service-cloud-agentforce-for-itsm` → `service-cloud-requestor-agent` → `service-cloud-it-service-employee-agent`
|
|
53
|
+
|
|
54
|
+
Einstein Generative AI is a dependency of Agentforce Studio and is not one of the toggles the validate skill reports on directly, but it must be enabled first if it is off — the classifier includes it in the enable plan for both paths.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Preconditions
|
|
59
|
+
|
|
60
|
+
Same as the validate skill (they share the target org and API surface). If unmet, `sf` surfaces an auth error or a `401`/`403`/`404`; **do not fabricate state — surface the raw error and stop**.
|
|
61
|
+
|
|
62
|
+
1. **`sf` CLI installed and authenticated to the target org** (`sf org display -o <alias>` shows Connected). All calls use `--target-org <alias>`; never extract or pass the access token by hand.
|
|
63
|
+
2. **API v67.0+**: the `connect/setup/discovery` feature APIs are available at v67.0. The version is pinned in the URL path; do not hand-edit it below the minimum.
|
|
64
|
+
3. **`node` ≥ 18** on PATH (runs the classifier script).
|
|
65
|
+
4. **Agentforce license** on the org (`accessCheck`) — a missing license surfaces as `403` or as `enableBlockedReasons` on the read.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Operations at a glance
|
|
70
|
+
|
|
71
|
+
| Operation | Command | Returns |
|
|
72
|
+
|-----------|---------|---------|
|
|
73
|
+
| Read feature toggles | `sf api request rest ".../connect/setup/discovery/features/status" --method POST --body '{"featureApiNames":[...]}' --target-org <alias>` | `{items:[{apiName,status,enableBlockedReasons[],dependencyStatuses[]}]}` |
|
|
74
|
+
| Enable one toggle | `sf api request rest ".../connect/setup/discovery/feature/{apiName}/enable" --method POST --body '{}' --target-org <alias>` | `{success:boolean}` — endpoint takes no meaningful body, but `--body '{}'` must be passed explicitly (see gotchas) |
|
|
75
|
+
|
|
76
|
+
Both are Connect API routes reachable via `sf api request rest` — no Headless360 dispatcher required. Full command shapes, the response envelope, and the error taxonomy live in `references/cli-invocation.md`.
|
|
77
|
+
|
|
78
|
+
> **Never extract the access token.** Use `sf api request rest` directly — it uses the CLI's stored session for the target org. Do **not** pull the `accessToken` out of `sf org display` and hand-build an HTTP request with it.
|
|
79
|
+
|
|
80
|
+
> **CRITICAL: DO NOT use IPCManagement `updateOrgPref` to flip agent prefs.** That controller's write allow-list **rejects** the agent prefNames (`Invalid prefName`, 500). The Setup Discovery `POST /feature/{apiName}/enable` endpoint is the **only** correct write path for these toggles.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Architecture — How enablement works
|
|
85
|
+
|
|
86
|
+
| Step | What happens | Tool used |
|
|
87
|
+
|------|--------------|-----------|
|
|
88
|
+
| Pick path | Determine fulfiller vs employee (ask if unclear) | `AskUserQuestion` |
|
|
89
|
+
| Read current state | POST the feature-status batch for the path's toggles, capture to a file | `Bash` (`sf api request rest`) |
|
|
90
|
+
| Plan | Run `scripts/classify-enable-plan.mjs <file> <agentType> [exitStatus]` → dependency-ordered `pending` list | `Bash` (`node`) |
|
|
91
|
+
| Confirm-to-write | Present the exact `pending` list and require explicit "yes" | `AskUserQuestion` |
|
|
92
|
+
| Enable | Re-read + reclassify before each `apiName` in `order`, POST `.../feature/{apiName}/enable` when unblocked, record the result | `Bash` (`sf api request rest` + `node scripts/record-enable-result.mjs`) |
|
|
93
|
+
| Verify | Re-read `/features/status`, re-run the classifier | `Bash` (`sf` + `node`) |
|
|
94
|
+
| Report | Run `scripts/classify-final-report.mjs` over the before/results/after files → final verdict | `Bash` (`node`) |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Workflow
|
|
99
|
+
|
|
100
|
+
Substitute `<alias>` with the target org alias. `<agentType>` is `fulfiller` or `employee`.
|
|
101
|
+
|
|
102
|
+
### Phase 1 — Read Current State
|
|
103
|
+
|
|
104
|
+
1. POST the feature-status batch for every toggle the chosen path needs, capturing stdout to a file. Do **not** add `--json`. Write the request body **once** to a temp file and reuse it verbatim in Phases 1, 4, and 5 via `--body "$(cat ...)"` — never retype it, substitute a placeholder like `[...]`, or rely on a shell variable, since each Bash invocation may run in a fresh shell where a plain variable would be unset:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
cat > /tmp/feature-status-body.json <<'EOF'
|
|
108
|
+
{"featureApiNames":["sales-cloud-einstein-generative-ai","sales-cloud-agent-studio","service-cloud-agentforce-for-itsm","service-cloud-it-fulfiller-agent","service-cloud-requestor-agent","service-cloud-it-service-employee-agent"]}
|
|
109
|
+
EOF
|
|
110
|
+
|
|
111
|
+
sf api request rest "/services/data/v67.0/connect/setup/discovery/features/status" \
|
|
112
|
+
--method POST \
|
|
113
|
+
--body "$(cat /tmp/feature-status-body.json)" \
|
|
114
|
+
--target-org <alias> > /tmp/enable-status-before.json 2>/tmp/enable-status-before.err
|
|
115
|
+
echo $? > /tmp/enable-status-before.exit
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Capture the exit status — do not swallow it with `|| true`.
|
|
119
|
+
|
|
120
|
+
### Phase 2 — Plan (helper script)
|
|
121
|
+
|
|
122
|
+
2. Run the classifier over the captured file to compute the dependency-ordered enable plan, saving its output — Phase 6 consumes this file, not the raw `/features/status` response:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
node "<skill_dir>/scripts/classify-enable-plan.mjs" /tmp/enable-status-before.json <agentType> "$(cat /tmp/enable-status-before.exit)" > /tmp/enable-plan-before.json
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
It prints `{ agentType, readState, features, order, alreadyEnabled, pending, blocked, unconfirmed, verdict, reasons, rawError }`. `verdict: "ALL-ENABLED"` means nothing to do — skip to Phase 6. `verdict: "NEEDS-ENABLE"` means `pending` (in `order`) lists what to enable. `blocked` lists any `pending` toggle whose `enableBlockedReasons` is non-empty **as of this read** — a toggle blocked only on an earlier dependency in `order` becomes enable-able once that dependency is on, so Phase 4 re-checks each toggle immediately before attempting it rather than trusting this snapshot for the whole loop. `unconfirmed` lists any required toggle missing from the response or carrying a status this classifier doesn't recognize — `verdict: "CANNOT-CONFIRM"` (not `"ALL-ENABLED"`) when `unconfirmed` is non-empty and `pending` is empty. `readState: "error"` ⇒ surface `rawError` and stop; `readState: "not-wired"` ⇒ report CANNOT-CONFIRM and stop.
|
|
129
|
+
|
|
130
|
+
### Phase 3 — Confirm-to-Write Checkpoint (REQUIRED)
|
|
131
|
+
|
|
132
|
+
3. **Present the exact `pending` list** (excluding anything in `blocked`) and require an explicit "yes" from the user via `AskUserQuestion` before proceeding. Enabling org prefs mutates org state. **Proceed to Phase 4 ONLY on an explicit "yes".** On "no", stop and report the current state without any writes.
|
|
133
|
+
|
|
134
|
+
### Phase 4 — Enable (Dependencies First, Re-Checked Before Each Toggle)
|
|
135
|
+
|
|
136
|
+
4. Iterate `order` **in sequence** (Einstein GenAI → Studio → parent → child template(s)). Before attempting to enable each `<apiName>`, re-read and reclassify — this is what lets a child that was `blocked` in Phase 2 (only because Studio/parent was still off) become enable-able once that dependency's own enable has landed, instead of being permanently written off from the Phase-2 snapshot:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
sf api request rest "/services/data/v67.0/connect/setup/discovery/features/status" \
|
|
140
|
+
--method POST \
|
|
141
|
+
--body "$(cat /tmp/feature-status-body.json)" \
|
|
142
|
+
--target-org <alias> > /tmp/enable-status-loop.json 2>/tmp/enable-status-loop.err
|
|
143
|
+
echo $? > /tmp/enable-status-loop.exit
|
|
144
|
+
node "<skill_dir>/scripts/classify-enable-plan.mjs" /tmp/enable-status-loop.json <agentType> "$(cat /tmp/enable-status-loop.exit)"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Inspect `features["<apiName>"].signal` from that output:
|
|
148
|
+
- `PASS` → already `ENABLED`; nothing to do, move to the next `apiName` in `order`.
|
|
149
|
+
- `FAIL` with an empty `enableBlockedReasons` → enable it now:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
sf api request rest "/services/data/v67.0/connect/setup/discovery/feature/<apiName>/enable" \
|
|
153
|
+
--method POST \
|
|
154
|
+
--body '{}' \
|
|
155
|
+
--target-org <alias> > /tmp/enable-<apiName>.json 2>/tmp/enable-<apiName>.err
|
|
156
|
+
node "<skill_dir>/scripts/record-enable-result.mjs" /tmp/enable-<apiName>.json <apiName> /tmp/enable-results.json
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
The `/enable` endpoint itself takes no meaningful body, but `sf api request rest --method POST` with no `--body` flag at all fails with `Error (SfError): No 'mode' found in 'body' entry` — always pass `--body '{}'` explicitly. `record-enable-result.mjs` reads the response, classifies it ENABLED/FAILED, and accumulates it into `/tmp/enable-results.json` keyed by `apiName` — the deterministic per-toggle bookkeeping Phase 6 consumes.
|
|
160
|
+
- `FAIL` with a **non-empty** `enableBlockedReasons` → still blocked even after this iteration's re-check (a real, not merely-sequential, blocker — e.g. unlicensed) — do not POST; move to the next `apiName` in `order` and let Phase 6 report the blocker verbatim.
|
|
161
|
+
- `CANNOT-CONFIRM` / `ERROR` on this specific `apiName`'s read → stop the loop and surface the read failure; do not guess at remaining toggles.
|
|
162
|
+
|
|
163
|
+
One failed toggle does not block the rest of the plan — continue the loop.
|
|
164
|
+
|
|
165
|
+
### Phase 5 — Verify Enablement
|
|
166
|
+
|
|
167
|
+
5. Re-run the Phase 1 read (same `/tmp/feature-status-body.json`) into a fresh file, and re-run the classifier over it, saving its output for Phase 6:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
sf api request rest "/services/data/v67.0/connect/setup/discovery/features/status" \
|
|
171
|
+
--method POST \
|
|
172
|
+
--body "$(cat /tmp/feature-status-body.json)" \
|
|
173
|
+
--target-org <alias> > /tmp/enable-status-after.json 2>/tmp/enable-status-after.err
|
|
174
|
+
echo $? > /tmp/enable-status-after.exit
|
|
175
|
+
node "<skill_dir>/scripts/classify-enable-plan.mjs" /tmp/enable-status-after.json <agentType> "$(cat /tmp/enable-status-after.exit)" > /tmp/enable-plan-after.json
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
`verdict: "ALL-ENABLED"` ⇒ every toggle in `order` is confirmed `ENABLED` — success. Anything still in `pending`/`blocked`/`unconfirmed` needs Phase 6 to classify it precisely (FAILED vs CANNOT-CONFIRM).
|
|
179
|
+
|
|
180
|
+
### Phase 6 — Aggregate Verdict (helper script)
|
|
181
|
+
|
|
182
|
+
6. Run the final aggregator over the Phase-2 classifier output (`/tmp/enable-plan-before.json`, not the raw `/features/status` response), the Phase-4 accumulated results (or `-` if Phase 2 was already `ALL-ENABLED`/`CANNOT-CONFIRM`/`ERROR` and Phase 4 never ran), and the Phase-5 classifier output (`/tmp/enable-plan-after.json`):
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
node "<skill_dir>/scripts/classify-final-report.mjs" /tmp/enable-plan-before.json /tmp/enable-results.json /tmp/enable-plan-after.json
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
It prints `{ features: { <apiName>: { finalStatus, reason } }, order, overall, reasons }` where `finalStatus` is `ALREADY-ENABLED | ENABLED | FAILED | CANNOT-CONFIRM | ERROR` and `overall` is `SUCCESS | PARTIAL | FAILED | CANNOT-CONFIRM | ERROR`. Render this directly into the Output Format — do not re-derive the per-feature verdict or the overall summary in prose (authoring standard A9). On `overall: "SUCCESS"`, point the user at `service-itsm-agentic-setup-fulfiller-agent-configure` (fulfiller) or `service-itsm-agentic-setup-employee-agent-configure` (employee) to proceed.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Rules / Constraints
|
|
193
|
+
|
|
194
|
+
| Constraint | Rationale |
|
|
195
|
+
|-----------|-----------|
|
|
196
|
+
| Enable via `POST /connect/setup/discovery/feature/{apiName}/enable` only | The IPCManagement `updateOrgPref` write allow-list rejects the agent prefNames (`Invalid prefName`) — this is the **only** correct write path |
|
|
197
|
+
| Read live per-feature state from `POST /features/status`, never a flat catalog list | Only `/status` carries per-org `ENABLED`/`NOT_ENABLED` + `enableBlockedReasons[]` + `dependencyStatuses[]` |
|
|
198
|
+
| Enable dependencies before children, in the classifier's `order` | Enabling a child before Einstein GenAI / Studio surfaces unmet-dependency blockers |
|
|
199
|
+
| Re-read and reclassify immediately before each toggle in the Phase-4 loop, not once at the top of the loop | A child `blocked` only because an earlier dependency was still off becomes enable-able the instant that dependency's own `/enable` lands — a single Phase-2 snapshot would report it FAILED even though it was never really blocked |
|
|
200
|
+
| Idempotent: skip `/enable` for anything already `ENABLED` | The classifier's `alreadyEnabled` list is authoritative; enabling an already-enabled feature returns `{success:true}` but is redundant |
|
|
201
|
+
| **REQUIRED confirm-to-write checkpoint** before any `/enable` POST | Enabling org prefs mutates org state; the user must explicitly approve the exact `pending` list |
|
|
202
|
+
| Never attempt to enable a toggle whose **current** (re-checked) `enableBlockedReasons` is non-empty | Non-empty `enableBlockedReasons` means the write would fail — report the blocker instead of a doomed POST |
|
|
203
|
+
| `verdict: "CANNOT-CONFIRM"` when `unconfirmed` is non-empty, even if `pending` is empty | A required toggle missing from the response, or with an unrecognized status, must not be reported as ALL-ENABLED just because nothing is left in `pending` |
|
|
204
|
+
| Classification and per-toggle result recording live in `scripts/classify-enable-plan.mjs`, `scripts/record-enable-result.mjs`, and `scripts/classify-final-report.mjs`, invoked via `Bash` — not in prose | Deterministic decision tables and aggregation over fixed feature statuses (authoring standard A9) |
|
|
205
|
+
| The read/write goes through `sf api request rest`; **never extract the access token** | `sf api request rest` uses the CLI's stored session for `--target-org` |
|
|
206
|
+
| Do **not** pass `--json` to `sf api request rest` | Unsupported on some Connect endpoints; the raw stdout body is already JSON |
|
|
207
|
+
| These are **Connect API** features — use SF CLI, not Headless360 | A Connect/Tooling equivalent exists, so SF CLI is preferred (avoids the Headless360HostedMcpServer org-perm gate) |
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Gotchas
|
|
212
|
+
|
|
213
|
+
| Issue | Resolution |
|
|
214
|
+
|-------|------------|
|
|
215
|
+
| `sf api request rest --method POST` with no `--body` flag errors `No 'mode' found in 'body' entry` | The `/enable` endpoint itself takes no meaningful body, but the CLI still requires the flag — always pass `--body '{}'` explicitly (verified on CLI 2.140.6 and 2.145.6) |
|
|
216
|
+
| Feature API name unavailable / unlicensed on the org | No catalog endpoint enumerates valid names — the Phase-1 `/features/status` read surfaces an unavailable/unlicensed feature via `enableBlockedReasons[]` before any enable attempt |
|
|
217
|
+
| `/features/status` shows `NOT_ENABLED` with `dependencyStatuses[]` unmet | Enable the listed dependency first (Einstein GenAI before Studio, Studio before the parent/child toggles) |
|
|
218
|
+
| `updateOrgPref` → 500 `Invalid prefName` for an agent pref | Wrong write path — use the Setup Discovery `feature/{apiName}/enable` endpoint instead |
|
|
219
|
+
| Auth error from `sf api request rest` | The target org's session needs re-authentication (`sf org login web`) |
|
|
220
|
+
| Treating an auth/permission/empty-body read failure as "not wired" | Pass the captured `$?` as the classifier's 3rd arg — only a confirmed 404 is CANNOT-CONFIRM; anything else is ERROR (surface `rawError`, stop) |
|
|
221
|
+
| Trusting the Phase-2 `blocked` list for the entire Phase-4 loop | It is a snapshot before any write — re-read + reclassify before each toggle attempt instead, or a dependency-blocked child gets reported FAILED even after its blocker was just cleared |
|
|
222
|
+
| Reporting `ALL-ENABLED` because `pending` is empty | Also check `unconfirmed` — a required toggle missing from the response or with an unrecognized status is neither confirmed ENABLED nor NOT_ENABLED |
|
|
223
|
+
| Re-deriving the per-feature / overall verdict in prose from the before/after JSON | Run `scripts/classify-final-report.mjs` — the aggregation is fixed comparison logic (authoring standard A9), not a judgment call |
|
|
224
|
+
| Setting the feature-status request body in a shell variable in Phase 1 and expecting it in Phase 4/5 | Each `Bash` invocation may run in a fresh shell where the variable is unset, silently sending an empty body — persist it to `/tmp/feature-status-body.json` once and read it back with `--body "$(cat /tmp/feature-status-body.json)"` in every phase |
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Verification Checklist
|
|
229
|
+
|
|
230
|
+
- [ ] The agent path (fulfiller / employee) was determined (asked if unclear).
|
|
231
|
+
- [ ] Phase 1 read `/features/status` via `sf api request rest`, captured to a file, with its exit status captured.
|
|
232
|
+
- [ ] `scripts/classify-enable-plan.mjs` computed the `pending` (dependency-ordered), `blocked`, and `unconfirmed` lists before any write.
|
|
233
|
+
- [ ] The user explicitly confirmed the exact `pending` list at the Phase-3 checkpoint before any `/enable` POST.
|
|
234
|
+
- [ ] Phase 4 re-read and reclassified **before each toggle**, not once for the whole loop — so a child unblocked by an earlier dependency's enable was still attempted.
|
|
235
|
+
- [ ] Each attempted `/enable` POST's response was recorded via `scripts/record-enable-result.mjs`, accumulated across the loop.
|
|
236
|
+
- [ ] `/features/status` was re-read after enablement and the classifier re-run to confirm the final per-feature verdict.
|
|
237
|
+
- [ ] `scripts/classify-final-report.mjs` (not prose) computed the final per-feature status and overall summary from the before/results/after files; the access token was never extracted.
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Output Format
|
|
242
|
+
|
|
243
|
+
Present the enablement report as:
|
|
244
|
+
|
|
245
|
+
```text
|
|
246
|
+
Agentforce for IT Service — Enable Prerequisites (via service-itsm-agentic-setup-agentforce-studio-configure)
|
|
247
|
+
|
|
248
|
+
Org: <org-alias> (API v67.0)
|
|
249
|
+
Agent path: fulfiller | employee
|
|
250
|
+
|
|
251
|
+
[1] Einstein Generative AI ................. ENABLED | ALREADY-ENABLED | FAILED | CANNOT-CONFIRM
|
|
252
|
+
[2] Agentforce Studio ...................... ENABLED | ALREADY-ENABLED | FAILED | CANNOT-CONFIRM
|
|
253
|
+
[3] Agentforce for IT Service (parent) ..... ENABLED | ALREADY-ENABLED | FAILED | CANNOT-CONFIRM
|
|
254
|
+
[4] <path-specific template(s)> ............ ENABLED | ALREADY-ENABLED | FAILED | CANNOT-CONFIRM
|
|
255
|
+
|
|
256
|
+
Verdict: SUCCESS | PARTIAL | FAILED | CANNOT-CONFIRM | ERROR
|
|
257
|
+
|
|
258
|
+
Next steps:
|
|
259
|
+
- <If SUCCESS: "Org satisfies the prerequisites for the <path> agent. Create it via service-itsm-agentic-setup-fulfiller-agent-configure (fulfiller) / the employee-agent skill.">
|
|
260
|
+
- <If PARTIAL/FAILED/CANNOT-CONFIRM/ERROR: list the affected toggle(s) + reason (enableBlockedReasons, unconfirmed status, or read error) + remediation steps>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Render `overall` and each feature's `finalStatus` from `scripts/classify-final-report.mjs` verbatim — do not recompute them. No files are produced beyond the temporary response captures used by the classifiers.
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Reference File Index
|
|
268
|
+
|
|
269
|
+
| File | When to read |
|
|
270
|
+
|------|--------------|
|
|
271
|
+
| `references/cli-invocation.md` | Every phase — exact `sf api request rest` read/write call shapes, response envelope, feature API names, the classifier contract, and the error taxonomy |
|