@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.
Files changed (38) hide show
  1. package/LICENSE +81 -30
  2. package/README.md +59 -95
  3. package/messages/compatibility.check.md +71 -0
  4. package/messages/cuneiform.access.md +138 -0
  5. package/messages/definition.create.md +511 -0
  6. package/messages/definition.export.md +88 -0
  7. package/messages/definition.get.md +147 -0
  8. package/messages/definition.import.md +65 -0
  9. package/messages/definition.list.md +264 -0
  10. package/messages/definition.purge.md +318 -0
  11. package/messages/definition.update.md +80 -0
  12. package/messages/mcp.serve.md +66 -0
  13. package/messages/object.describe.md +201 -0
  14. package/messages/object.list.md +443 -0
  15. package/messages/org.details.md +386 -0
  16. package/messages/org.reset.md +71 -0
  17. package/messages/profile.md +231 -0
  18. package/messages/profile.request.cancel.md +143 -0
  19. package/messages/profile.request.delete.md +139 -0
  20. package/messages/profile.request.list.md +89 -0
  21. package/messages/summary.purge.md +218 -0
  22. package/messages/summary.reprofile.md +150 -0
  23. package/messages/summary.stop.md +157 -0
  24. package/messages/user.details.md +501 -0
  25. package/oclif.lock +3021 -2224
  26. package/oclif.manifest.json +2 -116
  27. package/package.json +84 -19
  28. package/lib/commands/cuneiform/about.d.ts +0 -13
  29. package/lib/commands/cuneiform/about.js +0 -26
  30. package/lib/commands/cuneiform/about.js.map +0 -1
  31. package/lib/commands/hello/world.d.ts +0 -14
  32. package/lib/commands/hello/world.js +0 -27
  33. package/lib/commands/hello/world.js.map +0 -1
  34. package/lib/index.d.ts +0 -2
  35. package/lib/index.js +0 -2
  36. package/lib/index.js.map +0 -1
  37. package/messages/cuneiform.about.md +0 -19
  38. package/messages/hello.world.md +0 -29
