@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,511 @@
1
+ # summary
2
+
3
+ Build profiling definitions that translate scoping decisions — object selection, filtering, and profiling methodology — into executable configuration records across one or dozens of objects in a single command.
4
+
5
+ # description
6
+
7
+ Profiling definitions are the blueprint that tells Cuneiform what to analyze. Each definition specifies an object, a profiling method, and a time scope. This command translates your intent — expressed through flags for method selection, object filtering, and time windowing — into structured definition records in the target org.
8
+
9
+ The command executes in two phases. Phase 1 discovers and validates objects, builds a preview table showing each object with its record count, profiling type, category, time category, and segment category, then prompts for confirmation. Phase 2 creates definitions sequentially, reporting progress via spinner updates. Output includes separate Created and Skipped tables, a summary box (Objects/Created/Skipped/Failed), and optional post-creation actions: trigger immediate profiling, open the first definition in Salesforce Lightning, or write session data to a local log directory.
10
+
11
+ PREREQUISITES: Run `sf cuneiform user details --configure` to verify permissions. Objects must exist in the target org.
12
+
13
+ CHOOSING A PROFILING METHOD (--method):
14
+
15
+ - metadata — Catalogs field structure and configuration. No record scanning. Fast. No time dimension.
16
+ - historical — Full record-level data profiling with year-based time windows. Captures how field population changes over time.
17
+ - comparative — Year-over-year comparison: compares current-period records (SetA) against prior-period records (SetB). Requires --year or --date-literal.
18
+ - recordtype — Per-record-type analysis across 6 time windows. Segments data by business process stage (e.g., New Business vs Renewal).
19
+ - outcome — Boolean outcome comparison: Won vs Lost for Opportunity, Closed vs Open for Case, Converted vs Unconverted for Lead. Surfaces data quality gaps between business outcomes.
20
+ - full — All five methods combined. Comprehensive first-time profiling of a new org. Default.
21
+
22
+ SCOPING OBJECTS:
23
+
24
+ - --objects Account,Contact — Profile specific named objects (comma-separated or repeated)
25
+ - --filter custom — All custom objects; --filter standard — All standard objects
26
+ - --with-records — Only objects that have at least one record (recommended for historical/comparative)
27
+ - --min-records 100 — Only objects with 100+ records
28
+ - --namespace SBQQ — Only objects from a specific managed package (e.g., SBQQ for CPQ, FinServ for FSC)
29
+ - --pattern Account\* — Objects matching a wildcard pattern
30
+
31
+ ROLLING TIME WINDOWS (use with --method comparative, historical, recordtype, or full):
32
+
33
+ - --date-literal THIS_YEAR — Profile the current year's records
34
+ - --date-literal THIS_QUARTER — Profile the current quarter
35
+ - --date-literal THIS_MONTH — Profile the current month
36
+ - --depth 3 — With a date literal, creates 3 cascading periods: this period, last period, and two periods ago
37
+ - --depth 2 --date-literal THIS_QUARTER — Creates definitions for this quarter AND last quarter
38
+ - --year 2026 — Use a specific year instead of a date literal; --depth controls how many prior years to include
39
+ - --date-field LastModifiedDate — Use LastModifiedDate instead of CreatedDate for time filtering
40
+
41
+ NATURAL LANGUAGE → FLAG MAPPING:
42
+
43
+ - "compare X from 2025 vs 2026" → --method comparative --year 2026
44
+ - "rolling quarterly analysis" → --method comparative --date-literal THIS_QUARTER --depth N
45
+ - "year-over-year trends" → --method comparative
46
+ - "by business stage / record type" → --method recordtype
47
+ - "won vs lost / closed vs open" → --method outcome
48
+ - "field-level stats only" → --method metadata
49
+ - "objects with data" → --with-records
50
+ - "FSC objects" → --namespace FinServ
51
+ - "CPQ objects" → --namespace SBQQ
52
+ - "last N months" → --date-literal LAST_MONTH --depth N
53
+ - "this fiscal year" → --date-literal THIS_FISCAL_YEAR
54
+
55
+ COMMAND SEQUENCE: `user details --configure` (verify permissions) → `object describe` (understand structure) → `definition create` (build definitions) → `profile` (execute profiling)
56
+
57
+ SAFETY: Objects that already have definitions are skipped automatically (no duplicates). A confirmation prompt appears before creation. Use --dry-run to preview without creating.
58
+
59
+ # flags.target-org.summary
60
+
61
+ Salesforce org where definitions will be created. The command validates Cuneiform installation and permission sets before any API calls.
62
+
63
+ # flags.objects.summary
64
+
65
+ Salesforce object API names to create definitions for (e.g., --objects Account --objects Contact). Repeat the flag for multiple objects. When you know exactly which objects to profile, this is the most direct selection mode. Cannot be combined with --filter when targeting specific objects.
66
+
67
+ # flags.pattern.summary
68
+
69
+ Filter objects by API name pattern using wildcard matching (e.g., Account\_ matches Account and AccountTeamMember). Use plain text for substring matching (e.g., Account matches any object containing "Account"). Targets families of related objects by naming convention.
70
+
71
+ # flags.filter.summary
72
+
73
+ Filter objects by Salesforce object type: custom (objects with \_\_c suffix), standard (built-in objects like Account, Contact, Opportunity), or all (both). Defaults to all.
74
+
75
+ # flags.namespace.summary
76
+
77
+ Filter objects by managed package namespace prefix to scope profiling to a specific product installation (e.g., --namespace SBQQ for CPQ, --namespace FinServ for Financial Services Cloud, --namespace HealthCloudGA for Health Cloud). Pass an empty string ("") to target only unpackaged custom objects. Combines with --filter custom to isolate custom objects from a specific package.
78
+
79
+ # flags.classification.summary
80
+
81
+ Filter by object classification: customer (business-facing objects), internal (system objects), or all. Defaults to all.
82
+
83
+ # flags.with-records.summary
84
+
85
+ Include only objects that have at least one record. Avoids creating definitions for empty staging or archive objects. Recommended for historical and comparative profiling where empty objects produce no analytical value. Cannot be combined with --without-records.
86
+
87
+ # flags.without-records.summary
88
+
89
+ Include only objects that have zero records. Targets empty objects for data completeness analysis or unused schema identification. Cannot be combined with --with-records.
90
+
91
+ # flags.with-record-types.summary
92
+
93
+ Include only objects that have at least one active record type defined. Use with --method recordtype to ensure targeted objects have record types to segment by.
94
+
95
+ # flags.category.summary
96
+
97
+ Label assigned to every definition created in this run (e.g., --category "Phase 1" or --category "Sales Cloud"). Groups definitions by engagement phase or functional area for later filtering and management. Freeform text.
98
+
99
+ # flags.min-records.summary
100
+
101
+ Minimum record count an object must have to be included (e.g., --min-records 100 skips objects with fewer than 100 records). Filters out low-volume objects that would produce statistically insignificant profiling results. Defaults to 0 (include all).
102
+
103
+ # flags.limit.summary
104
+
105
+ Maximum number of objects to create definitions for (e.g., --limit 20 for a quick demo setup). Constrains scope in large orgs or matches a statement-of-work object count. Objects are selected in the order returned by the Salesforce DescribeGlobal API. When omitted, processes all matching objects.
106
+
107
+ # flags.method.summary
108
+
109
+ Profiling methodology that determines the analytical questions each definition can answer:
110
+ metadata — Catalogs field structure and configuration. Fast, no record scanning, no time dimension.
111
+ historical — Full record-level analysis with year-based time windows. Captures field population changes over time.
112
+ comparative — Compares current-period records (SetA) vs prior-period records (SetB). Requires --year or --date-literal.
113
+ recordtype — Per-record-type analysis across 6 time windows. Segments by business process stage (e.g., New Business vs Renewal for Opportunity).
114
+ outcome — Boolean outcome comparison: Won vs Lost (Opportunity), Closed vs Open (Case), Converted vs Unconverted (Lead). Surfaces data quality gaps between business outcomes.
115
+ full — All five methods combined. Comprehensive first-time profiling of a new org or client engagement. Default.
116
+ Defaults to full.
117
+
118
+ # flags.year.summary
119
+
120
+ Anchor year for time-based profiling definitions (e.g., --year 2026). Used with --method comparative, historical, recordtype, or full. Accepts comma-separated years (--year 2026,2025,2024). When combined with --depth, sets the starting year and counts backward (e.g., --year 2026 --depth 3 creates definitions for 2026, 2025, and 2024). Defaults to the current year. Cannot be combined with --date-literal.
121
+
122
+ # flags.depth.summary
123
+
124
+ Number of cascading time periods to create, counting backward from the anchor year or date literal (e.g., --depth 3 with --year 2026 creates definitions for 2026, 2025, and 2024). Use with --date-literal to span periods (e.g., --date-literal THIS_QUARTER --depth 2 creates definitions for this quarter and last quarter). When no anchor year is specified, defaults to the current year. Defaults to 1 for comparative, 3 for full and recordtype. Maximum 10.
125
+
126
+ # flags.from.summary
127
+
128
+ Start year of an explicit range (inclusive). Use with --to for a custom year range (e.g., --from 2020 --to 2026). Cannot be combined with --depth.
129
+
130
+ # flags.to.summary
131
+
132
+ End year of an explicit range (inclusive). Use with --from for a custom year range (e.g., --from 2020 --to 2026). Defaults to the current year when --from is specified.
133
+
134
+ # errors.yearRangeInvalid
135
+
136
+ Invalid year range: %s
137
+
138
+ # flags.recordtype.summary
139
+
140
+ Filter to a specific record type name for record-type-specific profiling (e.g., --recordtype "New Business"). Used with --method recordtype or --method full. When omitted, all record types matching --record-type-status are included.
141
+
142
+ # flags.record-type-status.summary
143
+
144
+ Filter record types by activity status: active (default), all (active and inactive), or inactive (only inactive). Used with --method recordtype or --method full.
145
+
146
+ # warnings.yearIgnored
147
+
148
+ Year-related flags (--year, --depth, --from, --to) have no effect with --method metadata. Metadata profiling analyzes field structure only, with no time dimension. Ignoring.
149
+
150
+ # flags.no-value-frequency.summary
151
+
152
+ Skip common value frequency analysis during profiling. Reduces profiling time for objects where frequency distribution data is not needed.
153
+
154
+ # flags.use-prior.summary
155
+
156
+ Expand the comparison baseline (SetB) for comparative definitions to include all records created before the anchor year, rather than only the immediately prior year. Shows "current year vs everything before" instead of "current year vs last year" — useful for demonstrating data quality improvements across the full historical record. Cannot be combined with --date-literal.
157
+
158
+ # flags.lifetime-primary.summary
159
+
160
+ Lifetime-vs-X comparative variant: SetA is unfiltered (all records), SetB is the supplied secondary filter. Shows "all records ever vs records matching the filter" — useful for highlighting what fraction of the lifetime data falls within a recent window or specific year. Requires --method comparative AND one of (--date-literal, --year, --from/--to). Mutually exclusive with --use-prior, --depth, and non-comparative methods.
161
+
162
+ # flags.date-literal.summary
163
+
164
+ Rolling time window for time-scoped profiling — use instead of --year for calendar-relative periods. Combine with --depth to create cascading definitions across multiple periods (e.g., --date-literal THIS_QUARTER --depth 4 creates definitions for the last 4 quarters). Cannot be combined with --year, --from, --to, or --use-prior.
165
+
166
+ Supported values:
167
+ TODAY, YESTERDAY — Single-day windows
168
+ THIS_WEEK, LAST_WEEK — Weekly windows
169
+ THIS_MONTH, LAST_MONTH — Monthly windows (use with --depth for "last N months")
170
+ THIS_QUARTER, LAST_QUARTER — Quarterly windows (use with --depth for "rolling quarters")
171
+ THIS_FISCAL_QUARTER, LAST_FISCAL_QUARTER — Fiscal quarter windows
172
+ THIS_YEAR, LAST_YEAR — Annual windows
173
+ THIS_FISCAL_YEAR, LAST_FISCAL_YEAR — Fiscal year windows
174
+ N_YEARS_AGO:2, N_YEARS_AGO:3 — Specific years in the past
175
+ LAST_N_YEARS:2, LAST_N_YEARS:3 — Last N complete years
176
+
177
+ # flags.date-field.summary
178
+
179
+ Date field used to assign records to time windows when using --date-literal. Determines which records fall in "this year" vs "last year." Defaults to CreatedDate. Use LastModifiedDate to analyze records by when they were last updated rather than when they were created (e.g., --date-field LastModifiedDate to profile recently refreshed data).
180
+
181
+ # errors.dateLiteralMutualExclusion
182
+
183
+ Cannot combine --date-literal with --year, --from, --to, or --use-prior. Date literals replace year-based time scoping. Use --date-literal with --depth to cascade across multiple periods.
184
+
185
+ # errors.lifetimePrimaryMethodRequired
186
+
187
+ --lifetime-primary is only valid with --method comparative.
188
+
189
+ # errors.lifetimePrimaryUsePriorMutualExclusion
190
+
191
+ Cannot combine --lifetime-primary with --use-prior. Choose one variant: --lifetime-primary (lifetime vs filtered) or --use-prior (current year vs all prior).
192
+
193
+ # errors.lifetimePrimaryDepthMutualExclusion
194
+
195
+ Cannot combine --lifetime-primary with --depth. The lifetime-vs-X variant produces a single definition shape per object — no cascade.
196
+
197
+ # errors.lifetimePrimaryRequiresSecondaryFilter
198
+
199
+ --lifetime-primary requires a secondary filter: provide --date-literal, --year, or --from/--to.
200
+
201
+ # flags.dry-run.summary
202
+
203
+ Preview which definitions would be created without writing any records to the org. The preview table shows the same columns as the creation output: object name, record count, type, category, and time segment. Use before any scoped run to verify the object selection and methodology match your intent.
204
+
205
+ # flags.no-prompt.summary
206
+
207
+ Skip the confirmation prompt and create definitions immediately. Use for scripted execution and CI automation workflows.
208
+
209
+ # prompt.showDetail
210
+
211
+ Show detailed preview?
212
+
213
+ # prompt.confirm
214
+
215
+ Create %s Profiling Definitions?
216
+
217
+ # output.cancelled
218
+
219
+ Definition creation cancelled.
220
+
221
+ # examples
222
+
223
+ - Create definitions for a single object using all profiling methods:
224
+
225
+ <%= config.bin %> <%= command.id %> --target-org myOrg --objects Account
226
+
227
+ - Preview what would be created before committing (recommended before batch runs):
228
+
229
+ <%= config.bin %> <%= command.id %> --target-org myOrg --filter custom --with-records --dry-run
230
+
231
+ - Profile all custom objects with at least 100 records, tagged by engagement phase:
232
+
233
+ <%= config.bin %> <%= command.id %> --target-org myOrg --filter custom --with-records --min-records 100 --category "Phase 1"
234
+
235
+ - Isolate Financial Services Cloud objects by namespace:
236
+
237
+ <%= config.bin %> <%= command.id %> --target-org myOrg --namespace FinServ --method metadata
238
+
239
+ - Rolling quarterly trend analysis across the last 4 quarters:
240
+
241
+ <%= config.bin %> <%= command.id %> --target-org myOrg --objects Opportunity --method comparative --date-literal THIS_QUARTER --depth 4
242
+
243
+ - Lifetime vs last 2 years — show what fraction of all records were created in the recent window:
244
+
245
+ <%= config.bin %> <%= command.id %> --target-org myOrg --objects Account,Contact,Opportunity --method comparative --lifetime-primary --date-literal LAST_N_YEARS:2
246
+
247
+ - Lifetime vs a specific year — compare all records ever against records created in 2024:
248
+
249
+ <%= config.bin %> <%= command.id %> --target-org myOrg --objects Opportunity --method comparative --lifetime-primary --year 2024
250
+
251
+ - Won vs Lost opportunity analysis to surface data quality gaps between business outcomes:
252
+
253
+ <%= config.bin %> <%= command.id %> --target-org myOrg --objects Opportunity --objects Case --objects Lead --method outcome
254
+
255
+ - Bulk run with shared, human-readable category labels across every created definition:
256
+
257
+ <%= config.bin %> <%= command.id %> --target-org myOrg --filter custom --with-records --time-category "Q1 2026" --segment-category "Pilot Run"
258
+
259
+ # flags.profiled.summary
260
+
261
+ Only create definitions for objects that already have successful metadata profiling results. Builds on prior metadata analysis — run metadata profiling first, review the results, then create historical or comparative definitions for the objects worth deeper analysis. Cannot be combined with --method metadata.
262
+
263
+ # errors.profiledWithMetadata
264
+
265
+ Cannot use --profiled with --method metadata. The --profiled flag targets objects that already have metadata profiling results.
266
+
267
+ # errors.noObjectsFound
268
+
269
+ No objects found matching the specified filters.
270
+
271
+ # errors.objectsNotFound
272
+
273
+ None of the specified objects exist in the org: %s
274
+
275
+ # errors.allObjectsSkipped
276
+
277
+ All %d objects already have existing definitions.
278
+
279
+ # errors.operationFailed
280
+
281
+ Failed to create definitions: %s
282
+
283
+ # errors.filterFailed
284
+
285
+ Failed to filter objects: %s
286
+
287
+ # flags.profile.summary
288
+
289
+ Trigger profiling immediately after definitions are created — equivalent to running `sf cuneiform profile` as a follow-up. Useful for quick single-object setup. For batch runs, create definitions first, review them, then profile separately.
290
+
291
+ # flags.open.summary
292
+
293
+ Open the created definition in Salesforce Lightning after creation completes. When multiple definitions are created, opens the first one. Useful for verifying the definition record in the Profiling Definition Wizard.
294
+
295
+ # flags.logs.summary
296
+
297
+ Write session logs to the .cuneiform/logs/ directory for audit and troubleshooting.
298
+
299
+ # errors.noProfiledObjects
300
+
301
+ No objects have been profiled yet. Run profiling with --method metadata first.
302
+
303
+ # errors.orgUnreachable
304
+
305
+ Unable to connect to the target org.
306
+
307
+ The org "%s" could not be reached. This usually means:
308
+
309
+ 1. The org alias or username is incorrect
310
+ 2. The org has expired or been deleted
311
+ 3. Your authentication has expired
312
+
313
+ To resolve:
314
+
315
+ - Verify the org exists: sf org list
316
+ - Re-authenticate: sf org login web --alias <your-org>
317
+ - Check org status: sf org display --target-org <your-org>
318
+
319
+ # errors.noTargetOrg
320
+
321
+ Could not determine target org username.
322
+
323
+ # errors.mutuallyExclusiveRecordFlags
324
+
325
+ Cannot use --with-records and --without-records together.
326
+
327
+ # errors.minRecordsWithoutRecords
328
+
329
+ Cannot use --min-records with --without-records. The --min-records flag requires record counts, which --without-records excludes.
330
+
331
+ # errors.recordtypeMethodRequired
332
+
333
+ --recordtype flag cannot be used with --method metadata. Use it with --method historical, comparative, recordtype, outcome, or full.
334
+
335
+ # output.title
336
+
337
+ Creating Cuneiform Profiling Definitions for %s (%s)
338
+
339
+ # output.creating
340
+
341
+ Creating %d Cuneiform Profiling Definitions
342
+
343
+ # errors.objectsNotFoundDetail
344
+
345
+ No Salesforce Objects were found matching the specified criteria.
346
+
347
+ Please check the object name(s) and confirm they exist in your Salesforce org.
348
+
349
+ # spinner.connecting
350
+
351
+ Connecting
352
+
353
+ # spinner.validatingObjects
354
+
355
+ Validating Salesforce Objects
356
+
357
+ # warnings.objectNotVerified
358
+
359
+ We could not verify the Object %s; no Profiling Definitions will be created for this object.
360
+
361
+ # output.failedSummary
362
+
363
+ %s definitions failed:
364
+
365
+ # output.profileDryRun
366
+
367
+ [DRY RUN] Would start profiling for %s definitions.
368
+
369
+ # output.profilingStarting
370
+
371
+ Profiling created definitions...
372
+
373
+ # output.profilingSuccess
374
+
375
+ [PROFILING] %s — request %s
376
+
377
+ # warnings.profilingFailed
378
+
379
+ Failed to start profiling for %s: %s
380
+
381
+ # output.openedMultiple
382
+
383
+ Opened first definition. Use Salesforce to view all %s definitions.
384
+
385
+ # output.openedSingle
386
+
387
+ Opened definition in Salesforce.
388
+
389
+ # output.sessionLog
390
+
391
+ Session log: %s
392
+
393
+ # output.creationSummary
394
+
395
+ Creation Summary
396
+
397
+ # output.summaryObjects
398
+
399
+ Objects:
400
+
401
+ # output.summaryMethod
402
+
403
+ Method:
404
+
405
+ # output.summaryToCreate
406
+
407
+ To create:
408
+
409
+ # output.summaryExisting
410
+
411
+ Existing:
412
+
413
+ # output.summaryPreview
414
+
415
+ Preview:
416
+
417
+ # output.summaryCreated
418
+
419
+ Created:
420
+
421
+ # output.summarySkipped
422
+
423
+ Skipped:
424
+
425
+ # output.summaryFailed
426
+
427
+ Failed:
428
+
429
+ # output.summaryHeader
430
+
431
+ Summary
432
+
433
+ # output.tablePrefix.preview
434
+
435
+ Preview
436
+
437
+ # output.tablePrefix.created
438
+
439
+ Created
440
+
441
+ # output.skippedExisting
442
+
443
+ Skipped %s Existing Definitions
444
+
445
+ # output.definitionsTitle
446
+
447
+ Cuneiform Profiling Definitions
448
+
449
+ # table.header.object
450
+
451
+ object
452
+
453
+ # table.header.records
454
+
455
+ records
456
+
457
+ # table.header.type
458
+
459
+ type
460
+
461
+ # table.header.category
462
+
463
+ category
464
+
465
+ # table.header.time
466
+
467
+ time
468
+
469
+ # table.header.segment
470
+
471
+ segment
472
+
473
+ # spinner.status.created
474
+
475
+ created
476
+
477
+ # spinner.status.skipped
478
+
479
+ skipped
480
+
481
+ # output.summaryToCreateSuffix
482
+
483
+ %s definitions
484
+
485
+ # output.summaryExistingSuffix
486
+
487
+ %s definitions (skipped)
488
+
489
+ # flags.name-prefix.summary
490
+
491
+ Prefix prepended to each definition name (e.g., --name-prefix TC-01). Joined with the bullet separator character.
492
+
493
+ # flags.name-suffix.summary
494
+
495
+ Suffix appended to each definition name (e.g., --name-suffix "Run A"). Joined with the bullet separator character.
496
+
497
+ # flags.time-category.summary
498
+
499
+ Verbatim time category applied to every definition created in this run (e.g., --time-category "Q1 2026" or --time-category "Pilot Period"). Overrides all computed time category values regardless of method, year, or outcome configuration. Useful for grouping definitions across a bulk run with a single shared, human-readable time label.
500
+
501
+ # flags.segment-category.summary
502
+
503
+ Verbatim segment category applied to every definition created in this run (e.g., --segment-category "Pilot Run" or --segment-category "Phase 1 Cohort"). Overrides all computed segment category values regardless of method, record type, or outcome configuration. Useful for grouping definitions across a bulk run with a single shared, human-readable segment label.
504
+
505
+ # flags.origin.summary
506
+
507
+ Origin message appended to auto-generated definition descriptions. Defaults to "Created via the Cuneiform for Salesforce CLI." Pass an empty string to suppress the origin tag.
508
+
509
+ # spinner.status.failed
510
+
511
+ failed
@@ -0,0 +1,88 @@
1
+ # summary
2
+
3
+ Preserve profiling definitions as portable CSV files before sandbox refreshes, package upgrades, or cross-org migrations — so hours of scoping work are recoverable in seconds.
4
+
5
+ # description
6
+
7
+ Profiling definitions represent hours of scoping work — object selection, method assignment, category classification, field configuration. That configuration exists inside the Salesforce org and a sandbox refresh removes it. This command extracts all profiling definitions and writes them to a self-contained export directory for backup, migration, or version control.
8
+
9
+ The export creates a timestamped directory containing three files:
10
+
11
+ - `export.json` — SFDMU configuration file for round-trip compatibility with `definition import`
12
+ - `pnova__Profiling_Definition__c.csv` — all definition records (fields covering identity, aggregation status, version tracking, profiling configuration, and formula fields)
13
+ - `export-metadata.json` — source org, timestamp, record count, and file manifest
14
+
15
+ This command exports OUT of the org. To bring definitions back IN, use `sf cuneiform definition import`.
16
+
17
+ WHEN TO USE:
18
+
19
+ - Before a sandbox refresh — preserve definitions so you can restore after the refresh wipes custom data
20
+ - Before a package upgrade — capture the current configuration in case the upgrade affects profiling definitions
21
+ - For cross-org migration — export from sandbox, review the CSV in a spreadsheet, import to production
22
+ - For version control — commit definition exports to Git with `--exclude-ids` for clean diffs between versions
23
+
24
+ The `--exclude-ids` flag strips Salesforce-generated IDs (Id, CreatedById, LastModifiedById) from the CSV output. This produces clean diffs between exports — org-specific IDs create false diffs in version control.
25
+
26
+ Read-only. Does not modify definitions in the org. Fails if the output directory already exists, preventing accidental overwrites of previous exports.
27
+
28
+ # flags.target-org.summary
29
+
30
+ Export definitions from this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.
31
+
32
+ # flags.output.summary
33
+
34
+ Override the default timestamped output directory. Defaults to `./data/exports/definitions/{timestamp}`, creating a unique directory per export. Specify a custom path to organize exports within a project structure (e.g., `--output ./config/definitions`).
35
+
36
+ # flags.exclude-ids.summary
37
+
38
+ Strip Salesforce-generated IDs (Id, CreatedById, LastModifiedById) from the CSV output. Use this when committing exports to Git — org-specific IDs differ between environments and create false diffs. Keep IDs when exporting for same-org restore fidelity.
39
+
40
+ # spinner.exporting
41
+
42
+ Exporting definitions...
43
+
44
+ # export.complete
45
+
46
+ Exported %s definition(s) successfully.
47
+
48
+ # output.directory
49
+
50
+ Output directory: %s
51
+
52
+ # table.header.file
53
+
54
+ File
55
+
56
+ # table.header.definition
57
+
58
+ Definition
59
+
60
+ # table.header.path
61
+
62
+ Path
63
+
64
+ # warnings.title
65
+
66
+ Warnings
67
+
68
+ # examples
69
+
70
+ - Back up all definitions before a sandbox refresh:
71
+
72
+ <%= config.bin %> <%= command.id %> --target-org myOrg
73
+
74
+ - Save to a specific directory within your project structure:
75
+
76
+ <%= config.bin %> <%= command.id %> --target-org myOrg --output ./backup/definitions
77
+
78
+ - Export for Git — strip org-specific IDs so diffs reflect only meaningful configuration changes:
79
+
80
+ <%= config.bin %> <%= command.id %> --target-org myOrg --exclude-ids --output ./config/definitions
81
+
82
+ - Export for cross-org migration — keep IDs for exact restore fidelity in the target org:
83
+
84
+ <%= config.bin %> <%= command.id %> --target-org myOrg --output ./migration/source-org
85
+
86
+ - Output as JSON for scripting, automation pipelines, or downstream tooling:
87
+
88
+ <%= config.bin %> <%= command.id %> --target-org myOrg --json