@salesforce/afv-skills 1.16.0 → 1.18.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/activating-datacloud/SKILL.md +2 -2
- package/skills/analyzing-omnistudio-dependencies/SKILL.md +1 -1
- package/skills/building-sf-integrations/SKILL.md +1 -1
- package/skills/building-ui-bundle-app/SKILL.md +1 -1
- package/skills/configuring-code-analyzer/SKILL.md +482 -0
- package/skills/configuring-code-analyzer/examples/apex-project-config.yml +41 -0
- package/skills/configuring-code-analyzer/examples/ci-github-actions.yml +96 -0
- package/skills/configuring-code-analyzer/examples/fullstack-project-config.yml +46 -0
- package/skills/configuring-code-analyzer/examples/lwc-project-config.yml +26 -0
- package/skills/configuring-code-analyzer/references/ci-cd-templates.md +648 -0
- package/skills/configuring-code-analyzer/references/config-schema.md +257 -0
- package/skills/configuring-code-analyzer/references/diagnostic-flow.md +70 -0
- package/skills/configuring-code-analyzer/references/engine-prerequisites.md +276 -0
- package/skills/configuring-code-analyzer/references/rule-name-resolution.md +67 -0
- package/skills/configuring-code-analyzer/references/troubleshooting.md +298 -0
- package/skills/configuring-code-analyzer/scripts/check-prerequisites.sh +189 -0
- package/skills/configuring-code-analyzer/scripts/generate-config.sh +143 -0
- package/skills/configuring-code-analyzer/scripts/validate-config.sh +153 -0
- package/skills/connecting-datacloud/SKILL.md +2 -2
- package/skills/creating-b2b-commerce-store/SKILL.md +0 -1
- package/skills/developing-agentforce/SKILL.md +0 -1
- package/skills/generating-apex/SKILL.md +1 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/b2b-commerce-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/campaigns-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/consent-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/files-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/forecasting-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/fsl-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/party-model-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/quote-order-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/revenue-cloud-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/sales-cloud-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/salesforce-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/scheduler-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/service-cloud-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/assets/datamodel/territory-management-erd.md +1 -1
- package/skills/generating-mermaid-diagrams/references/erd-conventions.md +1 -1
- package/skills/generating-mermaid-diagrams/references/preview-guide.md +2 -5
- package/skills/harmonizing-datacloud/SKILL.md +2 -2
- package/skills/implementing-ui-bundle-agentforce-conversation-client/SKILL.md +1 -2
- package/skills/investigating-agentforce-d360/SKILL.md +1 -1
- package/skills/managing-cdc-enablement/SKILL.md +164 -0
- package/skills/managing-cdc-enablement/assets/PlatformEventChannel-template.xml +5 -0
- package/skills/managing-cdc-enablement/assets/PlatformEventChannelMember-template.xml +11 -0
- package/skills/managing-cdc-enablement/references/deploy-troubleshooting.md +73 -0
- package/skills/managing-cdc-enablement/references/filter-expressions.md +93 -0
- package/skills/observing-agentforce/SKILL.md +0 -1
- package/skills/observing-agentforce/references/stdm-queries.md +3 -11
- package/skills/orchestrating-datacloud/README.md +5 -7
- package/skills/orchestrating-datacloud/SKILL.md +3 -3
- package/skills/orchestrating-datacloud/references/feature-readiness.md +2 -2
- package/skills/orchestrating-datacloud/references/plugin-setup.md +6 -8
- package/skills/orchestrating-datacloud/scripts/diagnose-org.mjs +1 -1
- package/skills/orchestrating-datacloud/scripts/verify-plugin.sh +2 -2
- package/skills/preparing-datacloud/SKILL.md +2 -2
- package/skills/retrieving-datacloud/SKILL.md +3 -3
- package/skills/reviewing-lwc-mobile-offline/SKILL.md +0 -1
- package/skills/running-code-analyzer/SKILL.md +264 -267
- package/skills/running-code-analyzer/references/post-scan-workflows.md +286 -0
- package/skills/running-code-analyzer/scripts/describe-rule.js +382 -0
- package/skills/running-code-analyzer/scripts/list-rules.js +260 -0
- package/skills/running-code-analyzer/scripts/query-results.js +230 -0
- package/skills/testing-agentforce/SKILL.md +0 -1
- package/skills/using-mobile-native-capabilities/SKILL.md +0 -1
- package/skills/using-salesforce-archive/SKILL.md +121 -0
- package/skills/using-salesforce-archive/examples/monitor-failed-jobs.md +47 -0
- package/skills/using-salesforce-archive/references/archive-activity-entity.md +59 -0
- package/skills/using-salesforce-archive/references/connect-api-operations.md +157 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# CDC Deploy Troubleshooting
|
|
2
|
+
|
|
3
|
+
Errors observed during real org dry-runs while authoring this skill, with the metadata-side fix.
|
|
4
|
+
|
|
5
|
+
## "Unable to find the specified channel"
|
|
6
|
+
|
|
7
|
+
The `<eventChannel>` value doesn't match a channel known to the org.
|
|
8
|
+
|
|
9
|
+
- For the default channel, the value must be exactly `ChangeEvents`. NOT `data/ChangeEvents`, NOT `/data/ChangeEvents`, NOT `data/ChangeEvent`.
|
|
10
|
+
- For a custom channel, the value must match the channel's DeveloperName **including the `__chn` suffix** — e.g. `PartnerSync__chn`.
|
|
11
|
+
- If the custom channel is in the same deploy, ensure it's in the same package directory so MDAPI orders the deploy correctly.
|
|
12
|
+
|
|
13
|
+
## "...invalid event in the 'selectedEntity' field"
|
|
14
|
+
|
|
15
|
+
`<selectedEntity>` must be the ChangeEvent entity, not the source object.
|
|
16
|
+
|
|
17
|
+
| Source | Wrong | Right |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| `Account` | `Account` | `AccountChangeEvent` |
|
|
20
|
+
| `Lead` | `Lead` | `LeadChangeEvent` |
|
|
21
|
+
| `Order__c` | `Order__c` | `Order__ChangeEvent` |
|
|
22
|
+
| `Custom__c` | `Custom__c` | `Custom__ChangeEvent` |
|
|
23
|
+
|
|
24
|
+
For custom objects, swap the trailing `__c` for `__ChangeEvent` — the double underscore separator is preserved.
|
|
25
|
+
|
|
26
|
+
## "Cannot create a new component with the namespace: <Object>"
|
|
27
|
+
|
|
28
|
+
The member's fullName has two underscores between the entity and `ChangeEvent`. Salesforce parses `Foo__Bar` as `<namespace>__<name>` and rejects creation outside the org's own namespace.
|
|
29
|
+
|
|
30
|
+
- Member fullName format: `<Entity>_ChangeEvent` (single underscore).
|
|
31
|
+
- File name: `<Entity>_ChangeEvent.platformEventChannelMember-meta.xml`.
|
|
32
|
+
|
|
33
|
+
This applies even when the source object has `__c` — the member fullName drops the `__c` and uses single underscore: file `Order_ChangeEvent.platformEventChannelMember-meta.xml`, fullName `Order_ChangeEvent`.
|
|
34
|
+
|
|
35
|
+
## "The selected field, X.Y, isn't valid" (enrichedFields)
|
|
36
|
+
|
|
37
|
+
Enrichment fields must be **single-hop API names on the source entity**. Field type doesn't matter — standard lookup IDs, custom lookups, and custom non-relationship fields all work. The rejection is specifically for relationship-traversal syntax (`X.Y`, `__r.Y`).
|
|
38
|
+
|
|
39
|
+
Verified working in dry-run:
|
|
40
|
+
|
|
41
|
+
| Field | Type | Result |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `OwnerId` | standard lookup ID | ✓ deploys |
|
|
44
|
+
| `ParentId` | standard lookup ID | ✓ deploys |
|
|
45
|
+
| `MyAccountManager__c` | custom Lookup → User | ✓ deploys |
|
|
46
|
+
| `Region__c` | custom Text | ✓ deploys |
|
|
47
|
+
| `Status__c` | custom Picklist | ✓ deploys |
|
|
48
|
+
|
|
49
|
+
Verified rejected:
|
|
50
|
+
|
|
51
|
+
| Field | Why |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `Owner.Name` | relationship traversal |
|
|
54
|
+
| `Parent.Account.Industry` | multi-hop traversal |
|
|
55
|
+
| `MyLookup__r.Name` | relationship traversal (custom) |
|
|
56
|
+
|
|
57
|
+
When the user says "include the owner's name in every event," the metadata stores `OwnerId` — CDC enriches the lookup automatically and the consumer resolves the related record from the ID.
|
|
58
|
+
|
|
59
|
+
## "filter expression has syntax errors: unexpected token: 'WHERE'"
|
|
60
|
+
|
|
61
|
+
The body of `<filterExpression>` is a SOQL WHERE-clause body — without the `WHERE` keyword.
|
|
62
|
+
|
|
63
|
+
| Wrong | Right |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `WHERE Status__c != null` | `Status__c != null` |
|
|
66
|
+
| `WHERE Industry IN ('Tech', 'Finance')` | `Industry IN ('Tech', 'Finance')` |
|
|
67
|
+
|
|
68
|
+
## ChangeEvent entity doesn't exist (for custom objects)
|
|
69
|
+
|
|
70
|
+
`Foo__ChangeEvent` only exists if `Foo__c` exists. If both are being deployed in the same dry-run, the dry-run validator may flag the member because it validates entity references against the *current* org state, not the post-deploy state. Mitigations:
|
|
71
|
+
|
|
72
|
+
- Deploy the source object first, then the channel member in a second deploy.
|
|
73
|
+
- Or accept that dry-run will flag this case but a real (non-dry-run) deploy succeeds because MDAPI orders the components correctly.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Filter Expression Reference
|
|
2
|
+
|
|
3
|
+
The `<filterExpression>` body is a SOQL-WHERE-clause-body — predicate only, no `WHERE` keyword. The platform supports a subset of SOQL grammar for CDC filters; this reference documents what the dry-run deploy verifies.
|
|
4
|
+
|
|
5
|
+
## Operators by field type
|
|
6
|
+
|
|
7
|
+
| Field type | Supported operators | Notes |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Text | `=`, `!=`, `IN`, `NOT IN`, `LIKE` | `LIKE` accepts `%` wildcard. Quote string literals with single quotes. |
|
|
10
|
+
| Number / Currency / Percent | `=`, `!=`, `<`, `<=`, `>`, `>=` | Numeric literals unquoted. |
|
|
11
|
+
| Boolean (Checkbox) | `=`, `!=` | Use `true` / `false` literal — no quotes. |
|
|
12
|
+
| Date | `=`, `!=` | Named literals (`TODAY`, `THIS_WEEK`, `LAST_N_DAYS:7`) and ISO date strings work. |
|
|
13
|
+
| DateTime | `=`, `!=` only | **Range operators (`>`, `<`) are rejected** — "Only equality operators are supported for this field type or value". |
|
|
14
|
+
| Reference (lookup ID) | `=`, `!=`, `IN`, `NOT IN` | Use the 18-character ID in single quotes: `OwnerId = '005000000000000AAA'`. |
|
|
15
|
+
| Picklist | `=`, `!=`, `IN`, `NOT IN` | Quote the value as a string. |
|
|
16
|
+
|
|
17
|
+
## Compound expressions
|
|
18
|
+
|
|
19
|
+
`AND`, `OR`, and parentheses all work. There's no documented limit on nesting depth.
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
(Industry = 'Technology' OR Industry = 'Finance') AND AnnualRevenue > 0 AND Phone != null
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Null checks
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
Phone = null
|
|
29
|
+
Phone != null
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`null` is a literal — no quotes.
|
|
33
|
+
|
|
34
|
+
`ISBLANK()` and `ISNULL()` are **not** valid filter operators — they parse-fail with "unexpected token". They work in formulas but not in CDC filter expressions. Use `Field = null` / `Field != null` instead.
|
|
35
|
+
|
|
36
|
+
## Functions
|
|
37
|
+
|
|
38
|
+
`LOWER(Name) = 'acme'` deploys successfully. Other SOQL functions probably work, but only `LOWER` has been verified in this skill's dataset. Test before relying on `UPPER`, `CONVERTCURRENCY`, etc.
|
|
39
|
+
|
|
40
|
+
## What the filter cannot do
|
|
41
|
+
|
|
42
|
+
| Pattern | Deploy error |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `WHERE Industry = 'Tech'` | "filter expression has syntax errors: unexpected token: 'WHERE'" — drop the keyword. |
|
|
45
|
+
| `IsDeleted = false` | "The IsDeleted field in the filter expression is invalid." Soft-deleted records still emit ChangeEvent; you cannot filter them out via this mechanism. |
|
|
46
|
+
| `Owner.Username = 'foo@bar.com'` | "The Owner.Username field in the filter expression is invalid." Relationship traversal works in `<enrichedFields>` rejection messages but NOT in filter expressions either — single-hop only. |
|
|
47
|
+
| `LastModifiedDate > LAST_N_DAYS:30` | "Only equality operators are supported for this field type or value." DateTime is equality-only; for "recent changes" semantics, use `LastModifiedDate = LAST_N_DAYS:N` (which compares to the *day*, not the timestamp). |
|
|
48
|
+
|
|
49
|
+
## Field-to-field comparison: not supported
|
|
50
|
+
|
|
51
|
+
The right-hand side of a comparison must be a **literal**. Field references are rejected.
|
|
52
|
+
|
|
53
|
+
| Wrong | Deploy error |
|
|
54
|
+
|---|---|
|
|
55
|
+
| `BillingCity = ShippingCity` | "syntax errors: unexpected token: 'ShippingCity'" |
|
|
56
|
+
| `NumberOfEmployees > AnnualRevenue` | "unexpected token: 'AnnualRevenue'" |
|
|
57
|
+
|
|
58
|
+
If the user wants "records where two fields differ," that logic must live downstream of the change event consumer, not in the filter.
|
|
59
|
+
|
|
60
|
+
## Composite (compound) fields like Address: dotted-component is the only valid form
|
|
61
|
+
|
|
62
|
+
Counterintuitively, the opposite rule applies for composite fields like `BillingAddress` vs. relationship traversals like `Owner.Name`. Compound fields **require** dot-notation; flat component names are rejected.
|
|
63
|
+
|
|
64
|
+
| Pattern | Result |
|
|
65
|
+
|---|---|
|
|
66
|
+
| `BillingAddress.City = 'San Francisco'` | ✓ deploys — required form for compound fields |
|
|
67
|
+
| `BillingAddress = null` | ✗ "Compound field BillingAddress has to be used with a component field in a filter expression" |
|
|
68
|
+
| `BillingCity = 'San Francisco'` (flat component) | ✗ "The BillingCity field in the filter expression is invalid" |
|
|
69
|
+
| `BillingState`, `BillingPostalCode`, `BillingCountry`, `BillingLatitude` (flat) | ✗ all rejected as invalid |
|
|
70
|
+
|
|
71
|
+
So, for the same `BillingAddress` field, the accepted form differs by location:
|
|
72
|
+
|
|
73
|
+
| Location | `BillingAddress` (compound) | `BillingAddress.City` (dotted) | `BillingCity` (flat component) |
|
|
74
|
+
|---|---|---|---|
|
|
75
|
+
| `<filterExpression>` | ✗ "has to be used with a component field" | ✓ deploys (required form) | ✗ "field is invalid" |
|
|
76
|
+
| `<enrichedFields>` | ✓ deploys | ✗ "isn't valid" (dots never allowed) | ✗ "isn't valid" (components not exposed at this layer) |
|
|
77
|
+
|
|
78
|
+
Rules per location:
|
|
79
|
+
|
|
80
|
+
- **Filter expression**: address components are reachable only via dotted form on the compound (`BillingAddress.City`). Both the compound itself (no component) and the flat component name are rejected.
|
|
81
|
+
- **Enrichment field**: takes a top-level field API name only. The compound `BillingAddress` is a top-level field and works; dotted forms are never valid here regardless of whether the dot would be a compound-component select or a relationship traversal; flat components like `BillingCity` are not top-level enrichable fields and are rejected.
|
|
82
|
+
- **Relationship traversal** (`Owner.Name`, `Parent.Industry`) is rejected in both locations.
|
|
83
|
+
|
|
84
|
+
The mental model: compound fields are a single physical column with sub-components; relationships are joins. The filter parser supports dotted access into compound sub-components but never into joins. The enrichment list takes top-level field names only and never accepts dots; the platform handles compound-vs-component decomposition itself when emitting the change event payload.
|
|
85
|
+
|
|
86
|
+
## What's NOT yet verified
|
|
87
|
+
|
|
88
|
+
- Aggregate functions or subqueries — almost certainly unsupported.
|
|
89
|
+
- Operators on Long Text, Rich Text, Encrypted, Geolocation field types.
|
|
90
|
+
- Filter on a custom field that doesn't exist (deploy-time error vs runtime).
|
|
91
|
+
- Custom-object-specific picklist with locale-sensitive values.
|
|
92
|
+
|
|
93
|
+
If the user requests one of these and the deploy succeeds — update this file. If it fails — capture the error here.
|
|
@@ -4,7 +4,6 @@ description: "Analyze production Agentforce agent behavior using session traces
|
|
|
4
4
|
allowed-tools: Bash Read Write Edit Glob Grep
|
|
5
5
|
metadata:
|
|
6
6
|
version: "1.0"
|
|
7
|
-
last_updated: "2026-04-08"
|
|
8
7
|
argument-hint: "<org-alias> [--agent-file <path>] [--session-id <id>] [--days <n>]"
|
|
9
8
|
compatibility: claude-code
|
|
10
9
|
---
|
|
@@ -23,18 +23,10 @@ Methods:
|
|
|
23
23
|
# Ensure the classes directory exists
|
|
24
24
|
mkdir -p <project-root>/force-app/main/default/classes
|
|
25
25
|
|
|
26
|
-
# Copy from the
|
|
27
|
-
cp
|
|
26
|
+
# Copy from the skill's apex directory
|
|
27
|
+
cp ../apex/AgentforceOptimizeService.cls \
|
|
28
28
|
<project-root>/force-app/main/default/classes/
|
|
29
|
-
cp
|
|
30
|
-
<project-root>/force-app/main/default/classes/
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
If the skill is installed globally via the installer, use the installed path:
|
|
34
|
-
```bash
|
|
35
|
-
cp ~/.claude/skills/observing-agentforce/apex/AgentforceOptimizeService.cls \
|
|
36
|
-
<project-root>/force-app/main/default/classes/
|
|
37
|
-
cp ~/.claude/skills/observing-agentforce/apex/AgentforceOptimizeService.cls-meta.xml \
|
|
29
|
+
cp ../apex/AgentforceOptimizeService.cls-meta.xml \
|
|
38
30
|
<project-root>/force-app/main/default/classes/
|
|
39
31
|
```
|
|
40
32
|
|
|
@@ -63,14 +63,12 @@ These are intentionally generic and should be adapted to the target org.
|
|
|
63
63
|
|
|
64
64
|
## Quick start
|
|
65
65
|
|
|
66
|
-
> The script examples below assume the skill is installed under `~/.claude/skills/` via the full Claude Code installer. If you are working from a repo checkout, run the same scripts from that checkout path.
|
|
67
|
-
|
|
68
66
|
### 1. Verify the runtime
|
|
69
67
|
|
|
70
68
|
```bash
|
|
71
|
-
bash
|
|
69
|
+
bash ./scripts/verify-plugin.sh
|
|
72
70
|
# or with an org alias
|
|
73
|
-
bash
|
|
71
|
+
bash ./scripts/verify-plugin.sh myorg
|
|
74
72
|
```
|
|
75
73
|
|
|
76
74
|
The helper treats `sf data360 doctor` as advisory and falls back to additional read-only smoke checks when an org is only partially provisioned.
|
|
@@ -78,9 +76,9 @@ The helper treats `sf data360 doctor` as advisory and falls back to additional r
|
|
|
78
76
|
### 2. Diagnose feature readiness before mutating
|
|
79
77
|
|
|
80
78
|
```bash
|
|
81
|
-
node
|
|
79
|
+
node ./scripts/diagnose-org.mjs -o myorg --json
|
|
82
80
|
# optional retrieve-plane probe, only when you know the table is real
|
|
83
|
-
node
|
|
81
|
+
node ./scripts/diagnose-org.mjs -o myorg --phase retrieve --describe-table MyDMO__dlm --json
|
|
84
82
|
```
|
|
85
83
|
|
|
86
84
|
Use the diagnose helper to distinguish between:
|
|
@@ -94,7 +92,7 @@ Use the diagnose helper to distinguish between:
|
|
|
94
92
|
```bash
|
|
95
93
|
python3 ~/.claude/sf-skills-install.py --with-datacloud-runtime
|
|
96
94
|
# or run the helper script directly
|
|
97
|
-
bash
|
|
95
|
+
bash ./scripts/bootstrap-plugin.sh
|
|
98
96
|
```
|
|
99
97
|
|
|
100
98
|
### 4. Start with read-only inspection
|
|
@@ -92,7 +92,7 @@ Recommended checks:
|
|
|
92
92
|
```bash
|
|
93
93
|
sf data360 man
|
|
94
94
|
sf org display -o <alias>
|
|
95
|
-
bash
|
|
95
|
+
bash ./scripts/verify-plugin.sh <alias>
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
Treat `sf data360 doctor` as a broad health signal, not the sole gate. On partially provisioned orgs it can fail even when read-only command families like connectors, DMOs, or segments still work.
|
|
@@ -100,12 +100,12 @@ Treat `sf data360 doctor` as a broad health signal, not the sole gate. On partia
|
|
|
100
100
|
### 2. Classify readiness before changing anything
|
|
101
101
|
Run the shared classifier first:
|
|
102
102
|
```bash
|
|
103
|
-
node
|
|
103
|
+
node ./scripts/diagnose-org.mjs -o <org> --json
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
Only use a query-plane probe after you know the table name is real:
|
|
107
107
|
```bash
|
|
108
|
-
node
|
|
108
|
+
node ./scripts/diagnose-org.mjs -o <org> --phase retrieve --describe-table MyDMO__dlm --json
|
|
109
109
|
```
|
|
110
110
|
|
|
111
111
|
Use the classifier to distinguish:
|
|
@@ -27,13 +27,13 @@ Examples:
|
|
|
27
27
|
Run the shared readiness classifier before mutation-heavy work:
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
node
|
|
30
|
+
node ../scripts/diagnose-org.mjs -o myorg --json
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
For retrieve/query work, only add a table probe when you already know the table name is real:
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
|
-
node
|
|
36
|
+
node ../scripts/diagnose-org.mjs -o myorg --phase retrieve --describe-table MyDMO__dlm --json
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
## Signal matrix
|
|
@@ -18,8 +18,6 @@ The orchestrating-datacloud family uses a **community `sf data360` CLI runtime**
|
|
|
18
18
|
|
|
19
19
|
## Recommended setup path
|
|
20
20
|
|
|
21
|
-
The command examples below assume the skill is installed under `~/.claude/skills/` via the full Claude Code installer. If you are working from a cloned sf-skills repo instead, run the same scripts from that checkout path.
|
|
22
|
-
|
|
23
21
|
If you use the Python installer, it can install this optional runtime for you:
|
|
24
22
|
|
|
25
23
|
```bash
|
|
@@ -29,7 +27,7 @@ python3 ~/.claude/sf-skills-install.py --with-datacloud-runtime
|
|
|
29
27
|
Or use the helper script directly:
|
|
30
28
|
|
|
31
29
|
```bash
|
|
32
|
-
bash
|
|
30
|
+
bash ../scripts/bootstrap-plugin.sh
|
|
33
31
|
```
|
|
34
32
|
|
|
35
33
|
By default it clones the plugin into `~/.sf-community-tools/datacloud/sf-cli-plugin-data360`, installs dependencies, compiles it, and links it into the local Salesforce CLI.
|
|
@@ -41,7 +39,7 @@ git clone https://github.com/Jaganpro/sf-cli-plugin-data360.git
|
|
|
41
39
|
cd sf-cli-plugin-data360
|
|
42
40
|
yarn install
|
|
43
41
|
npx tsc
|
|
44
|
-
node
|
|
42
|
+
node ../scripts/generate-manifest.mjs .
|
|
45
43
|
sf plugins link .
|
|
46
44
|
```
|
|
47
45
|
|
|
@@ -49,9 +47,9 @@ sf plugins link .
|
|
|
49
47
|
|
|
50
48
|
```bash
|
|
51
49
|
sf data360 man
|
|
52
|
-
bash
|
|
53
|
-
bash
|
|
54
|
-
node
|
|
50
|
+
bash ../scripts/verify-plugin.sh
|
|
51
|
+
bash ../scripts/verify-plugin.sh myorg
|
|
52
|
+
node ../scripts/diagnose-org.mjs -o myorg --json
|
|
55
53
|
```
|
|
56
54
|
|
|
57
55
|
For newer command families such as `sf data360 query hybrid` and recent pagination fixes, update the community runtime to the latest upstream commit by re-running the bootstrap helper.
|
|
@@ -80,7 +78,7 @@ sf data360 segment list -o myorg 2>/dev/null
|
|
|
80
78
|
If you see `Warning: @gthoppae/sf-cli-plugin-data360 is a linked ESM module and cannot be auto-transpiled`, generate the oclif command manifest:
|
|
81
79
|
|
|
82
80
|
```bash
|
|
83
|
-
node
|
|
81
|
+
node ../scripts/generate-manifest.mjs ~/.sf-community-tools/datacloud/sf-cli-plugin-data360
|
|
84
82
|
```
|
|
85
83
|
|
|
86
84
|
This tells oclif to use pre-compiled output directly instead of attempting auto-transpilation. The `npx oclif manifest` alternative may fail on newer Node.js versions due to `@oclif/core` version mismatches.
|
|
@@ -257,7 +257,7 @@ function guidanceFromProbe(scope, probe) {
|
|
|
257
257
|
if (probe.state === 'runtime_missing') {
|
|
258
258
|
return [
|
|
259
259
|
'Install or relink the community sf data360 runtime before attempting Data Cloud work.',
|
|
260
|
-
'Use python3 ~/.claude/sf-skills-install.py --with-datacloud-runtime or bash
|
|
260
|
+
'Use python3 ~/.claude/sf-skills-install.py --with-datacloud-runtime or bash ./scripts/bootstrap-plugin.sh.',
|
|
261
261
|
];
|
|
262
262
|
}
|
|
263
263
|
|
|
@@ -10,7 +10,7 @@ fi
|
|
|
10
10
|
|
|
11
11
|
if ! sf data360 man >/dev/null 2>&1; then
|
|
12
12
|
echo "The community 'sf data360' runtime is not available." >&2
|
|
13
|
-
echo "Run bash
|
|
13
|
+
echo "Run bash ./scripts/bootstrap-plugin.sh first." >&2
|
|
14
14
|
exit 1
|
|
15
15
|
fi
|
|
16
16
|
|
|
@@ -54,5 +54,5 @@ fi
|
|
|
54
54
|
|
|
55
55
|
echo "Verification complete."
|
|
56
56
|
if [[ -n "${ORG}" ]]; then
|
|
57
|
-
echo "Next: node
|
|
57
|
+
echo "Next: node ./scripts/diagnose-org.mjs -o '${ORG}' --json"
|
|
58
58
|
fi
|
|
@@ -44,7 +44,7 @@ Ask for or infer:
|
|
|
44
44
|
## Core Operating Rules
|
|
45
45
|
|
|
46
46
|
- Verify the external plugin runtime before running Data Cloud commands.
|
|
47
|
-
- Run the shared readiness classifier before mutating ingestion assets: `node
|
|
47
|
+
- Run the shared readiness classifier before mutating ingestion assets: `node ../orchestrating-datacloud/scripts/diagnose-org.mjs -o <org> --phase prepare --json`.
|
|
48
48
|
- Prefer inspecting existing streams and DLOs before creating new ingestion assets.
|
|
49
49
|
- Suppress linked-plugin warning noise with `2>/dev/null` for normal usage.
|
|
50
50
|
- Treat DLO naming and field naming as Data Cloud-specific, not CRM-native.
|
|
@@ -59,7 +59,7 @@ Ask for or infer:
|
|
|
59
59
|
|
|
60
60
|
### 1. Classify readiness for prepare work
|
|
61
61
|
```bash
|
|
62
|
-
node
|
|
62
|
+
node ../orchestrating-datacloud/scripts/diagnose-org.mjs -o <org> --phase prepare --json
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
### 2. Inspect existing ingestion assets
|
|
@@ -39,7 +39,7 @@ Ask for or infer:
|
|
|
39
39
|
## Core Operating Rules
|
|
40
40
|
|
|
41
41
|
- Treat Data Cloud SQL as its own query language, not SOQL.
|
|
42
|
-
- Run the shared readiness classifier before relying on query/search surfaces: `node
|
|
42
|
+
- Run the shared readiness classifier before relying on query/search surfaces: `node ../orchestrating-datacloud/scripts/diagnose-org.mjs -o <org> --phase retrieve --json`.
|
|
43
43
|
- Use describe before guessing columns.
|
|
44
44
|
- Prefer `sqlv2` or async query flows for larger result sets.
|
|
45
45
|
- Use vector search or hybrid search only when the search index lifecycle is healthy.
|
|
@@ -51,9 +51,9 @@ Ask for or infer:
|
|
|
51
51
|
|
|
52
52
|
### 1. Classify readiness for retrieve work
|
|
53
53
|
```bash
|
|
54
|
-
node
|
|
54
|
+
node ../orchestrating-datacloud/scripts/diagnose-org.mjs -o <org> --phase retrieve --json
|
|
55
55
|
# optional query-plane probe, only with a real table name
|
|
56
|
-
node
|
|
56
|
+
node ../orchestrating-datacloud/scripts/diagnose-org.mjs -o <org> --phase retrieve --describe-table MyDMO__dlm --json
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
### 2. Choose the smallest correct query shape
|