@@ -0,0 +1,386 @@
1
+ # summary
2
+
3
+ Consolidate org configuration — products, features, capacity, and namespace composition — into a single view that replaces navigating six Setup pages.
4
+
5
+ # description
6
+
7
+ Salesforce spreads org configuration across Company Information, Installed Packages, Org Limits, Feature Settings, License Management, and more. Understanding what an org contains before profiling typically means navigating between these pages to build a mental model. This command consolidates that orientation into a single call that returns in seconds.
8
+
9
+ **Structured sections, one command:**
10
+
11
+ - **Identity** — org name, type (Production/Sandbox/Scratch/Developer/Trial), edition, instance URL, namespace
12
+ - **Cuneiform** — installation status, package version, and license state
13
+ - **Features** — enabled capabilities (Multi-Currency, Person Accounts, Einstein AI, Enhanced Notes, and others)
14
+ - **Clouds** — Salesforce products detected by license queries and namespace prefix matching (Financial Services, CPQ, Health Cloud, and others found in the org)
15
+ - **Namespaces** — installed packages with object counts and population rates per namespace
16
+ - **Processes** — active business processes with record type associations
17
+ - **Limits** — current API request quotas, data and file storage consumption, with capacity warnings at 95%
18
+ - **Next Steps** — command suggestions tailored to the org's namespace composition and data
19
+
20
+ James Morrison runs this first in every new org. Sarah Mitchell checks limits before profiling runs. Marcus Thompson uses the dynamic next steps to guide his exploration path.
21
+
22
+ **When to run this command:**
23
+
24
+ - Entering a new org for the first time and building a mental model of its product landscape
25
+ - Checking API and storage capacity before submitting profiling requests
26
+ - Verifying Cuneiform installation and license status in a new sandbox
27
+ - Understanding which Salesforce products (Clouds, managed packages) are installed before scoping profiling
28
+
29
+ NATURAL LANGUAGE → FLAG MAPPING:
30
+ "show me everything about this org" → no flags (all sections)
31
+ "check my API limits" → --sections limits
32
+ "is Cuneiform installed?" → --sections cuneiform
33
+ "what Clouds are in this org?" → --sections clouds
34
+ "show me all limits grouped" → --sections limits-all
35
+ "how much storage is used?" → --sections limits-storage
36
+
37
+ COMMAND SEQUENCE:
38
+ `org details` → `object list` → `user details` → `definition create` → `profile`
39
+
40
+ This is typically the first command run in any engagement. It precedes `object list` (exploring what objects have data) and `user details` (verifying profiling readiness). Read-only — consolidates existing data from multiple API endpoints into a single view.
41
+
42
+ # flags.target-org.summary
43
+
44
+ The Salesforce org to retrieve configuration details from. Specify the org alias or username when you have multiple authenticated orgs.
45
+
46
+ # flags.api-version.summary
47
+
48
+ Override the Salesforce API version used for org configuration queries. Use this when troubleshooting version-specific behavior or testing against a specific API release.
49
+
50
+ # flags.sections.summary
51
+
52
+ Filter to specific sections instead of displaying the full eight-section report. Valid values: identity, cuneiform, features, clouds, namespaces, processes, limits. For limits granularity: limits-all (groups limits by category) or limits-api, limits-storage, limits-bulk, limits-apex, limits-streaming, limits-email (single category). Omit to display all sections.
53
+
54
+ # examples
55
+
56
+ - Engagement kickoff — see the full org picture (edition, products, features, capacity, namespace composition):
57
+
58
+ <%= config.bin %> <%= command.id %> --target-org myOrg
59
+
60
+ - Pre-profiling capacity check — verify API and storage capacity before submitting profiling requests:
61
+
62
+ <%= config.bin %> <%= command.id %> --target-org myOrg --sections limits
63
+
64
+ - Cuneiform readiness — confirm installation and license status in a new sandbox:
65
+
66
+ <%= config.bin %> <%= command.id %> --target-org myOrg --sections cuneiform
67
+
68
+ - Product landscape — see which Salesforce Clouds are installed to scope profiling by product:
69
+
70
+ <%= config.bin %> <%= command.id %> --target-org myOrg --sections clouds
71
+
72
+ - Namespace composition — identify managed packages and their object counts for profiling scope:
73
+
74
+ <%= config.bin %> <%= command.id %> --target-org myOrg --sections namespaces
75
+
76
+ - Storage detail — check data and file storage consumption before a profiling run:
77
+
78
+ <%= config.bin %> <%= command.id %> --target-org myOrg --sections limits-storage
79
+
80
+ - JSON for automation — pipe structured output to assessment pipelines or SOW templates:
81
+
82
+ <%= config.bin %> <%= command.id %> --target-org myOrg --json
83
+
84
+ # info.fetching
85
+
86
+ Fetching org details...
87
+
88
+ # errors.identityFailed
89
+
90
+ Failed to retrieve org identity information.
91
+
92
+ # warnings.header
93
+
94
+ Warnings
95
+
96
+ # output.identity.header
97
+
98
+ Org Identity
99
+
100
+ # output.identity.orgId
101
+
102
+ Org ID
103
+
104
+ # output.identity.orgName
105
+
106
+ Org Name
107
+
108
+ # output.identity.orgType
109
+
110
+ Org Type
111
+
112
+ # output.identity.edition
113
+
114
+ Edition
115
+
116
+ # output.identity.namespace
117
+
118
+ Namespace
119
+
120
+ # output.identity.instanceUrl
121
+
122
+ Instance URL
123
+
124
+ # output.identity.username
125
+
126
+ Username
127
+
128
+ # output.cuneiform.header
129
+
130
+ Cuneiform for Salesforce
131
+
132
+ # output.cuneiform.status
133
+
134
+ Status
135
+
136
+ # output.cuneiform.installed
137
+
138
+ Installed
139
+
140
+ # output.cuneiform.notInstalled
141
+
142
+ Not Installed
143
+
144
+ # output.cuneiform.version
145
+
146
+ Version
147
+
148
+ # output.cuneiform.license
149
+
150
+ License
151
+
152
+ # output.features.header
153
+
154
+ Org Features
155
+
156
+ # output.features.multiCurrency
157
+
158
+ Multi-Currency
159
+
160
+ # output.features.enhancedNotes
161
+
162
+ Enhanced Notes
163
+
164
+ # output.features.stateCountryPicklists
165
+
166
+ State/Country Picklists
167
+
168
+ # output.features.territoryManagement
169
+
170
+ Territory Management
171
+
172
+ # output.features.personAccounts
173
+
174
+ Person Accounts
175
+
176
+ # output.features.digitalExperiences
177
+
178
+ Digital Experiences
179
+
180
+ # output.features.einsteinAI
181
+
182
+ Einstein AI
183
+
184
+ # output.clouds.header
185
+
186
+ Detected Clouds
187
+
188
+ # output.clouds.none
189
+
190
+ No Salesforce Clouds detected
191
+
192
+ # output.clouds.licenseSubheader
193
+
194
+ Detected Clouds by License
195
+
196
+ # output.clouds.namespaceSubheader
197
+
198
+ Detected Clouds by Namespace
199
+
200
+ # output.namespaces.header
201
+
202
+ Installed Namespaces (Standard / Custom Objects)
203
+
204
+ # output.limits.header
205
+
206
+ API Limits
207
+
208
+ # output.limits.dailyApiRequests
209
+
210
+ Daily API Requests
211
+
212
+ # output.limits.bulkApiRequests
213
+
214
+ Bulk API Requests
215
+
216
+ # output.limits.bulkV2QueryJobs
217
+
218
+ Bulk V2 Query Jobs
219
+
220
+ # output.limits.asyncApexExecutions
221
+
222
+ Async Apex Executions
223
+
224
+ # output.limits.streamingApiEvents
225
+
226
+ Streaming API Events
227
+
228
+ # output.cuneiform.licenseStatus
229
+
230
+ Your Cuneiform license is %s.
231
+
232
+ # output.cuneiform.licenseContactSupport
233
+
234
+ Please contact support to reactivate your license at sfsupport@peernova.com.
235
+
236
+ # output.cuneiform.licenseContactOrgDetails
237
+
238
+ Include the org identity details from this command in your email.
239
+
240
+ # output.cuneiform.installGuide
241
+
242
+ To install Cuneiform for Salesforce, please visit: https://peernova.link/cli/configure
243
+
244
+ # warnings.storageNearCapacity
245
+
246
+ Your org is near its data storage limit.
247
+
248
+ # warnings.storageProfilingImpact
249
+
250
+ Cuneiform writes profiling results to custom objects in your org.
251
+
252
+ # warnings.storageProfilingFailure
253
+
254
+ Profiling may fail if storage capacity is exceeded.
255
+
256
+ # table.clouds.cloud
257
+
258
+ cloud
259
+
260
+ # table.clouds.status
261
+
262
+ status
263
+
264
+ # table.clouds.usedLicenses
265
+
266
+ used licenses
267
+
268
+ # table.clouds.total
269
+
270
+ total
271
+
272
+ # table.cloudsDetail.cloud
273
+
274
+ cloud
275
+
276
+ # table.cloudsDetail.version
277
+
278
+ version
279
+
280
+ # table.cloudsDetail.namespace
281
+
282
+ namespace
283
+
284
+ # table.namespaces.namespace
285
+
286
+ namespace
287
+
288
+ # table.namespaces.product
289
+
290
+ product
291
+
292
+ # table.namespaces.objects
293
+
294
+ objects
295
+
296
+ # table.namespaces.populated
297
+
298
+ populated
299
+
300
+ # table.namespaces.empty
301
+
302
+ empty
303
+
304
+ # table.limits.limit
305
+
306
+ limit
307
+
308
+ # table.limits.used
309
+
310
+ used
311
+
312
+ # table.limits.max
313
+
314
+ max
315
+
316
+ # table.limits.percent
317
+
318
+ percent
319
+
320
+ # output.headerTitle
321
+
322
+ Org Details
323
+
324
+ # output.limits.dataStorageWithUnit
325
+
326
+ Data Storage (MB)
327
+
328
+ # output.limits.fileStorageWithUnit
329
+
330
+ File Storage (MB)
331
+
332
+ # output.unknownFallback
333
+
334
+ Unknown
335
+
336
+ # output.processes.header
337
+
338
+ Business Processes
339
+
340
+ # table.processes.name
341
+
342
+ name
343
+
344
+ # table.processes.object
345
+
346
+ object
347
+
348
+ # table.processes.active
349
+
350
+ active
351
+
352
+ # table.processes.recordTypes
353
+
354
+ record types
355
+
356
+ # output.nextSteps.header
357
+
358
+ Next steps:
359
+
360
+ # output.nextSteps.objectListWithRecords
361
+
362
+ View objects with records
363
+
364
+ # output.nextSteps.objectListCustom
365
+
366
+ View custom objects
367
+
368
+ # output.nextSteps.objectListStandard
369
+
370
+ View standard objects
371
+
372
+ # output.nextSteps.objectListNamespace
373
+
374
+ View %s objects
375
+
376
+ # output.nextSteps.objectListCustomerFacing
377
+
378
+ View customer-facing objects with records
379
+
380
+ # output.nextSteps.objectDescribe
381
+
382
+ View specific object details
383
+
384
+ # output.nextSteps.definitionCreate
385
+
386
+ Create a profiling definition
@@ -0,0 +1,71 @@
1
+ # summary
2
+
3
+ Reset org by removing Cuneiform test data created by NUT tests.
4
+
5
+ # description
6
+
7
+ Purges all profiling definitions matching a name pattern (default: `[NUT-*]`), cancels active profiling requests, and deletes terminal requests. Use this command to restore a scratch org to a clean state after NUT test runs.
8
+
9
+ The reset sequence is:
10
+
11
+ 1. Query definitions matching the name pattern
12
+ 2. Cancel any active profiling requests
13
+ 3. Delete cancelled/rejected profiling requests
14
+ 4. Delete definitions that have no related summaries
15
+
16
+ Definitions with related summaries are skipped — use `sf cuneiform summary purge` first to remove them.
17
+
18
+ # examples
19
+
20
+ - Reset org by removing all NUT-created test data: `sf cuneiform org reset --target-org myOrg`
21
+ - Preview what would be deleted without making changes: `sf cuneiform org reset --target-org myOrg --dry-run`
22
+ - Reset with a custom pattern: `sf cuneiform org reset --target-org myOrg --pattern "Test%"`
23
+ - Reset without confirmation prompt: `sf cuneiform org reset --target-org myOrg --no-prompt`
24
+
25
+ # flags.pattern.summary
26
+
27
+ SOQL LIKE pattern for definition names to purge.
28
+
29
+ # flags.dry-run.summary
30
+
31
+ Preview what would be deleted without making changes.
32
+
33
+ # flags.no-prompt.summary
34
+
35
+ Skip the confirmation prompt before deleting.
36
+
37
+ # spinner.querying
38
+
39
+ Querying definitions matching "%s"...
40
+
41
+ # spinner.cancelling
42
+
43
+ Cancelling active profiling requests...
44
+
45
+ # spinner.deleting-requests
46
+
47
+ Deleting terminal profiling requests...
48
+
49
+ # spinner.deleting-definitions
50
+
51
+ Deleting %d definitions...
52
+
53
+ # info.already-clean
54
+
55
+ Org is already clean — no test data found matching "%s".
56
+
57
+ # info.dry-run-header
58
+
59
+ Dry-run preview (no changes will be made):
60
+
61
+ # info.summary
62
+
63
+ Reset complete.
64
+
65
+ # errors.queryFailed
66
+
67
+ Failed to query definitions: %s
68
+
69
+ # errors.operationFailed
70
+
71
+ Org reset failed: %s
@@ -0,0 +1,231 @@
1
+ # summary
2
+
3
+ Execute profiling definitions against a Salesforce org to generate field-level, value-level, and KPI-level evidence about data population and usage patterns.
4
+
5
+ # description
6
+
7
+ Profiling is the moment where KYCD moves from planning to evidence. Before profiling, definitions are plans — field lists, filters, and scoping decisions. After profiling, they have results: field population rates, value distributions, null percentages, default detection, and usage patterns across every profiled object.
8
+
9
+ The command operates as a fire-and-forget execution engine — it creates profiling requests in the processing queue and returns immediately. Results appear in the org as summaries complete, typically within minutes depending on object size and field count. Definitions are managed with the `definition` commands; results are reviewed through summaries.
10
+
11
+ TWO MODES:
12
+
13
+ **Single mode** — Profile one definition:
14
+
15
+ - `--keys PD-0001` — profile by definition key
16
+ - `--id a0Bxx000000001AAAA` — profile by Salesforce record ID
17
+
18
+ Single mode displays definition key, object name, status, request ID, duration, and error details.
19
+
20
+ **Bulk mode** — Profile multiple definitions with parallel execution:
21
+
22
+ - `--method metadata` — profile all definitions of a method type (metadata, historical, or comparative)
23
+ - Add filters: --status, --namespace, --category, --time-category, --segment-category, --limit
24
+ - Control concurrency: --parallel (1-10 threads, default: 5)
25
+
26
+ Bulk mode displays a configuration summary, a results table, a profiling summary (Successful/Failed/Skipped/Total), and resolution guidance for failures.
27
+
28
+ Objects with zero records are automatically skipped (--skip-empty defaults to true), preventing wasted API calls. Failed definitions are reported with resolution guidance that provides actionable next steps.
29
+
30
+ PREREQUISITE: Definitions must exist before profiling. Create them with `sf cuneiform definition create`.
31
+
32
+ WHEN TO USE:
33
+
34
+ - After creating definitions — turn scoping work into analytical evidence
35
+ - To refresh profiling results — re-run profiling on existing definitions for updated data
36
+ - For bulk assessment — sweep all metadata definitions in a single parallel command
37
+ - To re-profile after errors — fix the underlying issue, then re-run the failed definitions
38
+
39
+ NATURAL LANGUAGE → FLAG MAPPING:
40
+ "profile the Account definition" → --keys PD-0001
41
+ "profile all metadata definitions" → --method metadata
42
+ "profile everything that hasn't been profiled" → --method metadata --status "NOT PROFILED"
43
+ "profile only FSC objects" → --method metadata --namespace FinServ
44
+ "profile with less concurrency" → --method metadata --parallel 1
45
+
46
+ COMMAND SEQUENCE:
47
+ `definition create` or `definition update` → **`profile`** → `profile request list` → `definition get` (view results)
48
+
49
+ # flags.target-org.summary
50
+
51
+ Authenticate and execute profiling against this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.
52
+
53
+ # flags.keys.summary
54
+
55
+ Profile one or more definitions by key (e.g., --keys PD-0001). Find keys with `definition list`. Mutually exclusive with --id and --method.
56
+
57
+ # flags.id.summary
58
+
59
+ Profile a single definition by its Salesforce record ID (e.g., --id a0Bxx000000001AAAA). Use when you have the record ID from the Salesforce UI or API. Mutually exclusive with --keys and --method.
60
+
61
+ # flags.method.summary
62
+
63
+ Profile all definitions matching a method type: metadata (field-level analysis), historical (time-series trends), or comparative (segment comparison). Activates bulk mode with parallel execution. Mutually exclusive with --keys and --id.
64
+
65
+ # flags.status.summary
66
+
67
+ Filter definitions by profiling status before executing (e.g., --status "NOT PROFILED" for first-time profiling, --status "ERROR" to retry failures). Applies only in bulk mode with --method.
68
+
69
+ # flags.namespace.summary
70
+
71
+ Filter definitions by the namespace prefix of their target object (e.g., "FinServ" for Financial Services Cloud, "SBQQ" for CPQ). Profiles only definitions targeting objects from a specific managed package.
72
+
73
+ # flags.category.summary
74
+
75
+ Filter definitions by category label (e.g., "Baseline", "Phase 1"). Combine with --time-category and --segment-category to target definitions across all three category dimensions.
76
+
77
+ # flags.time-category.summary
78
+
79
+ Filter definitions by time category (e.g., "Lifetime", "2026 vs 2025", "This Year"). Combine with --category and --segment-category to target time-scoped definitions.
80
+
81
+ # flags.segment-category.summary
82
+
83
+ Filter definitions by segment category (e.g., "Historical", "Comparative", "Enterprise Sales", "Won vs Lost"). Combine with --category and --time-category to target specific comparison segments.
84
+
85
+ # flags.limit.summary
86
+
87
+ Cap the number of definitions processed in bulk mode (e.g., --limit 10 to profile a small batch for testing). Controls the maximum definitions per run.
88
+
89
+ # flags.skip-empty.summary
90
+
91
+ Automatically skip definitions targeting objects with zero records (default: true). Optimizes API usage by focusing execution on populated objects. Use --no-skip-empty to include all definitions regardless of record count.
92
+
93
+ # flags.parallel.summary
94
+
95
+ Set the number of parallel concurrent operations for bulk mode (1-10, default: 5). Lower values reduce API consumption; higher values increase throughput when the org has API capacity.
96
+
97
+ # flags.format.summary
98
+
99
+ Control the output format: table (default, human-readable with progress and summary boxes) or json (machine-readable for scripting and automation).
100
+
101
+ # examples
102
+
103
+ - Profile a single definition by key:
104
+
105
+ <%= config.bin %> <%= command.id %> --target-org myOrg --keys PD-0001
106
+
107
+ - Profile a single definition by Salesforce record ID:
108
+
109
+ <%= config.bin %> <%= command.id %> --target-org myOrg --id a0Bxx000000001AAAA
110
+
111
+ - Sweep all metadata definitions with parallel execution:
112
+
113
+ <%= config.bin %> <%= command.id %> --target-org myOrg --method metadata
114
+
115
+ - Profile only definitions that have never been profiled:
116
+
117
+ <%= config.bin %> <%= command.id %> --target-org myOrg --method historical --status "NOT PROFILED"
118
+
119
+ - Profile only Financial Services Cloud objects:
120
+
121
+ <%= config.bin %> <%= command.id %> --target-org myOrg --method metadata --namespace FinServ
122
+
123
+ - Maximize throughput with full parallelism:
124
+
125
+ <%= config.bin %> <%= command.id %> --target-org myOrg --method comparative --parallel 10
126
+
127
+ - Profile a small batch for testing:
128
+
129
+ <%= config.bin %> <%= command.id %> --target-org myOrg --method metadata --limit 5
130
+
131
+ - Minimize API impact with single-threaded execution:
132
+
133
+ <%= config.bin %> <%= command.id %> --target-org myOrg --method metadata --parallel 1
134
+
135
+ # display.definition
136
+
137
+ Definition: %s (%s)
138
+
139
+ # display.status
140
+
141
+ Status: %s
142
+
143
+ # display.requestId
144
+
145
+ Request ID: %s
146
+
147
+ # display.error
148
+
149
+ Error: %s
150
+
151
+ # display.resolution
152
+
153
+ Resolution: %s
154
+
155
+ # display.skipReason
156
+
157
+ Skip reason: %s
158
+
159
+ # display.processed
160
+
161
+ Processed %s definition(s):
162
+
163
+ # display.resolutionGuidance
164
+
165
+ Resolution guidance for failures:
166
+
167
+ # display.resolutionItem
168
+
169
+ %s: %s
170
+
171
+ # display.summaryTitle
172
+
173
+ Summary
174
+
175
+ # display.summarySuccessful
176
+
177
+ Successful
178
+
179
+ # display.summaryFailedLabel
180
+
181
+ Failed
182
+
183
+ # display.summarySkippedLabel
184
+
185
+ Skipped
186
+
187
+ # display.summaryTotalLabel
188
+
189
+ Total
190
+
191
+ # display.nextSteps
192
+
193
+ Track profiling progress:
194
+
195
+ sf cuneiform profile request list --target-org %s
196
+
197
+ # spinner.connecting
198
+
199
+ Connecting
200
+
201
+ # errors.noSelection
202
+
203
+ No selection provided. Specify --keys, --id, or --method flag.
204
+
205
+ # errors.invalidSelection
206
+
207
+ Invalid flag combination. Only one of --keys, --id, or --method allowed.
208
+
209
+ # errors.invalidId
210
+
211
+ Invalid Salesforce ID format: %s. Must be 15 or 18 alphanumeric characters.
212
+
213
+ # errors.definitionNotFound
214
+
215
+ Definition not found: %s
216
+
217
+ # errors.invalidParallel
218
+
219
+ Invalid --parallel value. Must be between 1 and 10.
220
+
221
+ # errors.queryFailed
222
+
223
+ Failed to query definitions: %s
224
+
225
+ # errors.noDefinitionsFound
226
+
227
+ No definitions found matching filters.
228
+
229
+ # errors.executionFailed
230
+
231
+ Profiling execution failed: %s