@peernova/cuneiform-sf 1.0.2 → 1.0.4-beta.6
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/LICENSE +81 -30
- package/README.md +59 -95
- package/messages/compatibility.check.md +71 -0
- package/messages/cuneiform.access.md +138 -0
- package/messages/definition.create.md +511 -0
- package/messages/definition.export.md +88 -0
- package/messages/definition.get.md +147 -0
- package/messages/definition.import.md +65 -0
- package/messages/definition.list.md +264 -0
- package/messages/definition.purge.md +318 -0
- package/messages/definition.update.md +80 -0
- package/messages/mcp.serve.md +66 -0
- package/messages/object.describe.md +201 -0
- package/messages/object.list.md +443 -0
- package/messages/org.details.md +386 -0
- package/messages/org.reset.md +71 -0
- package/messages/profile.md +231 -0
- package/messages/profile.request.cancel.md +143 -0
- package/messages/profile.request.delete.md +139 -0
- package/messages/profile.request.list.md +89 -0
- package/messages/summary.purge.md +218 -0
- package/messages/summary.reprofile.md +150 -0
- package/messages/summary.stop.md +157 -0
- package/messages/user.details.md +501 -0
- package/oclif.lock +3021 -2224
- package/oclif.manifest.json +2 -116
- package/package.json +84 -19
- package/lib/commands/cuneiform/about.d.ts +0 -13
- package/lib/commands/cuneiform/about.js +0 -26
- package/lib/commands/cuneiform/about.js.map +0 -1
- package/lib/commands/hello/world.d.ts +0 -14
- package/lib/commands/hello/world.js +0 -27
- package/lib/commands/hello/world.js.map +0 -1
- package/lib/index.d.ts +0 -2
- package/lib/index.js +0 -2
- package/lib/index.js.map +0 -1
- package/messages/cuneiform.about.md +0 -19
- package/messages/hello.world.md +0 -29
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# summary
|
|
2
|
+
|
|
3
|
+
Delete profiling definitions that no longer represent current analysis intent — keeping the definition inventory focused on actively profiled objects.
|
|
4
|
+
|
|
5
|
+
# description
|
|
6
|
+
|
|
7
|
+
Profiling definitions accumulate over iterative scoping cycles: test definitions, exploration definitions, definitions for objects the team decided not to profile. This command removes them, leaving the inventory focused on current business intent.
|
|
8
|
+
|
|
9
|
+
Three selection modes: by specific definition key (`--keys`), by composable AND filters (object, pattern, method, category, status, namespace), or all definitions (`--all`). Before deletion, the command pre-categorizes every matched definition into two groups: deletable (no summaries) and blocked by summaries (must run `summary purge` first). A paginated preview table shows this categorization with a can-delete indicator per definition.
|
|
10
|
+
|
|
11
|
+
IMPORTANT: Definitions with existing summaries must have their summaries purged first. The full cleanup dependency order:
|
|
12
|
+
|
|
13
|
+
1. `sf cuneiform profile request cancel` — cancel queued requests
|
|
14
|
+
2. `sf cuneiform profile request delete` — remove canceled and rejected requests
|
|
15
|
+
3. `sf cuneiform summary purge` — remove summaries (cascade-deletes completed requests; resets definition status)
|
|
16
|
+
4. `sf cuneiform definition purge` — remove definitions (requires zero summaries)
|
|
17
|
+
|
|
18
|
+
THREE SELECTION MODES:
|
|
19
|
+
|
|
20
|
+
- **By key** (`--keys PD-0001,PD-0003`) — Delete specific definitions. Exclusive mode — all filter flags are ignored.
|
|
21
|
+
- **By filter** (`--objects Account --method metadata`) — Delete definitions matching ALL specified filters (AND logic). Combine --objects, --filter, --pattern, --method, --category, --status, and --namespace.
|
|
22
|
+
- **All** (`--all`) — Delete all eligible definitions. Can be combined with filters to narrow scope.
|
|
23
|
+
|
|
24
|
+
NATURAL LANGUAGE → FLAG MAPPING:
|
|
25
|
+
"delete the Account definition" → --keys PD-0001 (look up the key with `definition list`)
|
|
26
|
+
"remove all unused definitions" → --all --status "NOT PROFILED"
|
|
27
|
+
"clean up custom object definitions" → --all --filter custom
|
|
28
|
+
"delete metadata-only definitions" → --all --method metadata
|
|
29
|
+
"remove FSC definitions" → --all --namespace FinServ
|
|
30
|
+
"what would be deleted?" → --all --dry-run
|
|
31
|
+
|
|
32
|
+
COMMAND SEQUENCE: `summary purge` (remove summaries from blocked definitions) → `definition purge --dry-run` (preview) → `definition purge` (execute)
|
|
33
|
+
|
|
34
|
+
# flags.target-org.summary
|
|
35
|
+
|
|
36
|
+
Salesforce org to purge definitions from. The command validates Cuneiform installation and permissions before any deletions.
|
|
37
|
+
|
|
38
|
+
# flags.all.summary
|
|
39
|
+
|
|
40
|
+
Target all definitions for deletion. Combine with filter flags (--objects, --method, --status, etc.) to narrow scope. Definitions blocked by summaries are reported but not deleted — run `summary purge` for those first.
|
|
41
|
+
|
|
42
|
+
# flags.keys.summary
|
|
43
|
+
|
|
44
|
+
Delete specific definitions by key (e.g., --keys PD-0001,PD-0003). Exclusive mode — when --keys is specified, all other filter flags are ignored. Look up definition keys with `definition list`.
|
|
45
|
+
|
|
46
|
+
# flags.objects.summary
|
|
47
|
+
|
|
48
|
+
Filter definitions by target object API names (e.g., --objects Account,Contact). Limits deletion to definitions targeting the specified objects.
|
|
49
|
+
|
|
50
|
+
# flags.filter.summary
|
|
51
|
+
|
|
52
|
+
Filter definitions by object type: standard or custom. Targets definitions for one category of objects (e.g., --filter custom to clean up custom object definitions after scoping).
|
|
53
|
+
|
|
54
|
+
# flags.pattern.summary
|
|
55
|
+
|
|
56
|
+
Filter definitions by name pattern using SOQL LIKE wildcards (e.g., --pattern Account% matches definitions whose name starts with "Account"). Use % for multi-character wildcard and \_ for single-character wildcard.
|
|
57
|
+
|
|
58
|
+
# flags.method.summary
|
|
59
|
+
|
|
60
|
+
Filter definitions by profiling method: metadata, historical, or comparative (e.g., --method metadata to remove metadata-only definitions). Targets definitions of a specific analysis type.
|
|
61
|
+
|
|
62
|
+
# flags.category.summary
|
|
63
|
+
|
|
64
|
+
Filter definitions by category label (e.g., --category "Phase 1"). Removes definitions from a completed engagement phase or functional area.
|
|
65
|
+
|
|
66
|
+
# flags.status.summary
|
|
67
|
+
|
|
68
|
+
Filter definitions by profiling status: "NOT PROFILED", "IN PROGRESS", "COMPLETE", "COMPLETE w/ FAILURES", or "ERROR". Use --status "NOT PROFILED" to target definitions that were created but never executed.
|
|
69
|
+
|
|
70
|
+
# flags.namespace.summary
|
|
71
|
+
|
|
72
|
+
Filter definitions by the namespace prefix of their target object (e.g., --namespace FinServ for Financial Services Cloud, --namespace SBQQ for CPQ). Removes definitions for a managed package that is no longer in profiling scope.
|
|
73
|
+
|
|
74
|
+
# flags.limit.summary
|
|
75
|
+
|
|
76
|
+
Maximum number of definitions to process per batch (default: 50). Controls batch size for large deletion operations.
|
|
77
|
+
|
|
78
|
+
# flags.dry-run.summary
|
|
79
|
+
|
|
80
|
+
Preview what would be deleted without making changes. Shows the same two-category classification (deletable and blocked by summaries) as a real run. Use this first to verify scope and share the preview with stakeholders before committing.
|
|
81
|
+
|
|
82
|
+
# flags.format.summary
|
|
83
|
+
|
|
84
|
+
Output format: table (default, human-readable) or json (structured output for scripted pipelines).
|
|
85
|
+
|
|
86
|
+
# examples
|
|
87
|
+
|
|
88
|
+
- Preview what would be deleted and what is blocked by summaries:
|
|
89
|
+
|
|
90
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --all --dry-run
|
|
91
|
+
|
|
92
|
+
- Delete specific definitions by key (exclusive mode ignores all filters):
|
|
93
|
+
|
|
94
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --keys PD-0001,PD-0003
|
|
95
|
+
|
|
96
|
+
- Remove definitions that were never profiled after exploration:
|
|
97
|
+
|
|
98
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --all --status "NOT PROFILED"
|
|
99
|
+
|
|
100
|
+
- Clean up Financial Services Cloud definitions no longer in profiling scope:
|
|
101
|
+
|
|
102
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --all --namespace FinServ
|
|
103
|
+
|
|
104
|
+
- Remove metadata-only definitions after upgrading to comparative analysis:
|
|
105
|
+
|
|
106
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --all --method metadata
|
|
107
|
+
|
|
108
|
+
- Scripted scratch org reset with JSON output for CI verification:
|
|
109
|
+
|
|
110
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --all --no-prompt --format json
|
|
111
|
+
|
|
112
|
+
# errors.noSelectionCriteria
|
|
113
|
+
|
|
114
|
+
No selection criteria specified. Provide --all, --keys, or filter flags.
|
|
115
|
+
|
|
116
|
+
# errors.noEligibleDefinitions
|
|
117
|
+
|
|
118
|
+
No definitions found matching the specified criteria.
|
|
119
|
+
|
|
120
|
+
# errors.queryFailed
|
|
121
|
+
|
|
122
|
+
Failed to query definitions: %s
|
|
123
|
+
|
|
124
|
+
# errors.deleteFailed
|
|
125
|
+
|
|
126
|
+
Failed to delete definitions: %s
|
|
127
|
+
|
|
128
|
+
# errors.noTargetOrg
|
|
129
|
+
|
|
130
|
+
Could not determine target org username.
|
|
131
|
+
|
|
132
|
+
# blockedBySummaries.header
|
|
133
|
+
|
|
134
|
+
Blocked by summaries — run `sf cuneiform summary purge` first:
|
|
135
|
+
|
|
136
|
+
# queued.header
|
|
137
|
+
|
|
138
|
+
Queued — these definitions have related requests in queue and cannot be deleted yet:
|
|
139
|
+
|
|
140
|
+
# flags.no-prompt.summary
|
|
141
|
+
|
|
142
|
+
Skip the confirmation prompt and delete immediately. Use for scripted execution in CI pipelines and automation workflows.
|
|
143
|
+
|
|
144
|
+
# prompt.confirm.singular
|
|
145
|
+
|
|
146
|
+
Delete this Profiling Definition
|
|
147
|
+
|
|
148
|
+
# prompt.confirm.plural
|
|
149
|
+
|
|
150
|
+
Delete these %s Profiling Definitions
|
|
151
|
+
|
|
152
|
+
# output.noDeletable
|
|
153
|
+
|
|
154
|
+
Purge cancelled — there are no Profiling Definitions that can be deleted.
|
|
155
|
+
|
|
156
|
+
# output.cancelled
|
|
157
|
+
|
|
158
|
+
Purge cancelled. No definitions were deleted.
|
|
159
|
+
|
|
160
|
+
# spinner.connecting
|
|
161
|
+
|
|
162
|
+
Connecting
|
|
163
|
+
|
|
164
|
+
# spinner.retrievingDefinitions
|
|
165
|
+
|
|
166
|
+
Retrieving Definitions
|
|
167
|
+
|
|
168
|
+
# spinner.deletingDefinitions
|
|
169
|
+
|
|
170
|
+
Deleting Definitions
|
|
171
|
+
|
|
172
|
+
# spinner.status.deleted
|
|
173
|
+
|
|
174
|
+
deleted
|
|
175
|
+
|
|
176
|
+
# spinner.status.skipped
|
|
177
|
+
|
|
178
|
+
skipped
|
|
179
|
+
|
|
180
|
+
# spinner.status.failed
|
|
181
|
+
|
|
182
|
+
failed
|
|
183
|
+
|
|
184
|
+
# spinner.status.queued
|
|
185
|
+
|
|
186
|
+
queued
|
|
187
|
+
|
|
188
|
+
# output.initializing
|
|
189
|
+
|
|
190
|
+
Initializing Profiling Definition Purging %s...
|
|
191
|
+
|
|
192
|
+
# output.initializing.dryRunMode
|
|
193
|
+
|
|
194
|
+
(dry run)
|
|
195
|
+
|
|
196
|
+
# output.definitionsFound.singular
|
|
197
|
+
|
|
198
|
+
%s definition found
|
|
199
|
+
|
|
200
|
+
# output.definitionsFound.plural
|
|
201
|
+
|
|
202
|
+
%s definitions found
|
|
203
|
+
|
|
204
|
+
# output.noEligible.message
|
|
205
|
+
|
|
206
|
+
No definitions were found matching the specified criteria.
|
|
207
|
+
|
|
208
|
+
# output.noEligible.guidance
|
|
209
|
+
|
|
210
|
+
- Please check your filters and confirm that definitions exist in your Salesforce org.
|
|
211
|
+
|
|
212
|
+
# output.summaryHeader
|
|
213
|
+
|
|
214
|
+
Summary
|
|
215
|
+
|
|
216
|
+
# output.summary.deleted
|
|
217
|
+
|
|
218
|
+
Deleted:
|
|
219
|
+
|
|
220
|
+
# output.summary.skipped
|
|
221
|
+
|
|
222
|
+
Skipped:
|
|
223
|
+
|
|
224
|
+
# output.summary.failed
|
|
225
|
+
|
|
226
|
+
Failed:
|
|
227
|
+
|
|
228
|
+
# output.summary.queued
|
|
229
|
+
|
|
230
|
+
Queued:
|
|
231
|
+
|
|
232
|
+
# output.summary.total
|
|
233
|
+
|
|
234
|
+
Total:
|
|
235
|
+
|
|
236
|
+
# reason.hasSummaries
|
|
237
|
+
|
|
238
|
+
Has Summaries
|
|
239
|
+
|
|
240
|
+
# reason.notFound
|
|
241
|
+
|
|
242
|
+
Not Found
|
|
243
|
+
|
|
244
|
+
# reason.lookupFailed
|
|
245
|
+
|
|
246
|
+
Lookup Failed
|
|
247
|
+
|
|
248
|
+
# reason.queuedKeyword
|
|
249
|
+
|
|
250
|
+
has related requests in queue
|
|
251
|
+
|
|
252
|
+
# table.header.key
|
|
253
|
+
|
|
254
|
+
Key
|
|
255
|
+
|
|
256
|
+
# table.header.object
|
|
257
|
+
|
|
258
|
+
Object
|
|
259
|
+
|
|
260
|
+
# table.header.category
|
|
261
|
+
|
|
262
|
+
Category
|
|
263
|
+
|
|
264
|
+
# table.header.timeCategory
|
|
265
|
+
|
|
266
|
+
Time Category
|
|
267
|
+
|
|
268
|
+
# table.header.segmentCategory
|
|
269
|
+
|
|
270
|
+
Segment Category
|
|
271
|
+
|
|
272
|
+
# table.header.status
|
|
273
|
+
|
|
274
|
+
Status
|
|
275
|
+
|
|
276
|
+
# table.header.deleted
|
|
277
|
+
|
|
278
|
+
Deleted?
|
|
279
|
+
|
|
280
|
+
# table.header.canDelete
|
|
281
|
+
|
|
282
|
+
Can Delete?
|
|
283
|
+
|
|
284
|
+
# preview.summary
|
|
285
|
+
|
|
286
|
+
%s to delete, %s blocked by summaries
|
|
287
|
+
|
|
288
|
+
# dryRun.banner.singular
|
|
289
|
+
|
|
290
|
+
[DRY RUN] Would delete %s definition. %s blocked by summaries.
|
|
291
|
+
|
|
292
|
+
# dryRun.banner.plural
|
|
293
|
+
|
|
294
|
+
[DRY RUN] Would delete %s definitions. %s blocked by summaries.
|
|
295
|
+
|
|
296
|
+
# table.column.key
|
|
297
|
+
|
|
298
|
+
KEY
|
|
299
|
+
|
|
300
|
+
# table.column.name
|
|
301
|
+
|
|
302
|
+
NAME
|
|
303
|
+
|
|
304
|
+
# table.column.object
|
|
305
|
+
|
|
306
|
+
OBJECT
|
|
307
|
+
|
|
308
|
+
# table.column.status
|
|
309
|
+
|
|
310
|
+
STATUS
|
|
311
|
+
|
|
312
|
+
# table.column.action
|
|
313
|
+
|
|
314
|
+
ACTION
|
|
315
|
+
|
|
316
|
+
# warnings.limitIgnoredWithAll
|
|
317
|
+
|
|
318
|
+
--limit is ignored when --all is specified. All eligible records will be processed.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# summary
|
|
2
|
+
|
|
3
|
+
Replace the field list on an existing profiling definition — preserving the definition's key, name, method, category, and profiling history while updating which fields get analyzed.
|
|
4
|
+
|
|
5
|
+
# description
|
|
6
|
+
|
|
7
|
+
A profiling definition specifies which fields on a Salesforce object will be analyzed during a profiling run. When a definition is first created, its field list captures a point-in-time snapshot of the object's schema. Schemas evolve — fields are added, deprecated, or reclassified — and the profiling scope needs to evolve with them.
|
|
8
|
+
|
|
9
|
+
This command replaces the field list on an existing definition. It takes a Salesforce record ID and one or more field API names, then writes the new selection to the definition record via the API. The definition's key, name, object binding, method, category, and profiling history are all preserved — only the field selection changes.
|
|
10
|
+
|
|
11
|
+
This is a full replacement operation — the new field list replaces the existing one entirely. Include all fields you want profiled, not just additions.
|
|
12
|
+
|
|
13
|
+
WHAT IT DOES:
|
|
14
|
+
|
|
15
|
+
- Replaces the definition's selected fields with the specified field API names
|
|
16
|
+
- Deduplicates field names (duplicates are removed, order is preserved)
|
|
17
|
+
- Validates the definition ID format (15 or 18 character Salesforce ID)
|
|
18
|
+
- Returns the updated field count
|
|
19
|
+
- Preserves definition identity: key, name, object, method, category, and profiling history remain intact
|
|
20
|
+
|
|
21
|
+
WHEN TO USE:
|
|
22
|
+
|
|
23
|
+
- After deploying new custom fields to a Salesforce object
|
|
24
|
+
- To narrow profiling scope to analytically significant fields after reviewing initial results
|
|
25
|
+
- To expand profiling scope when managed package upgrades add fields
|
|
26
|
+
- When synchronizing definition field lists with current object metadata in CI scripts
|
|
27
|
+
|
|
28
|
+
NATURAL LANGUAGE → FLAG MAPPING:
|
|
29
|
+
"update the field list for Account definition" → --id <definition-id> --fields Name --fields Email --fields Phone
|
|
30
|
+
"change which fields are profiled" → --id <definition-id> --fields <field1> --fields <field2>
|
|
31
|
+
"sync definition fields with metadata" → --id <definition-id> --fields <all-current-fields>
|
|
32
|
+
"narrow profiling to 10 fields" → --id <definition-id> --fields <field1> ... --fields <field10>
|
|
33
|
+
|
|
34
|
+
COMMAND SEQUENCE: `definition get` (retrieve current fields and definition ID) → `definition update` (replace field list) → `profile` (re-run profiling with updated scope)
|
|
35
|
+
|
|
36
|
+
# flags.target-org.summary
|
|
37
|
+
|
|
38
|
+
Salesforce org containing the definition to update. The command validates permissions before writing.
|
|
39
|
+
|
|
40
|
+
# flags.id.summary
|
|
41
|
+
|
|
42
|
+
Salesforce record ID (15 or 18 character) of the profiling definition to update. Retrieve definition IDs with `sf cuneiform definition get` or `sf cuneiform definition list`.
|
|
43
|
+
|
|
44
|
+
# flags.fields.summary
|
|
45
|
+
|
|
46
|
+
Field API names to set on the definition. Replaces the existing field list entirely — include all fields you want profiled, not just additions. Repeat the flag for each field (e.g., --fields Name --fields Email --fields Phone). Cross-object fields use dot notation (e.g., Account.Name). Duplicates are automatically removed while preserving order.
|
|
47
|
+
|
|
48
|
+
# flags.format.summary
|
|
49
|
+
|
|
50
|
+
Output format: table (human-readable, default) or json (structured output for scripting).
|
|
51
|
+
|
|
52
|
+
# examples
|
|
53
|
+
|
|
54
|
+
- Replace the field list on a definition after deploying new custom fields:
|
|
55
|
+
|
|
56
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --id a00000000000001AAA --fields Name --fields Email --fields Phone
|
|
57
|
+
|
|
58
|
+
- Narrow profiling scope to analytically significant fields:
|
|
59
|
+
|
|
60
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --id a00000000000001AAA --fields Amount --fields StageName --fields CloseDate --fields Probability
|
|
61
|
+
|
|
62
|
+
- Include cross-object lookup fields using dot notation:
|
|
63
|
+
|
|
64
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --id a00000000000001AAA --fields Name --fields Email --fields Phone --fields Account.Name
|
|
65
|
+
|
|
66
|
+
- Output update results as JSON for scripted bulk field refresh:
|
|
67
|
+
|
|
68
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --id a00000000000001AAA --fields Name --fields Email --json
|
|
69
|
+
|
|
70
|
+
# errors.invalidDefinitionId
|
|
71
|
+
|
|
72
|
+
Invalid definition ID format: %s. Expected a 15 or 18 character Salesforce ID.
|
|
73
|
+
|
|
74
|
+
# errors.noFieldsProvided
|
|
75
|
+
|
|
76
|
+
No fields provided. Use --fields to specify one or more field API names.
|
|
77
|
+
|
|
78
|
+
# errors.updateFailed
|
|
79
|
+
|
|
80
|
+
Failed to update definition %s: %s
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# summary
|
|
2
|
+
|
|
3
|
+
Start the MCP server to expose 18 Cuneiform tools to AI assistants — enabling natural language org discovery, definition management, and profiling through Claude Desktop, Cursor, or any MCP client.
|
|
4
|
+
|
|
5
|
+
# description
|
|
6
|
+
|
|
7
|
+
Starts the Cuneiform MCP (Model Context Protocol) server, exposing Cuneiform CLI capabilities as tools for AI assistants. Once running, an LLM client can query your org, list objects, describe fields, manage definitions, and execute profiling through natural language — using the same permissions as your CLI session.
|
|
8
|
+
|
|
9
|
+
The server registers tools across categories covering org and metadata discovery, user management, definition lifecycle, definition import/export, analysis, and profiling execution. A system prompt provides LLMs with an incremental exploration workflow for the KYCD journey.
|
|
10
|
+
|
|
11
|
+
David Chen wires this into Claude Desktop and Cursor workflows — the registered tools give him a well-defined API contract. Marcus Thompson uses it to accelerate org exploration through conversational queries. Andre Robitaille demonstrates MCP integration during workshops, where attendees experience Cuneiform through natural dialogue.
|
|
12
|
+
|
|
13
|
+
TRANSPORT: The server uses stdio (stdin/stdout) with JSON-RPC 2.0 protocol. Logging goes to stderr (enable with --debug). The stdio transport ensures the server runs locally alongside the Salesforce CLI — same machine, same authenticated session.
|
|
14
|
+
|
|
15
|
+
This command blocks until the MCP client disconnects. It is designed to be launched by an MCP client (Claude Desktop, Cursor, etc.). The access gate validates Cuneiform permissions at startup — the same gate used by all Cuneiform commands. On access gate failure, the command exits with an error describing the missing permission and how to resolve it via `user details --configure`.
|
|
16
|
+
|
|
17
|
+
**When to run this command:**
|
|
18
|
+
|
|
19
|
+
- AI-guided org discovery — let Claude explore a new client org through natural language
|
|
20
|
+
- Hands-free definition creation — describe what you want and let the AI translate to tool calls
|
|
21
|
+
- Training demonstrations — show Cuneiform capabilities through interactive AI conversation
|
|
22
|
+
- Automated workflows — integrate Cuneiform tools into AI agent pipelines
|
|
23
|
+
|
|
24
|
+
NATURAL LANGUAGE → FLAG MAPPING:
|
|
25
|
+
"start the MCP server" → --target-org myOrg
|
|
26
|
+
"troubleshoot MCP tool calls" → --target-org myOrg --debug
|
|
27
|
+
"pin a specific API version" → --target-org myOrg --api-version 59.0
|
|
28
|
+
|
|
29
|
+
CONFIGURATION: Add the server to your AI tool's settings. For Claude Desktop, add to `claude_desktop_config.json`:
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"mcpServers": {
|
|
34
|
+
"cuneiform": {
|
|
35
|
+
"command": "sf",
|
|
36
|
+
"args": ["cuneiform", "mcp", "serve", "--target-org", "myOrg"]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
# examples
|
|
43
|
+
|
|
44
|
+
- Start the MCP server for an org — the standard launch configuration:
|
|
45
|
+
|
|
46
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg
|
|
47
|
+
|
|
48
|
+
- Start with debug logging — see tool invocations and parameters on stderr:
|
|
49
|
+
|
|
50
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --debug
|
|
51
|
+
|
|
52
|
+
- Pin a specific API version — for consistent behavior across environments:
|
|
53
|
+
|
|
54
|
+
<%= config.bin %> <%= command.id %> --target-org myOrg --api-version 59.0
|
|
55
|
+
|
|
56
|
+
# flags.target-org.summary
|
|
57
|
+
|
|
58
|
+
The Salesforce org to connect the MCP server to. The server inherits this org's authentication for all 18 tool invocations. Specify the org alias or username.
|
|
59
|
+
|
|
60
|
+
# flags.api-version.summary
|
|
61
|
+
|
|
62
|
+
Override the API version used for Salesforce API requests made through MCP tools. Use when troubleshooting version-specific behavior or testing against a specific API release.
|
|
63
|
+
|
|
64
|
+
# flags.debug.summary
|
|
65
|
+
|
|
66
|
+
Enable debug logging to stderr. Shows tool invocations, parameters, and response metadata for troubleshooting MCP communication. stdout remains reserved for MCP protocol traffic.
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# summary
|
|
2
|
+
|
|
3
|
+
Retrieve comprehensive object metadata — fields, record types, data age distribution, relationships, and profiling status — to make informed decisions about what and how to profile.
|
|
4
|
+
|
|
5
|
+
# description
|
|
6
|
+
|
|
7
|
+
Understanding an object before profiling it is the difference between a targeted assessment and a fishing expedition. Salesforce scatters object metadata across Object Manager, Schema Builder, and Setup. This command consolidates everything into structured sections from a single call:
|
|
8
|
+
|
|
9
|
+
- **Object Summary** — record count, field totals, type
|
|
10
|
+
- **Record Age Distribution** — year-by-year grid showing when records were created (Cuneiform-exclusive), revealing whether data is actively growing, historical, or stagnant
|
|
11
|
+
- **Record Types** — name, developer name, active status, default flag
|
|
12
|
+
- **Business Processes** — active processes with record type associations and per-process record age grids
|
|
13
|
+
- **Field Summary** — total, standard, custom, formula, lookup counts
|
|
14
|
+
- **Field Type Distribution** — type counts with percentages
|
|
15
|
+
- **Namespace Breakdown** — fields grouped by namespace prefix showing which managed packages contribute fields
|
|
16
|
+
- **External References** — other objects that reference this one via lookups or master-detail
|
|
17
|
+
- **Outbound Lookups** — this object's lookup fields and their target objects
|
|
18
|
+
- **Profiling Status** — existing definitions, summary counts, last profiled date
|
|
19
|
+
- **Field Listing** (opt-in via `--with-fields`) — individual field detail with filtering and sorting
|
|
20
|
+
|
|
21
|
+
The record age distribution and per-business-process age grids directly inform the choice between metadata, historical, and comparative profiling methods. The profiling status section shows whether definitions already exist, preventing duplicate work.
|
|
22
|
+
|
|
23
|
+
NATURAL LANGUAGE → FLAG MAPPING:
|
|
24
|
+
|
|
25
|
+
"Show me the fields" → `--with-fields`
|
|
26
|
+
"Just the lookup fields" → `--with-fields --field-type lookup`
|
|
27
|
+
"Just custom fields" → `--with-fields --field-pattern "*__c"`
|
|
28
|
+
"Sort fields by type" → `--with-fields --sort type`
|
|
29
|
+
"Compare multiple objects" → `--object Account,Contact,Opportunity`
|
|
30
|
+
|
|
31
|
+
For multiple objects (comma-separated), describes run in parallel with aggregate totals across all objects. Big Objects (**b) and External Objects (**x) are not supported — they lack standard SOQL support.
|
|
32
|
+
|
|
33
|
+
Read-only. Does not modify objects, fields, or metadata. The access gate validates Cuneiform installation and permissions before queries execute.
|
|
34
|
+
|
|
35
|
+
COMMAND SEQUENCE: `object list` (identify objects of interest) → `object describe` (deep dive on specific objects) → `definition create` (define profiling scope based on what you learned)
|
|
36
|
+
|
|
37
|
+
# flags.target-org.summary
|
|
38
|
+
|
|
39
|
+
Describe objects from this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.
|
|
40
|
+
|
|
41
|
+
# flags.object.summary
|
|
42
|
+
|
|
43
|
+
Object API name(s), comma-separated. Use one name for a complete deep dive or multiple for side-by-side comparison with aggregate totals (e.g., `Account,Contact,Opportunity`).
|
|
44
|
+
|
|
45
|
+
# flags.with-fields.summary
|
|
46
|
+
|
|
47
|
+
Include a detailed field listing showing individual fields with API name, label, type, custom flag, and namespace. Use with `--field-type`, `--field-pattern`, and `--sort` to filter and organize the listing.
|
|
48
|
+
|
|
49
|
+
# flags.field-type.summary
|
|
50
|
+
|
|
51
|
+
Filter the field listing to a specific type (requires `--with-fields`). Valid types: text, picklist, lookup, number, date, formula, checkbox, id, address. Use `lookup` to map the object's relationship network.
|
|
52
|
+
|
|
53
|
+
# flags.field-pattern.summary
|
|
54
|
+
|
|
55
|
+
Filter the field listing by API name pattern with wildcard support (requires `--with-fields`). Examples: `*__c` for custom fields, `pnova__*` for Cuneiform namespace fields.
|
|
56
|
+
|
|
57
|
+
# flags.sort.summary
|
|
58
|
+
|
|
59
|
+
Sort the field listing by: `name` (alphabetical, the default), `type` (grouped by field type), or `label`. Requires `--with-fields`.
|
|
60
|
+
|
|
61
|
+
# examples
|
|
62
|
+
|
|
63
|
+
- Assess an object before building profiling definitions — see all 11 metadata sections:
|
|
64
|
+
|
|
65
|
+
<%= config.bin %> <%= command.id %> --object Account --target-org myOrg
|
|
66
|
+
|
|
67
|
+
- Compare multiple objects in parallel with aggregate totals for profiling scope decisions:
|
|
68
|
+
|
|
69
|
+
<%= config.bin %> <%= command.id %> --object Account,Contact,Opportunity --target-org myOrg
|
|
70
|
+
|
|
71
|
+
- Full field inventory — add detailed field listings to see every field on the object:
|
|
72
|
+
|
|
73
|
+
<%= config.bin %> <%= command.id %> --object Account --with-fields --target-org myOrg
|
|
74
|
+
|
|
75
|
+
- Relationship mapping — isolate lookup fields to understand the object's position in the data model:
|
|
76
|
+
|
|
77
|
+
<%= config.bin %> <%= command.id %> --object Account --with-fields --field-type lookup --sort type --target-org myOrg
|
|
78
|
+
|
|
79
|
+
- Custom field audit — filter to custom fields for a managed package or customization review:
|
|
80
|
+
|
|
81
|
+
<%= config.bin %> <%= command.id %> --object Account --with-fields --field-pattern "\*\_\_c" --target-org myOrg
|
|
82
|
+
|
|
83
|
+
- JSON for automation — pipe structured metadata to assessment pipelines or architecture documentation:
|
|
84
|
+
|
|
85
|
+
<%= config.bin %> <%= command.id %> --object Account --json --target-org myOrg
|
|
86
|
+
|
|
87
|
+
# output.identity.header
|
|
88
|
+
|
|
89
|
+
Org Identity
|
|
90
|
+
|
|
91
|
+
# output.identity.orgName
|
|
92
|
+
|
|
93
|
+
Org Name
|
|
94
|
+
|
|
95
|
+
# output.identity.orgId
|
|
96
|
+
|
|
97
|
+
Org ID
|
|
98
|
+
|
|
99
|
+
# output.identity.instanceUrl
|
|
100
|
+
|
|
101
|
+
Instance URL
|
|
102
|
+
|
|
103
|
+
# output.identity.orgType
|
|
104
|
+
|
|
105
|
+
Org Type
|
|
106
|
+
|
|
107
|
+
# output.identity.edition
|
|
108
|
+
|
|
109
|
+
Edition
|
|
110
|
+
|
|
111
|
+
# output.identity.namespace
|
|
112
|
+
|
|
113
|
+
Namespace
|
|
114
|
+
|
|
115
|
+
# output.identity.username
|
|
116
|
+
|
|
117
|
+
Username
|
|
118
|
+
|
|
119
|
+
# errors.orgIdentityFailed
|
|
120
|
+
|
|
121
|
+
Could not retrieve org identity information. Continuing without org context.
|
|
122
|
+
|
|
123
|
+
# output.table.recordTypes.name
|
|
124
|
+
|
|
125
|
+
Name
|
|
126
|
+
|
|
127
|
+
# output.table.recordTypes.developerName
|
|
128
|
+
|
|
129
|
+
Developer Name
|
|
130
|
+
|
|
131
|
+
# output.table.recordTypes.active
|
|
132
|
+
|
|
133
|
+
Active
|
|
134
|
+
|
|
135
|
+
# output.table.recordTypes.default
|
|
136
|
+
|
|
137
|
+
Default
|
|
138
|
+
|
|
139
|
+
# output.table.fieldTypes.type
|
|
140
|
+
|
|
141
|
+
Type
|
|
142
|
+
|
|
143
|
+
# output.table.fieldTypes.count
|
|
144
|
+
|
|
145
|
+
Count
|
|
146
|
+
|
|
147
|
+
# output.table.fieldTypes.percent
|
|
148
|
+
|
|
149
|
+
Percent
|
|
150
|
+
|
|
151
|
+
# output.table.namespaces.namespace
|
|
152
|
+
|
|
153
|
+
Namespace
|
|
154
|
+
|
|
155
|
+
# output.table.namespaces.fieldCount
|
|
156
|
+
|
|
157
|
+
Field Count
|
|
158
|
+
|
|
159
|
+
# output.table.fields.apiName
|
|
160
|
+
|
|
161
|
+
API Name
|
|
162
|
+
|
|
163
|
+
# output.table.fields.label
|
|
164
|
+
|
|
165
|
+
Label
|
|
166
|
+
|
|
167
|
+
# output.table.fields.type
|
|
168
|
+
|
|
169
|
+
Type
|
|
170
|
+
|
|
171
|
+
# output.table.fields.custom
|
|
172
|
+
|
|
173
|
+
Custom
|
|
174
|
+
|
|
175
|
+
# output.table.fields.namespace
|
|
176
|
+
|
|
177
|
+
Namespace
|
|
178
|
+
|
|
179
|
+
# output.table.relationships.relatedObject
|
|
180
|
+
|
|
181
|
+
Related Object
|
|
182
|
+
|
|
183
|
+
# output.table.relationships.field
|
|
184
|
+
|
|
185
|
+
Field
|
|
186
|
+
|
|
187
|
+
# output.table.lookups.lookupField
|
|
188
|
+
|
|
189
|
+
Lookup Field
|
|
190
|
+
|
|
191
|
+
# output.table.lookups.targetObject
|
|
192
|
+
|
|
193
|
+
Target Object
|
|
194
|
+
|
|
195
|
+
# output.table.profilingStatus.name
|
|
196
|
+
|
|
197
|
+
Definition
|
|
198
|
+
|
|
199
|
+
# output.table.profilingStatus.lastProfiled
|
|
200
|
+
|
|
201
|
+
Last Profiled
|