@peernova/cuneiform-sf 1.0.2 → 1.0.4-beta.8

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 (494) hide show
  1. package/LICENSE +81 -30
  2. package/README.md +59 -95
  3. package/lib/adapters/connection-facade.d.ts +458 -0
  4. package/lib/adapters/connection-facade.js +379 -0
  5. package/lib/adapters/connection-facade.js.map +1 -0
  6. package/lib/adapters/errors.d.ts +547 -0
  7. package/lib/adapters/errors.js +937 -0
  8. package/lib/adapters/errors.js.map +1 -0
  9. package/lib/adapters/index.d.ts +33 -0
  10. package/lib/adapters/index.js +50 -0
  11. package/lib/adapters/index.js.map +1 -0
  12. package/lib/adapters/lifecycle.d.ts +119 -0
  13. package/lib/adapters/lifecycle.js +94 -0
  14. package/lib/adapters/lifecycle.js.map +1 -0
  15. package/lib/adapters/rest/cache.d.ts +69 -0
  16. package/lib/adapters/rest/cache.js +133 -0
  17. package/lib/adapters/rest/cache.js.map +1 -0
  18. package/lib/adapters/rest/index.d.ts +11 -0
  19. package/lib/adapters/rest/index.js +18 -0
  20. package/lib/adapters/rest/index.js.map +1 -0
  21. package/lib/adapters/rest/profiling-rest-client.d.ts +137 -0
  22. package/lib/adapters/rest/profiling-rest-client.js +115 -0
  23. package/lib/adapters/rest/profiling-rest-client.js.map +1 -0
  24. package/lib/adapters/rest/rest-api-adapter.d.ts +389 -0
  25. package/lib/adapters/rest/rest-api-adapter.js +747 -0
  26. package/lib/adapters/rest/rest-api-adapter.js.map +1 -0
  27. package/lib/adapters/rest/types.d.ts +34 -0
  28. package/lib/adapters/rest/types.js +9 -0
  29. package/lib/adapters/rest/types.js.map +1 -0
  30. package/lib/adapters/retry.d.ts +91 -0
  31. package/lib/adapters/retry.js +215 -0
  32. package/lib/adapters/retry.js.map +1 -0
  33. package/lib/adapters/soql/cuneiform-query-builder.d.ts +391 -0
  34. package/lib/adapters/soql/cuneiform-query-builder.js +559 -0
  35. package/lib/adapters/soql/cuneiform-query-builder.js.map +1 -0
  36. package/lib/adapters/soql/index.d.ts +13 -0
  37. package/lib/adapters/soql/index.js +21 -0
  38. package/lib/adapters/soql/index.js.map +1 -0
  39. package/lib/adapters/soql/soql-query-adapter.d.ts +141 -0
  40. package/lib/adapters/soql/soql-query-adapter.js +259 -0
  41. package/lib/adapters/soql/soql-query-adapter.js.map +1 -0
  42. package/lib/adapters/soql/types.d.ts +37 -0
  43. package/lib/adapters/soql/types.js +19 -0
  44. package/lib/adapters/soql/types.js.map +1 -0
  45. package/lib/adapters/testing/index.d.ts +37 -0
  46. package/lib/adapters/testing/index.js +20 -0
  47. package/lib/adapters/testing/index.js.map +1 -0
  48. package/lib/adapters/testing/mock-connection.d.ts +77 -0
  49. package/lib/adapters/testing/mock-connection.js +207 -0
  50. package/lib/adapters/testing/mock-connection.js.map +1 -0
  51. package/lib/adapters/testing/mock-logger.d.ts +29 -0
  52. package/lib/adapters/testing/mock-logger.js +57 -0
  53. package/lib/adapters/testing/mock-logger.js.map +1 -0
  54. package/lib/adapters/testing/mock-mcp-adapters.d.ts +32 -0
  55. package/lib/adapters/testing/mock-mcp-adapters.js +52 -0
  56. package/lib/adapters/testing/mock-mcp-adapters.js.map +1 -0
  57. package/lib/adapters/testing/mock-oclif-config.d.ts +22 -0
  58. package/lib/adapters/testing/mock-oclif-config.js +90 -0
  59. package/lib/adapters/testing/mock-oclif-config.js.map +1 -0
  60. package/lib/adapters/testing/mock-rest-adapter.d.ts +26 -0
  61. package/lib/adapters/testing/mock-rest-adapter.js +243 -0
  62. package/lib/adapters/testing/mock-rest-adapter.js.map +1 -0
  63. package/lib/adapters/testing/mock-salesforce-connection.d.ts +40 -0
  64. package/lib/adapters/testing/mock-salesforce-connection.js +61 -0
  65. package/lib/adapters/testing/mock-salesforce-connection.js.map +1 -0
  66. package/lib/adapters/testing/mock-soql-adapter.d.ts +30 -0
  67. package/lib/adapters/testing/mock-soql-adapter.js +120 -0
  68. package/lib/adapters/testing/mock-soql-adapter.js.map +1 -0
  69. package/lib/adapters/testing/mock-tooling-adapter.d.ts +24 -0
  70. package/lib/adapters/testing/mock-tooling-adapter.js +163 -0
  71. package/lib/adapters/testing/mock-tooling-adapter.js.map +1 -0
  72. package/lib/adapters/testing/stub-connection.d.ts +93 -0
  73. package/lib/adapters/testing/stub-connection.js +97 -0
  74. package/lib/adapters/testing/stub-connection.js.map +1 -0
  75. package/lib/adapters/testing/stub-rest-adapter.d.ts +52 -0
  76. package/lib/adapters/testing/stub-rest-adapter.js +58 -0
  77. package/lib/adapters/testing/stub-rest-adapter.js.map +1 -0
  78. package/lib/adapters/testing/stub-soql-adapter.d.ts +56 -0
  79. package/lib/adapters/testing/stub-soql-adapter.js +50 -0
  80. package/lib/adapters/testing/stub-soql-adapter.js.map +1 -0
  81. package/lib/adapters/testing/types.d.ts +71 -0
  82. package/lib/adapters/testing/types.js +9 -0
  83. package/lib/adapters/testing/types.js.map +1 -0
  84. package/lib/adapters/tooling/index.d.ts +10 -0
  85. package/lib/adapters/tooling/index.js +17 -0
  86. package/lib/adapters/tooling/index.js.map +1 -0
  87. package/lib/adapters/tooling/tooling-api-adapter.d.ts +157 -0
  88. package/lib/adapters/tooling/tooling-api-adapter.js +339 -0
  89. package/lib/adapters/tooling/tooling-api-adapter.js.map +1 -0
  90. package/lib/adapters/tooling/types.d.ts +81 -0
  91. package/lib/adapters/tooling/types.js +9 -0
  92. package/lib/adapters/tooling/types.js.map +1 -0
  93. package/lib/adapters/types.d.ts +112 -0
  94. package/lib/adapters/types.js +169 -0
  95. package/lib/adapters/types.js.map +1 -0
  96. package/lib/base/cuneiform-command.d.ts +152 -0
  97. package/lib/base/cuneiform-command.js +243 -0
  98. package/lib/base/cuneiform-command.js.map +1 -0
  99. package/lib/commands/cuneiform/compatibility/check.d.ts +43 -0
  100. package/lib/commands/cuneiform/compatibility/check.js +114 -0
  101. package/lib/commands/cuneiform/compatibility/check.js.map +1 -0
  102. package/lib/commands/cuneiform/definition/create.d.ts +119 -0
  103. package/lib/commands/cuneiform/definition/create.js +693 -0
  104. package/lib/commands/cuneiform/definition/create.js.map +1 -0
  105. package/lib/commands/cuneiform/definition/export.d.ts +57 -0
  106. package/lib/commands/cuneiform/definition/export.js +133 -0
  107. package/lib/commands/cuneiform/definition/export.js.map +1 -0
  108. package/lib/commands/cuneiform/definition/get.d.ts +86 -0
  109. package/lib/commands/cuneiform/definition/get.js +270 -0
  110. package/lib/commands/cuneiform/definition/get.js.map +1 -0
  111. package/lib/commands/cuneiform/definition/import.d.ts +54 -0
  112. package/lib/commands/cuneiform/definition/import.js +118 -0
  113. package/lib/commands/cuneiform/definition/import.js.map +1 -0
  114. package/lib/commands/cuneiform/definition/list.d.ts +110 -0
  115. package/lib/commands/cuneiform/definition/list.js +344 -0
  116. package/lib/commands/cuneiform/definition/list.js.map +1 -0
  117. package/lib/commands/cuneiform/definition/purge.d.ts +105 -0
  118. package/lib/commands/cuneiform/definition/purge.js +533 -0
  119. package/lib/commands/cuneiform/definition/purge.js.map +1 -0
  120. package/lib/commands/cuneiform/definition/update.d.ts +58 -0
  121. package/lib/commands/cuneiform/definition/update.js +206 -0
  122. package/lib/commands/cuneiform/definition/update.js.map +1 -0
  123. package/lib/commands/cuneiform/mcp/serve.d.ts +56 -0
  124. package/lib/commands/cuneiform/mcp/serve.js +109 -0
  125. package/lib/commands/cuneiform/mcp/serve.js.map +1 -0
  126. package/lib/commands/cuneiform/object/describe.d.ts +61 -0
  127. package/lib/commands/cuneiform/object/describe.js +461 -0
  128. package/lib/commands/cuneiform/object/describe.js.map +1 -0
  129. package/lib/commands/cuneiform/object/list.d.ts +111 -0
  130. package/lib/commands/cuneiform/object/list.js +239 -0
  131. package/lib/commands/cuneiform/object/list.js.map +1 -0
  132. package/lib/commands/cuneiform/org/details.d.ts +99 -0
  133. package/lib/commands/cuneiform/org/details.js +521 -0
  134. package/lib/commands/cuneiform/org/details.js.map +1 -0
  135. package/lib/commands/cuneiform/org/reset.d.ts +46 -0
  136. package/lib/commands/cuneiform/org/reset.js +135 -0
  137. package/lib/commands/cuneiform/org/reset.js.map +1 -0
  138. package/lib/commands/cuneiform/profile/request/cancel.d.ts +59 -0
  139. package/lib/commands/cuneiform/profile/request/cancel.js +202 -0
  140. package/lib/commands/cuneiform/profile/request/cancel.js.map +1 -0
  141. package/lib/commands/cuneiform/profile/request/delete.d.ts +59 -0
  142. package/lib/commands/cuneiform/profile/request/delete.js +223 -0
  143. package/lib/commands/cuneiform/profile/request/delete.js.map +1 -0
  144. package/lib/commands/cuneiform/profile/request/list.d.ts +35 -0
  145. package/lib/commands/cuneiform/profile/request/list.js +102 -0
  146. package/lib/commands/cuneiform/profile/request/list.js.map +1 -0
  147. package/lib/commands/cuneiform/profile.d.ts +90 -0
  148. package/lib/commands/cuneiform/profile.js +322 -0
  149. package/lib/commands/cuneiform/profile.js.map +1 -0
  150. package/lib/commands/cuneiform/summary/purge.d.ts +77 -0
  151. package/lib/commands/cuneiform/summary/purge.js +429 -0
  152. package/lib/commands/cuneiform/summary/purge.js.map +1 -0
  153. package/lib/commands/cuneiform/summary/reprofile.d.ts +60 -0
  154. package/lib/commands/cuneiform/summary/reprofile.js +236 -0
  155. package/lib/commands/cuneiform/summary/reprofile.js.map +1 -0
  156. package/lib/commands/cuneiform/summary/stop.d.ts +59 -0
  157. package/lib/commands/cuneiform/summary/stop.js +234 -0
  158. package/lib/commands/cuneiform/summary/stop.js.map +1 -0
  159. package/lib/commands/cuneiform/user/details.d.ts +73 -0
  160. package/lib/commands/cuneiform/user/details.js +391 -0
  161. package/lib/commands/cuneiform/user/details.js.map +1 -0
  162. package/lib/constants/index.d.ts +8 -0
  163. package/lib/constants/index.js +16 -0
  164. package/lib/constants/index.js.map +1 -0
  165. package/lib/constants/namespace-constants.d.ts +91 -0
  166. package/lib/constants/namespace-constants.js +211 -0
  167. package/lib/constants/namespace-constants.js.map +1 -0
  168. package/lib/debug/command-debug-proxy.d.ts +101 -0
  169. package/lib/debug/command-debug-proxy.js +171 -0
  170. package/lib/debug/command-debug-proxy.js.map +1 -0
  171. package/lib/debug/debug-logger.d.ts +85 -0
  172. package/lib/debug/debug-logger.js +133 -0
  173. package/lib/debug/debug-logger.js.map +1 -0
  174. package/lib/debug/index.d.ts +12 -0
  175. package/lib/debug/index.js +20 -0
  176. package/lib/debug/index.js.map +1 -0
  177. package/lib/debug/service-debug-proxy.d.ts +30 -0
  178. package/lib/debug/service-debug-proxy.js +102 -0
  179. package/lib/debug/service-debug-proxy.js.map +1 -0
  180. package/lib/hooks/prerun.d.ts +25 -0
  181. package/lib/hooks/prerun.js +47 -0
  182. package/lib/hooks/prerun.js.map +1 -0
  183. package/lib/mcp/config/mcp-config.d.ts +55 -0
  184. package/lib/mcp/config/mcp-config.js +51 -0
  185. package/lib/mcp/config/mcp-config.js.map +1 -0
  186. package/lib/mcp/config/pagination.d.ts +96 -0
  187. package/lib/mcp/config/pagination.js +108 -0
  188. package/lib/mcp/config/pagination.js.map +1 -0
  189. package/lib/mcp/config/system-prompts.d.ts +18 -0
  190. package/lib/mcp/config/system-prompts.js +92 -0
  191. package/lib/mcp/config/system-prompts.js.map +1 -0
  192. package/lib/mcp/errors.d.ts +23 -0
  193. package/lib/mcp/errors.js +27 -0
  194. package/lib/mcp/errors.js.map +1 -0
  195. package/lib/mcp/schemas/input-schemas.d.ts +327 -0
  196. package/lib/mcp/schemas/input-schemas.js +302 -0
  197. package/lib/mcp/schemas/input-schemas.js.map +1 -0
  198. package/lib/mcp/server.d.ts +40 -0
  199. package/lib/mcp/server.js +316 -0
  200. package/lib/mcp/server.js.map +1 -0
  201. package/lib/mcp/tools/contactpoint-tools.d.ts +14 -0
  202. package/lib/mcp/tools/contactpoint-tools.js +34 -0
  203. package/lib/mcp/tools/contactpoint-tools.js.map +1 -0
  204. package/lib/mcp/tools/definition-io-tools.d.ts +19 -0
  205. package/lib/mcp/tools/definition-io-tools.js +152 -0
  206. package/lib/mcp/tools/definition-io-tools.js.map +1 -0
  207. package/lib/mcp/tools/definition-tools.d.ts +51 -0
  208. package/lib/mcp/tools/definition-tools.js +199 -0
  209. package/lib/mcp/tools/definition-tools.js.map +1 -0
  210. package/lib/mcp/tools/index.d.ts +37 -0
  211. package/lib/mcp/tools/index.js +88 -0
  212. package/lib/mcp/tools/index.js.map +1 -0
  213. package/lib/mcp/tools/object-tools.d.ts +22 -0
  214. package/lib/mcp/tools/object-tools.js +306 -0
  215. package/lib/mcp/tools/object-tools.js.map +1 -0
  216. package/lib/mcp/tools/org-tools.d.ts +14 -0
  217. package/lib/mcp/tools/org-tools.js +177 -0
  218. package/lib/mcp/tools/org-tools.js.map +1 -0
  219. package/lib/mcp/tools/profile-tools.d.ts +59 -0
  220. package/lib/mcp/tools/profile-tools.js +213 -0
  221. package/lib/mcp/tools/profile-tools.js.map +1 -0
  222. package/lib/mcp/tools/summary-tools.d.ts +14 -0
  223. package/lib/mcp/tools/summary-tools.js +38 -0
  224. package/lib/mcp/tools/summary-tools.js.map +1 -0
  225. package/lib/mcp/tools/tool-factory.d.ts +63 -0
  226. package/lib/mcp/tools/tool-factory.js +146 -0
  227. package/lib/mcp/tools/tool-factory.js.map +1 -0
  228. package/lib/mcp/tools/user-tools.d.ts +25 -0
  229. package/lib/mcp/tools/user-tools.js +167 -0
  230. package/lib/mcp/tools/user-tools.js.map +1 -0
  231. package/lib/models/date-literal.d.ts +211 -0
  232. package/lib/models/date-literal.js +615 -0
  233. package/lib/models/date-literal.js.map +1 -0
  234. package/lib/models/object-describe-types.d.ts +173 -0
  235. package/lib/models/object-describe-types.js +9 -0
  236. package/lib/models/object-describe-types.js.map +1 -0
  237. package/lib/models/profile-request-types.d.ts +118 -0
  238. package/lib/models/profile-request-types.js +23 -0
  239. package/lib/models/profile-request-types.js.map +1 -0
  240. package/lib/models/profiling-execution-types.d.ts +154 -0
  241. package/lib/models/profiling-execution-types.js +14 -0
  242. package/lib/models/profiling-execution-types.js.map +1 -0
  243. package/lib/models/service-result.d.ts +114 -0
  244. package/lib/models/service-result.js +81 -0
  245. package/lib/models/service-result.js.map +1 -0
  246. package/lib/models/sfdmu-types.d.ts +53 -0
  247. package/lib/models/sfdmu-types.js +23 -0
  248. package/lib/models/sfdmu-types.js.map +1 -0
  249. package/lib/models/status-types.d.ts +38 -0
  250. package/lib/models/status-types.js +12 -0
  251. package/lib/models/status-types.js.map +1 -0
  252. package/lib/models/summary-bulk-types.d.ts +61 -0
  253. package/lib/models/summary-bulk-types.js +23 -0
  254. package/lib/models/summary-bulk-types.js.map +1 -0
  255. package/lib/models/user-details-types.d.ts +163 -0
  256. package/lib/models/user-details-types.js +9 -0
  257. package/lib/models/user-details-types.js.map +1 -0
  258. package/lib/models/year-range.d.ts +78 -0
  259. package/lib/models/year-range.js +153 -0
  260. package/lib/models/year-range.js.map +1 -0
  261. package/lib/operations/CompatibilityCheckOperation.d.ts +62 -0
  262. package/lib/operations/CompatibilityCheckOperation.js +102 -0
  263. package/lib/operations/CompatibilityCheckOperation.js.map +1 -0
  264. package/lib/operations/DefinitionCreateOperation.d.ts +411 -0
  265. package/lib/operations/DefinitionCreateOperation.js +1121 -0
  266. package/lib/operations/DefinitionCreateOperation.js.map +1 -0
  267. package/lib/operations/DefinitionExportOperation.d.ts +155 -0
  268. package/lib/operations/DefinitionExportOperation.js +281 -0
  269. package/lib/operations/DefinitionExportOperation.js.map +1 -0
  270. package/lib/operations/DefinitionImportOperation.d.ts +144 -0
  271. package/lib/operations/DefinitionImportOperation.js +357 -0
  272. package/lib/operations/DefinitionImportOperation.js.map +1 -0
  273. package/lib/operations/DefinitionListOperation.d.ts +66 -0
  274. package/lib/operations/DefinitionListOperation.js +108 -0
  275. package/lib/operations/DefinitionListOperation.js.map +1 -0
  276. package/lib/operations/DefinitionPurgeOperation.d.ts +199 -0
  277. package/lib/operations/DefinitionPurgeOperation.js +465 -0
  278. package/lib/operations/DefinitionPurgeOperation.js.map +1 -0
  279. package/lib/operations/DefinitionUpdateOperation.d.ts +78 -0
  280. package/lib/operations/DefinitionUpdateOperation.js +142 -0
  281. package/lib/operations/DefinitionUpdateOperation.js.map +1 -0
  282. package/lib/operations/OrgDetailsOperation.d.ts +253 -0
  283. package/lib/operations/OrgDetailsOperation.js +456 -0
  284. package/lib/operations/OrgDetailsOperation.js.map +1 -0
  285. package/lib/operations/OrgResetOperation.d.ts +114 -0
  286. package/lib/operations/OrgResetOperation.js +209 -0
  287. package/lib/operations/OrgResetOperation.js.map +1 -0
  288. package/lib/operations/ProfileOperation.d.ts +187 -0
  289. package/lib/operations/ProfileOperation.js +373 -0
  290. package/lib/operations/ProfileOperation.js.map +1 -0
  291. package/lib/operations/ProfileRequestCancelOperation.d.ts +59 -0
  292. package/lib/operations/ProfileRequestCancelOperation.js +137 -0
  293. package/lib/operations/ProfileRequestCancelOperation.js.map +1 -0
  294. package/lib/operations/ProfileRequestDeleteOperation.d.ts +64 -0
  295. package/lib/operations/ProfileRequestDeleteOperation.js +134 -0
  296. package/lib/operations/ProfileRequestDeleteOperation.js.map +1 -0
  297. package/lib/operations/ProfileRequestListOperation.d.ts +39 -0
  298. package/lib/operations/ProfileRequestListOperation.js +61 -0
  299. package/lib/operations/ProfileRequestListOperation.js.map +1 -0
  300. package/lib/operations/SummaryPurgeOperation.d.ts +134 -0
  301. package/lib/operations/SummaryPurgeOperation.js +257 -0
  302. package/lib/operations/SummaryPurgeOperation.js.map +1 -0
  303. package/lib/operations/SummaryReprofileOperation.d.ts +88 -0
  304. package/lib/operations/SummaryReprofileOperation.js +174 -0
  305. package/lib/operations/SummaryReprofileOperation.js.map +1 -0
  306. package/lib/operations/SummaryStopOperation.d.ts +87 -0
  307. package/lib/operations/SummaryStopOperation.js +175 -0
  308. package/lib/operations/SummaryStopOperation.js.map +1 -0
  309. package/lib/services/BulkExecutionService.d.ts +120 -0
  310. package/lib/services/BulkExecutionService.js +535 -0
  311. package/lib/services/BulkExecutionService.js.map +1 -0
  312. package/lib/services/CompatibilityService.d.ts +81 -0
  313. package/lib/services/CompatibilityService.js +118 -0
  314. package/lib/services/CompatibilityService.js.map +1 -0
  315. package/lib/services/ConfigureMode.d.ts +85 -0
  316. package/lib/services/ConfigureMode.js +390 -0
  317. package/lib/services/ConfigureMode.js.map +1 -0
  318. package/lib/services/ContactPointService.d.ts +111 -0
  319. package/lib/services/ContactPointService.js +286 -0
  320. package/lib/services/ContactPointService.js.map +1 -0
  321. package/lib/services/DataAvailabilityService.d.ts +81 -0
  322. package/lib/services/DataAvailabilityService.js +128 -0
  323. package/lib/services/DataAvailabilityService.js.map +1 -0
  324. package/lib/services/DefinitionFieldGenerationService.d.ts +309 -0
  325. package/lib/services/DefinitionFieldGenerationService.js +795 -0
  326. package/lib/services/DefinitionFieldGenerationService.js.map +1 -0
  327. package/lib/services/DefinitionQueryBuilder.d.ts +59 -0
  328. package/lib/services/DefinitionQueryBuilder.js +234 -0
  329. package/lib/services/DefinitionQueryBuilder.js.map +1 -0
  330. package/lib/services/ObjectDescribeService.d.ts +436 -0
  331. package/lib/services/ObjectDescribeService.js +869 -0
  332. package/lib/services/ObjectDescribeService.js.map +1 -0
  333. package/lib/services/ObjectFilteringService.d.ts +400 -0
  334. package/lib/services/ObjectFilteringService.js +878 -0
  335. package/lib/services/ObjectFilteringService.js.map +1 -0
  336. package/lib/services/ObjectListCommandService.d.ts +429 -0
  337. package/lib/services/ObjectListCommandService.js +873 -0
  338. package/lib/services/ObjectListCommandService.js.map +1 -0
  339. package/lib/services/ObjectListService.d.ts +201 -0
  340. package/lib/services/ObjectListService.js +345 -0
  341. package/lib/services/ObjectListService.js.map +1 -0
  342. package/lib/services/OrgInfoService.d.ts +485 -0
  343. package/lib/services/OrgInfoService.js +1122 -0
  344. package/lib/services/OrgInfoService.js.map +1 -0
  345. package/lib/services/PollingService.d.ts +105 -0
  346. package/lib/services/PollingService.js +117 -0
  347. package/lib/services/PollingService.js.map +1 -0
  348. package/lib/services/ProfileRequestService.d.ts +186 -0
  349. package/lib/services/ProfileRequestService.js +555 -0
  350. package/lib/services/ProfileRequestService.js.map +1 -0
  351. package/lib/services/ProfilingDefinitionService.d.ts +535 -0
  352. package/lib/services/ProfilingDefinitionService.js +981 -0
  353. package/lib/services/ProfilingDefinitionService.js.map +1 -0
  354. package/lib/services/ProfilingExecutionService.d.ts +122 -0
  355. package/lib/services/ProfilingExecutionService.js +320 -0
  356. package/lib/services/ProfilingExecutionService.js.map +1 -0
  357. package/lib/services/ProfilingSummaryService.d.ts +292 -0
  358. package/lib/services/ProfilingSummaryService.js +685 -0
  359. package/lib/services/ProfilingSummaryService.js.map +1 -0
  360. package/lib/services/RecordTypeService.d.ts +129 -0
  361. package/lib/services/RecordTypeService.js +284 -0
  362. package/lib/services/RecordTypeService.js.map +1 -0
  363. package/lib/services/SFDMUService.d.ts +133 -0
  364. package/lib/services/SFDMUService.js +295 -0
  365. package/lib/services/SFDMUService.js.map +1 -0
  366. package/lib/services/TabDetectionService.d.ts +105 -0
  367. package/lib/services/TabDetectionService.js +206 -0
  368. package/lib/services/TabDetectionService.js.map +1 -0
  369. package/lib/services/UnconfigureMode.d.ts +74 -0
  370. package/lib/services/UnconfigureMode.js +378 -0
  371. package/lib/services/UnconfigureMode.js.map +1 -0
  372. package/lib/services/UserConfigurationService.d.ts +155 -0
  373. package/lib/services/UserConfigurationService.js +573 -0
  374. package/lib/services/UserConfigurationService.js.map +1 -0
  375. package/lib/services/UserConfigurationTypes.d.ts +181 -0
  376. package/lib/services/UserConfigurationTypes.js +14 -0
  377. package/lib/services/UserConfigurationTypes.js.map +1 -0
  378. package/lib/services/UserReadinessService.d.ts +330 -0
  379. package/lib/services/UserReadinessService.js +831 -0
  380. package/lib/services/UserReadinessService.js.map +1 -0
  381. package/lib/services/constants.d.ts +53 -0
  382. package/lib/services/constants.js +71 -0
  383. package/lib/services/constants.js.map +1 -0
  384. package/lib/services/namespace-constants.d.ts +1 -0
  385. package/lib/services/namespace-constants.js +11 -0
  386. package/lib/services/namespace-constants.js.map +1 -0
  387. package/lib/services/validation.d.ts +47 -0
  388. package/lib/services/validation.js +119 -0
  389. package/lib/services/validation.js.map +1 -0
  390. package/lib/utils/batch-processor.d.ts +13 -0
  391. package/lib/utils/batch-processor.js +39 -0
  392. package/lib/utils/batch-processor.js.map +1 -0
  393. package/lib/utils/formatting/availability-grid.d.ts +81 -0
  394. package/lib/utils/formatting/availability-grid.js +94 -0
  395. package/lib/utils/formatting/availability-grid.js.map +1 -0
  396. package/lib/utils/formatting/business-process-grid.d.ts +51 -0
  397. package/lib/utils/formatting/business-process-grid.js +58 -0
  398. package/lib/utils/formatting/business-process-grid.js.map +1 -0
  399. package/lib/utils/formatting/command-display.d.ts +154 -0
  400. package/lib/utils/formatting/command-display.js +154 -0
  401. package/lib/utils/formatting/command-display.js.map +1 -0
  402. package/lib/utils/formatting/definition-create-display.d.ts +118 -0
  403. package/lib/utils/formatting/definition-create-display.js +231 -0
  404. package/lib/utils/formatting/definition-create-display.js.map +1 -0
  405. package/lib/utils/formatting/empty-states.d.ts +35 -0
  406. package/lib/utils/formatting/empty-states.js +70 -0
  407. package/lib/utils/formatting/empty-states.js.map +1 -0
  408. package/lib/utils/formatting/errors.d.ts +33 -0
  409. package/lib/utils/formatting/errors.js +72 -0
  410. package/lib/utils/formatting/errors.js.map +1 -0
  411. package/lib/utils/formatting/field-types.d.ts +32 -0
  412. package/lib/utils/formatting/field-types.js +88 -0
  413. package/lib/utils/formatting/field-types.js.map +1 -0
  414. package/lib/utils/formatting/index.d.ts +29 -0
  415. package/lib/utils/formatting/index.js +28 -0
  416. package/lib/utils/formatting/index.js.map +1 -0
  417. package/lib/utils/formatting/indicators.d.ts +113 -0
  418. package/lib/utils/formatting/indicators.js +161 -0
  419. package/lib/utils/formatting/indicators.js.map +1 -0
  420. package/lib/utils/formatting/loading-messages.d.ts +37 -0
  421. package/lib/utils/formatting/loading-messages.js +50 -0
  422. package/lib/utils/formatting/loading-messages.js.map +1 -0
  423. package/lib/utils/formatting/namespace-display.d.ts +31 -0
  424. package/lib/utils/formatting/namespace-display.js +64 -0
  425. package/lib/utils/formatting/namespace-display.js.map +1 -0
  426. package/lib/utils/formatting/numbers.d.ts +73 -0
  427. package/lib/utils/formatting/numbers.js +187 -0
  428. package/lib/utils/formatting/numbers.js.map +1 -0
  429. package/lib/utils/formatting/object-describe-display.d.ts +114 -0
  430. package/lib/utils/formatting/object-describe-display.js +440 -0
  431. package/lib/utils/formatting/object-describe-display.js.map +1 -0
  432. package/lib/utils/formatting/object-list-display.d.ts +213 -0
  433. package/lib/utils/formatting/object-list-display.js +672 -0
  434. package/lib/utils/formatting/object-list-display.js.map +1 -0
  435. package/lib/utils/formatting/org-identity.d.ts +15 -0
  436. package/lib/utils/formatting/org-identity.js +28 -0
  437. package/lib/utils/formatting/org-identity.js.map +1 -0
  438. package/lib/utils/formatting/record-age-grid.d.ts +41 -0
  439. package/lib/utils/formatting/record-age-grid.js +56 -0
  440. package/lib/utils/formatting/record-age-grid.js.map +1 -0
  441. package/lib/utils/formatting/sections.d.ts +108 -0
  442. package/lib/utils/formatting/sections.js +150 -0
  443. package/lib/utils/formatting/sections.js.map +1 -0
  444. package/lib/utils/formatting/tables.d.ts +90 -0
  445. package/lib/utils/formatting/tables.js +113 -0
  446. package/lib/utils/formatting/tables.js.map +1 -0
  447. package/lib/utils/formatting/user-details-display.d.ts +101 -0
  448. package/lib/utils/formatting/user-details-display.js +425 -0
  449. package/lib/utils/formatting/user-details-display.js.map +1 -0
  450. package/lib/utils/pagination/index.d.ts +11 -0
  451. package/lib/utils/pagination/index.js +18 -0
  452. package/lib/utils/pagination/index.js.map +1 -0
  453. package/lib/utils/pagination/keypress-reader.d.ts +20 -0
  454. package/lib/utils/pagination/keypress-reader.js +63 -0
  455. package/lib/utils/pagination/keypress-reader.js.map +1 -0
  456. package/lib/utils/pagination/paginate-output.d.ts +48 -0
  457. package/lib/utils/pagination/paginate-output.js +136 -0
  458. package/lib/utils/pagination/paginate-output.js.map +1 -0
  459. package/messages/compatibility.check.md +71 -0
  460. package/messages/cuneiform.access.md +138 -0
  461. package/messages/definition.create.md +511 -0
  462. package/messages/definition.export.md +84 -0
  463. package/messages/definition.get.md +147 -0
  464. package/messages/definition.import.md +65 -0
  465. package/messages/definition.list.md +264 -0
  466. package/messages/definition.purge.md +318 -0
  467. package/messages/definition.update.md +118 -0
  468. package/messages/mcp.serve.md +66 -0
  469. package/messages/object.describe.md +201 -0
  470. package/messages/object.list.md +443 -0
  471. package/messages/org.details.md +386 -0
  472. package/messages/org.reset.md +71 -0
  473. package/messages/profile.md +231 -0
  474. package/messages/profile.request.cancel.md +143 -0
  475. package/messages/profile.request.delete.md +139 -0
  476. package/messages/profile.request.list.md +89 -0
  477. package/messages/summary.purge.md +218 -0
  478. package/messages/summary.reprofile.md +150 -0
  479. package/messages/summary.stop.md +157 -0
  480. package/messages/user.details.md +501 -0
  481. package/oclif.lock +2887 -2149
  482. package/oclif.manifest.json +2813 -31
  483. package/package.json +94 -19
  484. package/lib/commands/cuneiform/about.d.ts +0 -13
  485. package/lib/commands/cuneiform/about.js +0 -26
  486. package/lib/commands/cuneiform/about.js.map +0 -1
  487. package/lib/commands/hello/world.d.ts +0 -14
  488. package/lib/commands/hello/world.js +0 -27
  489. package/lib/commands/hello/world.js.map +0 -1
  490. package/lib/index.d.ts +0 -2
  491. package/lib/index.js +0 -2
  492. package/lib/index.js.map +0 -1
  493. package/messages/cuneiform.about.md +0 -19
  494. package/messages/hello.world.md +0 -29
@@ -1,11 +1,18 @@
1
1
  {
2
2
  "commands": {
3
- "cuneiform:about": {
3
+ "cuneiform:profile": {
4
4
  "aliases": [],
5
5
  "args": {},
6
- "description": "More information about a command. Don't repeat the summary.",
6
+ "description": "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.\n\nThe 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.\n\nTWO MODES:\n\n**Single mode** — Profile one definition:\n\n- `--keys PD-0001` — profile by definition key\n- `--id a0Bxx000000001AAAA` — profile by Salesforce record ID\n\nSingle mode displays definition key, object name, status, request ID, duration, and error details.\n\n**Bulk mode** — Profile multiple definitions with parallel execution:\n\n- `--method metadata` — profile all definitions of a method type (metadata, historical, or comparative)\n- Add filters: --status, --namespace, --category, --time-category, --segment-category, --limit\n- Control concurrency: --parallel (1-10 threads, default: 5)\n\nBulk mode displays a configuration summary, a results table, a profiling summary (Successful/Failed/Skipped/Total), and resolution guidance for failures.\n\nObjects 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.\n\nPREREQUISITE: Definitions must exist before profiling. Create them with `sf cuneiform definition create`.\n\nWHEN TO USE:\n\n- After creating definitions — turn scoping work into analytical evidence\n- To refresh profiling results — re-run profiling on existing definitions for updated data\n- For bulk assessment — sweep all metadata definitions in a single parallel command\n- To re-profile after errors — fix the underlying issue, then re-run the failed definitions\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"profile the Account definition\" → --keys PD-0001\n\"profile all metadata definitions\" → --method metadata\n\"profile everything that hasn't been profiled\" → --method metadata --status \"NOT PROFILED\"\n\"profile only FSC objects\" → --method metadata --namespace FinServ\n\"profile with less concurrency\" → --method metadata --parallel 1\n\nCOMMAND SEQUENCE:\n`definition create` or `definition update` → **`profile`** → `profile request list` → `definition get` (view results)",
7
7
  "examples": [
8
- "<%= config.bin %> <%= command.id %>"
8
+ "Profile a single definition by key:\n<%= config.bin %> <%= command.id %> --target-org myOrg --keys PD-0001",
9
+ "Profile a single definition by Salesforce record ID:\n<%= config.bin %> <%= command.id %> --target-org myOrg --id a0Bxx000000001AAAA",
10
+ "Sweep all metadata definitions with parallel execution:\n<%= config.bin %> <%= command.id %> --target-org myOrg --method metadata",
11
+ "Profile only definitions that have never been profiled:\n<%= config.bin %> <%= command.id %> --target-org myOrg --method historical --status \"NOT PROFILED\"",
12
+ "Profile only Financial Services Cloud objects:\n<%= config.bin %> <%= command.id %> --target-org myOrg --method metadata --namespace FinServ",
13
+ "Maximize throughput with full parallelism:\n<%= config.bin %> <%= command.id %> --target-org myOrg --method comparative --parallel 10",
14
+ "Profile a small batch for testing:\n<%= config.bin %> <%= command.id %> --target-org myOrg --method metadata --limit 5",
15
+ "Minimize API impact with single-threaded execution:\n<%= config.bin %> <%= command.id %> --target-org myOrg --method metadata --parallel 1"
9
16
  ],
10
17
  "flags": {
11
18
  "json": {
@@ -23,46 +30,193 @@
23
30
  "multiple": false,
24
31
  "type": "option"
25
32
  },
26
- "name": {
33
+ "target-org": {
34
+ "char": "o",
35
+ "name": "target-org",
36
+ "noCacheDefault": true,
37
+ "required": true,
38
+ "summary": "Authenticate and execute profiling against this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.",
39
+ "hasDynamicHelp": true,
40
+ "multiple": false,
41
+ "type": "option"
42
+ },
43
+ "api-version": {
44
+ "description": "Override the api version used for api requests made by this command",
45
+ "name": "api-version",
46
+ "hasDynamicHelp": false,
47
+ "multiple": false,
48
+ "type": "option"
49
+ },
50
+ "keys": {
51
+ "aliases": [
52
+ "key"
53
+ ],
54
+ "char": "k",
55
+ "deprecateAliases": true,
56
+ "exclusive": [
57
+ "id",
58
+ "method"
59
+ ],
60
+ "name": "keys",
61
+ "summary": "Profile one or more definitions by key (e.g., --keys PD-0001). Find keys with `definition list`. Mutually exclusive with --id and --method.",
62
+ "hasDynamicHelp": false,
63
+ "multiple": true,
64
+ "type": "option"
65
+ },
66
+ "id": {
67
+ "exclusive": [
68
+ "keys",
69
+ "method"
70
+ ],
71
+ "name": "id",
72
+ "summary": "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.",
73
+ "hasDynamicHelp": false,
74
+ "multiple": false,
75
+ "type": "option"
76
+ },
77
+ "method": {
78
+ "aliases": [
79
+ "type"
80
+ ],
81
+ "char": "t",
82
+ "deprecateAliases": true,
83
+ "exclusive": [
84
+ "keys",
85
+ "id"
86
+ ],
87
+ "name": "method",
88
+ "summary": "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.",
89
+ "hasDynamicHelp": false,
90
+ "multiple": false,
91
+ "options": [
92
+ "metadata",
93
+ "historical",
94
+ "comparative"
95
+ ],
96
+ "type": "option"
97
+ },
98
+ "status": {
99
+ "char": "s",
100
+ "name": "status",
101
+ "summary": "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.",
102
+ "hasDynamicHelp": false,
103
+ "multiple": false,
104
+ "options": [
105
+ "NOT PROFILED",
106
+ "IN PROGRESS",
107
+ "SUCCESS",
108
+ "COMPLETE w/ FAILURES",
109
+ "ERROR"
110
+ ],
111
+ "type": "option"
112
+ },
113
+ "namespace": {
27
114
  "char": "n",
28
- "description": "More information about a flag. Don't repeat the summary.",
29
- "name": "name",
30
- "required": false,
31
- "summary": "Description of a flag.",
115
+ "name": "namespace",
116
+ "summary": "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.",
117
+ "hasDynamicHelp": false,
118
+ "multiple": false,
119
+ "type": "option"
120
+ },
121
+ "category": {
122
+ "char": "c",
123
+ "name": "category",
124
+ "summary": "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.",
125
+ "hasDynamicHelp": false,
126
+ "multiple": false,
127
+ "type": "option"
128
+ },
129
+ "time-category": {
130
+ "name": "time-category",
131
+ "summary": "Filter definitions by time category (e.g., \"Lifetime\", \"2026 vs 2025\", \"This Year\"). Combine with --category and --segment-category to target time-scoped definitions.",
132
+ "hasDynamicHelp": false,
133
+ "multiple": false,
134
+ "type": "option"
135
+ },
136
+ "segment-category": {
137
+ "name": "segment-category",
138
+ "summary": "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.",
139
+ "hasDynamicHelp": false,
140
+ "multiple": false,
141
+ "type": "option"
142
+ },
143
+ "limit": {
144
+ "char": "l",
145
+ "name": "limit",
146
+ "summary": "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.",
147
+ "default": 50,
148
+ "hasDynamicHelp": false,
149
+ "multiple": false,
150
+ "type": "option"
151
+ },
152
+ "skip-empty": {
153
+ "name": "skip-empty",
154
+ "summary": "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.",
155
+ "allowNo": true,
156
+ "type": "boolean"
157
+ },
158
+ "parallel": {
159
+ "name": "parallel",
160
+ "summary": "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.",
161
+ "default": 5,
162
+ "hasDynamicHelp": false,
163
+ "multiple": false,
164
+ "type": "option"
165
+ },
166
+ "format": {
167
+ "name": "format",
168
+ "summary": "Control the output format: table (default, human-readable with progress and summary boxes) or json (machine-readable for scripting and automation).",
169
+ "default": "table",
32
170
  "hasDynamicHelp": false,
33
171
  "multiple": false,
172
+ "options": [
173
+ "table",
174
+ "json"
175
+ ],
34
176
  "type": "option"
35
177
  }
36
178
  },
37
- "hasDynamicHelp": false,
179
+ "hasDynamicHelp": true,
38
180
  "hiddenAliases": [],
39
- "id": "cuneiform:about",
181
+ "id": "cuneiform:profile",
40
182
  "pluginAlias": "@peernova/cuneiform-sf",
41
183
  "pluginName": "@peernova/cuneiform-sf",
42
184
  "pluginType": "core",
43
185
  "strict": true,
44
- "summary": "Summary of a command.",
186
+ "summary": "Execute profiling definitions against a Salesforce org to generate field-level, value-level, and KPI-level evidence about data population and usage patterns.",
45
187
  "enableJsonFlag": true,
188
+ "skipAccessGate": false,
189
+ "ERROR_CODE_MAP": {
190
+ "PROFILE_NO_SELECTION": "errors.noSelection",
191
+ "PROFILE_INVALID_SELECTION": "errors.invalidSelection",
192
+ "PROFILE_INVALID_ID": "errors.invalidId",
193
+ "PROFILE_DEFINITION_NOT_FOUND": "errors.definitionNotFound",
194
+ "PROFILE_INVALID_PARALLEL": "errors.invalidParallel",
195
+ "PROFILE_QUERY_FAILED": "errors.queryFailed",
196
+ "PROFILE_NO_DEFINITIONS_FOUND": "errors.noDefinitionsFound",
197
+ "PROFILE_EXECUTION_FAILED": "errors.executionFailed"
198
+ },
46
199
  "isESM": true,
47
200
  "relativePath": [
48
201
  "lib",
49
202
  "commands",
50
203
  "cuneiform",
51
- "about.js"
204
+ "profile.js"
52
205
  ],
53
206
  "aliasPermutations": [],
54
207
  "permutations": [
55
- "cuneiform:about",
56
- "about:cuneiform"
208
+ "cuneiform:profile",
209
+ "profile:cuneiform"
57
210
  ]
58
211
  },
59
- "hello:world": {
212
+ "cuneiform:compatibility:check": {
60
213
  "aliases": [],
61
214
  "args": {},
62
- "description": "Say hello either to the world or someone you know.",
215
+ "description": "Reports the Cuneiform For Salesforce managed-package version this CLI release was tested against. Without `--target-org`, the command is a local-only readout — no Salesforce API calls, no authentication required.\n\nWhen `--target-org` is supplied, the command queries the org for the installed Cuneiform For Salesforce package via the Tooling API and reports one of five states:\n\n- `installed-match` — installed version satisfies the requirement (exit 0)\n- `installed-newer` — installed version is newer than required (exit 0, advisory)\n- `installed-version-unknown` — Cuneiform is detected via namespace but the version is not exposed (typical for source-pushed scratch orgs — CLI-1569). Compatibility cannot be verified, but the package is present (exit 0, advisory)\n- `installed-older` — installed version is older than required (exit 1)\n- `not-installed` — Cuneiform For Salesforce is not installed in this org (exit 1)\n\nUse this command to:\n\n- Confirm a scratch org or sandbox is ready for CLI operations after a fresh package install\n- Diagnose CLI errors that look like data-shape mismatches but are version-compatibility issues\n- Pin CLI/app version pairs in CI before running profiling jobs",
63
216
  "examples": [
64
- "Say hello to the world:\n<%= config.bin %> <%= command.id %>",
65
- "Say hello to someone you know:\n<%= config.bin %> <%= command.id %> --name Astro"
217
+ "Print the required app version (no auth, no API calls):\n<%= config.bin %> <%= command.id %>",
218
+ "Verify the installed version in a target org:\n<%= config.bin %> <%= command.id %> --target-org myOrg",
219
+ "Machine-readable output for CI:\n<%= config.bin %> <%= command.id %> --target-org myOrg --json"
66
220
  ],
67
221
  "flags": {
68
222
  "json": {
@@ -80,39 +234,2667 @@
80
234
  "multiple": false,
81
235
  "type": "option"
82
236
  },
83
- "name": {
237
+ "target-org": {
238
+ "char": "o",
239
+ "name": "target-org",
240
+ "noCacheDefault": true,
241
+ "summary": "Target org username or alias. When supplied, the command queries the org's installed Cuneiform For Salesforce version and reports compatibility.",
242
+ "hasDynamicHelp": true,
243
+ "multiple": false,
244
+ "type": "option"
245
+ },
246
+ "api-version": {
247
+ "char": "a",
248
+ "description": "Override the api version used for api requests made by this command",
249
+ "name": "api-version",
250
+ "summary": "API version to use when querying the target org. Defaults to the org's maximum supported version.",
251
+ "hasDynamicHelp": false,
252
+ "multiple": false,
253
+ "type": "option"
254
+ }
255
+ },
256
+ "hasDynamicHelp": true,
257
+ "hiddenAliases": [],
258
+ "id": "cuneiform:compatibility:check",
259
+ "pluginAlias": "@peernova/cuneiform-sf",
260
+ "pluginName": "@peernova/cuneiform-sf",
261
+ "pluginType": "core",
262
+ "strict": true,
263
+ "summary": "Verify the Cuneiform For Salesforce app version required by this CLI build, and (optionally) the version installed in a target org.",
264
+ "enableJsonFlag": true,
265
+ "isESM": true,
266
+ "relativePath": [
267
+ "lib",
268
+ "commands",
269
+ "cuneiform",
270
+ "compatibility",
271
+ "check.js"
272
+ ],
273
+ "aliasPermutations": [],
274
+ "permutations": [
275
+ "cuneiform:compatibility:check",
276
+ "compatibility:cuneiform:check",
277
+ "compatibility:check:cuneiform",
278
+ "cuneiform:check:compatibility",
279
+ "check:cuneiform:compatibility",
280
+ "check:compatibility:cuneiform"
281
+ ]
282
+ },
283
+ "cuneiform:definition:create": {
284
+ "aliases": [],
285
+ "args": {},
286
+ "description": "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.\n\nThe 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.\n\nPREREQUISITES: Run `sf cuneiform user details --configure` to verify permissions. Objects must exist in the target org.\n\nCHOOSING A PROFILING METHOD (--method):\n\n- metadata — Catalogs field structure and configuration. No record scanning. Fast. No time dimension.\n- historical — Full record-level data profiling with year-based time windows. Captures how field population changes over time.\n- comparative — Year-over-year comparison: compares current-period records (SetA) against prior-period records (SetB). Requires --year or --date-literal.\n- recordtype — Per-record-type analysis across 6 time windows. Segments data by business process stage (e.g., New Business vs Renewal).\n- 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.\n- full — All five methods combined. Comprehensive first-time profiling of a new org. Default.\n\nSCOPING OBJECTS:\n\n- --objects Account,Contact — Profile specific named objects (comma-separated or repeated)\n- --filter custom — All custom objects; --filter standard — All standard objects\n- --with-records — Only objects that have at least one record (recommended for historical/comparative)\n- --min-records 100 — Only objects with 100+ records\n- --namespace SBQQ — Only objects from a specific managed package (e.g., SBQQ for CPQ, FinServ for FSC)\n- --pattern Account\\* — Objects matching a wildcard pattern\n\nROLLING TIME WINDOWS (use with --method comparative, historical, recordtype, or full):\n\n- --date-literal THIS_YEAR — Profile the current year's records\n- --date-literal THIS_QUARTER — Profile the current quarter\n- --date-literal THIS_MONTH — Profile the current month\n- --depth 3 — With a date literal, creates 3 cascading periods: this period, last period, and two periods ago\n- --depth 2 --date-literal THIS_QUARTER — Creates definitions for this quarter AND last quarter\n- --year 2026 — Use a specific year instead of a date literal; --depth controls how many prior years to include\n- --date-field LastModifiedDate — Use LastModifiedDate instead of CreatedDate for time filtering\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\n- \"compare X from 2025 vs 2026\" → --method comparative --year 2026\n- \"rolling quarterly analysis\" → --method comparative --date-literal THIS_QUARTER --depth N\n- \"year-over-year trends\" → --method comparative\n- \"by business stage / record type\" → --method recordtype\n- \"won vs lost / closed vs open\" → --method outcome\n- \"field-level stats only\" → --method metadata\n- \"objects with data\" → --with-records\n- \"FSC objects\" → --namespace FinServ\n- \"CPQ objects\" → --namespace SBQQ\n- \"last N months\" → --date-literal LAST_MONTH --depth N\n- \"this fiscal year\" → --date-literal THIS_FISCAL_YEAR\n\nCOMMAND SEQUENCE: `user details --configure` (verify permissions) → `object describe` (understand structure) → `definition create` (build definitions) → `profile` (execute profiling)\n\nSAFETY: Objects that already have definitions are skipped automatically (no duplicates). A confirmation prompt appears before creation. Use --dry-run to preview without creating.",
287
+ "examples": [
288
+ "Create definitions for a single object using all profiling methods:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Account",
289
+ "Preview what would be created before committing (recommended before batch runs):\n<%= config.bin %> <%= command.id %> --target-org myOrg --filter custom --with-records --dry-run",
290
+ "Profile all custom objects with at least 100 records, tagged by engagement phase:\n<%= config.bin %> <%= command.id %> --target-org myOrg --filter custom --with-records --min-records 100 --category \"Phase 1\"",
291
+ "Isolate Financial Services Cloud objects by namespace:\n<%= config.bin %> <%= command.id %> --target-org myOrg --namespace FinServ --method metadata",
292
+ "Rolling quarterly trend analysis across the last 4 quarters:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Opportunity --method comparative --date-literal THIS_QUARTER --depth 4",
293
+ "Lifetime vs last 2 years — show what fraction of all records were created in the recent window:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Account,Contact,Opportunity --method comparative --lifetime-primary --date-literal LAST_N_YEARS:2",
294
+ "Lifetime vs a specific year — compare all records ever against records created in 2024:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Opportunity --method comparative --lifetime-primary --year 2024",
295
+ "Won vs Lost opportunity analysis to surface data quality gaps between business outcomes:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Opportunity --objects Case --objects Lead --method outcome",
296
+ "Bulk run with shared, human-readable category labels across every created definition:\n<%= config.bin %> <%= command.id %> --target-org myOrg --filter custom --with-records --time-category \"Q1 2026\" --segment-category \"Pilot Run\""
297
+ ],
298
+ "flags": {
299
+ "json": {
300
+ "description": "Format output as json.",
301
+ "helpGroup": "GLOBAL",
302
+ "name": "json",
303
+ "allowNo": false,
304
+ "type": "boolean"
305
+ },
306
+ "flags-dir": {
307
+ "helpGroup": "GLOBAL",
308
+ "name": "flags-dir",
309
+ "summary": "Import flag values from a directory.",
310
+ "hasDynamicHelp": false,
311
+ "multiple": false,
312
+ "type": "option"
313
+ },
314
+ "target-org": {
315
+ "char": "o",
316
+ "name": "target-org",
317
+ "noCacheDefault": true,
318
+ "required": true,
319
+ "summary": "Salesforce org where definitions will be created. The command validates Cuneiform installation and permission sets before any API calls.",
320
+ "hasDynamicHelp": true,
321
+ "multiple": false,
322
+ "type": "option"
323
+ },
324
+ "api-version": {
325
+ "description": "Override the api version used for api requests made by this command",
326
+ "name": "api-version",
327
+ "hasDynamicHelp": false,
328
+ "multiple": false,
329
+ "type": "option"
330
+ },
331
+ "objects": {
332
+ "char": "b",
333
+ "name": "objects",
334
+ "summary": "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.",
335
+ "hasDynamicHelp": false,
336
+ "multiple": true,
337
+ "type": "option"
338
+ },
339
+ "filter": {
340
+ "char": "f",
341
+ "name": "filter",
342
+ "summary": "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.",
343
+ "default": "all",
344
+ "hasDynamicHelp": false,
345
+ "multiple": false,
346
+ "options": [
347
+ "all",
348
+ "standard",
349
+ "custom"
350
+ ],
351
+ "type": "option"
352
+ },
353
+ "pattern": {
354
+ "char": "p",
355
+ "name": "pattern",
356
+ "summary": "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.",
357
+ "hasDynamicHelp": false,
358
+ "multiple": false,
359
+ "type": "option"
360
+ },
361
+ "namespace": {
84
362
  "char": "n",
85
- "description": "This person can be anyone in the world!",
86
- "name": "name",
87
- "summary": "The name of the person you'd like to say hello to.",
88
- "default": "World",
363
+ "name": "namespace",
364
+ "summary": "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.",
365
+ "hasDynamicHelp": false,
366
+ "multiple": false,
367
+ "type": "option"
368
+ },
369
+ "classification": {
370
+ "name": "classification",
371
+ "summary": "Filter by object classification: customer (business-facing objects), internal (system objects), or all. Defaults to all.",
372
+ "default": "customer",
373
+ "hasDynamicHelp": false,
374
+ "multiple": false,
375
+ "options": [
376
+ "customer",
377
+ "internal",
378
+ "all"
379
+ ],
380
+ "type": "option"
381
+ },
382
+ "with-records": {
383
+ "name": "with-records",
384
+ "summary": "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.",
385
+ "allowNo": false,
386
+ "type": "boolean"
387
+ },
388
+ "without-records": {
389
+ "name": "without-records",
390
+ "summary": "Include only objects that have zero records. Targets empty objects for data completeness analysis or unused schema identification. Cannot be combined with --with-records.",
391
+ "allowNo": false,
392
+ "type": "boolean"
393
+ },
394
+ "with-record-types": {
395
+ "name": "with-record-types",
396
+ "summary": "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.",
397
+ "allowNo": false,
398
+ "type": "boolean"
399
+ },
400
+ "category": {
401
+ "char": "c",
402
+ "name": "category",
403
+ "summary": "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.",
404
+ "hasDynamicHelp": false,
405
+ "multiple": false,
406
+ "type": "option"
407
+ },
408
+ "min-records": {
409
+ "name": "min-records",
410
+ "summary": "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).",
411
+ "default": 0,
412
+ "hasDynamicHelp": false,
413
+ "multiple": false,
414
+ "type": "option"
415
+ },
416
+ "limit": {
417
+ "char": "l",
418
+ "name": "limit",
419
+ "summary": "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.",
420
+ "default": 100,
421
+ "hasDynamicHelp": false,
422
+ "multiple": false,
423
+ "type": "option"
424
+ },
425
+ "method": {
426
+ "char": "t",
427
+ "name": "method",
428
+ "summary": "Profiling methodology that determines the analytical questions each definition can answer:\nmetadata — Catalogs field structure and configuration. Fast, no record scanning, no time dimension.\nhistorical — Full record-level analysis with year-based time windows. Captures field population changes over time.\ncomparative — Compares current-period records (SetA) vs prior-period records (SetB). Requires --year or --date-literal.\nrecordtype — Per-record-type analysis across 6 time windows. Segments by business process stage (e.g., New Business vs Renewal for Opportunity).\noutcome — Boolean outcome comparison: Won vs Lost (Opportunity), Closed vs Open (Case), Converted vs Unconverted (Lead). Surfaces data quality gaps between business outcomes.\nfull — All five methods combined. Comprehensive first-time profiling of a new org or client engagement. Default.\nDefaults to full.",
429
+ "default": "full",
430
+ "hasDynamicHelp": false,
431
+ "multiple": false,
432
+ "options": [
433
+ "metadata",
434
+ "historical",
435
+ "comparative",
436
+ "recordtype",
437
+ "outcome",
438
+ "full"
439
+ ],
440
+ "type": "option"
441
+ },
442
+ "recordtype": {
443
+ "name": "recordtype",
444
+ "summary": "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.",
445
+ "hasDynamicHelp": false,
446
+ "multiple": false,
447
+ "type": "option"
448
+ },
449
+ "record-type-status": {
450
+ "name": "record-type-status",
451
+ "summary": "Filter record types by activity status: active (default), all (active and inactive), or inactive (only inactive). Used with --method recordtype or --method full.",
452
+ "default": "active",
453
+ "hasDynamicHelp": false,
454
+ "multiple": false,
455
+ "options": [
456
+ "active",
457
+ "all",
458
+ "inactive"
459
+ ],
460
+ "type": "option"
461
+ },
462
+ "year": {
463
+ "name": "year",
464
+ "summary": "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.",
465
+ "hasDynamicHelp": false,
466
+ "multiple": false,
467
+ "type": "option"
468
+ },
469
+ "depth": {
470
+ "name": "depth",
471
+ "summary": "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.",
472
+ "hasDynamicHelp": false,
473
+ "multiple": false,
474
+ "type": "option"
475
+ },
476
+ "from": {
477
+ "name": "from",
478
+ "summary": "Start year of an explicit range (inclusive). Use with --to for a custom year range (e.g., --from 2020 --to 2026). Produces one profiling definition per year in the inclusive range — `objects × (to − from + 1)` total. Cannot be combined with --depth.",
479
+ "hasDynamicHelp": false,
480
+ "multiple": false,
481
+ "type": "option"
482
+ },
483
+ "to": {
484
+ "name": "to",
485
+ "summary": "End year of an explicit range (inclusive). Use with --from for a custom year range (e.g., --from 2020 --to 2026). Produces one profiling definition per year in the inclusive range — `objects × (to − from + 1)` total. Defaults to the current year when --from is specified.",
486
+ "hasDynamicHelp": false,
487
+ "multiple": false,
488
+ "type": "option"
489
+ },
490
+ "no-value-frequency": {
491
+ "name": "no-value-frequency",
492
+ "summary": "Skip common value frequency analysis during profiling. Reduces profiling time for objects where frequency distribution data is not needed.",
493
+ "allowNo": false,
494
+ "type": "boolean"
495
+ },
496
+ "use-prior": {
497
+ "name": "use-prior",
498
+ "summary": "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.",
499
+ "allowNo": false,
500
+ "type": "boolean"
501
+ },
502
+ "lifetime-primary": {
503
+ "name": "lifetime-primary",
504
+ "summary": "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.",
505
+ "allowNo": false,
506
+ "type": "boolean"
507
+ },
508
+ "date-literal": {
509
+ "name": "date-literal",
510
+ "summary": "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.\n\nSupported values:\nTODAY, YESTERDAY — Single-day windows\nTHIS_WEEK, LAST_WEEK — Weekly windows\nTHIS_MONTH, LAST_MONTH — Monthly windows (use with --depth for \"last N months\")\nTHIS_QUARTER, LAST_QUARTER — Quarterly windows (use with --depth for \"rolling quarters\")\nTHIS_FISCAL_QUARTER, LAST_FISCAL_QUARTER — Fiscal quarter windows\nTHIS_YEAR, LAST_YEAR — Annual windows\nTHIS_FISCAL_YEAR, LAST_FISCAL_YEAR — Fiscal year windows\nN_YEARS_AGO:2, N_YEARS_AGO:3 — Specific years in the past\nLAST_N_YEARS:2, LAST_N_YEARS:3 — Last N complete years",
511
+ "hasDynamicHelp": false,
512
+ "multiple": false,
513
+ "type": "option"
514
+ },
515
+ "date-field": {
516
+ "name": "date-field",
517
+ "summary": "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).",
518
+ "default": "CreatedDate",
519
+ "hasDynamicHelp": false,
520
+ "multiple": false,
521
+ "type": "option"
522
+ },
523
+ "profiled": {
524
+ "name": "profiled",
525
+ "summary": "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.",
526
+ "allowNo": false,
527
+ "type": "boolean"
528
+ },
529
+ "dry-run": {
530
+ "char": "d",
531
+ "name": "dry-run",
532
+ "summary": "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.",
533
+ "allowNo": false,
534
+ "type": "boolean"
535
+ },
536
+ "no-prompt": {
537
+ "name": "no-prompt",
538
+ "summary": "Skip the confirmation prompt and create definitions immediately. Use for scripted execution and CI automation workflows.",
539
+ "allowNo": false,
540
+ "type": "boolean"
541
+ },
542
+ "profile": {
543
+ "name": "profile",
544
+ "summary": "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.",
545
+ "allowNo": false,
546
+ "type": "boolean"
547
+ },
548
+ "open": {
549
+ "name": "open",
550
+ "summary": "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.",
551
+ "allowNo": false,
552
+ "type": "boolean"
553
+ },
554
+ "logs": {
555
+ "name": "logs",
556
+ "summary": "Write session logs to the .cuneiform/logs/ directory for audit and troubleshooting.",
557
+ "allowNo": false,
558
+ "type": "boolean"
559
+ },
560
+ "name-prefix": {
561
+ "name": "name-prefix",
562
+ "summary": "Prefix prepended to each definition name (e.g., --name-prefix TC-01). Joined with the bullet separator character.",
563
+ "hasDynamicHelp": false,
564
+ "multiple": false,
565
+ "type": "option"
566
+ },
567
+ "name-suffix": {
568
+ "name": "name-suffix",
569
+ "summary": "Suffix appended to each definition name (e.g., --name-suffix \"Run A\"). Joined with the bullet separator character.",
570
+ "hasDynamicHelp": false,
571
+ "multiple": false,
572
+ "type": "option"
573
+ },
574
+ "time-category": {
575
+ "name": "time-category",
576
+ "summary": "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.",
577
+ "hasDynamicHelp": false,
578
+ "multiple": false,
579
+ "type": "option"
580
+ },
581
+ "segment-category": {
582
+ "name": "segment-category",
583
+ "summary": "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.",
584
+ "hasDynamicHelp": false,
585
+ "multiple": false,
586
+ "type": "option"
587
+ },
588
+ "origin": {
589
+ "name": "origin",
590
+ "summary": "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.",
591
+ "default": "Created via the Cuneiform for Salesforce CLI.",
89
592
  "hasDynamicHelp": false,
90
593
  "multiple": false,
91
594
  "type": "option"
92
595
  }
93
596
  },
94
- "hasDynamicHelp": false,
597
+ "hasDynamicHelp": true,
95
598
  "hiddenAliases": [],
96
- "id": "hello:world",
599
+ "id": "cuneiform:definition:create",
97
600
  "pluginAlias": "@peernova/cuneiform-sf",
98
601
  "pluginName": "@peernova/cuneiform-sf",
99
602
  "pluginType": "core",
100
603
  "strict": true,
101
- "summary": "Say hello.",
604
+ "summary": "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.",
102
605
  "enableJsonFlag": true,
606
+ "skipAccessGate": false,
103
607
  "isESM": true,
104
608
  "relativePath": [
105
609
  "lib",
106
610
  "commands",
107
- "hello",
108
- "world.js"
611
+ "cuneiform",
612
+ "definition",
613
+ "create.js"
614
+ ],
615
+ "aliasPermutations": [],
616
+ "permutations": [
617
+ "cuneiform:definition:create",
618
+ "definition:cuneiform:create",
619
+ "definition:create:cuneiform",
620
+ "cuneiform:create:definition",
621
+ "create:cuneiform:definition",
622
+ "create:definition:cuneiform"
623
+ ]
624
+ },
625
+ "cuneiform:definition:export": {
626
+ "aliases": [],
627
+ "args": {},
628
+ "description": "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.\n\nThe export creates a timestamped directory containing three files:\n\n- `export.json` — SFDMU configuration file for round-trip compatibility with `definition import`\n- `pnova__Profiling_Definition__c.csv` — all definition records (fields covering identity, aggregation status, version tracking, profiling configuration, and formula fields)\n- `export-metadata.json` — source org, timestamp, record count, and file manifest\n\nThis command exports OUT of the org. To bring definitions back IN, use `sf cuneiform definition import`.\n\nWHEN TO USE:\n\n- Before a sandbox refresh — preserve definitions so you can restore after the refresh wipes custom data\n- Before a package upgrade — capture the current configuration in case the upgrade affects profiling definitions\n- For cross-org migration — export from sandbox, review the CSV in a spreadsheet, import to production\n- For version control — commit definition exports to Git with `--exclude-ids` for clean diffs between versions\n\nThe `--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.\n\nRead-only. Does not modify definitions in the org. Fails if the output directory already exists, preventing accidental overwrites of previous exports.",
629
+ "examples": [
630
+ "Back up all definitions before a sandbox refresh:\n<%= config.bin %> <%= command.id %> --target-org myOrg",
631
+ "Save to a specific directory within your project structure:\n<%= config.bin %> <%= command.id %> --target-org myOrg --output ./backup/definitions",
632
+ "Export for Git — strip org-specific IDs so diffs reflect only meaningful configuration changes:\n<%= config.bin %> <%= command.id %> --target-org myOrg --exclude-ids --output ./config/definitions",
633
+ "Export for cross-org migration — keep IDs for exact restore fidelity in the target org:\n<%= config.bin %> <%= command.id %> --target-org myOrg --output ./migration/source-org",
634
+ "Output as JSON for scripting, automation pipelines, or downstream tooling:\n<%= config.bin %> <%= command.id %> --target-org myOrg --json"
635
+ ],
636
+ "flags": {
637
+ "json": {
638
+ "description": "Format output as json.",
639
+ "helpGroup": "GLOBAL",
640
+ "name": "json",
641
+ "allowNo": false,
642
+ "type": "boolean"
643
+ },
644
+ "flags-dir": {
645
+ "helpGroup": "GLOBAL",
646
+ "name": "flags-dir",
647
+ "summary": "Import flag values from a directory.",
648
+ "hasDynamicHelp": false,
649
+ "multiple": false,
650
+ "type": "option"
651
+ },
652
+ "target-org": {
653
+ "char": "o",
654
+ "name": "target-org",
655
+ "noCacheDefault": true,
656
+ "required": true,
657
+ "summary": "Export definitions from this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.",
658
+ "hasDynamicHelp": true,
659
+ "multiple": false,
660
+ "type": "option"
661
+ },
662
+ "output": {
663
+ "char": "d",
664
+ "name": "output",
665
+ "summary": "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`).",
666
+ "hasDynamicHelp": false,
667
+ "multiple": false,
668
+ "type": "option"
669
+ },
670
+ "exclude-ids": {
671
+ "name": "exclude-ids",
672
+ "summary": "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.",
673
+ "allowNo": false,
674
+ "type": "boolean"
675
+ },
676
+ "api-version": {
677
+ "description": "Override the api version used for api requests made by this command",
678
+ "name": "api-version",
679
+ "hasDynamicHelp": false,
680
+ "multiple": false,
681
+ "type": "option"
682
+ }
683
+ },
684
+ "hasDynamicHelp": true,
685
+ "hiddenAliases": [],
686
+ "id": "cuneiform:definition:export",
687
+ "pluginAlias": "@peernova/cuneiform-sf",
688
+ "pluginName": "@peernova/cuneiform-sf",
689
+ "pluginType": "core",
690
+ "strict": true,
691
+ "summary": "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.",
692
+ "enableJsonFlag": true,
693
+ "skipAccessGate": false,
694
+ "isESM": true,
695
+ "relativePath": [
696
+ "lib",
697
+ "commands",
698
+ "cuneiform",
699
+ "definition",
700
+ "export.js"
701
+ ],
702
+ "aliasPermutations": [],
703
+ "permutations": [
704
+ "cuneiform:definition:export",
705
+ "definition:cuneiform:export",
706
+ "definition:export:cuneiform",
707
+ "cuneiform:export:definition",
708
+ "export:cuneiform:definition",
709
+ "export:definition:cuneiform"
710
+ ]
711
+ },
712
+ "cuneiform:definition:get": {
713
+ "aliases": [],
714
+ "args": {},
715
+ "description": "Definition keys like PD-0001 appear throughout the Cuneiform workflow — in profiling logs, summary reports, error messages, and colleague questions. When a key surfaces in any context, the next step is resolving what that definition targets, what method it uses, and what state it is in. This command retrieves profiling definitions by key and presents them in a nine-column table: key, name, target object, profiling type, category, time category, segment category, profiling status, and last profiled date.\n\nMultiple keys are fetched in parallel, so looking up 5 definitions is as fast as looking up 1. The output includes an Org Identity header, a definitions table with section header and count, JSON flag guidance with a copy-paste command, and contextual next steps. Keys that do not match any definition produce warnings (not errors), supporting partial success when retrieving batches.\n\n**When to use vs related commands:**\n\n- `definition list` — \"Show me all definitions\" (browse, filter, overview of many)\n- `definition get` — \"Show me PD-0001\" (targeted lookup of specific definitions by key)\n- `definition export` — \"Back up definitions for migration\" (portable CSV export, not inspection)\n\n**File export:** Use `--output-dir` to save each definition as a separate JSON file for audit artifacts, project documentation, or version control.\n\nRead-only. Does not create, modify, or execute definitions. The access gate validates Cuneiform installation and permissions before queries execute.\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\n\"get definition PD-0001\" → --keys PD-0001\n\"get details for Account Standard\" → --keys Account_Standard\n\"show me multiple definitions\" → --keys PD-0001 --keys PD-0002\n\"export definitions to files\" → --keys PD-0001 --output-dir ./definitions\n\"show definition as JSON\" → --keys PD-0001 --json\n\nCOMMAND SEQUENCE: `definition list` (find keys) → `definition get` (inspect by key) → `profile` (execute profiling) or `definition update` (refine configuration)",
716
+ "examples": [
717
+ "Resolve a definition key from a profiling log or error message:\n<%= config.bin %> <%= command.id %> --target-org myOrg --keys PD-0001",
718
+ "Verify multiple definitions before executing profiling (fetched in parallel):\n<%= config.bin %> <%= command.id %> --target-org myOrg --keys PD-0001 --keys PD-0002 --keys PD-0003",
719
+ "Export definitions as JSON files for audit artifacts or project documentation:\n<%= config.bin %> <%= command.id %> --target-org myOrg --keys PD-0001 --keys PD-0002 --output-dir ./definitions",
720
+ "Export with descriptive file names for engagement deliverables:\n<%= config.bin %> <%= command.id %> --target-org myOrg --keys PD-0001 --output-dir ./definitions --file-names account-standard.json",
721
+ "View the complete definition record in JSON format:\n<%= config.bin %> <%= command.id %> --target-org myOrg --keys PD-0001 --json"
722
+ ],
723
+ "flags": {
724
+ "json": {
725
+ "description": "Format output as json.",
726
+ "helpGroup": "GLOBAL",
727
+ "name": "json",
728
+ "allowNo": false,
729
+ "type": "boolean"
730
+ },
731
+ "flags-dir": {
732
+ "helpGroup": "GLOBAL",
733
+ "name": "flags-dir",
734
+ "summary": "Import flag values from a directory.",
735
+ "hasDynamicHelp": false,
736
+ "multiple": false,
737
+ "type": "option"
738
+ },
739
+ "target-org": {
740
+ "char": "o",
741
+ "name": "target-org",
742
+ "noCacheDefault": true,
743
+ "required": true,
744
+ "summary": "Retrieve definitions from this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.",
745
+ "hasDynamicHelp": true,
746
+ "multiple": false,
747
+ "type": "option"
748
+ },
749
+ "api-version": {
750
+ "description": "Override the api version used for api requests made by this command",
751
+ "name": "api-version",
752
+ "hasDynamicHelp": false,
753
+ "multiple": false,
754
+ "type": "option"
755
+ },
756
+ "keys": {
757
+ "char": "k",
758
+ "name": "keys",
759
+ "required": true,
760
+ "summary": "One or more definition keys to retrieve (e.g., `--keys PD-0001`). Repeat the flag for multiple keys: `--keys PD-0001 --keys PD-0002`. Keys are fetched in parallel for efficient batch lookup.",
761
+ "hasDynamicHelp": false,
762
+ "multiple": true,
763
+ "type": "option"
764
+ },
765
+ "output-dir": {
766
+ "name": "output-dir",
767
+ "summary": "Save each definition as a separate JSON file in this directory (e.g., `PD-0001.json`). The directory is created if it does not exist. Use this for audit artifacts, project documentation, or version control snapshots.",
768
+ "hasDynamicHelp": false,
769
+ "multiple": false,
770
+ "type": "option"
771
+ },
772
+ "file-names": {
773
+ "name": "file-names",
774
+ "summary": "Override default key-based file names with custom names (must match `--keys` count). Use when you want descriptive names for exported files (e.g., `--file-names account-standard.json`).",
775
+ "hasDynamicHelp": false,
776
+ "multiple": true,
777
+ "type": "option"
778
+ },
779
+ "format": {
780
+ "name": "format",
781
+ "summary": "Display format: `table` (nine-column summary, default) or `json` (complete definition record with all fields).",
782
+ "default": "table",
783
+ "hasDynamicHelp": false,
784
+ "multiple": false,
785
+ "options": [
786
+ "table",
787
+ "json"
788
+ ],
789
+ "type": "option"
790
+ }
791
+ },
792
+ "hasDynamicHelp": true,
793
+ "hiddenAliases": [],
794
+ "id": "cuneiform:definition:get",
795
+ "pluginAlias": "@peernova/cuneiform-sf",
796
+ "pluginName": "@peernova/cuneiform-sf",
797
+ "pluginType": "core",
798
+ "strict": true,
799
+ "summary": "Resolve profiling definition keys to their full configuration — see what each definition targets, which method it uses, and what state it is in.",
800
+ "enableJsonFlag": true,
801
+ "skipAccessGate": false,
802
+ "isESM": true,
803
+ "relativePath": [
804
+ "lib",
805
+ "commands",
806
+ "cuneiform",
807
+ "definition",
808
+ "get.js"
809
+ ],
810
+ "aliasPermutations": [],
811
+ "permutations": [
812
+ "cuneiform:definition:get",
813
+ "definition:cuneiform:get",
814
+ "definition:get:cuneiform",
815
+ "cuneiform:get:definition",
816
+ "get:cuneiform:definition",
817
+ "get:definition:cuneiform"
818
+ ]
819
+ },
820
+ "cuneiform:definition:import": {
821
+ "aliases": [],
822
+ "args": {},
823
+ "description": "Profiling definitions capture the scoping decisions that tell Cuneiform what to analyze. When those decisions need to move between environments — sandbox to production, old scratch org to new, or restored after a refresh — this command imports them from CSV files produced by `definition export`.\n\nThe command reads a source directory containing `pnova__Profiling_Definition__c.csv`, generates a temporary import configuration, and executes the import. Partial failures are surfaced explicitly — if some definitions fail validation while others import successfully, the output identifies which objects failed and why.\n\nOPERATION MODES:\n\n- **Insert** (default) — Creates new records only. Fails on duplicate Name. Use for clean restores into empty orgs.\n- **Upsert** — Creates new records OR updates existing records matched by the Name external ID. Use when some definitions may already exist in the target org (e.g., incremental deployment to production).\n\nWHEN TO USE:\n\n- After a sandbox refresh — restore definitions from backup in under a minute\n- For production deployment — import validated definitions from sandbox with simulation as the approval artifact\n- For template provisioning — import a standard definition set into each new engagement org\n- To test safely — simulate first with --simulation to validate the entire pipeline before committing\n\nCOMMAND SEQUENCE: `definition export` (save definitions to files) → `definition import --simulation` (validate against target) → `definition import` (execute) → `profile` (run profiling with restored definitions)",
824
+ "examples": [
825
+ "Restore definitions after a sandbox refresh:\n<%= config.bin %> <%= command.id %> --target-org myOrg --source ./backup/definitions",
826
+ "Validate the import before committing (simulation runs the full pipeline without writing):\n<%= config.bin %> <%= command.id %> --target-org myOrg --source ./backup/definitions --simulation",
827
+ "Deploy validated definitions to production with Upsert to handle mixed scenarios:\n<%= config.bin %> <%= command.id %> --target-org prodOrg --source ./release/definitions --operation Upsert",
828
+ "Provision a new engagement org from a standard definition template:\n<%= config.bin %> <%= command.id %> --target-org newClientOrg --source ./templates/standard-definitions",
829
+ "Output as JSON for scripted verification in CI pipelines:\n<%= config.bin %> <%= command.id %> --target-org myOrg --source ./backup/definitions --json"
830
+ ],
831
+ "flags": {
832
+ "json": {
833
+ "description": "Format output as json.",
834
+ "helpGroup": "GLOBAL",
835
+ "name": "json",
836
+ "allowNo": false,
837
+ "type": "boolean"
838
+ },
839
+ "flags-dir": {
840
+ "helpGroup": "GLOBAL",
841
+ "name": "flags-dir",
842
+ "summary": "Import flag values from a directory.",
843
+ "hasDynamicHelp": false,
844
+ "multiple": false,
845
+ "type": "option"
846
+ },
847
+ "target-org": {
848
+ "char": "o",
849
+ "name": "target-org",
850
+ "noCacheDefault": true,
851
+ "required": true,
852
+ "summary": "Salesforce org to import definitions into. The command validates Cuneiform installation before executing the import.",
853
+ "hasDynamicHelp": true,
854
+ "multiple": false,
855
+ "type": "option"
856
+ },
857
+ "source": {
858
+ "char": "s",
859
+ "name": "source",
860
+ "required": true,
861
+ "summary": "Directory containing the CSV files to import. Point this at a previous `definition export` output directory or any directory with a `pnova__Profiling_Definition__c.csv` file (e.g., --source ./backup/definitions).",
862
+ "hasDynamicHelp": false,
863
+ "multiple": false,
864
+ "type": "option"
865
+ },
866
+ "operation": {
867
+ "name": "operation",
868
+ "summary": "How to handle existing definitions: Insert (default) creates new records and fails on duplicate Names; Upsert creates new records and updates existing records matched by Name. Use Insert for clean restores into empty orgs. Use Upsert when some definitions may already exist from earlier iterations.",
869
+ "default": "Insert",
870
+ "hasDynamicHelp": false,
871
+ "multiple": false,
872
+ "options": [
873
+ "Insert",
874
+ "Upsert"
875
+ ],
876
+ "type": "option"
877
+ },
878
+ "simulation": {
879
+ "char": "m",
880
+ "name": "simulation",
881
+ "summary": "Validate the import without modifying data. Runs the full import pipeline — parsing, validation, duplicate checking — but skips all writes. Use before production imports to verify the operation would succeed. The simulation output serves as a change approval artifact.",
882
+ "allowNo": false,
883
+ "type": "boolean"
884
+ }
885
+ },
886
+ "hasDynamicHelp": true,
887
+ "hiddenAliases": [],
888
+ "id": "cuneiform:definition:import",
889
+ "pluginAlias": "@peernova/cuneiform-sf",
890
+ "pluginName": "@peernova/cuneiform-sf",
891
+ "pluginType": "core",
892
+ "strict": true,
893
+ "summary": "Restore or migrate profiling definitions into a Salesforce org from portable CSV files, with simulation to validate the result before any records are written.",
894
+ "enableJsonFlag": true,
895
+ "skipAccessGate": false,
896
+ "isESM": true,
897
+ "relativePath": [
898
+ "lib",
899
+ "commands",
900
+ "cuneiform",
901
+ "definition",
902
+ "import.js"
903
+ ],
904
+ "aliasPermutations": [],
905
+ "permutations": [
906
+ "cuneiform:definition:import",
907
+ "definition:cuneiform:import",
908
+ "definition:import:cuneiform",
909
+ "cuneiform:import:definition",
910
+ "import:cuneiform:definition",
911
+ "import:definition:cuneiform"
912
+ ]
913
+ },
914
+ "cuneiform:definition:list": {
915
+ "aliases": [],
916
+ "args": {},
917
+ "description": "The profiling definition inventory is the foundation of any data profiling workflow. Before you can decide what to profile, you need to see what has already been defined, which objects are in scope, and which definitions are active, complete, or stuck. This command retrieves all profiling definitions from a Salesforce org and presents them as a paginated, filterable table with seven columns: definition key, name, target object, profiling method, category, profiling status, and last profiled date.\n\nAn Org Identity summary box provides org context, and a Summary box shows aggregate counts: total definitions, active, inactive, profiled, and not profiled. Active filters display above the table so you always know which narrowing is in effect. Contextual next steps suggest `definition get`, `definition create`, and `profile` commands with the target org pre-populated.\n\n**When to use vs related commands:**\n\n- `definition list` — \"Show me everything\" / \"What definitions exist?\" / \"Which definitions need profiling?\" (browse and filter across many)\n- `definition get` — \"Show me PD-0001\" / \"Verify this definition before profiling\" (targeted lookup by key)\n\nFILTERING — six dimensions narrow results to precisely targeted subsets:\n\n--objects Account — Only definitions targeting the Account object\n--status active — Only active definitions (vs inactive or all)\n--method metadata — Only metadata-type definitions (vs historical or comparative)\n--category \"Phase 1\" — Only definitions in a specific category\n--namespace FinServ — Only definitions for Financial Services Cloud objects\n--pattern Account% — Definitions whose name matches a SOQL LIKE pattern\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\n\"show all definitions\" → (no filter flags)\n\"definitions for Account\" → --objects Account\n\"which definitions are active\" → --status active\n\"metadata definitions only\" → --method metadata\n\"definitions not yet profiled\" → --sort lastProfiledDate\n\"only FSC definitions\" → --namespace FinServ\n\nCOMMAND SEQUENCE: `definition create` (build definitions) → `definition list` (review inventory) → `definition get` / `profile` / `definition purge` (act on specific definitions)",
918
+ "examples": [
919
+ "Inventory all definitions in the org — see the full picture before deciding what to profile next:\n<%= config.bin %> <%= command.id %> --target-org myOrg",
920
+ "Focus on a specific object — show only definitions targeting Account:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Account",
921
+ "Find active definitions ready for profiling:\n<%= config.bin %> <%= command.id %> --target-org myOrg --status active",
922
+ "Isolate Financial Services Cloud definitions by namespace:\n<%= config.bin %> <%= command.id %> --target-org myOrg --namespace FinServ",
923
+ "Page through a large definition inventory (page 3 of 25-per-page):\n<%= config.bin %> <%= command.id %> --target-org myOrg --limit 25 --offset 50",
924
+ "Export the inventory as JSON for engagement reports or scripting:\n<%= config.bin %> <%= command.id %> --target-org myOrg --json"
925
+ ],
926
+ "flags": {
927
+ "json": {
928
+ "description": "Format output as json.",
929
+ "helpGroup": "GLOBAL",
930
+ "name": "json",
931
+ "allowNo": false,
932
+ "type": "boolean"
933
+ },
934
+ "flags-dir": {
935
+ "helpGroup": "GLOBAL",
936
+ "name": "flags-dir",
937
+ "summary": "Import flag values from a directory.",
938
+ "hasDynamicHelp": false,
939
+ "multiple": false,
940
+ "type": "option"
941
+ },
942
+ "target-org": {
943
+ "char": "o",
944
+ "name": "target-org",
945
+ "noCacheDefault": true,
946
+ "required": true,
947
+ "summary": "Retrieve definitions from this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.",
948
+ "hasDynamicHelp": true,
949
+ "multiple": false,
950
+ "type": "option"
951
+ },
952
+ "api-version": {
953
+ "description": "Override the api version used for api requests made by this command",
954
+ "name": "api-version",
955
+ "hasDynamicHelp": false,
956
+ "multiple": false,
957
+ "type": "option"
958
+ },
959
+ "status": {
960
+ "name": "status",
961
+ "summary": "Filter by activity status: `active` (currently usable for profiling), `inactive` (disabled), or `all` (both). Defaults to `all`, which gives the broadest view for discovery.",
962
+ "default": "all",
963
+ "hasDynamicHelp": false,
964
+ "multiple": false,
965
+ "options": [
966
+ "active",
967
+ "inactive",
968
+ "all"
969
+ ],
970
+ "type": "option"
971
+ },
972
+ "method": {
973
+ "name": "method",
974
+ "summary": "Filter by profiling method: `metadata`, `historical`, or `comparative`. Use this when reviewing definitions of a single analysis type (e.g., `--method historical` to see only historical definitions).",
975
+ "hasDynamicHelp": false,
976
+ "multiple": false,
977
+ "options": [
978
+ "metadata",
979
+ "historical",
980
+ "comparative"
981
+ ],
982
+ "type": "option"
983
+ },
984
+ "objects": {
985
+ "name": "objects",
986
+ "summary": "Narrow the inventory to definitions targeting specific objects (comma-separated). For example, `--objects Account,Contact` shows only definitions for Account and Contact.",
987
+ "hasDynamicHelp": false,
988
+ "multiple": false,
989
+ "type": "option"
990
+ },
991
+ "pattern": {
992
+ "name": "pattern",
993
+ "summary": "Filter definitions by name pattern using SOQL LIKE wildcards. Use `%` for multi-character and `_` for single-character wildcards (e.g., `Account%` matches all definitions whose name starts with \"Account\").",
994
+ "hasDynamicHelp": false,
995
+ "multiple": false,
996
+ "type": "option"
997
+ },
998
+ "category": {
999
+ "name": "category",
1000
+ "summary": "Filter by the category label assigned during definition creation (e.g., \"Phase 1\", \"Sales Cloud\"). Use this to view definitions grouped by engagement phase or functional area.",
1001
+ "hasDynamicHelp": false,
1002
+ "multiple": false,
1003
+ "type": "option"
1004
+ },
1005
+ "namespace": {
1006
+ "name": "namespace",
1007
+ "summary": "Filter by the namespace prefix of the target object (e.g., `FinServ` for Financial Services Cloud, `SBQQ` for CPQ). Use this to isolate definitions belonging to a specific managed package.",
1008
+ "hasDynamicHelp": false,
1009
+ "multiple": false,
1010
+ "type": "option"
1011
+ },
1012
+ "limit": {
1013
+ "name": "limit",
1014
+ "summary": "Maximum definitions per page (default: 25, max: 200). Use with `--offset` to paginate through large inventories.",
1015
+ "default": 25,
1016
+ "hasDynamicHelp": false,
1017
+ "multiple": false,
1018
+ "type": "option"
1019
+ },
1020
+ "offset": {
1021
+ "name": "offset",
1022
+ "summary": "Skip this many definitions before returning results. Use with `--limit` for pagination (e.g., `--limit 25 --offset 25` returns the second page).",
1023
+ "default": 0,
1024
+ "hasDynamicHelp": false,
1025
+ "multiple": false,
1026
+ "type": "option"
1027
+ },
1028
+ "sort": {
1029
+ "name": "sort",
1030
+ "summary": "Sort results by: `key` (definition key), `name` (definition name, the default), `objectName` (target object), or `lastProfiledDate` (most recently profiled first).",
1031
+ "default": "name",
1032
+ "hasDynamicHelp": false,
1033
+ "multiple": false,
1034
+ "options": [
1035
+ "key",
1036
+ "name",
1037
+ "objectName",
1038
+ "lastProfiledDate"
1039
+ ],
1040
+ "type": "option"
1041
+ }
1042
+ },
1043
+ "hasDynamicHelp": true,
1044
+ "hiddenAliases": [],
1045
+ "id": "cuneiform:definition:list",
1046
+ "pluginAlias": "@peernova/cuneiform-sf",
1047
+ "pluginName": "@peernova/cuneiform-sf",
1048
+ "pluginType": "core",
1049
+ "strict": true,
1050
+ "summary": "Inventory profiling definitions across a Salesforce org — see what has been defined, what method each uses, and where profiling stands — so you know where to focus next.",
1051
+ "enableJsonFlag": true,
1052
+ "skipAccessGate": false,
1053
+ "isESM": true,
1054
+ "relativePath": [
1055
+ "lib",
1056
+ "commands",
1057
+ "cuneiform",
1058
+ "definition",
1059
+ "list.js"
1060
+ ],
1061
+ "aliasPermutations": [],
1062
+ "permutations": [
1063
+ "cuneiform:definition:list",
1064
+ "definition:cuneiform:list",
1065
+ "definition:list:cuneiform",
1066
+ "cuneiform:list:definition",
1067
+ "list:cuneiform:definition",
1068
+ "list:definition:cuneiform"
1069
+ ]
1070
+ },
1071
+ "cuneiform:definition:purge": {
1072
+ "aliases": [],
1073
+ "args": {},
1074
+ "description": "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.\n\nThree 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.\n\nIMPORTANT: Definitions with existing summaries must have their summaries purged first. The full cleanup dependency order:\n\n1. `sf cuneiform profile request cancel` — cancel queued requests\n2. `sf cuneiform profile request delete` — remove canceled and rejected requests\n3. `sf cuneiform summary purge` — remove summaries (cascade-deletes completed requests; resets definition status)\n4. `sf cuneiform definition purge` — remove definitions (requires zero summaries)\n\nTHREE SELECTION MODES:\n\n- **By key** (`--keys PD-0001,PD-0003`) — Delete specific definitions. Exclusive mode — all filter flags are ignored.\n- **By filter** (`--objects Account --method metadata`) — Delete definitions matching ALL specified filters (AND logic). Combine --objects, --filter, --pattern, --method, --category, --status, and --namespace.\n- **All** (`--all`) — Delete all eligible definitions. Can be combined with filters to narrow scope.\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"delete the Account definition\" → --keys PD-0001 (look up the key with `definition list`)\n\"remove all unused definitions\" → --all --status \"NOT PROFILED\"\n\"clean up custom object definitions\" → --all --filter custom\n\"delete metadata-only definitions\" → --all --method metadata\n\"remove FSC definitions\" → --all --namespace FinServ\n\"what would be deleted?\" → --all --dry-run\n\nCOMMAND SEQUENCE: `summary purge` (remove summaries from blocked definitions) → `definition purge --dry-run` (preview) → `definition purge` (execute)",
1075
+ "examples": [
1076
+ "Preview what would be deleted and what is blocked by summaries:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --dry-run",
1077
+ "Delete specific definitions by key (exclusive mode ignores all filters):\n<%= config.bin %> <%= command.id %> --target-org myOrg --keys PD-0001,PD-0003",
1078
+ "Remove definitions that were never profiled after exploration:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --status \"NOT PROFILED\"",
1079
+ "Clean up Financial Services Cloud definitions no longer in profiling scope:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --namespace FinServ",
1080
+ "Remove metadata-only definitions after upgrading to comparative analysis:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --method metadata",
1081
+ "Scripted scratch org reset with JSON output for CI verification:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --no-prompt --format json"
1082
+ ],
1083
+ "flags": {
1084
+ "json": {
1085
+ "description": "Format output as json.",
1086
+ "helpGroup": "GLOBAL",
1087
+ "name": "json",
1088
+ "allowNo": false,
1089
+ "type": "boolean"
1090
+ },
1091
+ "flags-dir": {
1092
+ "helpGroup": "GLOBAL",
1093
+ "name": "flags-dir",
1094
+ "summary": "Import flag values from a directory.",
1095
+ "hasDynamicHelp": false,
1096
+ "multiple": false,
1097
+ "type": "option"
1098
+ },
1099
+ "target-org": {
1100
+ "char": "o",
1101
+ "name": "target-org",
1102
+ "noCacheDefault": true,
1103
+ "required": true,
1104
+ "summary": "Salesforce org to purge definitions from. The command validates Cuneiform installation and permissions before any deletions.",
1105
+ "hasDynamicHelp": true,
1106
+ "multiple": false,
1107
+ "type": "option"
1108
+ },
1109
+ "api-version": {
1110
+ "description": "Override the api version used for api requests made by this command",
1111
+ "name": "api-version",
1112
+ "hasDynamicHelp": false,
1113
+ "multiple": false,
1114
+ "type": "option"
1115
+ },
1116
+ "all": {
1117
+ "char": "a",
1118
+ "name": "all",
1119
+ "summary": "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.",
1120
+ "allowNo": false,
1121
+ "type": "boolean"
1122
+ },
1123
+ "keys": {
1124
+ "char": "k",
1125
+ "name": "keys",
1126
+ "summary": "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`.",
1127
+ "hasDynamicHelp": false,
1128
+ "multiple": true,
1129
+ "type": "option"
1130
+ },
1131
+ "objects": {
1132
+ "char": "b",
1133
+ "name": "objects",
1134
+ "summary": "Filter definitions by target object API names (e.g., --objects Account,Contact). Limits deletion to definitions targeting the specified objects.",
1135
+ "hasDynamicHelp": false,
1136
+ "multiple": true,
1137
+ "type": "option"
1138
+ },
1139
+ "filter": {
1140
+ "char": "f",
1141
+ "name": "filter",
1142
+ "summary": "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).",
1143
+ "hasDynamicHelp": false,
1144
+ "multiple": false,
1145
+ "options": [
1146
+ "standard",
1147
+ "custom"
1148
+ ],
1149
+ "type": "option"
1150
+ },
1151
+ "pattern": {
1152
+ "char": "p",
1153
+ "name": "pattern",
1154
+ "summary": "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.",
1155
+ "hasDynamicHelp": false,
1156
+ "multiple": false,
1157
+ "type": "option"
1158
+ },
1159
+ "method": {
1160
+ "char": "t",
1161
+ "name": "method",
1162
+ "summary": "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.",
1163
+ "hasDynamicHelp": false,
1164
+ "multiple": false,
1165
+ "options": [
1166
+ "metadata",
1167
+ "historical",
1168
+ "comparative"
1169
+ ],
1170
+ "type": "option"
1171
+ },
1172
+ "category": {
1173
+ "char": "c",
1174
+ "name": "category",
1175
+ "summary": "Filter definitions by category label (e.g., --category \"Phase 1\"). Removes definitions from a completed engagement phase or functional area.",
1176
+ "hasDynamicHelp": false,
1177
+ "multiple": false,
1178
+ "type": "option"
1179
+ },
1180
+ "status": {
1181
+ "char": "s",
1182
+ "name": "status",
1183
+ "summary": "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.",
1184
+ "hasDynamicHelp": false,
1185
+ "multiple": false,
1186
+ "options": [
1187
+ "NOT PROFILED",
1188
+ "IN PROGRESS",
1189
+ "SUCCESS",
1190
+ "COMPLETE w/ FAILURES",
1191
+ "ERROR"
1192
+ ],
1193
+ "type": "option"
1194
+ },
1195
+ "namespace": {
1196
+ "char": "n",
1197
+ "name": "namespace",
1198
+ "summary": "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.",
1199
+ "hasDynamicHelp": false,
1200
+ "multiple": false,
1201
+ "type": "option"
1202
+ },
1203
+ "limit": {
1204
+ "char": "l",
1205
+ "name": "limit",
1206
+ "summary": "Maximum number of definitions to process per batch (default: 50). Controls batch size for large deletion operations.",
1207
+ "default": 50,
1208
+ "hasDynamicHelp": false,
1209
+ "multiple": false,
1210
+ "type": "option"
1211
+ },
1212
+ "dry-run": {
1213
+ "char": "d",
1214
+ "name": "dry-run",
1215
+ "summary": "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.",
1216
+ "allowNo": false,
1217
+ "type": "boolean"
1218
+ },
1219
+ "no-prompt": {
1220
+ "char": "y",
1221
+ "name": "no-prompt",
1222
+ "summary": "Skip the confirmation prompt and delete immediately. Use for scripted execution in CI pipelines and automation workflows.",
1223
+ "allowNo": false,
1224
+ "type": "boolean"
1225
+ },
1226
+ "format": {
1227
+ "name": "format",
1228
+ "summary": "Output format: table (default, human-readable) or json (structured output for scripted pipelines).",
1229
+ "default": "table",
1230
+ "hasDynamicHelp": false,
1231
+ "multiple": false,
1232
+ "options": [
1233
+ "table",
1234
+ "json"
1235
+ ],
1236
+ "type": "option"
1237
+ }
1238
+ },
1239
+ "hasDynamicHelp": true,
1240
+ "hiddenAliases": [],
1241
+ "id": "cuneiform:definition:purge",
1242
+ "pluginAlias": "@peernova/cuneiform-sf",
1243
+ "pluginName": "@peernova/cuneiform-sf",
1244
+ "pluginType": "core",
1245
+ "strict": true,
1246
+ "summary": "Delete profiling definitions that no longer represent current analysis intent — keeping the definition inventory focused on actively profiled objects.",
1247
+ "enableJsonFlag": true,
1248
+ "skipAccessGate": false,
1249
+ "ERROR_CODE_MAP": {
1250
+ "PURGE_NO_SELECTION_CRITERIA": "errors.noSelectionCriteria",
1251
+ "PURGE_NO_ELIGIBLE_DEFINITIONS": "errors.noEligibleDefinitions",
1252
+ "PURGE_QUERY_FAILED": "errors.queryFailed",
1253
+ "PURGE_DELETE_FAILED": "errors.deleteFailed"
1254
+ },
1255
+ "REASON_LABELS": {
1256
+ "has_summaries": "Has Summaries",
1257
+ "not_found": "Not Found",
1258
+ "lookup_failed": "Lookup Failed"
1259
+ },
1260
+ "QUEUED_REASON": "has related requests in queue",
1261
+ "isESM": true,
1262
+ "relativePath": [
1263
+ "lib",
1264
+ "commands",
1265
+ "cuneiform",
1266
+ "definition",
1267
+ "purge.js"
1268
+ ],
1269
+ "aliasPermutations": [],
1270
+ "permutations": [
1271
+ "cuneiform:definition:purge",
1272
+ "definition:cuneiform:purge",
1273
+ "definition:purge:cuneiform",
1274
+ "cuneiform:purge:definition",
1275
+ "purge:cuneiform:definition",
1276
+ "purge:definition:cuneiform"
1277
+ ]
1278
+ },
1279
+ "cuneiform:definition:update": {
1280
+ "aliases": [],
1281
+ "args": {},
1282
+ "description": "A profiling definition has two distinct surfaces: its metadata attributes (name, category, time category, segment category, description) and its field selection. This command edits the metadata attributes only — the field selection set at creation time is not mutable through this command.\n\nSupply one or more of the five attribute flags to update exactly those columns; untouched attributes are preserved.\n\nWHAT IT DOES:\n\n- Writes only the supplied attributes; untouched columns are preserved on the record\n- Validates the definition ID format (15 or 18 character Salesforce ID)\n- Enforces length constraints: name, category, time category, segment category max 255 chars; description max 8192 chars\n- Returns the list of attribute names that were written\n\nWHEN TO USE:\n\n- To rename a definition after a scope change or project rebranding\n- To reclassify definitions under a new category for cleaner reporting\n- To assign or update time and segment labels after profiling results are reviewed\n- To add or revise the description for team documentation purposes\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"rename this definition\" → --name \"New Definition Name\"\n\"set the category to Revenue\" → --category \"Revenue\"\n\"tag this as Q1 2025\" → --time-category \"Q1 2025\"\n\"classify as Closed Won accounts\" → --segment-category \"Closed Won\"\n\"update the description\" → --description \"Detailed profiling of high-value accounts\"\n\nCOMMAND SEQUENCE: `definition get` (retrieve current metadata and definition ID) → `definition update` (update attributes) → `definition list` (confirm updated values)",
1283
+ "examples": [
1284
+ "Rename a definition:\n<%= config.bin %> <%= command.id %> --target-org myOrg --id a00000000000001AAA --name \"Q1 2025 Revenue Analysis\"",
1285
+ "Update the category and time category together:\n<%= config.bin %> <%= command.id %> --target-org myOrg --id a00000000000001AAA --category \"Revenue\" --time-category \"Q1 2025\"",
1286
+ "Add a segment category to an existing definition:\n<%= config.bin %> <%= command.id %> --target-org myOrg --id a00000000000001AAA --segment-category \"Closed Won\"",
1287
+ "Update all five attributes at once:\n<%= config.bin %> <%= command.id %> --target-org myOrg --id a00000000000001AAA --name \"Full Profile\" --category \"Revenue\" --time-category \"2025\" --segment-category \"All\" --description \"Complete revenue profile\"",
1288
+ "Output update results as JSON for scripted pipelines:\n<%= config.bin %> <%= command.id %> --target-org myOrg --id a00000000000001AAA --name \"Renamed\" --json"
1289
+ ],
1290
+ "flags": {
1291
+ "json": {
1292
+ "description": "Format output as json.",
1293
+ "helpGroup": "GLOBAL",
1294
+ "name": "json",
1295
+ "allowNo": false,
1296
+ "type": "boolean"
1297
+ },
1298
+ "flags-dir": {
1299
+ "helpGroup": "GLOBAL",
1300
+ "name": "flags-dir",
1301
+ "summary": "Import flag values from a directory.",
1302
+ "hasDynamicHelp": false,
1303
+ "multiple": false,
1304
+ "type": "option"
1305
+ },
1306
+ "target-org": {
1307
+ "char": "o",
1308
+ "name": "target-org",
1309
+ "noCacheDefault": true,
1310
+ "required": true,
1311
+ "summary": "Salesforce org containing the definition to update. The command validates permissions before writing.",
1312
+ "hasDynamicHelp": true,
1313
+ "multiple": false,
1314
+ "type": "option"
1315
+ },
1316
+ "api-version": {
1317
+ "description": "Override the api version used for api requests made by this command",
1318
+ "name": "api-version",
1319
+ "hasDynamicHelp": false,
1320
+ "multiple": false,
1321
+ "type": "option"
1322
+ },
1323
+ "id": {
1324
+ "aliases": [
1325
+ "definition-id"
1326
+ ],
1327
+ "deprecateAliases": true,
1328
+ "name": "id",
1329
+ "required": true,
1330
+ "summary": "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`.",
1331
+ "hasDynamicHelp": false,
1332
+ "multiple": false,
1333
+ "type": "option"
1334
+ },
1335
+ "name": {
1336
+ "name": "name",
1337
+ "required": false,
1338
+ "summary": "New definition name (max 255 characters). Replaces the current Prop_Name\\_\\_c value.",
1339
+ "hasDynamicHelp": false,
1340
+ "multiple": false,
1341
+ "type": "option"
1342
+ },
1343
+ "category": {
1344
+ "name": "category",
1345
+ "required": false,
1346
+ "summary": "New category label (max 255 characters). Replaces the current Prop_Category\\_\\_c value. Use to group definitions for reporting.",
1347
+ "hasDynamicHelp": false,
1348
+ "multiple": false,
1349
+ "type": "option"
1350
+ },
1351
+ "time-category": {
1352
+ "name": "time-category",
1353
+ "required": false,
1354
+ "summary": "New time category label (max 255 characters). Replaces the current Prop_TimeCategory\\_\\_c value. Examples: \"Q1 2025\", \"Lifetime\", \"2024\".",
1355
+ "hasDynamicHelp": false,
1356
+ "multiple": false,
1357
+ "type": "option"
1358
+ },
1359
+ "segment-category": {
1360
+ "name": "segment-category",
1361
+ "required": false,
1362
+ "summary": "New segment category label (max 255 characters). Replaces the current Prop_SegmentCategory\\_\\_c value. Examples: \"Closed Won\", \"PersonAccounts\", \"Open Cases\".",
1363
+ "hasDynamicHelp": false,
1364
+ "multiple": false,
1365
+ "type": "option"
1366
+ },
1367
+ "description": {
1368
+ "name": "description",
1369
+ "required": false,
1370
+ "summary": "New description (max 8192 characters). Replaces the current Prop_Description\\_\\_c value. Supports HTML content.",
1371
+ "hasDynamicHelp": false,
1372
+ "multiple": false,
1373
+ "type": "option"
1374
+ },
1375
+ "format": {
1376
+ "name": "format",
1377
+ "summary": "Output format: table (human-readable, default) or json (structured output for scripting).",
1378
+ "default": "table",
1379
+ "hasDynamicHelp": false,
1380
+ "multiple": false,
1381
+ "options": [
1382
+ "table",
1383
+ "json"
1384
+ ],
1385
+ "type": "option"
1386
+ }
1387
+ },
1388
+ "hasDynamicHelp": true,
1389
+ "hiddenAliases": [],
1390
+ "id": "cuneiform:definition:update",
1391
+ "pluginAlias": "@peernova/cuneiform-sf",
1392
+ "pluginName": "@peernova/cuneiform-sf",
1393
+ "pluginType": "core",
1394
+ "strict": true,
1395
+ "summary": "Update metadata attributes (name, category, time category, segment category, description) on an existing profiling definition.",
1396
+ "enableJsonFlag": true,
1397
+ "skipAccessGate": false,
1398
+ "isESM": true,
1399
+ "relativePath": [
1400
+ "lib",
1401
+ "commands",
1402
+ "cuneiform",
1403
+ "definition",
1404
+ "update.js"
1405
+ ],
1406
+ "aliasPermutations": [],
1407
+ "permutations": [
1408
+ "cuneiform:definition:update",
1409
+ "definition:cuneiform:update",
1410
+ "definition:update:cuneiform",
1411
+ "cuneiform:update:definition",
1412
+ "update:cuneiform:definition",
1413
+ "update:definition:cuneiform"
1414
+ ]
1415
+ },
1416
+ "cuneiform:mcp:serve": {
1417
+ "aliases": [],
1418
+ "args": {},
1419
+ "description": "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.\n\nThe 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.\n\nDavid 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.\n\nTRANSPORT: 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.\n\nThis 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`.\n\n**When to run this command:**\n\n- AI-guided org discovery — let Claude explore a new client org through natural language\n- Hands-free definition creation — describe what you want and let the AI translate to tool calls\n- Training demonstrations — show Cuneiform capabilities through interactive AI conversation\n- Automated workflows — integrate Cuneiform tools into AI agent pipelines\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"start the MCP server\" → --target-org myOrg\n\"troubleshoot MCP tool calls\" → --target-org myOrg --debug\n\"pin a specific API version\" → --target-org myOrg --api-version 59.0\n\nCONFIGURATION: Add the server to your AI tool's settings. For Claude Desktop, add to `claude_desktop_config.json`:\n\n```json\n{\n \"mcpServers\": {\n \"cuneiform\": {\n \"command\": \"sf\",\n \"args\": [\"cuneiform\", \"mcp\", \"serve\", \"--target-org\", \"myOrg\"]\n }\n }\n}\n```",
1420
+ "examples": [
1421
+ "Start the MCP server for an org — the standard launch configuration:\n<%= config.bin %> <%= command.id %> --target-org myOrg",
1422
+ "Start with debug logging — see tool invocations and parameters on stderr:\n<%= config.bin %> <%= command.id %> --target-org myOrg --debug",
1423
+ "Pin a specific API version — for consistent behavior across environments:\n<%= config.bin %> <%= command.id %> --target-org myOrg --api-version 59.0"
1424
+ ],
1425
+ "flags": {
1426
+ "json": {
1427
+ "description": "Format output as json.",
1428
+ "helpGroup": "GLOBAL",
1429
+ "name": "json",
1430
+ "allowNo": false,
1431
+ "type": "boolean"
1432
+ },
1433
+ "flags-dir": {
1434
+ "helpGroup": "GLOBAL",
1435
+ "name": "flags-dir",
1436
+ "summary": "Import flag values from a directory.",
1437
+ "hasDynamicHelp": false,
1438
+ "multiple": false,
1439
+ "type": "option"
1440
+ },
1441
+ "target-org": {
1442
+ "char": "o",
1443
+ "name": "target-org",
1444
+ "noCacheDefault": true,
1445
+ "required": true,
1446
+ "summary": "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.",
1447
+ "hasDynamicHelp": true,
1448
+ "multiple": false,
1449
+ "type": "option"
1450
+ },
1451
+ "api-version": {
1452
+ "char": "a",
1453
+ "description": "Override the api version used for api requests made by this command",
1454
+ "name": "api-version",
1455
+ "summary": "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.",
1456
+ "hasDynamicHelp": false,
1457
+ "multiple": false,
1458
+ "type": "option"
1459
+ },
1460
+ "debug": {
1461
+ "char": "d",
1462
+ "name": "debug",
1463
+ "summary": "Enable debug logging to stderr. Shows tool invocations, parameters, and response metadata for troubleshooting MCP communication. stdout remains reserved for MCP protocol traffic.",
1464
+ "allowNo": false,
1465
+ "type": "boolean"
1466
+ }
1467
+ },
1468
+ "hasDynamicHelp": true,
1469
+ "hidden": true,
1470
+ "hiddenAliases": [],
1471
+ "id": "cuneiform:mcp:serve",
1472
+ "pluginAlias": "@peernova/cuneiform-sf",
1473
+ "pluginName": "@peernova/cuneiform-sf",
1474
+ "pluginType": "core",
1475
+ "strict": true,
1476
+ "summary": "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.",
1477
+ "enableJsonFlag": true,
1478
+ "skipAccessGate": false,
1479
+ "isESM": true,
1480
+ "relativePath": [
1481
+ "lib",
1482
+ "commands",
1483
+ "cuneiform",
1484
+ "mcp",
1485
+ "serve.js"
1486
+ ],
1487
+ "aliasPermutations": [],
1488
+ "permutations": [
1489
+ "cuneiform:mcp:serve",
1490
+ "mcp:cuneiform:serve",
1491
+ "mcp:serve:cuneiform",
1492
+ "cuneiform:serve:mcp",
1493
+ "serve:cuneiform:mcp",
1494
+ "serve:mcp:cuneiform"
1495
+ ]
1496
+ },
1497
+ "cuneiform:object:describe": {
1498
+ "aliases": [],
1499
+ "args": {},
1500
+ "description": "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:\n\n- **Object Summary** — record count, field totals, type\n- **Record Age Distribution** — year-by-year grid showing when records were created (Cuneiform-exclusive), revealing whether data is actively growing, historical, or stagnant\n- **Record Types** — name, developer name, active status, default flag\n- **Business Processes** — active processes with record type associations and per-process record age grids\n- **Field Summary** — total, standard, custom, formula, lookup counts\n- **Field Type Distribution** — type counts with percentages\n- **Namespace Breakdown** — fields grouped by namespace prefix showing which managed packages contribute fields\n- **External References** — other objects that reference this one via lookups or master-detail\n- **Outbound Lookups** — this object's lookup fields and their target objects\n- **Profiling Status** — existing definitions, summary counts, last profiled date\n- **Field Listing** (opt-in via `--with-fields`) — individual field detail with filtering and sorting\n\nThe 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.\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\n\"Show me the fields\" → `--with-fields`\n\"Just the lookup fields\" → `--with-fields --field-type lookup`\n\"Just custom fields\" → `--with-fields --field-pattern \"*__c\"`\n\"Sort fields by type\" → `--with-fields --sort type`\n\"Compare multiple objects\" → `--object Account,Contact,Opportunity`\n\nFor 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.\n\nRead-only. Does not modify objects, fields, or metadata. The access gate validates Cuneiform installation and permissions before queries execute.\n\nCOMMAND SEQUENCE: `object list` (identify objects of interest) → `object describe` (deep dive on specific objects) → `definition create` (define profiling scope based on what you learned)",
1501
+ "examples": [
1502
+ "Assess an object before building profiling definitions — see all 11 metadata sections:\n<%= config.bin %> <%= command.id %> --object Account --target-org myOrg",
1503
+ "Compare multiple objects in parallel with aggregate totals for profiling scope decisions:\n<%= config.bin %> <%= command.id %> --object Account,Contact,Opportunity --target-org myOrg",
1504
+ "Full field inventory — add detailed field listings to see every field on the object:\n<%= config.bin %> <%= command.id %> --object Account --with-fields --target-org myOrg",
1505
+ "Relationship mapping — isolate lookup fields to understand the object's position in the data model:\n<%= config.bin %> <%= command.id %> --object Account --with-fields --field-type lookup --sort type --target-org myOrg",
1506
+ "Custom field audit — filter to custom fields for a managed package or customization review:\n<%= config.bin %> <%= command.id %> --object Account --with-fields --field-pattern \"\\*\\_\\_c\" --target-org myOrg",
1507
+ "JSON for automation — pipe structured metadata to assessment pipelines or architecture documentation:\n<%= config.bin %> <%= command.id %> --object Account --json --target-org myOrg"
1508
+ ],
1509
+ "flags": {
1510
+ "json": {
1511
+ "description": "Format output as json.",
1512
+ "helpGroup": "GLOBAL",
1513
+ "name": "json",
1514
+ "allowNo": false,
1515
+ "type": "boolean"
1516
+ },
1517
+ "flags-dir": {
1518
+ "helpGroup": "GLOBAL",
1519
+ "name": "flags-dir",
1520
+ "summary": "Import flag values from a directory.",
1521
+ "hasDynamicHelp": false,
1522
+ "multiple": false,
1523
+ "type": "option"
1524
+ },
1525
+ "target-org": {
1526
+ "char": "o",
1527
+ "name": "target-org",
1528
+ "noCacheDefault": true,
1529
+ "required": true,
1530
+ "summary": "Describe objects from this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.",
1531
+ "hasDynamicHelp": true,
1532
+ "multiple": false,
1533
+ "type": "option"
1534
+ },
1535
+ "api-version": {
1536
+ "description": "Override the api version used for api requests made by this command",
1537
+ "name": "api-version",
1538
+ "hasDynamicHelp": false,
1539
+ "multiple": false,
1540
+ "type": "option"
1541
+ },
1542
+ "object": {
1543
+ "name": "object",
1544
+ "required": true,
1545
+ "summary": "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`).",
1546
+ "hasDynamicHelp": false,
1547
+ "multiple": false,
1548
+ "type": "option"
1549
+ },
1550
+ "with-fields": {
1551
+ "aliases": [
1552
+ "show-fields"
1553
+ ],
1554
+ "deprecateAliases": true,
1555
+ "name": "with-fields",
1556
+ "summary": "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.",
1557
+ "allowNo": false,
1558
+ "type": "boolean"
1559
+ },
1560
+ "field-type": {
1561
+ "name": "field-type",
1562
+ "summary": "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.",
1563
+ "hasDynamicHelp": false,
1564
+ "multiple": false,
1565
+ "options": [
1566
+ "text",
1567
+ "picklist",
1568
+ "lookup",
1569
+ "number",
1570
+ "date",
1571
+ "formula",
1572
+ "checkbox",
1573
+ "id",
1574
+ "address"
1575
+ ],
1576
+ "type": "option"
1577
+ },
1578
+ "field-pattern": {
1579
+ "name": "field-pattern",
1580
+ "summary": "Filter the field listing by API name pattern with wildcard support (requires `--with-fields`). Examples: `*__c` for custom fields, `pnova__*` for Cuneiform namespace fields.",
1581
+ "hasDynamicHelp": false,
1582
+ "multiple": false,
1583
+ "type": "option"
1584
+ },
1585
+ "sort": {
1586
+ "name": "sort",
1587
+ "summary": "Sort the field listing by: `name` (alphabetical, the default), `type` (grouped by field type), or `label`. Requires `--with-fields`.",
1588
+ "default": "name",
1589
+ "hasDynamicHelp": false,
1590
+ "multiple": false,
1591
+ "options": [
1592
+ "name",
1593
+ "type",
1594
+ "label"
1595
+ ],
1596
+ "type": "option"
1597
+ }
1598
+ },
1599
+ "hasDynamicHelp": true,
1600
+ "hiddenAliases": [],
1601
+ "id": "cuneiform:object:describe",
1602
+ "pluginAlias": "@peernova/cuneiform-sf",
1603
+ "pluginName": "@peernova/cuneiform-sf",
1604
+ "pluginType": "core",
1605
+ "strict": true,
1606
+ "summary": "Retrieve comprehensive object metadata — fields, record types, data age distribution, relationships, and profiling status — to make informed decisions about what and how to profile.",
1607
+ "enableJsonFlag": true,
1608
+ "skipAccessGate": false,
1609
+ "isESM": true,
1610
+ "relativePath": [
1611
+ "lib",
1612
+ "commands",
1613
+ "cuneiform",
1614
+ "object",
1615
+ "describe.js"
1616
+ ],
1617
+ "aliasPermutations": [],
1618
+ "permutations": [
1619
+ "cuneiform:object:describe",
1620
+ "object:cuneiform:describe",
1621
+ "object:describe:cuneiform",
1622
+ "cuneiform:describe:object",
1623
+ "describe:cuneiform:object",
1624
+ "describe:object:cuneiform"
1625
+ ]
1626
+ },
1627
+ "cuneiform:object:list": {
1628
+ "aliases": [],
1629
+ "args": {},
1630
+ "description": "A typical Salesforce org contains 500 to 2,000 objects. Most are empty platform objects, managed package internals, or system metadata. Finding the objects that actually hold customer data — the ones worth profiling — requires navigating Object Manager, running SOQL counts, and cross-referencing namespace prefixes. This command transforms that exploration into a single call with filter flags and enrichment options.\n\nThe default customer-facing classification filter focuses attention on objects most likely relevant for profiling scope decisions. Record counts distinguish populated objects from empty shells. Namespace distribution reveals how the org's data is partitioned across standard Salesforce, industry clouds, managed packages, and custom development.\n\n**Six output sections:**\n\n- **Org Identity** — org name, edition, instance URL\n- **Summary Statistics** — total objects, objects with records, standard/custom/external counts, namespace distribution\n- **Namespace Distribution** — objects grouped by standard, industry, managed, and custom categories\n- **Objects Table** — name, label, record count, type, namespace — plus optional enrichment columns\n- **Contact Points** — email, phone, and URL field details (when `--with-contact-points` is specified)\n- **Next Steps** — `object describe` for field-level deep dives, `definition create` for profiling scope\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\n\"Which objects have data?\" → `--with-records`\n\"What custom objects exist?\" → `--filter custom`\n\"What did CPQ add to this org?\" → `--namespace SBQQ`\n\"Which objects match a name?\" → `--pattern Account*`\n\"Which objects have meaningful volume?\" → `--min-records 1000`\n\"Which objects can be assigned to users?\" → `--with-owner`\n\"Which objects have record type segmentation?\" → `--with-record-types`\n\"Where are email, phone, and address fields?\" → `--with-contact-points`\n\"How complex is each object?\" → `--with-fields`\n\"Which objects reference other objects?\" → `--with-references`\n\n**How this differs from `object describe`:** This command shows the broad inventory across many objects. Use `object describe` when you need the deep dive on a specific object's fields, record types, relationships, and data age.\n\nRead-only. Does not create, modify, or delete records or metadata. Results default to customer-facing classification, sorted by record count descending, paginated at 50 with a visible notice when more exist.\n\nCOMMAND SEQUENCE: `org details` (understand the org landscape) → `object list` (identify objects of interest) → `object describe` (deep dive on specific objects) → `definition create` (define profiling scope)",
1631
+ "examples": [
1632
+ "Explore a new org — see customer-facing objects sorted by data volume (the default starting point):\n<%= config.bin %> <%= command.id %> --target-org myOrg",
1633
+ "Custom object audit — inventory custom objects for a handoff document or data model review:\n<%= config.bin %> <%= command.id %> --target-org myOrg --filter custom",
1634
+ "Namespace-focused scope — see how Financial Services Cloud objects are populated:\n<%= config.bin %> <%= command.id %> --target-org myOrg --namespace FinServ --with-fields --with-record-types",
1635
+ "Profiling candidates — focus on high-volume objects worth profiling:\n<%= config.bin %> <%= command.id %> --target-org myOrg --with-records --min-records 1000 --sort recordCount",
1636
+ "Contact point discovery — find objects with email, phone, or address fields before an analysis engagement:\n<%= config.bin %> <%= command.id %> --target-org myOrg --with-contact-points --with-records",
1637
+ "Complexity assessment — add field and reference counts to identify hub objects in the data model:\n<%= config.bin %> <%= command.id %> --target-org myOrg --with-fields --with-references --with-records"
1638
+ ],
1639
+ "flags": {
1640
+ "json": {
1641
+ "description": "Format output as json.",
1642
+ "helpGroup": "GLOBAL",
1643
+ "name": "json",
1644
+ "allowNo": false,
1645
+ "type": "boolean"
1646
+ },
1647
+ "flags-dir": {
1648
+ "helpGroup": "GLOBAL",
1649
+ "name": "flags-dir",
1650
+ "summary": "Import flag values from a directory.",
1651
+ "hasDynamicHelp": false,
1652
+ "multiple": false,
1653
+ "type": "option"
1654
+ },
1655
+ "target-org": {
1656
+ "char": "o",
1657
+ "name": "target-org",
1658
+ "noCacheDefault": true,
1659
+ "required": true,
1660
+ "summary": "List objects from this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.",
1661
+ "hasDynamicHelp": true,
1662
+ "multiple": false,
1663
+ "type": "option"
1664
+ },
1665
+ "api-version": {
1666
+ "description": "Override the api version used for api requests made by this command",
1667
+ "name": "api-version",
1668
+ "hasDynamicHelp": false,
1669
+ "multiple": false,
1670
+ "type": "option"
1671
+ },
1672
+ "object": {
1673
+ "char": "O",
1674
+ "name": "object",
1675
+ "summary": "Fetch a single object by API name — bypasses all filters and the limit cap, and always returns the real record count. Use this when you know the exact object you need (e.g., `--object Lead`). Mutually exclusive with --filter (non-default), --namespace, --pattern, --without-records, and --min-records.",
1676
+ "hasDynamicHelp": false,
1677
+ "multiple": false,
1678
+ "type": "option"
1679
+ },
1680
+ "filter": {
1681
+ "char": "f",
1682
+ "name": "filter",
1683
+ "summary": "Filter by object type: `standard`, `custom`, or `all`. Use `custom` to audit custom data model objects or `standard` to focus on platform objects. Defaults to `all`.",
1684
+ "default": "all",
1685
+ "hasDynamicHelp": false,
1686
+ "multiple": false,
1687
+ "options": [
1688
+ "all",
1689
+ "standard",
1690
+ "custom"
1691
+ ],
1692
+ "type": "option"
1693
+ },
1694
+ "namespace": {
1695
+ "char": "n",
1696
+ "name": "namespace",
1697
+ "summary": "Filter by namespace prefix (case-insensitive). Scope to a specific managed package — e.g., `SBQQ` for CPQ, `FinServ` for Financial Services Cloud. Use an empty string for unmanaged objects only.",
1698
+ "hasDynamicHelp": false,
1699
+ "multiple": false,
1700
+ "type": "option"
1701
+ },
1702
+ "pattern": {
1703
+ "char": "p",
1704
+ "name": "pattern",
1705
+ "summary": "Filter by API name pattern with wildcard support. Examples: `Account*` matches Account and AccountContactRelation; `*__c` matches custom objects.",
1706
+ "hasDynamicHelp": false,
1707
+ "multiple": false,
1708
+ "type": "option"
1709
+ },
1710
+ "with-records": {
1711
+ "name": "with-records",
1712
+ "summary": "Show only objects that contain data (record count > 0). Filters out empty platform infrastructure and focuses on populated objects worth profiling.",
1713
+ "allowNo": false,
1714
+ "type": "boolean"
1715
+ },
1716
+ "without-records": {
1717
+ "name": "without-records",
1718
+ "summary": "Show only empty objects (record count = 0). Identifies unused objects during org cleanup or newly provisioned objects awaiting data.",
1719
+ "allowNo": false,
1720
+ "type": "boolean"
1721
+ },
1722
+ "with-owner": {
1723
+ "name": "with-owner",
1724
+ "summary": "Show only objects with an OwnerId field — objects whose records can be assigned to users. Identifies ownership-trackable data for profiling scope.",
1725
+ "allowNo": false,
1726
+ "type": "boolean"
1727
+ },
1728
+ "with-record-types": {
1729
+ "name": "with-record-types",
1730
+ "summary": "Show only objects with record types defined. Record types indicate segmented data entry or business processes — relevant for deciding whether to use record-type-based profiling.",
1731
+ "allowNo": false,
1732
+ "type": "boolean"
1733
+ },
1734
+ "with-business-process": {
1735
+ "name": "with-business-process",
1736
+ "summary": "Add a business process count column showing lifecycle processes (Lead, Opportunity, Case, Solution). Identifies objects with stage-based workflows before profiling.",
1737
+ "allowNo": false,
1738
+ "type": "boolean"
1739
+ },
1740
+ "with-fields": {
1741
+ "name": "with-fields",
1742
+ "summary": "Add field count columns (total fields and custom fields) to gauge object complexity. Identifies objects with large field inventories before running `object describe`.",
1743
+ "allowNo": false,
1744
+ "type": "boolean"
1745
+ },
1746
+ "with-references": {
1747
+ "name": "with-references",
1748
+ "summary": "Add a reference/lookup field count column. High reference counts indicate hub objects in the data model with dense relationship networks.",
1749
+ "allowNo": false,
1750
+ "type": "boolean"
1751
+ },
1752
+ "with-contact-points": {
1753
+ "name": "with-contact-points",
1754
+ "summary": "Add contact point columns showing email, phone, and URL field counts per object. Discovers identity resolution candidates before a contact point analysis engagement.",
1755
+ "allowNo": false,
1756
+ "type": "boolean"
1757
+ },
1758
+ "classification": {
1759
+ "char": "c",
1760
+ "name": "classification",
1761
+ "summary": "Object classification filter: `customer` (customer-facing objects most relevant to profiling, the default), `internal` (system/platform objects), or `all`. The customer-facing filter uses heuristics based on object type, namespace, and naming patterns.",
1762
+ "default": "all",
1763
+ "hasDynamicHelp": false,
1764
+ "multiple": false,
1765
+ "options": [
1766
+ "customer",
1767
+ "internal",
1768
+ "all"
1769
+ ],
1770
+ "type": "option"
1771
+ },
1772
+ "min-records": {
1773
+ "name": "min-records",
1774
+ "summary": "Minimum record count threshold. Show only objects with at least this many records (e.g., `--min-records 1000` to focus on high-volume objects).",
1775
+ "default": 0,
1776
+ "hasDynamicHelp": false,
1777
+ "multiple": false,
1778
+ "type": "option"
1779
+ },
1780
+ "sort": {
1781
+ "char": "s",
1782
+ "name": "sort",
1783
+ "summary": "Sort results by: `name` (alphabetical), `recordCount` (highest first, the default), or `label`.",
1784
+ "default": "recordCount",
1785
+ "hasDynamicHelp": false,
1786
+ "multiple": false,
1787
+ "options": [
1788
+ "name",
1789
+ "recordCount",
1790
+ "label"
1791
+ ],
1792
+ "type": "option"
1793
+ },
1794
+ "limit": {
1795
+ "char": "l",
1796
+ "name": "limit",
1797
+ "summary": "Maximum objects to display (1-200, default: 50). A notice appears when results are truncated — increase to see more, or use --pattern / --object to bypass this cap entirely.",
1798
+ "default": 50,
1799
+ "hasDynamicHelp": false,
1800
+ "multiple": false,
1801
+ "type": "option"
1802
+ }
1803
+ },
1804
+ "hasDynamicHelp": true,
1805
+ "hiddenAliases": [],
1806
+ "id": "cuneiform:object:list",
1807
+ "pluginAlias": "@peernova/cuneiform-sf",
1808
+ "pluginName": "@peernova/cuneiform-sf",
1809
+ "pluginType": "core",
1810
+ "strict": true,
1811
+ "summary": "Enumerate Salesforce objects with record counts, type classifications, and namespace distribution — so you can identify which objects hold customer data and focus profiling on what matters.",
1812
+ "enableJsonFlag": true,
1813
+ "skipAccessGate": false,
1814
+ "isESM": true,
1815
+ "relativePath": [
1816
+ "lib",
1817
+ "commands",
1818
+ "cuneiform",
1819
+ "object",
1820
+ "list.js"
1821
+ ],
1822
+ "aliasPermutations": [],
1823
+ "permutations": [
1824
+ "cuneiform:object:list",
1825
+ "object:cuneiform:list",
1826
+ "object:list:cuneiform",
1827
+ "cuneiform:list:object",
1828
+ "list:cuneiform:object",
1829
+ "list:object:cuneiform"
1830
+ ]
1831
+ },
1832
+ "cuneiform:org:details": {
1833
+ "aliases": [],
1834
+ "args": {},
1835
+ "description": "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.\n\n**Structured sections, one command:**\n\n- **Identity** — org name, type (Production/Sandbox/Scratch/Developer/Trial), edition, instance URL, namespace\n- **Cuneiform** — installation status, package version, and license state\n- **Features** — enabled capabilities (Multi-Currency, Person Accounts, Einstein AI, Enhanced Notes, and others)\n- **Clouds** — Salesforce products detected by license queries and namespace prefix matching (Financial Services, CPQ, Health Cloud, and others found in the org)\n- **Namespaces** — installed packages with object counts and population rates per namespace\n- **Processes** — active business processes with record type associations\n- **Limits** — current API request quotas, data and file storage consumption, with capacity warnings at 95%\n- **Next Steps** — command suggestions tailored to the org's namespace composition and data\n\nJames 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.\n\n**When to run this command:**\n\n- Entering a new org for the first time and building a mental model of its product landscape\n- Checking API and storage capacity before submitting profiling requests\n- Verifying Cuneiform installation and license status in a new sandbox\n- Understanding which Salesforce products (Clouds, managed packages) are installed before scoping profiling\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"show me everything about this org\" → no flags (all sections)\n\"check my API limits\" → --sections limits\n\"is Cuneiform installed?\" → --sections cuneiform\n\"what Clouds are in this org?\" → --sections clouds\n\"show me all limits grouped\" → --sections limits-all\n\"how much storage is used?\" → --sections limits-storage\n\nCOMMAND SEQUENCE:\n`org details` → `object list` → `user details` → `definition create` → `profile`\n\nThis 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.",
1836
+ "examples": [
1837
+ "Engagement kickoff — see the full org picture (edition, products, features, capacity, namespace composition):\n<%= config.bin %> <%= command.id %> --target-org myOrg",
1838
+ "Pre-profiling capacity check — verify API and storage capacity before submitting profiling requests:\n<%= config.bin %> <%= command.id %> --target-org myOrg --sections limits",
1839
+ "Cuneiform readiness — confirm installation and license status in a new sandbox:\n<%= config.bin %> <%= command.id %> --target-org myOrg --sections cuneiform",
1840
+ "Product landscape — see which Salesforce Clouds are installed to scope profiling by product:\n<%= config.bin %> <%= command.id %> --target-org myOrg --sections clouds",
1841
+ "Namespace composition — identify managed packages and their object counts for profiling scope:\n<%= config.bin %> <%= command.id %> --target-org myOrg --sections namespaces",
1842
+ "Storage detail — check data and file storage consumption before a profiling run:\n<%= config.bin %> <%= command.id %> --target-org myOrg --sections limits-storage",
1843
+ "JSON for automation — pipe structured output to assessment pipelines or SOW templates:\n<%= config.bin %> <%= command.id %> --target-org myOrg --json"
1844
+ ],
1845
+ "flags": {
1846
+ "json": {
1847
+ "description": "Format output as json.",
1848
+ "helpGroup": "GLOBAL",
1849
+ "name": "json",
1850
+ "allowNo": false,
1851
+ "type": "boolean"
1852
+ },
1853
+ "flags-dir": {
1854
+ "helpGroup": "GLOBAL",
1855
+ "name": "flags-dir",
1856
+ "summary": "Import flag values from a directory.",
1857
+ "hasDynamicHelp": false,
1858
+ "multiple": false,
1859
+ "type": "option"
1860
+ },
1861
+ "target-org": {
1862
+ "char": "o",
1863
+ "name": "target-org",
1864
+ "noCacheDefault": true,
1865
+ "required": true,
1866
+ "summary": "The Salesforce org to retrieve configuration details from. Specify the org alias or username when you have multiple authenticated orgs.",
1867
+ "hasDynamicHelp": true,
1868
+ "multiple": false,
1869
+ "type": "option"
1870
+ },
1871
+ "api-version": {
1872
+ "char": "a",
1873
+ "description": "Override the api version used for api requests made by this command",
1874
+ "name": "api-version",
1875
+ "summary": "Override the Salesforce API version used for org configuration queries. Use this when troubleshooting version-specific behavior or testing against a specific API release.",
1876
+ "hasDynamicHelp": false,
1877
+ "multiple": false,
1878
+ "type": "option"
1879
+ },
1880
+ "sections": {
1881
+ "char": "s",
1882
+ "name": "sections",
1883
+ "required": false,
1884
+ "summary": "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.",
1885
+ "hasDynamicHelp": false,
1886
+ "multiple": true,
1887
+ "type": "option"
1888
+ }
1889
+ },
1890
+ "hasDynamicHelp": true,
1891
+ "hiddenAliases": [],
1892
+ "id": "cuneiform:org:details",
1893
+ "pluginAlias": "@peernova/cuneiform-sf",
1894
+ "pluginName": "@peernova/cuneiform-sf",
1895
+ "pluginType": "core",
1896
+ "strict": true,
1897
+ "summary": "Consolidate org configuration — products, features, capacity, and namespace composition — into a single view that replaces navigating six Setup pages.",
1898
+ "enableJsonFlag": true,
1899
+ "skipAccessGate": false,
1900
+ "isESM": true,
1901
+ "relativePath": [
1902
+ "lib",
1903
+ "commands",
1904
+ "cuneiform",
1905
+ "org",
1906
+ "details.js"
1907
+ ],
1908
+ "aliasPermutations": [],
1909
+ "permutations": [
1910
+ "cuneiform:org:details",
1911
+ "org:cuneiform:details",
1912
+ "org:details:cuneiform",
1913
+ "cuneiform:details:org",
1914
+ "details:cuneiform:org",
1915
+ "details:org:cuneiform"
1916
+ ]
1917
+ },
1918
+ "cuneiform:org:reset": {
1919
+ "aliases": [],
1920
+ "args": {},
1921
+ "description": "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.\n\nThe reset sequence is:\n\n1. Query definitions matching the name pattern\n2. Cancel any active profiling requests\n3. Delete cancelled/rejected profiling requests\n4. Delete definitions that have no related summaries\n\nDefinitions with related summaries are skipped — use `sf cuneiform summary purge` first to remove them.",
1922
+ "examples": [
1923
+ "Reset org by removing all NUT-created test data: `sf cuneiform org reset --target-org myOrg`",
1924
+ "Preview what would be deleted without making changes: `sf cuneiform org reset --target-org myOrg --dry-run`",
1925
+ "Reset with a custom pattern: `sf cuneiform org reset --target-org myOrg --pattern \"Test%\"`",
1926
+ "Reset without confirmation prompt: `sf cuneiform org reset --target-org myOrg --no-prompt`"
1927
+ ],
1928
+ "flags": {
1929
+ "json": {
1930
+ "description": "Format output as json.",
1931
+ "helpGroup": "GLOBAL",
1932
+ "name": "json",
1933
+ "allowNo": false,
1934
+ "type": "boolean"
1935
+ },
1936
+ "flags-dir": {
1937
+ "helpGroup": "GLOBAL",
1938
+ "name": "flags-dir",
1939
+ "summary": "Import flag values from a directory.",
1940
+ "hasDynamicHelp": false,
1941
+ "multiple": false,
1942
+ "type": "option"
1943
+ },
1944
+ "target-org": {
1945
+ "char": "o",
1946
+ "name": "target-org",
1947
+ "noCacheDefault": true,
1948
+ "required": true,
1949
+ "summary": "Username or alias of the target org. Not required if the `target-org` configuration variable is already set.",
1950
+ "hasDynamicHelp": true,
1951
+ "multiple": false,
1952
+ "type": "option"
1953
+ },
1954
+ "api-version": {
1955
+ "description": "Override the api version used for api requests made by this command",
1956
+ "name": "api-version",
1957
+ "hasDynamicHelp": false,
1958
+ "multiple": false,
1959
+ "type": "option"
1960
+ },
1961
+ "pattern": {
1962
+ "char": "p",
1963
+ "name": "pattern",
1964
+ "summary": "SOQL LIKE pattern for definition names to purge.",
1965
+ "default": "[NUT-%",
1966
+ "hasDynamicHelp": false,
1967
+ "multiple": false,
1968
+ "type": "option"
1969
+ },
1970
+ "dry-run": {
1971
+ "char": "d",
1972
+ "name": "dry-run",
1973
+ "summary": "Preview what would be deleted without making changes.",
1974
+ "allowNo": false,
1975
+ "type": "boolean"
1976
+ },
1977
+ "no-prompt": {
1978
+ "char": "n",
1979
+ "name": "no-prompt",
1980
+ "summary": "Skip the confirmation prompt before deleting.",
1981
+ "allowNo": false,
1982
+ "type": "boolean"
1983
+ }
1984
+ },
1985
+ "hasDynamicHelp": true,
1986
+ "hidden": true,
1987
+ "hiddenAliases": [],
1988
+ "id": "cuneiform:org:reset",
1989
+ "pluginAlias": "@peernova/cuneiform-sf",
1990
+ "pluginName": "@peernova/cuneiform-sf",
1991
+ "pluginType": "core",
1992
+ "strict": true,
1993
+ "summary": "Reset org by removing Cuneiform test data created by NUT tests.",
1994
+ "enableJsonFlag": true,
1995
+ "skipAccessGate": true,
1996
+ "isESM": true,
1997
+ "relativePath": [
1998
+ "lib",
1999
+ "commands",
2000
+ "cuneiform",
2001
+ "org",
2002
+ "reset.js"
2003
+ ],
2004
+ "aliasPermutations": [],
2005
+ "permutations": [
2006
+ "cuneiform:org:reset",
2007
+ "org:cuneiform:reset",
2008
+ "org:reset:cuneiform",
2009
+ "cuneiform:reset:org",
2010
+ "reset:cuneiform:org",
2011
+ "reset:org:cuneiform"
2012
+ ]
2013
+ },
2014
+ "cuneiform:summary:purge": {
2015
+ "aliases": [],
2016
+ "args": {},
2017
+ "description": "Every profiling run creates a summary — a result record containing Field Results, Value Results, and KPI Results. Over repeated profiling cycles, summaries accumulate. An org with 20 definitions profiled weekly generates over 1,000 summaries per year. The current profiling posture is the latest summary per definition; older summaries are historical artifacts.\n\nThis command deletes summaries and their child records from a Salesforce org. The `--prune` flag implements the standard housekeeping pattern: keep the latest summary per definition while removing older results. This is how Marcus Thompson closes engagement phases and how David Chen configures automated weekly cleanup.\n\n**Cleanup dependency order** — summary purge must happen BEFORE definition purge:\n\n1. `sf cuneiform profile request cancel` — cancel queued requests\n2. `sf cuneiform profile request delete` — remove canceled and rejected requests\n3. `sf cuneiform summary purge` — remove summaries (cascade-deletes completed requests; resets definition status to NOT PROFILED when all summaries are removed)\n4. `sf cuneiform definition purge` — remove definitions (requires zero summaries)\n\nTHREE SELECTION MODES:\n\n- **By ID** (`--ids`) — Delete specific summaries by Salesforce record ID. Exclusive mode — filter flags are ignored.\n- **By filter** (`--objects`, `--category`, `--is-active`) — Delete summaries matching filters. Summaries are resolved through their parent definitions: the command queries definitions first, then targets their associated summaries.\n- **All** (`--all`) — Delete all eligible summaries. Can be combined with filter flags to narrow scope.\n\nELIGIBILITY: Only summaries with a terminal profiling status (SUCCESS, COMPLETE w/ FAILURES, FAILED, CANCELED) can be deleted. In-progress summaries are automatically excluded and reported with a reason.\n\nSAFETY: Use --dry-run to preview the scope before deleting. The confirmation prompt shows affected summaries before proceeding. Cascade delete automatically removes child Field Results, Value Results, KPI Results, and related profiling requests (original and reprofile). Definition status resets to NOT PROFILED when all summaries for a definition are removed.\n\n**When to run this command:**\n\n- Post-sprint cleanup — prune intermediate results after iterative profiling cycles\n- Pre-sandbox-refresh storage reduction — free storage before the refresh window\n- Object-targeted cleanup after data model changes — remove stale summaries for redesigned objects\n- Before definition purge — clear summaries as a prerequisite for definition deletion\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"clean up old summaries, keep latest\" → --all --prune\n\"delete all summaries\" → --all\n\"delete Account summaries\" → --objects Account\n\"delete this specific summary\" → --ids a0Bxx0000001234AAA\n\"what would be deleted?\" → --all --dry-run\n\"clean up old summaries without asking\" → --all --prune --no-prompt\n\nCOMMAND SEQUENCE:\n`profile request cancel` → `profile request delete` → `summary purge` → `definition purge`",
2018
+ "examples": [
2019
+ "Preview what would be deleted — start here to verify scope:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --dry-run",
2020
+ "Standard housekeeping — keep the latest summary per definition, remove older results:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --prune",
2021
+ "Object-targeted cleanup — remove Account summaries after a data model redesign:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Account",
2022
+ "Complete cleanup — delete all terminal-state summaries:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all",
2023
+ "Surgical removal — delete specific summaries by record ID:\n<%= config.bin %> <%= command.id %> --target-org myOrg --ids a0Bxx0000001234AAA,a0Bxx0000005678AAA",
2024
+ "Automated weekly prune — for CI pipelines and scheduled jobs:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --prune --no-prompt --format json"
2025
+ ],
2026
+ "flags": {
2027
+ "json": {
2028
+ "description": "Format output as json.",
2029
+ "helpGroup": "GLOBAL",
2030
+ "name": "json",
2031
+ "allowNo": false,
2032
+ "type": "boolean"
2033
+ },
2034
+ "flags-dir": {
2035
+ "helpGroup": "GLOBAL",
2036
+ "name": "flags-dir",
2037
+ "summary": "Import flag values from a directory.",
2038
+ "hasDynamicHelp": false,
2039
+ "multiple": false,
2040
+ "type": "option"
2041
+ },
2042
+ "target-org": {
2043
+ "char": "o",
2044
+ "name": "target-org",
2045
+ "noCacheDefault": true,
2046
+ "required": true,
2047
+ "summary": "The Salesforce org to purge summaries from. Specify the org alias or username when you have multiple authenticated orgs.",
2048
+ "hasDynamicHelp": true,
2049
+ "multiple": false,
2050
+ "type": "option"
2051
+ },
2052
+ "api-version": {
2053
+ "description": "Override the api version used for api requests made by this command",
2054
+ "name": "api-version",
2055
+ "hasDynamicHelp": false,
2056
+ "multiple": false,
2057
+ "type": "option"
2058
+ },
2059
+ "all": {
2060
+ "char": "a",
2061
+ "name": "all",
2062
+ "summary": "Target all eligible summaries for deletion. Can be combined with filter flags (--objects, --category, --is-active) to narrow scope. Combine with --prune to preserve the latest summary per definition while removing older results.",
2063
+ "allowNo": false,
2064
+ "type": "boolean"
2065
+ },
2066
+ "ids": {
2067
+ "char": "i",
2068
+ "name": "ids",
2069
+ "summary": "Specific summary record IDs to delete (comma-separated Salesforce record IDs). Exclusive mode — filter flags are ignored when --ids is specified. Use for surgical removal of individual summaries.",
2070
+ "hasDynamicHelp": false,
2071
+ "multiple": true,
2072
+ "type": "option"
2073
+ },
2074
+ "objects": {
2075
+ "aliases": [
2076
+ "object-name"
2077
+ ],
2078
+ "char": "b",
2079
+ "deprecateAliases": true,
2080
+ "name": "objects",
2081
+ "summary": "Filter by target object API name (matches the definition's profiled object). Scopes purge to summaries for specific objects (e.g., --objects Account removes only Account-related summaries).",
2082
+ "hasDynamicHelp": false,
2083
+ "multiple": false,
2084
+ "type": "option"
2085
+ },
2086
+ "category": {
2087
+ "char": "c",
2088
+ "name": "category",
2089
+ "summary": "Filter by definition category label (e.g., \"Phase 1\", \"Baseline\"). Scopes purge to summaries from a completed engagement phase or functional area.",
2090
+ "hasDynamicHelp": false,
2091
+ "multiple": false,
2092
+ "type": "option"
2093
+ },
2094
+ "is-active": {
2095
+ "name": "is-active",
2096
+ "summary": "Filter by definition active status. Targets summaries belonging to active or inactive definitions.",
2097
+ "allowNo": false,
2098
+ "type": "boolean"
2099
+ },
2100
+ "limit": {
2101
+ "char": "l",
2102
+ "name": "limit",
2103
+ "summary": "Maximum number of summaries to process per invocation (default: 50). Controls batch size in large cleanup operations. Ignored when --all is specified.",
2104
+ "default": 50,
2105
+ "hasDynamicHelp": false,
2106
+ "multiple": false,
2107
+ "type": "option"
2108
+ },
2109
+ "prune": {
2110
+ "name": "prune",
2111
+ "summary": "Preserve the latest summary for each definition and delete only older summaries. This is the standard housekeeping pattern — current profiling evidence is retained while historical results are removed. Combine with --all for org-wide pruning, or with filter flags to prune specific scopes.",
2112
+ "allowNo": false,
2113
+ "type": "boolean"
2114
+ },
2115
+ "dry-run": {
2116
+ "char": "d",
2117
+ "name": "dry-run",
2118
+ "summary": "Preview what would be deleted, applied to nothing. Shows the same categorization (eligible, skipped by status, preserved by prune) as a real purge. Run this first to verify scope before committing.",
2119
+ "allowNo": false,
2120
+ "type": "boolean"
2121
+ },
2122
+ "no-prompt": {
2123
+ "char": "y",
2124
+ "name": "no-prompt",
2125
+ "summary": "Skip the confirmation prompt and delete immediately. Use in scripts and automation pipelines. The prompt normally shows which summaries (and their child records) will be permanently deleted.",
2126
+ "allowNo": false,
2127
+ "type": "boolean"
2128
+ },
2129
+ "format": {
2130
+ "name": "format",
2131
+ "summary": "Output format: table (default, human-readable) or json (machine-readable for scripting and automation dashboards).",
2132
+ "default": "table",
2133
+ "hasDynamicHelp": false,
2134
+ "multiple": false,
2135
+ "options": [
2136
+ "table",
2137
+ "json"
2138
+ ],
2139
+ "type": "option"
2140
+ }
2141
+ },
2142
+ "hasDynamicHelp": true,
2143
+ "hiddenAliases": [],
2144
+ "id": "cuneiform:summary:purge",
2145
+ "pluginAlias": "@peernova/cuneiform-sf",
2146
+ "pluginName": "@peernova/cuneiform-sf",
2147
+ "pluginType": "core",
2148
+ "strict": true,
2149
+ "summary": "Delete profiling summaries and their child records — use --prune to preserve the latest summary per definition while removing older results.",
2150
+ "enableJsonFlag": true,
2151
+ "skipAccessGate": false,
2152
+ "ERROR_CODE_MAP": {
2153
+ "E4510": "errors.noSelectionCriteria",
2154
+ "E4511": "errors.mutuallyExclusive",
2155
+ "E4513": "errors.noEligibleSummaries",
2156
+ "E4512": "errors.queryFailed",
2157
+ "E4514": "errors.deleteFailed"
2158
+ },
2159
+ "isESM": true,
2160
+ "relativePath": [
2161
+ "lib",
2162
+ "commands",
2163
+ "cuneiform",
2164
+ "summary",
2165
+ "purge.js"
2166
+ ],
2167
+ "aliasPermutations": [],
2168
+ "permutations": [
2169
+ "cuneiform:summary:purge",
2170
+ "summary:cuneiform:purge",
2171
+ "summary:purge:cuneiform",
2172
+ "cuneiform:purge:summary",
2173
+ "purge:cuneiform:summary",
2174
+ "purge:summary:cuneiform"
2175
+ ]
2176
+ },
2177
+ "cuneiform:summary:reprofile": {
2178
+ "aliases": [],
2179
+ "args": {},
2180
+ "description": "When a profiling run fails due to transient errors or is manually stopped, the resulting summary has gaps — some fields completed, others did not. Those gaps in the KYCD evidence persist until someone acts on them. This command re-submits those summaries for targeted recovery.\n\nOnly failed and unprocessed fields are re-executed — previously completed fields are preserved. The existing summary record is reused. No definition recreation or reconfiguration is needed. This is a fire-and-forget operation: after submission, profiling re-executes asynchronously in the org. Use `sf cuneiform definition get` to check profiling status after submission.\n\nSTOP + REPROFILE form a natural pair: use `sf cuneiform summary stop` to halt a summary and free resources, then reprofile later to complete the remaining fields. This is the standard recovery pattern for resource management and transient failure recovery.\n\nTHREE SELECTION MODES (mutually exclusive):\n\n- **By ID** (`--ids`) — Reprofile specific summaries by Salesforce record ID\n- **All** (`--all`) — Reprofile all eligible (failed/stopped) summaries\n- **By object** (`--objects`) — Reprofile summaries for specific Salesforce objects\n\nOnly summaries with failed or stopped (canceled) status are eligible. In-progress and completed summaries are excluded.\n\nWHEN TO USE:\n\n- After stopping summaries — complete the fields that were not yet processed when the stop signal was sent\n- After transient failures — governor limits, API timeouts, or infrastructure interruptions caused partial results\n- Bulk recovery — re-submit all failed summaries in one command after a service disruption\n- Object-targeted recovery — reprofile only the objects that failed while leaving successful ones untouched\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"reprofile everything that failed\" → --all\n\"reprofile just Account\" → --objects Account\n\"reprofile this specific summary\" → --ids a0Bxx0000001234AAA\n\"what would be reprofiled?\" → --all --dry-run\n\"reprofile without asking\" → --all --no-prompt\n\nCOMMAND SEQUENCE:\n`summary stop` or failed profiling run → **`summary reprofile`** → `profile request list` (verify re-profiling completed)",
2181
+ "examples": [
2182
+ "Preview what would be reprofiled — assess recovery scope first:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --dry-run",
2183
+ "Reprofile all failed and stopped summaries — bulk recovery:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all",
2184
+ "Reprofile summaries for a specific object — targeted recovery:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Account",
2185
+ "Reprofile specific summaries by ID — surgical recovery:\n<%= config.bin %> <%= command.id %> --target-org myOrg --ids a0Bxx0000001234AAA,a0Bxx0000005678AAA",
2186
+ "Reprofile summaries for multiple objects:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Account,Contact",
2187
+ "Reprofile immediately for automated recovery workflows:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --no-prompt"
2188
+ ],
2189
+ "flags": {
2190
+ "json": {
2191
+ "description": "Format output as json.",
2192
+ "helpGroup": "GLOBAL",
2193
+ "name": "json",
2194
+ "allowNo": false,
2195
+ "type": "boolean"
2196
+ },
2197
+ "flags-dir": {
2198
+ "helpGroup": "GLOBAL",
2199
+ "name": "flags-dir",
2200
+ "summary": "Import flag values from a directory.",
2201
+ "hasDynamicHelp": false,
2202
+ "multiple": false,
2203
+ "type": "option"
2204
+ },
2205
+ "target-org": {
2206
+ "char": "o",
2207
+ "name": "target-org",
2208
+ "noCacheDefault": true,
2209
+ "required": true,
2210
+ "summary": "Re-submit profiling summaries in this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.",
2211
+ "hasDynamicHelp": true,
2212
+ "multiple": false,
2213
+ "type": "option"
2214
+ },
2215
+ "api-version": {
2216
+ "description": "Override the api version used for api requests made by this command",
2217
+ "name": "api-version",
2218
+ "hasDynamicHelp": false,
2219
+ "multiple": false,
2220
+ "type": "option"
2221
+ },
2222
+ "ids": {
2223
+ "char": "i",
2224
+ "name": "ids",
2225
+ "summary": "Reprofile specific summaries by Salesforce record ID (comma-separated). Use for targeted recovery of individual summaries when the failure scope is narrow. Find summary IDs with `definition get`. Mutually exclusive with --all and --objects.",
2226
+ "hasDynamicHelp": false,
2227
+ "multiple": true,
2228
+ "type": "option"
2229
+ },
2230
+ "all": {
2231
+ "char": "a",
2232
+ "name": "all",
2233
+ "summary": "Reprofile all eligible (failed or stopped) summaries across the org. Use for bulk recovery after infrastructure events, transient API failures, or governor limit spikes that affected multiple summaries. Mutually exclusive with --ids and --objects.",
2234
+ "allowNo": false,
2235
+ "type": "boolean"
2236
+ },
2237
+ "objects": {
2238
+ "char": "b",
2239
+ "name": "objects",
2240
+ "summary": "Reprofile summaries targeting specific Salesforce objects by API name (comma-separated). Use when only certain objects need recovery while others completed successfully. Mutually exclusive with --ids and --all.",
2241
+ "hasDynamicHelp": false,
2242
+ "multiple": true,
2243
+ "type": "option"
2244
+ },
2245
+ "dry-run": {
2246
+ "char": "d",
2247
+ "name": "dry-run",
2248
+ "summary": "Preview which summaries would be re-profiled, showing definition key, summary key, object, status, and planned action. Use to assess recovery scope and estimate the re-execution workload before committing.",
2249
+ "allowNo": false,
2250
+ "type": "boolean"
2251
+ },
2252
+ "no-prompt": {
2253
+ "char": "y",
2254
+ "name": "no-prompt",
2255
+ "summary": "Skip the confirmation prompt and reprofile immediately. Use in automated recovery scripts or runbooks where interactive prompts are not available.",
2256
+ "allowNo": false,
2257
+ "type": "boolean"
2258
+ }
2259
+ },
2260
+ "hasDynamicHelp": true,
2261
+ "hiddenAliases": [],
2262
+ "id": "cuneiform:summary:reprofile",
2263
+ "pluginAlias": "@peernova/cuneiform-sf",
2264
+ "pluginName": "@peernova/cuneiform-sf",
2265
+ "pluginType": "core",
2266
+ "strict": true,
2267
+ "summary": "Re-submit failed or stopped profiling summaries for targeted recovery — only the failed and unprocessed fields are re-executed, preserving completed results.",
2268
+ "enableJsonFlag": true,
2269
+ "skipAccessGate": false,
2270
+ "ERROR_CODE_MAP": {
2271
+ "E4530": "errors.noSelectionCriteria",
2272
+ "E4531": "errors.mutuallyExclusive",
2273
+ "E4533": "errors.noEligibleSummaries",
2274
+ "E4532": "errors.queryFailed",
2275
+ "E4534": "errors.reprofileFailed"
2276
+ },
2277
+ "isESM": true,
2278
+ "relativePath": [
2279
+ "lib",
2280
+ "commands",
2281
+ "cuneiform",
2282
+ "summary",
2283
+ "reprofile.js"
2284
+ ],
2285
+ "aliasPermutations": [],
2286
+ "permutations": [
2287
+ "cuneiform:summary:reprofile",
2288
+ "summary:cuneiform:reprofile",
2289
+ "summary:reprofile:cuneiform",
2290
+ "cuneiform:reprofile:summary",
2291
+ "reprofile:cuneiform:summary",
2292
+ "reprofile:summary:cuneiform"
2293
+ ]
2294
+ },
2295
+ "cuneiform:summary:stop": {
2296
+ "aliases": [],
2297
+ "args": {},
2298
+ "description": "Profiling runs in the background and consumes org resources — API calls, processing time, and storage writes. When a profiling run needs to yield — because of resource contention, a scheduling conflict, or a configuration issue — this command provides immediate control.\n\nThe stop signal is sent and the command returns immediately (fire-and-forget). The backend handles the actual halting asynchronously. Fields that completed before the stop are preserved; unprocessed and in-progress fields are marked as failed. The summary status transitions to canceled.\n\nIMPORTANT: This command stops SUMMARIES, not requests. Summaries are the execution records created after a profiling request is processed. To prevent queued requests from being processed, use `sf cuneiform profile request cancel` instead.\n\nSTOP vs CANCEL — these address different objects at different lifecycle stages:\n\n- **Cancel** prevents a Request from being processed. No Summary is created.\n- **Stop** halts an active Summary. Partially completed results are preserved.\n\nSTOP + REPROFILE form a natural pair: stop a summary to release resources now, then use `sf cuneiform summary reprofile` later to re-execute only the failed and unprocessed fields. The existing summary is reused — no reconfiguration needed.\n\nTHREE SELECTION MODES (mutually exclusive):\n\n- **By ID** (`--ids`) — Stop specific summaries by Salesforce record ID\n- **All** (`--all`) — Stop all in-progress summaries\n- **By object** (`--objects`) — Stop summaries for specific Salesforce objects\n\nOnly summaries with in-progress profiling status are eligible. Completed, failed, and canceled summaries are excluded.\n\nWHEN TO USE:\n\n- Peak hours resource management — halt profiling to free API capacity, reprofile during off-hours\n- Long-running profiling on a large object — stop one object while others continue\n- Pre-maintenance window — stop active summaries before planned downtime\n- Definition adjustment — stop a run, fix the definition, then reprofile\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"stop everything\" → --all\n\"stop just Account profiling\" → --objects Account\n\"stop this specific summary\" → --ids a0Bxx0000001234AAA\n\"what would be stopped?\" → --all --dry-run\n\"stop without asking\" → --all --no-prompt\n\nCOMMAND SEQUENCE:\n`profile request list` (identify resource-consuming runs) → **`summary stop`** → `summary reprofile` (re-execute when conditions are appropriate)",
2299
+ "examples": [
2300
+ "Preview what would be stopped — verify scope before committing:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --dry-run",
2301
+ "Stop all in-progress summaries — free resources during peak hours:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all",
2302
+ "Stop profiling for a specific object while others continue:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Account",
2303
+ "Stop specific summaries by ID — targeted precision:\n<%= config.bin %> <%= command.id %> --target-org myOrg --ids a0Bxx0000001234AAA,a0Bxx0000005678AAA",
2304
+ "Stop profiling for multiple objects at once:\n<%= config.bin %> <%= command.id %> --target-org myOrg --objects Account,Contact",
2305
+ "Stop immediately for automated runbooks:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --no-prompt"
2306
+ ],
2307
+ "flags": {
2308
+ "json": {
2309
+ "description": "Format output as json.",
2310
+ "helpGroup": "GLOBAL",
2311
+ "name": "json",
2312
+ "allowNo": false,
2313
+ "type": "boolean"
2314
+ },
2315
+ "flags-dir": {
2316
+ "helpGroup": "GLOBAL",
2317
+ "name": "flags-dir",
2318
+ "summary": "Import flag values from a directory.",
2319
+ "hasDynamicHelp": false,
2320
+ "multiple": false,
2321
+ "type": "option"
2322
+ },
2323
+ "target-org": {
2324
+ "char": "o",
2325
+ "name": "target-org",
2326
+ "noCacheDefault": true,
2327
+ "required": true,
2328
+ "summary": "Stop profiling summaries in this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.",
2329
+ "hasDynamicHelp": true,
2330
+ "multiple": false,
2331
+ "type": "option"
2332
+ },
2333
+ "api-version": {
2334
+ "description": "Override the api version used for api requests made by this command",
2335
+ "name": "api-version",
2336
+ "hasDynamicHelp": false,
2337
+ "multiple": false,
2338
+ "type": "option"
2339
+ },
2340
+ "ids": {
2341
+ "char": "i",
2342
+ "name": "ids",
2343
+ "summary": "Stop specific profiling summaries by Salesforce record ID (comma-separated). Use for targeted halting when only some summaries need to stop. Find summary IDs with `definition get`. Mutually exclusive with --all and --objects.",
2344
+ "hasDynamicHelp": false,
2345
+ "multiple": true,
2346
+ "type": "option"
2347
+ },
2348
+ "all": {
2349
+ "char": "a",
2350
+ "name": "all",
2351
+ "summary": "Stop all in-progress profiling summaries across the org. Use for peak hours resource management, pre-maintenance windows, or when the org needs its full API capacity immediately. Mutually exclusive with --ids and --objects.",
2352
+ "allowNo": false,
2353
+ "type": "boolean"
2354
+ },
2355
+ "objects": {
2356
+ "char": "b",
2357
+ "name": "objects",
2358
+ "summary": "Stop profiling for specific Salesforce objects by API name (comma-separated). Use when one object is consuming disproportionate resources while profiling on other objects should continue. Mutually exclusive with --ids and --all.",
2359
+ "hasDynamicHelp": false,
2360
+ "multiple": true,
2361
+ "type": "option"
2362
+ },
2363
+ "dry-run": {
2364
+ "char": "d",
2365
+ "name": "dry-run",
2366
+ "summary": "Preview which summaries would be stopped, showing definition key, summary key, object, status, and planned action. Use to verify scope before sending stop signals — especially important with --all.",
2367
+ "allowNo": false,
2368
+ "type": "boolean"
2369
+ },
2370
+ "no-prompt": {
2371
+ "char": "y",
2372
+ "name": "no-prompt",
2373
+ "summary": "Skip the confirmation prompt and send stop signals immediately. Use in automated scripts, runbooks, or time-sensitive situations where interactive prompts are not practical.",
2374
+ "allowNo": false,
2375
+ "type": "boolean"
2376
+ }
2377
+ },
2378
+ "hasDynamicHelp": true,
2379
+ "hiddenAliases": [],
2380
+ "id": "cuneiform:summary:stop",
2381
+ "pluginAlias": "@peernova/cuneiform-sf",
2382
+ "pluginName": "@peernova/cuneiform-sf",
2383
+ "pluginType": "core",
2384
+ "strict": true,
2385
+ "summary": "Send a stop signal to in-progress profiling summaries — halt execution to free org resources, preserving fields that already completed.",
2386
+ "enableJsonFlag": true,
2387
+ "skipAccessGate": false,
2388
+ "ERROR_CODE_MAP": {
2389
+ "E4520": "errors.noSelectionCriteria",
2390
+ "E4521": "errors.mutuallyExclusive",
2391
+ "E4523": "errors.noEligibleSummaries",
2392
+ "E4522": "errors.queryFailed",
2393
+ "E4524": "errors.stopFailed"
2394
+ },
2395
+ "isESM": true,
2396
+ "relativePath": [
2397
+ "lib",
2398
+ "commands",
2399
+ "cuneiform",
2400
+ "summary",
2401
+ "stop.js"
2402
+ ],
2403
+ "aliasPermutations": [],
2404
+ "permutations": [
2405
+ "cuneiform:summary:stop",
2406
+ "summary:cuneiform:stop",
2407
+ "summary:stop:cuneiform",
2408
+ "cuneiform:stop:summary",
2409
+ "stop:cuneiform:summary",
2410
+ "stop:summary:cuneiform"
2411
+ ]
2412
+ },
2413
+ "cuneiform:user:details": {
2414
+ "aliases": [],
2415
+ "args": {},
2416
+ "description": "Remote profiling requires two configuration touchpoints spread across two Salesforce Setup pages: a permission set assignment and a Custom Metadata Type setting on your Configuration Profile. Missing either one produces a generic access error. This command checks both in one step and tells you exactly what is missing and who can fix it.\n\n**Three modes:**\n\n- **Diagnostic (default)** — Answer \"Am I set up to profile?\" Shows Cuneiform installation status, permission set assignments, Configuration Profile enablement, and resolution guidance for any gaps. Read-only — safe to run even when permissions are incomplete.\n- **Configure (`--configure`)** — Answer \"Set me up so I can profile.\" Assigns the required permission set via REST API and enables API-Based Profiling via Metadata API deployment in a single step. Idempotent — running it when already configured produces \"no changes needed.\" Blocked in production orgs.\n- **Preview (`--configure --dry-run`)** — Answer \"What would configure change?\" Shows exactly what would be assigned or enabled, applied to nothing. Use this in regulated environments where changes require documented approval before execution.\n\n**Resolution guidance routes by persona:** When gaps exist, the output distinguishes between steps you can take yourself (self-service via `--configure`) and steps that require a Salesforce administrator.\n\nSarah Mitchell uses this to onboard users for profiling. Marcus Thompson runs it on day one of every engagement — if access is missing, `--configure` resolves it in 15 seconds. Andre Robitaille uses `--configure` as the \"hello world\" of every workshop, turning NOT READY into READY as the first moment of participant success.\n\n**When to run this command:**\n\n- First time in a new org or after a sandbox refresh — confirm your user is configured before profiling\n- After getting an access error from any Cuneiform command — diagnose the exact gap\n- When onboarding workshop participants — each person runs `--configure` on their own account\n- Before a client-facing profiling session — verify readiness to prevent access failures mid-demo\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"am I set up to profile?\" → no flags (diagnostic mode)\n\"set me up for profiling\" → --configure\n\"what would configure change?\" → --configure --dry-run\n\"undo my configuration\" → --unconfigure\n\nCOMMAND SEQUENCE:\n`org details` → `user details` → `definition create` → `profile`\n\nThe scope is the authenticated user's profiling readiness: permission set assignment and API-Based Profiling enablement. It typically follows `org details` (confirming Cuneiform is installed) and precedes `definition create` (building profiling definitions).",
2417
+ "examples": [
2418
+ "First-time readiness check — confirm your user is configured before profiling:\n<%= config.bin %> <%= command.id %> --target-org myOrg",
2419
+ "Resolve all gaps at once — configure both touchpoints (permission set + API-Based Profiling) automatically:\n<%= config.bin %> <%= command.id %> --target-org myOrg --configure",
2420
+ "Change management preview — document what would change before applying:\n<%= config.bin %> <%= command.id %> --target-org myOrg --configure --dry-run",
2421
+ "Workshop onboarding — each participant configures their own account:\n<%= config.bin %> <%= command.id %> --target-org workshopOrg --configure",
2422
+ "Troubleshooting output — attach structured JSON to a support ticket when diagnosing access errors:\n<%= config.bin %> <%= command.id %> --target-org myOrg --json",
2423
+ "Environment cleanup — reverse a previous configure when decommissioning a sandbox:\n<%= config.bin %> <%= command.id %> --target-org myOrg --unconfigure"
2424
+ ],
2425
+ "flags": {
2426
+ "json": {
2427
+ "description": "Format output as json.",
2428
+ "helpGroup": "GLOBAL",
2429
+ "name": "json",
2430
+ "allowNo": false,
2431
+ "type": "boolean"
2432
+ },
2433
+ "flags-dir": {
2434
+ "helpGroup": "GLOBAL",
2435
+ "name": "flags-dir",
2436
+ "summary": "Import flag values from a directory.",
2437
+ "hasDynamicHelp": false,
2438
+ "multiple": false,
2439
+ "type": "option"
2440
+ },
2441
+ "target-org": {
2442
+ "char": "o",
2443
+ "name": "target-org",
2444
+ "noCacheDefault": true,
2445
+ "required": true,
2446
+ "summary": "The Salesforce org to check for profiling readiness. Specify the org alias or username when you have multiple authenticated orgs.",
2447
+ "hasDynamicHelp": true,
2448
+ "multiple": false,
2449
+ "type": "option"
2450
+ },
2451
+ "api-version": {
2452
+ "description": "Override the api version used for api requests made by this command",
2453
+ "name": "api-version",
2454
+ "summary": "Override the Salesforce API version for readiness checks. Use this when troubleshooting version-specific behavior or testing against a specific API release.",
2455
+ "hasDynamicHelp": false,
2456
+ "multiple": false,
2457
+ "type": "option"
2458
+ },
2459
+ "configure": {
2460
+ "char": "c",
2461
+ "exclusive": [
2462
+ "unconfigure"
2463
+ ],
2464
+ "name": "configure",
2465
+ "summary": "Resolve configuration gaps in one step. Assigns the required permission set via REST API and enables API-Based Profiling via Metadata API deployment. Idempotent — safe to run when already configured. Blocked in production orgs (Developer Edition, sandbox, scratch, and trial only).",
2466
+ "allowNo": false,
2467
+ "type": "boolean"
2468
+ },
2469
+ "unconfigure": {
2470
+ "exclusive": [
2471
+ "configure",
2472
+ "dry-run"
2473
+ ],
2474
+ "hidden": true,
2475
+ "name": "unconfigure",
2476
+ "summary": "Reverse a previous --configure by removing the permission set assignment and disabling API-Based Profiling on the Configuration Profile. Use this when decommissioning an environment or cleaning up access after testing.",
2477
+ "allowNo": false,
2478
+ "type": "boolean"
2479
+ },
2480
+ "dry-run": {
2481
+ "char": "d",
2482
+ "name": "dry-run",
2483
+ "summary": "Preview what --configure would change, applied to nothing. Shows which permission set would be assigned and which Configuration Profile settings would be enabled. Use this in regulated environments to document changes for approval before execution. Implies --configure.",
2484
+ "allowNo": false,
2485
+ "type": "boolean"
2486
+ }
2487
+ },
2488
+ "hasDynamicHelp": true,
2489
+ "hiddenAliases": [],
2490
+ "id": "cuneiform:user:details",
2491
+ "pluginAlias": "@peernova/cuneiform-sf",
2492
+ "pluginName": "@peernova/cuneiform-sf",
2493
+ "pluginType": "core",
2494
+ "strict": true,
2495
+ "summary": "Check whether the authenticated user is configured for profiling and resolve gaps — two configuration touchpoints verified and fixed in one command.",
2496
+ "enableJsonFlag": true,
2497
+ "skipAccessGate": true,
2498
+ "isESM": true,
2499
+ "relativePath": [
2500
+ "lib",
2501
+ "commands",
2502
+ "cuneiform",
2503
+ "user",
2504
+ "details.js"
2505
+ ],
2506
+ "aliasPermutations": [],
2507
+ "permutations": [
2508
+ "cuneiform:user:details",
2509
+ "user:cuneiform:details",
2510
+ "user:details:cuneiform",
2511
+ "cuneiform:details:user",
2512
+ "details:cuneiform:user",
2513
+ "details:user:cuneiform"
2514
+ ]
2515
+ },
2516
+ "cuneiform:profile:request:cancel": {
2517
+ "aliases": [],
2518
+ "args": {},
2519
+ "description": "When profiling is triggered, the system creates a request record that tracks execution. Requests begin in a Queued state, waiting for the backend to process them. This command transitions queued requests to Canceled status before processing begins — preventing them from generating summaries that would need to be identified and cleaned up later.\n\nIMPORTANT: Cancel applies to QUEUED requests only. Once a request has been processed and its summary is actively executing, the request is complete. To halt an in-progress summary, use `sf cuneiform summary stop` instead.\n\nTWO SELECTION MODES (mutually exclusive):\n\n- **Broad** (`--all`) — Cancel all cancellable requests (Queued status)\n- **Targeted** (`--request-ids`) — Cancel specific requests by Salesforce record ID\n\nSAFETY: Completed, rejected, and already-canceled requests are automatically excluded. Use --dry-run to preview what would be canceled before committing. A confirmation prompt shows the count before proceeding — use --no-prompt to skip for scripted use.\n\nCancellation transitions status only — it does not delete records. Canceled requests remain visible in `profile request list` until permanently removed with `profile request delete`.\n\nCANCEL vs STOP — these address different objects at different lifecycle stages:\n\n- **Cancel** prevents a Request from being processed. No Summary is created.\n- **Stop** halts an active Summary that is already executing. Preserves completed fields.\n\nBy the time a Summary exists, its originating Request is already complete. These operations do not overlap.\n\nWHEN TO USE:\n\n- Wrong definition submitted — cancel the queued request before it generates incorrect results\n- Pre-maintenance window — clear the queue before planned downtime\n- Configuration issue discovered — pause processing until the issue is resolved\n- Selective cleanup in shared orgs — cancel specific requests by ID while preserving valid requests\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"cancel everything in the queue\" → --all\n\"cancel just this one request\" → --request-ids a0Xxx0000001AAA\n\"what would be canceled?\" → --all --dry-run\n\"cancel without asking\" → --all --no-prompt\n\nCOMMAND SEQUENCE:\n`profile` or `profile request list` → **`profile request cancel`** → `profile request delete` (remove artifacts) or re-submit with corrected parameters",
2520
+ "examples": [
2521
+ "Preview what would be canceled — verify scope before committing:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --dry-run",
2522
+ "Cancel all queued requests — clear the processing queue before maintenance:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all",
2523
+ "Cancel specific requests by ID — targeted cancellation in shared orgs:\n<%= config.bin %> <%= command.id %> --target-org myOrg --request-ids a0Xxx0000001AAA,a0Xxx0000002BBB",
2524
+ "Cancel immediately for scripted workflows:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --no-prompt",
2525
+ "Cancel specific requests as JSON output for automation:\n<%= config.bin %> <%= command.id %> --target-org myOrg --request-ids a0Xxx0000001AAA --json"
2526
+ ],
2527
+ "flags": {
2528
+ "json": {
2529
+ "description": "Format output as json.",
2530
+ "helpGroup": "GLOBAL",
2531
+ "name": "json",
2532
+ "allowNo": false,
2533
+ "type": "boolean"
2534
+ },
2535
+ "flags-dir": {
2536
+ "helpGroup": "GLOBAL",
2537
+ "name": "flags-dir",
2538
+ "summary": "Import flag values from a directory.",
2539
+ "hasDynamicHelp": false,
2540
+ "multiple": false,
2541
+ "type": "option"
2542
+ },
2543
+ "target-org": {
2544
+ "char": "o",
2545
+ "name": "target-org",
2546
+ "noCacheDefault": true,
2547
+ "required": true,
2548
+ "summary": "Cancel profiling requests in this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.",
2549
+ "hasDynamicHelp": true,
2550
+ "multiple": false,
2551
+ "type": "option"
2552
+ },
2553
+ "api-version": {
2554
+ "description": "Override the api version used for api requests made by this command",
2555
+ "name": "api-version",
2556
+ "hasDynamicHelp": false,
2557
+ "multiple": false,
2558
+ "type": "option"
2559
+ },
2560
+ "all": {
2561
+ "char": "a",
2562
+ "exclusive": [
2563
+ "request-ids"
2564
+ ],
2565
+ "name": "all",
2566
+ "summary": "Cancel all queued requests in a single operation. Use for pre-maintenance windows, configuration corrections, or full queue pauses when processing should be deferred. Mutually exclusive with --request-ids.",
2567
+ "allowNo": false,
2568
+ "type": "boolean"
2569
+ },
2570
+ "request-ids": {
2571
+ "char": "i",
2572
+ "exclusive": [
2573
+ "all"
2574
+ ],
2575
+ "name": "request-ids",
2576
+ "summary": "Cancel specific profiling requests by Salesforce record ID (comma-separated). Use for targeted cancellation when only some queued requests are problematic — preserving valid requests in shared environments. Find request IDs with `profile request list`. Mutually exclusive with --all.",
2577
+ "hasDynamicHelp": false,
2578
+ "multiple": true,
2579
+ "type": "option"
2580
+ },
2581
+ "dry-run": {
2582
+ "char": "d",
2583
+ "name": "dry-run",
2584
+ "summary": "Preview which requests would be canceled, showing the same request details as a real cancellation. Use first in production orgs or shared environments to verify scope before committing — particularly important when other users have valid requests in the queue.",
2585
+ "allowNo": false,
2586
+ "type": "boolean"
2587
+ },
2588
+ "no-prompt": {
2589
+ "char": "y",
2590
+ "name": "no-prompt",
2591
+ "summary": "Skip the confirmation prompt and cancel immediately. Use in scripts or automation where interactive prompts are not available. JSON mode also skips the prompt.",
2592
+ "allowNo": false,
2593
+ "type": "boolean"
2594
+ }
2595
+ },
2596
+ "hasDynamicHelp": true,
2597
+ "hiddenAliases": [],
2598
+ "id": "cuneiform:profile:request:cancel",
2599
+ "pluginAlias": "@peernova/cuneiform-sf",
2600
+ "pluginName": "@peernova/cuneiform-sf",
2601
+ "pluginType": "core",
2602
+ "strict": true,
2603
+ "summary": "Transition queued profiling requests to Canceled status before they begin processing — prevent incorrect or unnecessary requests from generating summaries.",
2604
+ "enableJsonFlag": true,
2605
+ "skipAccessGate": false,
2606
+ "ERROR_CODE_MAP": {
2607
+ "E4903": "errors.invalidIds",
2608
+ "E4904": "errors.noCancellable",
2609
+ "E4902": "errors.cancelFailed",
2610
+ "E4905": "errors.partialFailure"
2611
+ },
2612
+ "isESM": true,
2613
+ "relativePath": [
2614
+ "lib",
2615
+ "commands",
2616
+ "cuneiform",
2617
+ "profile",
2618
+ "request",
2619
+ "cancel.js"
2620
+ ],
2621
+ "aliasPermutations": [],
2622
+ "permutations": [
2623
+ "cuneiform:profile:request:cancel",
2624
+ "profile:cuneiform:request:cancel",
2625
+ "profile:request:cuneiform:cancel",
2626
+ "profile:request:cancel:cuneiform",
2627
+ "cuneiform:request:profile:cancel",
2628
+ "request:cuneiform:profile:cancel",
2629
+ "request:profile:cuneiform:cancel",
2630
+ "request:profile:cancel:cuneiform",
2631
+ "cuneiform:request:cancel:profile",
2632
+ "request:cuneiform:cancel:profile",
2633
+ "request:cancel:cuneiform:profile",
2634
+ "request:cancel:profile:cuneiform",
2635
+ "cuneiform:profile:cancel:request",
2636
+ "profile:cuneiform:cancel:request",
2637
+ "profile:cancel:cuneiform:request",
2638
+ "profile:cancel:request:cuneiform",
2639
+ "cuneiform:cancel:profile:request",
2640
+ "cancel:cuneiform:profile:request",
2641
+ "cancel:profile:cuneiform:request",
2642
+ "cancel:profile:request:cuneiform",
2643
+ "cuneiform:cancel:request:profile",
2644
+ "cancel:cuneiform:request:profile",
2645
+ "cancel:request:cuneiform:profile",
2646
+ "cancel:request:profile:cuneiform"
2647
+ ]
2648
+ },
2649
+ "cuneiform:profile:request:delete": {
2650
+ "aliases": [],
2651
+ "args": {},
2652
+ "description": "Every profiling run begins with a request record that tracks who initiated profiling, which definition was targeted, and the execution outcome. Canceled and rejected requests are terminal — they never produced a summary and serve no ongoing purpose. This command permanently removes them.\n\nELIGIBLE STATUSES: Only Canceled and Rejected requests can be deleted. The eligibility filter is enforced at the query level — Queued and Completed requests are structurally excluded.\n\nPROTECTED STATUSES: Completed requests maintain the profiling user context reference needed for reprofiling. They are cascade-deleted automatically when their summary is purged via `summary purge`. Queued requests must be canceled first with `profile request cancel` before they become eligible for deletion.\n\nTWO SELECTION MODES (mutually exclusive):\n\n- **Broad** (`--all`) — Delete all deletable requests (Canceled and Rejected)\n- **Targeted** (`--request-ids`) — Delete specific requests by Salesforce record ID\n\nLIFECYCLE CONTEXT: Delete removes terminal, summary-less requests:\n\n1. `profile request cancel` — transition queued requests to Canceled status\n2. `profile request delete` — permanently remove Canceled and Rejected requests\n3. `summary purge` — cascade-deletes Completed requests automatically\n\nWHEN TO USE:\n\n- Post-cancellation cleanup — remove canceled request artifacts after resolving the issue\n- Engagement close-out — clean up the request history before org handoff\n- Periodic housekeeping — remove old canceled and rejected requests to keep the request list focused\n- CI pipeline reset — automate scratch org cleanup between test runs\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"delete all processed requests\" → --all\n\"delete just this one request\" → --request-ids a0Xxx0000001AAA\n\"what would be deleted?\" → --all --dry-run\n\"delete without asking\" → --all --no-prompt\n\nCOMMAND SEQUENCE: `profile request cancel` (cancel queued requests) → `profile request delete` (remove canceled/rejected) → `summary purge` (remove summaries, cascade-delete completed requests) → `definition purge` (remove definitions)",
2653
+ "examples": [
2654
+ "Preview what would be deleted (deletion is permanent — always preview first):\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --dry-run",
2655
+ "Delete all canceled and rejected requests after resolving the underlying issues:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all",
2656
+ "Delete specific requests by ID for targeted cleanup:\n<%= config.bin %> <%= command.id %> --target-org myOrg --request-ids a0Xxx0000001AAA,a0Xxx0000002BBB",
2657
+ "Scripted scratch org reset in CI pipelines:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --no-prompt",
2658
+ "Capture deletion results as JSON for engagement close-out documentation:\n<%= config.bin %> <%= command.id %> --target-org myOrg --all --json"
2659
+ ],
2660
+ "flags": {
2661
+ "json": {
2662
+ "description": "Format output as json.",
2663
+ "helpGroup": "GLOBAL",
2664
+ "name": "json",
2665
+ "allowNo": false,
2666
+ "type": "boolean"
2667
+ },
2668
+ "flags-dir": {
2669
+ "helpGroup": "GLOBAL",
2670
+ "name": "flags-dir",
2671
+ "summary": "Import flag values from a directory.",
2672
+ "hasDynamicHelp": false,
2673
+ "multiple": false,
2674
+ "type": "option"
2675
+ },
2676
+ "target-org": {
2677
+ "char": "o",
2678
+ "name": "target-org",
2679
+ "noCacheDefault": true,
2680
+ "required": true,
2681
+ "summary": "Salesforce org containing the profiling requests to delete. The command validates Cuneiform installation before executing.",
2682
+ "hasDynamicHelp": true,
2683
+ "multiple": false,
2684
+ "type": "option"
2685
+ },
2686
+ "api-version": {
2687
+ "description": "Override the api version used for api requests made by this command",
2688
+ "name": "api-version",
2689
+ "hasDynamicHelp": false,
2690
+ "multiple": false,
2691
+ "type": "option"
2692
+ },
2693
+ "all": {
2694
+ "char": "a",
2695
+ "exclusive": [
2696
+ "request-ids"
2697
+ ],
2698
+ "name": "all",
2699
+ "summary": "Delete all deletable requests (Canceled and Rejected status). Targets request artifacts that never produced summaries. Completed requests are excluded — they are cascade-deleted when their summary is purged. Mutually exclusive with --request-ids.",
2700
+ "allowNo": false,
2701
+ "type": "boolean"
2702
+ },
2703
+ "request-ids": {
2704
+ "char": "i",
2705
+ "exclusive": [
2706
+ "all"
2707
+ ],
2708
+ "name": "request-ids",
2709
+ "summary": "Specific profiling request IDs to delete (e.g., --request-ids a0Xxx0000001AAA,a0Xxx0000002BBB). Targets individual canceled or rejected requests. Look up request IDs with `profile request list`. Mutually exclusive with --all.",
2710
+ "hasDynamicHelp": false,
2711
+ "multiple": true,
2712
+ "type": "option"
2713
+ },
2714
+ "dry-run": {
2715
+ "char": "d",
2716
+ "name": "dry-run",
2717
+ "summary": "Preview what would be deleted without making changes. Shows the same request details and counts as a real deletion. Use this first — deletion is permanent and cannot be undone.",
2718
+ "allowNo": false,
2719
+ "type": "boolean"
2720
+ },
2721
+ "no-prompt": {
2722
+ "char": "y",
2723
+ "name": "no-prompt",
2724
+ "summary": "Skip the confirmation prompt and delete immediately. Use for scripted cleanup in CI pipelines and automation workflows. The irreversibility warning is bypassed — the caller accepts permanent deletion programmatically.",
2725
+ "allowNo": false,
2726
+ "type": "boolean"
2727
+ }
2728
+ },
2729
+ "hasDynamicHelp": true,
2730
+ "hiddenAliases": [],
2731
+ "id": "cuneiform:profile:request:delete",
2732
+ "pluginAlias": "@peernova/cuneiform-sf",
2733
+ "pluginName": "@peernova/cuneiform-sf",
2734
+ "pluginType": "core",
2735
+ "strict": true,
2736
+ "summary": "Permanently remove canceled and rejected profiling requests — cleaning up terminal request artifacts that never produced a summary.",
2737
+ "enableJsonFlag": true,
2738
+ "skipAccessGate": false,
2739
+ "ERROR_CODE_MAP": {
2740
+ "E4903": "errors.invalidIds",
2741
+ "E4908": "errors.noDeletable",
2742
+ "E4906": "errors.deleteFailed",
2743
+ "E4909": "errors.partialFailure"
2744
+ },
2745
+ "isESM": true,
2746
+ "relativePath": [
2747
+ "lib",
2748
+ "commands",
2749
+ "cuneiform",
2750
+ "profile",
2751
+ "request",
2752
+ "delete.js"
2753
+ ],
2754
+ "aliasPermutations": [],
2755
+ "permutations": [
2756
+ "cuneiform:profile:request:delete",
2757
+ "profile:cuneiform:request:delete",
2758
+ "profile:request:cuneiform:delete",
2759
+ "profile:request:delete:cuneiform",
2760
+ "cuneiform:request:profile:delete",
2761
+ "request:cuneiform:profile:delete",
2762
+ "request:profile:cuneiform:delete",
2763
+ "request:profile:delete:cuneiform",
2764
+ "cuneiform:request:delete:profile",
2765
+ "request:cuneiform:delete:profile",
2766
+ "request:delete:cuneiform:profile",
2767
+ "request:delete:profile:cuneiform",
2768
+ "cuneiform:profile:delete:request",
2769
+ "profile:cuneiform:delete:request",
2770
+ "profile:delete:cuneiform:request",
2771
+ "profile:delete:request:cuneiform",
2772
+ "cuneiform:delete:profile:request",
2773
+ "delete:cuneiform:profile:request",
2774
+ "delete:profile:cuneiform:request",
2775
+ "delete:profile:request:cuneiform",
2776
+ "cuneiform:delete:request:profile",
2777
+ "delete:cuneiform:request:profile",
2778
+ "delete:request:cuneiform:profile",
2779
+ "delete:request:profile:cuneiform"
2780
+ ]
2781
+ },
2782
+ "cuneiform:profile:request:list": {
2783
+ "aliases": [],
2784
+ "args": {},
2785
+ "description": "Profiling requests are the execution records of the KYCD journey — each one tracks who submitted profiling, against which definition, and the outcome. This command retrieves those records and displays them as a six-column table: request name, status, target object, parent definition name, submitted by (user), and created date.\n\nThe command is read-only. For cancelling queued requests, use `profile request cancel`. For deleting terminal requests, use `profile request delete`.\n\nLIFECYCLE CONTEXT: Profiling requests are created when `sf cuneiform profile` runs. Each request starts as Queued and ends in one of three terminal states: Completed (summary created and executing independently), Rejected (validation failed or capacity exceeded), or Canceled (user stopped it before processing). There are exactly 4 request statuses.\n\nWHEN TO USE:\n\n- After submitting profiling — \"Did my requests complete? Are they still queued?\"\n- To triage rejections — filter by Rejected status to isolate problematic requests\n- For multi-user coordination — the submitted-by column shows who triggered each request\n- To check queue depth — see how many requests are waiting to be processed\n\nRELATED COMMANDS:\n\n- `sf cuneiform profile` — creates the requests this command lists\n- `sf cuneiform profile request cancel` — cancel queued requests that should not be processed\n- `sf cuneiform profile request delete` — permanently remove processed requests\n- `sf cuneiform definition get` — check profiling results at the definition level\n\nNATURAL LANGUAGE → FLAG MAPPING:\n\"show me all requests\" → (no flags, lists all)\n\"what's still queued?\" → --status Queued\n\"were any rejected?\" → --status Rejected\n\"show canceled requests\" → --status Canceled\n\"show more results\" → --limit 100\n\nCOMMAND SEQUENCE:\n`profile` → **`profile request list`** → `profile request cancel` or `summary stop` (when intervention is needed)",
2786
+ "examples": [
2787
+ "List all profiling requests — monitor progress after submitting profiling:\n<%= config.bin %> <%= command.id %> --target-org myOrg",
2788
+ "Triage rejected requests — isolate requests that need attention:\n<%= config.bin %> <%= command.id %> --target-org myOrg --status Rejected",
2789
+ "Check queue depth — see how many requests are waiting for processing:\n<%= config.bin %> <%= command.id %> --target-org myOrg --status Queued",
2790
+ "Confirm completed requests — verify which requests produced summaries:\n<%= config.bin %> <%= command.id %> --target-org myOrg --status Completed",
2791
+ "View more results in a large profiling run:\n<%= config.bin %> <%= command.id %> --target-org myOrg --limit 100",
2792
+ "Produce machine-readable output for scripting or dashboards:\n<%= config.bin %> <%= command.id %> --target-org myOrg --json"
2793
+ ],
2794
+ "flags": {
2795
+ "json": {
2796
+ "description": "Format output as json.",
2797
+ "helpGroup": "GLOBAL",
2798
+ "name": "json",
2799
+ "allowNo": false,
2800
+ "type": "boolean"
2801
+ },
2802
+ "flags-dir": {
2803
+ "helpGroup": "GLOBAL",
2804
+ "name": "flags-dir",
2805
+ "summary": "Import flag values from a directory.",
2806
+ "hasDynamicHelp": false,
2807
+ "multiple": false,
2808
+ "type": "option"
2809
+ },
2810
+ "target-org": {
2811
+ "char": "o",
2812
+ "name": "target-org",
2813
+ "noCacheDefault": true,
2814
+ "required": true,
2815
+ "summary": "Retrieve profiling requests from this Salesforce org. Specify the org alias or username when you have multiple authenticated orgs.",
2816
+ "hasDynamicHelp": true,
2817
+ "multiple": false,
2818
+ "type": "option"
2819
+ },
2820
+ "api-version": {
2821
+ "description": "Override the api version used for api requests made by this command",
2822
+ "name": "api-version",
2823
+ "hasDynamicHelp": false,
2824
+ "multiple": false,
2825
+ "type": "option"
2826
+ },
2827
+ "status": {
2828
+ "char": "s",
2829
+ "name": "status",
2830
+ "summary": "Filter by request lifecycle status: Queued (waiting to be processed), Completed (summary created and executing), Rejected (validation failed or capacity exceeded), or Canceled (stopped before processing). There are exactly 4 valid values. Use --status Rejected for triage or --status Queued to check queue depth.",
2831
+ "hasDynamicHelp": false,
2832
+ "multiple": false,
2833
+ "options": [
2834
+ "Queued",
2835
+ "Canceled",
2836
+ "Completed",
2837
+ "Rejected"
2838
+ ],
2839
+ "type": "option"
2840
+ },
2841
+ "limit": {
2842
+ "char": "l",
2843
+ "name": "limit",
2844
+ "summary": "Control how many requests are displayed per page (default: 25, max: 200). Increase for large profiling runs where 25 results may not show the full picture.",
2845
+ "default": 25,
2846
+ "hasDynamicHelp": false,
2847
+ "multiple": false,
2848
+ "type": "option"
2849
+ }
2850
+ },
2851
+ "hasDynamicHelp": true,
2852
+ "hiddenAliases": [],
2853
+ "id": "cuneiform:profile:request:list",
2854
+ "pluginAlias": "@peernova/cuneiform-sf",
2855
+ "pluginName": "@peernova/cuneiform-sf",
2856
+ "pluginType": "core",
2857
+ "strict": true,
2858
+ "summary": "Retrieve profiling request execution records — see which requests are queued, completed, rejected, or canceled across the org.",
2859
+ "enableJsonFlag": true,
2860
+ "skipAccessGate": false,
2861
+ "isESM": true,
2862
+ "relativePath": [
2863
+ "lib",
2864
+ "commands",
2865
+ "cuneiform",
2866
+ "profile",
2867
+ "request",
2868
+ "list.js"
109
2869
  ],
110
2870
  "aliasPermutations": [],
111
2871
  "permutations": [
112
- "hello:world",
113
- "world:hello"
2872
+ "cuneiform:profile:request:list",
2873
+ "profile:cuneiform:request:list",
2874
+ "profile:request:cuneiform:list",
2875
+ "profile:request:list:cuneiform",
2876
+ "cuneiform:request:profile:list",
2877
+ "request:cuneiform:profile:list",
2878
+ "request:profile:cuneiform:list",
2879
+ "request:profile:list:cuneiform",
2880
+ "cuneiform:request:list:profile",
2881
+ "request:cuneiform:list:profile",
2882
+ "request:list:cuneiform:profile",
2883
+ "request:list:profile:cuneiform",
2884
+ "cuneiform:profile:list:request",
2885
+ "profile:cuneiform:list:request",
2886
+ "profile:list:cuneiform:request",
2887
+ "profile:list:request:cuneiform",
2888
+ "cuneiform:list:profile:request",
2889
+ "list:cuneiform:profile:request",
2890
+ "list:profile:cuneiform:request",
2891
+ "list:profile:request:cuneiform",
2892
+ "cuneiform:list:request:profile",
2893
+ "list:cuneiform:request:profile",
2894
+ "list:request:cuneiform:profile",
2895
+ "list:request:profile:cuneiform"
114
2896
  ]
115
2897
  }
116
2898
  },
117
- "version": "1.0.2"
2899
+ "version": "1.0.4-beta.8"
118
2900
  }