sfdx-hardis 6.0.7-beta202508172156.0 → 6.0.7-beta202508202323.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4407,6 +4407,135 @@
4407
4407
  "ws:work:hardis"
4408
4408
  ]
4409
4409
  },
4410
+ "hardis:git:pull-requests:extract": {
4411
+ "aliases": [],
4412
+ "args": {},
4413
+ "description": "\n## Command Behavior\n\n**Extracts pull request information from your Git server based on specified filtering criteria.**\n\nThis command provides a powerful way to query and retrieve details about pull requests (or merge requests, depending on your Git provider) in your repository. It's highly useful for reporting, auditing, and analyzing development workflows.\n\nKey functionalities include:\n\n- **Target Branch Filtering:** You can filter pull requests by their target branch using the `--target-branch` flag. If not specified, the command will prompt you to select one.\n- **Status Filtering:** Filter pull requests by their status: `open`, `merged`, or `abandoned` using the `--status` flag. An interactive prompt is provided if no status is specified.\n- **Minimum Date Filtering:** Use the `--min-date` flag to retrieve pull requests created or updated after a specific date.\n- **CSV Output:** The extracted pull request data is generated into a CSV file, which can be used for further analysis in spreadsheet software.\n\n<details markdown=\"1\">\n<summary>Technical explanations</summary>\n\nThe command's technical implementation involves interacting with a Git provider's API:\n\n- **Git Provider Abstraction:** It uses the `GitProvider.getInstance(true)` to abstract away the specifics of different Git platforms (e.g., GitHub, GitLab, Azure DevOps). This ensures the command can work across various environments.\n- **API Calls:** The `gitProvider.listPullRequests()` method is called with a `prConstraint` object that encapsulates the filtering criteria (target branch, minimum date, status).\n- **Interactive Prompts:** The `prompts` library is used to interactively gather input from the user for the target branch and pull request status if they are not provided as command-line flags.\n- **Date Handling:** The `moment` library is used to parse and handle date inputs for the `--min-date` flag.\n- **CSV Generation:** The `generateCsvFile` utility is responsible for converting the retrieved pull request data into a CSV format, and `generateReportPath` determines the output file location.\n- **Error Handling:** It includes error handling for cases where a Git provider cannot be identified.\n</details>\n",
4414
+ "examples": [
4415
+ "$ sf hardis:git:pull-requests:extract",
4416
+ "$ sf hardis:git:pull-requests:extract --target-branch main --status merged"
4417
+ ],
4418
+ "flags": {
4419
+ "json": {
4420
+ "description": "Format output as json.",
4421
+ "helpGroup": "GLOBAL",
4422
+ "name": "json",
4423
+ "allowNo": false,
4424
+ "type": "boolean"
4425
+ },
4426
+ "flags-dir": {
4427
+ "helpGroup": "GLOBAL",
4428
+ "name": "flags-dir",
4429
+ "summary": "Import flag values from a directory.",
4430
+ "hasDynamicHelp": false,
4431
+ "multiple": false,
4432
+ "type": "option"
4433
+ },
4434
+ "target-branch": {
4435
+ "char": "t",
4436
+ "description": "Target branch of PRs",
4437
+ "name": "target-branch",
4438
+ "hasDynamicHelp": false,
4439
+ "multiple": false,
4440
+ "type": "option"
4441
+ },
4442
+ "status": {
4443
+ "char": "x",
4444
+ "description": "Status of the PR",
4445
+ "name": "status",
4446
+ "hasDynamicHelp": false,
4447
+ "multiple": false,
4448
+ "options": [
4449
+ "open",
4450
+ "merged",
4451
+ "abandoned"
4452
+ ],
4453
+ "type": "option"
4454
+ },
4455
+ "min-date": {
4456
+ "char": "m",
4457
+ "description": "Minimum date for PR",
4458
+ "name": "min-date",
4459
+ "hasDynamicHelp": false,
4460
+ "multiple": false,
4461
+ "type": "option"
4462
+ },
4463
+ "outputfile": {
4464
+ "char": "f",
4465
+ "description": "Force the path and name of output report file. Must end with .csv",
4466
+ "name": "outputfile",
4467
+ "hasDynamicHelp": false,
4468
+ "multiple": false,
4469
+ "type": "option"
4470
+ },
4471
+ "debug": {
4472
+ "char": "d",
4473
+ "description": "Activate debug mode (more logs)",
4474
+ "name": "debug",
4475
+ "allowNo": false,
4476
+ "type": "boolean"
4477
+ },
4478
+ "websocket": {
4479
+ "description": "Websocket host:port for VsCode SFDX Hardis UI integration",
4480
+ "name": "websocket",
4481
+ "hasDynamicHelp": false,
4482
+ "multiple": false,
4483
+ "type": "option"
4484
+ },
4485
+ "skipauth": {
4486
+ "description": "Skip authentication check when a default username is required",
4487
+ "name": "skipauth",
4488
+ "allowNo": false,
4489
+ "type": "boolean"
4490
+ }
4491
+ },
4492
+ "hasDynamicHelp": false,
4493
+ "hiddenAliases": [],
4494
+ "id": "hardis:git:pull-requests:extract",
4495
+ "pluginAlias": "sfdx-hardis",
4496
+ "pluginName": "sfdx-hardis",
4497
+ "pluginType": "core",
4498
+ "strict": true,
4499
+ "enableJsonFlag": true,
4500
+ "title": "Extract pull requests",
4501
+ "requiresProject": true,
4502
+ "isESM": true,
4503
+ "relativePath": [
4504
+ "lib",
4505
+ "commands",
4506
+ "hardis",
4507
+ "git",
4508
+ "pull-requests",
4509
+ "extract.js"
4510
+ ],
4511
+ "aliasPermutations": [],
4512
+ "permutations": [
4513
+ "hardis:git:pull-requests:extract",
4514
+ "git:hardis:pull-requests:extract",
4515
+ "git:pull-requests:hardis:extract",
4516
+ "git:pull-requests:extract:hardis",
4517
+ "hardis:pull-requests:git:extract",
4518
+ "pull-requests:hardis:git:extract",
4519
+ "pull-requests:git:hardis:extract",
4520
+ "pull-requests:git:extract:hardis",
4521
+ "hardis:pull-requests:extract:git",
4522
+ "pull-requests:hardis:extract:git",
4523
+ "pull-requests:extract:hardis:git",
4524
+ "pull-requests:extract:git:hardis",
4525
+ "hardis:git:extract:pull-requests",
4526
+ "git:hardis:extract:pull-requests",
4527
+ "git:extract:hardis:pull-requests",
4528
+ "git:extract:pull-requests:hardis",
4529
+ "hardis:extract:git:pull-requests",
4530
+ "extract:hardis:git:pull-requests",
4531
+ "extract:git:hardis:pull-requests",
4532
+ "extract:git:pull-requests:hardis",
4533
+ "hardis:extract:pull-requests:git",
4534
+ "extract:hardis:pull-requests:git",
4535
+ "extract:pull-requests:hardis:git",
4536
+ "extract:pull-requests:git:hardis"
4537
+ ]
4538
+ },
4410
4539
  "hardis:doc:extract:permsetgroups": {
4411
4540
  "aliases": [],
4412
4541
  "args": {},
@@ -4597,135 +4726,6 @@
4597
4726
  "generate:plugin:doc:hardis"
4598
4727
  ]
4599
4728
  },
4600
- "hardis:git:pull-requests:extract": {
4601
- "aliases": [],
4602
- "args": {},
4603
- "description": "\n## Command Behavior\n\n**Extracts pull request information from your Git server based on specified filtering criteria.**\n\nThis command provides a powerful way to query and retrieve details about pull requests (or merge requests, depending on your Git provider) in your repository. It's highly useful for reporting, auditing, and analyzing development workflows.\n\nKey functionalities include:\n\n- **Target Branch Filtering:** You can filter pull requests by their target branch using the `--target-branch` flag. If not specified, the command will prompt you to select one.\n- **Status Filtering:** Filter pull requests by their status: `open`, `merged`, or `abandoned` using the `--status` flag. An interactive prompt is provided if no status is specified.\n- **Minimum Date Filtering:** Use the `--min-date` flag to retrieve pull requests created or updated after a specific date.\n- **CSV Output:** The extracted pull request data is generated into a CSV file, which can be used for further analysis in spreadsheet software.\n\n<details markdown=\"1\">\n<summary>Technical explanations</summary>\n\nThe command's technical implementation involves interacting with a Git provider's API:\n\n- **Git Provider Abstraction:** It uses the `GitProvider.getInstance(true)` to abstract away the specifics of different Git platforms (e.g., GitHub, GitLab, Azure DevOps). This ensures the command can work across various environments.\n- **API Calls:** The `gitProvider.listPullRequests()` method is called with a `prConstraint` object that encapsulates the filtering criteria (target branch, minimum date, status).\n- **Interactive Prompts:** The `prompts` library is used to interactively gather input from the user for the target branch and pull request status if they are not provided as command-line flags.\n- **Date Handling:** The `moment` library is used to parse and handle date inputs for the `--min-date` flag.\n- **CSV Generation:** The `generateCsvFile` utility is responsible for converting the retrieved pull request data into a CSV format, and `generateReportPath` determines the output file location.\n- **Error Handling:** It includes error handling for cases where a Git provider cannot be identified.\n</details>\n",
4604
- "examples": [
4605
- "$ sf hardis:git:pull-requests:extract",
4606
- "$ sf hardis:git:pull-requests:extract --target-branch main --status merged"
4607
- ],
4608
- "flags": {
4609
- "json": {
4610
- "description": "Format output as json.",
4611
- "helpGroup": "GLOBAL",
4612
- "name": "json",
4613
- "allowNo": false,
4614
- "type": "boolean"
4615
- },
4616
- "flags-dir": {
4617
- "helpGroup": "GLOBAL",
4618
- "name": "flags-dir",
4619
- "summary": "Import flag values from a directory.",
4620
- "hasDynamicHelp": false,
4621
- "multiple": false,
4622
- "type": "option"
4623
- },
4624
- "target-branch": {
4625
- "char": "t",
4626
- "description": "Target branch of PRs",
4627
- "name": "target-branch",
4628
- "hasDynamicHelp": false,
4629
- "multiple": false,
4630
- "type": "option"
4631
- },
4632
- "status": {
4633
- "char": "x",
4634
- "description": "Status of the PR",
4635
- "name": "status",
4636
- "hasDynamicHelp": false,
4637
- "multiple": false,
4638
- "options": [
4639
- "open",
4640
- "merged",
4641
- "abandoned"
4642
- ],
4643
- "type": "option"
4644
- },
4645
- "min-date": {
4646
- "char": "m",
4647
- "description": "Minimum date for PR",
4648
- "name": "min-date",
4649
- "hasDynamicHelp": false,
4650
- "multiple": false,
4651
- "type": "option"
4652
- },
4653
- "outputfile": {
4654
- "char": "f",
4655
- "description": "Force the path and name of output report file. Must end with .csv",
4656
- "name": "outputfile",
4657
- "hasDynamicHelp": false,
4658
- "multiple": false,
4659
- "type": "option"
4660
- },
4661
- "debug": {
4662
- "char": "d",
4663
- "description": "Activate debug mode (more logs)",
4664
- "name": "debug",
4665
- "allowNo": false,
4666
- "type": "boolean"
4667
- },
4668
- "websocket": {
4669
- "description": "Websocket host:port for VsCode SFDX Hardis UI integration",
4670
- "name": "websocket",
4671
- "hasDynamicHelp": false,
4672
- "multiple": false,
4673
- "type": "option"
4674
- },
4675
- "skipauth": {
4676
- "description": "Skip authentication check when a default username is required",
4677
- "name": "skipauth",
4678
- "allowNo": false,
4679
- "type": "boolean"
4680
- }
4681
- },
4682
- "hasDynamicHelp": false,
4683
- "hiddenAliases": [],
4684
- "id": "hardis:git:pull-requests:extract",
4685
- "pluginAlias": "sfdx-hardis",
4686
- "pluginName": "sfdx-hardis",
4687
- "pluginType": "core",
4688
- "strict": true,
4689
- "enableJsonFlag": true,
4690
- "title": "Extract pull requests",
4691
- "requiresProject": true,
4692
- "isESM": true,
4693
- "relativePath": [
4694
- "lib",
4695
- "commands",
4696
- "hardis",
4697
- "git",
4698
- "pull-requests",
4699
- "extract.js"
4700
- ],
4701
- "aliasPermutations": [],
4702
- "permutations": [
4703
- "hardis:git:pull-requests:extract",
4704
- "git:hardis:pull-requests:extract",
4705
- "git:pull-requests:hardis:extract",
4706
- "git:pull-requests:extract:hardis",
4707
- "hardis:pull-requests:git:extract",
4708
- "pull-requests:hardis:git:extract",
4709
- "pull-requests:git:hardis:extract",
4710
- "pull-requests:git:extract:hardis",
4711
- "hardis:pull-requests:extract:git",
4712
- "pull-requests:hardis:extract:git",
4713
- "pull-requests:extract:hardis:git",
4714
- "pull-requests:extract:git:hardis",
4715
- "hardis:git:extract:pull-requests",
4716
- "git:hardis:extract:pull-requests",
4717
- "git:extract:hardis:pull-requests",
4718
- "git:extract:pull-requests:hardis",
4719
- "hardis:extract:git:pull-requests",
4720
- "extract:hardis:git:pull-requests",
4721
- "extract:git:hardis:pull-requests",
4722
- "extract:git:pull-requests:hardis",
4723
- "hardis:extract:pull-requests:git",
4724
- "extract:hardis:pull-requests:git",
4725
- "extract:pull-requests:hardis:git",
4726
- "extract:pull-requests:git:hardis"
4727
- ]
4728
- },
4729
4729
  "hardis:org:community:update": {
4730
4730
  "aliases": [],
4731
4731
  "args": {},
@@ -5751,6 +5751,121 @@
5751
5751
  "import:files:org:hardis"
5752
5752
  ]
5753
5753
  },
5754
+ "hardis:org:fix:listviewmine": {
5755
+ "aliases": [],
5756
+ "args": {},
5757
+ "description": "Fix listviews whose scope Mine has been replaced by Everything\n\n[![Invalid scope:Mine, not allowed ? Deploy your ListViews anyway !](https://github.com/hardisgroupcom/sfdx-hardis/raw/main/docs/assets/images/article-invalid-scope-mine.jpg)](https://nicolas.vuillamy.fr/invalid-scope-mine-not-allowed-deploy-your-listviews-anyway-443aceca8ac7)\n\nList of ListViews can be:\n\n- read from .sfdx-hardis.yml file in property **listViewsToSetToMine**\n- sent in argument listviews\n\nNote: property **listViewsToSetToMine** can be auto-generated by command hardis:work:save if .sfdx-hardis.yml contains the following configuration\n\n```yaml\nautoCleanTypes:\n - listViewsMine\n```\n\n- Example of sfdx-hardis.yml property `listViewsToSetToMine`:\n\n```yaml\nlistViewsToSetToMine:\n - \"force-app/main/default/objects/Operation__c/listViews/MyCurrentOperations.listView-meta.xml\"\n - \"force-app/main/default/objects/Operation__c/listViews/MyFinalizedOperations.listView-meta.xml\"\n - \"force-app/main/default/objects/Opportunity/listViews/Default_Opportunity_Pipeline.listView-meta.xml\"\n - \"force-app/main/default/objects/Opportunity/listViews/MyCurrentSubscriptions.listView-meta.xml\"\n - \"force-app/main/default/objects/Opportunity/listViews/MySubscriptions.listView-meta.xml\"\n - \"force-app/main/default/objects/Account/listViews/MyActivePartners.listView-meta.xml\"\n```\n\n- If manually written, this could also be:\n\n```yaml\nlistViewsToSetToMine:\n - \"Operation__c:MyCurrentOperations\"\n - \"Operation__c:MyFinalizedOperations\"\n - \"Opportunity:Default_Opportunity_Pipeline\"\n - \"Opportunity:MyCurrentSubscriptions\"\n - \"Opportunity:MySubscriptions\"\n - \"Account:MyActivePartners\"\n```\n\nTroubleshooting: if you need to run this command from an alpine-linux based docker image, use this workaround in your dockerfile:\n\n```dockerfile\n# Do not use puppeteer embedded chromium\nRUN apk add --update --no-cache chromium\nENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=\"true\"\nENV CHROMIUM_PATH=\"/usr/bin/chromium-browser\"\nENV PUPPETEER_EXECUTABLE_PATH=\"$\\{CHROMIUM_PATH}\" // remove \\ before {\n```\n",
5758
+ "examples": [
5759
+ "$ sf hardis:org:fix:listviewmine",
5760
+ "$ sf hardis:org:fix:listviewmine --listviews Opportunity:MySubscriptions,Account:MyActivePartners"
5761
+ ],
5762
+ "flags": {
5763
+ "json": {
5764
+ "description": "Format output as json.",
5765
+ "helpGroup": "GLOBAL",
5766
+ "name": "json",
5767
+ "allowNo": false,
5768
+ "type": "boolean"
5769
+ },
5770
+ "flags-dir": {
5771
+ "helpGroup": "GLOBAL",
5772
+ "name": "flags-dir",
5773
+ "summary": "Import flag values from a directory.",
5774
+ "hasDynamicHelp": false,
5775
+ "multiple": false,
5776
+ "type": "option"
5777
+ },
5778
+ "listviews": {
5779
+ "char": "l",
5780
+ "description": "Comma-separated list of listviews following format Object:ListViewName\nExample: Contact:MyContacts,Contact:MyActiveContacts,Opportunity:MYClosedOpportunities",
5781
+ "name": "listviews",
5782
+ "hasDynamicHelp": false,
5783
+ "multiple": false,
5784
+ "type": "option"
5785
+ },
5786
+ "debug": {
5787
+ "char": "d",
5788
+ "description": "Activate debug mode (more logs)",
5789
+ "name": "debug",
5790
+ "allowNo": false,
5791
+ "type": "boolean"
5792
+ },
5793
+ "websocket": {
5794
+ "description": "Websocket host:port for VsCode SFDX Hardis UI integration",
5795
+ "name": "websocket",
5796
+ "hasDynamicHelp": false,
5797
+ "multiple": false,
5798
+ "type": "option"
5799
+ },
5800
+ "skipauth": {
5801
+ "description": "Skip authentication check when a default username is required",
5802
+ "name": "skipauth",
5803
+ "allowNo": false,
5804
+ "type": "boolean"
5805
+ },
5806
+ "target-org": {
5807
+ "aliases": [
5808
+ "targetusername",
5809
+ "u"
5810
+ ],
5811
+ "char": "o",
5812
+ "deprecateAliases": true,
5813
+ "name": "target-org",
5814
+ "noCacheDefault": true,
5815
+ "required": true,
5816
+ "summary": "Username or alias of the target org. Not required if the `target-org` configuration variable is already set.",
5817
+ "hasDynamicHelp": true,
5818
+ "multiple": false,
5819
+ "type": "option"
5820
+ }
5821
+ },
5822
+ "hasDynamicHelp": true,
5823
+ "hiddenAliases": [],
5824
+ "id": "hardis:org:fix:listviewmine",
5825
+ "pluginAlias": "sfdx-hardis",
5826
+ "pluginName": "sfdx-hardis",
5827
+ "pluginType": "core",
5828
+ "strict": true,
5829
+ "enableJsonFlag": true,
5830
+ "title": "Fix listviews with ",
5831
+ "requiresProject": true,
5832
+ "isESM": true,
5833
+ "relativePath": [
5834
+ "lib",
5835
+ "commands",
5836
+ "hardis",
5837
+ "org",
5838
+ "fix",
5839
+ "listviewmine.js"
5840
+ ],
5841
+ "aliasPermutations": [],
5842
+ "permutations": [
5843
+ "hardis:org:fix:listviewmine",
5844
+ "org:hardis:fix:listviewmine",
5845
+ "org:fix:hardis:listviewmine",
5846
+ "org:fix:listviewmine:hardis",
5847
+ "hardis:fix:org:listviewmine",
5848
+ "fix:hardis:org:listviewmine",
5849
+ "fix:org:hardis:listviewmine",
5850
+ "fix:org:listviewmine:hardis",
5851
+ "hardis:fix:listviewmine:org",
5852
+ "fix:hardis:listviewmine:org",
5853
+ "fix:listviewmine:hardis:org",
5854
+ "fix:listviewmine:org:hardis",
5855
+ "hardis:org:listviewmine:fix",
5856
+ "org:hardis:listviewmine:fix",
5857
+ "org:listviewmine:hardis:fix",
5858
+ "org:listviewmine:fix:hardis",
5859
+ "hardis:listviewmine:org:fix",
5860
+ "listviewmine:hardis:org:fix",
5861
+ "listviewmine:org:hardis:fix",
5862
+ "listviewmine:org:fix:hardis",
5863
+ "hardis:listviewmine:fix:org",
5864
+ "listviewmine:hardis:fix:org",
5865
+ "listviewmine:fix:hardis:org",
5866
+ "listviewmine:fix:org:hardis"
5867
+ ]
5868
+ },
5754
5869
  "hardis:org:diagnose:audittrail": {
5755
5870
  "aliases": [],
5756
5871
  "args": {},
@@ -6900,121 +7015,6 @@
6900
7015
  "unusedusers:diagnose:org:hardis"
6901
7016
  ]
6902
7017
  },
6903
- "hardis:org:fix:listviewmine": {
6904
- "aliases": [],
6905
- "args": {},
6906
- "description": "Fix listviews whose scope Mine has been replaced by Everything\n\n[![Invalid scope:Mine, not allowed ? Deploy your ListViews anyway !](https://github.com/hardisgroupcom/sfdx-hardis/raw/main/docs/assets/images/article-invalid-scope-mine.jpg)](https://nicolas.vuillamy.fr/invalid-scope-mine-not-allowed-deploy-your-listviews-anyway-443aceca8ac7)\n\nList of ListViews can be:\n\n- read from .sfdx-hardis.yml file in property **listViewsToSetToMine**\n- sent in argument listviews\n\nNote: property **listViewsToSetToMine** can be auto-generated by command hardis:work:save if .sfdx-hardis.yml contains the following configuration\n\n```yaml\nautoCleanTypes:\n - listViewsMine\n```\n\n- Example of sfdx-hardis.yml property `listViewsToSetToMine`:\n\n```yaml\nlistViewsToSetToMine:\n - \"force-app/main/default/objects/Operation__c/listViews/MyCurrentOperations.listView-meta.xml\"\n - \"force-app/main/default/objects/Operation__c/listViews/MyFinalizedOperations.listView-meta.xml\"\n - \"force-app/main/default/objects/Opportunity/listViews/Default_Opportunity_Pipeline.listView-meta.xml\"\n - \"force-app/main/default/objects/Opportunity/listViews/MyCurrentSubscriptions.listView-meta.xml\"\n - \"force-app/main/default/objects/Opportunity/listViews/MySubscriptions.listView-meta.xml\"\n - \"force-app/main/default/objects/Account/listViews/MyActivePartners.listView-meta.xml\"\n```\n\n- If manually written, this could also be:\n\n```yaml\nlistViewsToSetToMine:\n - \"Operation__c:MyCurrentOperations\"\n - \"Operation__c:MyFinalizedOperations\"\n - \"Opportunity:Default_Opportunity_Pipeline\"\n - \"Opportunity:MyCurrentSubscriptions\"\n - \"Opportunity:MySubscriptions\"\n - \"Account:MyActivePartners\"\n```\n\nTroubleshooting: if you need to run this command from an alpine-linux based docker image, use this workaround in your dockerfile:\n\n```dockerfile\n# Do not use puppeteer embedded chromium\nRUN apk add --update --no-cache chromium\nENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=\"true\"\nENV CHROMIUM_PATH=\"/usr/bin/chromium-browser\"\nENV PUPPETEER_EXECUTABLE_PATH=\"$\\{CHROMIUM_PATH}\" // remove \\ before {\n```\n",
6907
- "examples": [
6908
- "$ sf hardis:org:fix:listviewmine",
6909
- "$ sf hardis:org:fix:listviewmine --listviews Opportunity:MySubscriptions,Account:MyActivePartners"
6910
- ],
6911
- "flags": {
6912
- "json": {
6913
- "description": "Format output as json.",
6914
- "helpGroup": "GLOBAL",
6915
- "name": "json",
6916
- "allowNo": false,
6917
- "type": "boolean"
6918
- },
6919
- "flags-dir": {
6920
- "helpGroup": "GLOBAL",
6921
- "name": "flags-dir",
6922
- "summary": "Import flag values from a directory.",
6923
- "hasDynamicHelp": false,
6924
- "multiple": false,
6925
- "type": "option"
6926
- },
6927
- "listviews": {
6928
- "char": "l",
6929
- "description": "Comma-separated list of listviews following format Object:ListViewName\nExample: Contact:MyContacts,Contact:MyActiveContacts,Opportunity:MYClosedOpportunities",
6930
- "name": "listviews",
6931
- "hasDynamicHelp": false,
6932
- "multiple": false,
6933
- "type": "option"
6934
- },
6935
- "debug": {
6936
- "char": "d",
6937
- "description": "Activate debug mode (more logs)",
6938
- "name": "debug",
6939
- "allowNo": false,
6940
- "type": "boolean"
6941
- },
6942
- "websocket": {
6943
- "description": "Websocket host:port for VsCode SFDX Hardis UI integration",
6944
- "name": "websocket",
6945
- "hasDynamicHelp": false,
6946
- "multiple": false,
6947
- "type": "option"
6948
- },
6949
- "skipauth": {
6950
- "description": "Skip authentication check when a default username is required",
6951
- "name": "skipauth",
6952
- "allowNo": false,
6953
- "type": "boolean"
6954
- },
6955
- "target-org": {
6956
- "aliases": [
6957
- "targetusername",
6958
- "u"
6959
- ],
6960
- "char": "o",
6961
- "deprecateAliases": true,
6962
- "name": "target-org",
6963
- "noCacheDefault": true,
6964
- "required": true,
6965
- "summary": "Username or alias of the target org. Not required if the `target-org` configuration variable is already set.",
6966
- "hasDynamicHelp": true,
6967
- "multiple": false,
6968
- "type": "option"
6969
- }
6970
- },
6971
- "hasDynamicHelp": true,
6972
- "hiddenAliases": [],
6973
- "id": "hardis:org:fix:listviewmine",
6974
- "pluginAlias": "sfdx-hardis",
6975
- "pluginName": "sfdx-hardis",
6976
- "pluginType": "core",
6977
- "strict": true,
6978
- "enableJsonFlag": true,
6979
- "title": "Fix listviews with ",
6980
- "requiresProject": true,
6981
- "isESM": true,
6982
- "relativePath": [
6983
- "lib",
6984
- "commands",
6985
- "hardis",
6986
- "org",
6987
- "fix",
6988
- "listviewmine.js"
6989
- ],
6990
- "aliasPermutations": [],
6991
- "permutations": [
6992
- "hardis:org:fix:listviewmine",
6993
- "org:hardis:fix:listviewmine",
6994
- "org:fix:hardis:listviewmine",
6995
- "org:fix:listviewmine:hardis",
6996
- "hardis:fix:org:listviewmine",
6997
- "fix:hardis:org:listviewmine",
6998
- "fix:org:hardis:listviewmine",
6999
- "fix:org:listviewmine:hardis",
7000
- "hardis:fix:listviewmine:org",
7001
- "fix:hardis:listviewmine:org",
7002
- "fix:listviewmine:hardis:org",
7003
- "fix:listviewmine:org:hardis",
7004
- "hardis:org:listviewmine:fix",
7005
- "org:hardis:listviewmine:fix",
7006
- "org:listviewmine:hardis:fix",
7007
- "org:listviewmine:fix:hardis",
7008
- "hardis:listviewmine:org:fix",
7009
- "listviewmine:hardis:org:fix",
7010
- "listviewmine:org:hardis:fix",
7011
- "listviewmine:org:fix:hardis",
7012
- "hardis:listviewmine:fix:org",
7013
- "listviewmine:hardis:fix:org",
7014
- "listviewmine:fix:hardis:org",
7015
- "listviewmine:fix:org:hardis"
7016
- ]
7017
- },
7018
7018
  "hardis:org:generate:packagexmlfull": {
7019
7019
  "aliases": [],
7020
7020
  "args": {},
@@ -8000,7 +8000,7 @@
8000
8000
  "hardis:org:refresh:before-refresh": {
8001
8001
  "aliases": [],
8002
8002
  "args": {},
8003
- "description": "\n## Command Behavior\n\n**Backs up all Connected Apps and their secrets from a Salesforce org before a sandbox refresh, enabling full restoration after the refresh.**\n\nThis command is essential for Salesforce sandbox refresh operations where Connected Apps (and their Consumer Secrets) would otherwise be lost. It automates the extraction, secure storage, and (optionally) deletion of Connected Apps, ensuring that all credentials and configuration can be restored post-refresh.\n\nKey functionalities:\n\n- **Connected App Discovery:** Lists all Connected Apps in the org, with options to filter by name or process all.\n- **User Selection:** Allows interactive or flag-based selection of which Connected Apps to back up.\n- **Metadata Retrieval:** Retrieves Connected App metadata and saves it in a dedicated project folder for the sandbox instance.\n- **Consumer Secret Extraction:** Attempts to extract Consumer Secrets automatically using browser automation (Puppeteer), or prompts for manual entry if automation fails.\n- **Config Persistence:** Stores the list of selected apps in the project config for use during restoration.\n- **Optional Deletion:** Can delete the Connected Apps from the org after backup, as required for re-upload after refresh.\n- **Summary and Reporting:** Provides a summary of actions, including which apps were saved and whether secrets were captured.\n\nThis command is part of [sfdx-hardis Sandbox Refresh](https://sfdx-hardis.cloudity.com/salesforce-sandbox-refresh/) and is designed to be run before a sandbox refresh. It ensures that all Connected Apps and their secrets are safely stored for later restoration.\n\n<details markdown=\"1\">\n<summary>Technical explanations</summary>\n\n- **Salesforce CLI Integration:** Uses `sf org list metadata` and other CLI commands to discover and retrieve Connected Apps.\n- **Metadata Handling:** Saves Connected App XML files in a dedicated folder under `scripts / sandbox - refresh / <sandbox-folder > `.\n- **Consumer Secret Handling:** Uses Puppeteer to automate browser login and extraction of Consumer Secrets, falling back to manual prompts if needed.\n- **Config Management:** Updates `config /.sfdx - hardis.yml` with the list of selected apps for later use.\n- **Deletion Logic:** Optionally deletes Connected Apps from the org (required for re-upload after refresh), with user confirmation unless running in CI or with `--delete ` flag.\n- **Error Handling:** Provides detailed error messages and guidance if retrieval or extraction fails.\n\n</details>\n",
8003
+ "description": "\n## Command Behavior\n\n**Backs up all Connected Apps, their secrets, certificates, and custom settings from a Salesforce org before a sandbox refresh, enabling full restoration after the refresh.**\n\nThis command is essential for Salesforce sandbox refresh operations where Connected Apps (and their Consumer Secrets), certificates, and custom settings would otherwise be lost. It automates the extraction, secure storage, and (optionally) deletion of Connected Apps, ensuring that all credentials and configuration can be restored post-refresh.\n\nKey functionalities:\n\n- **Connected App Discovery:** Lists all Connected Apps in the org, with options to filter by name, process all, or interactively select.\n- **User Selection:** Allows interactive or flag-based selection of which Connected Apps to back up.\n- **Metadata Retrieval:** Retrieves Connected App metadata and saves it in a dedicated project folder for the sandbox instance.\n- **Consumer Secret Extraction:** Attempts to extract Consumer Secrets automatically using browser automation (Puppeteer), or prompts for manual entry if automation fails.\n- **Config Persistence:** Stores the list of selected apps in the project config for use during restoration.\n- **Optional Deletion:** Can delete the Connected Apps from the org after backup, as required for re-upload after refresh.\n- **Certificate Backup:** Retrieves all org certificates and their definitions, saving them for later restoration.\n- **Custom Settings Backup:** Lists all custom settings in the org, allows user selection, and exports their data to JSON files for backup.\n- **Summary and Reporting:** Provides a summary of actions, including which apps, certificates, and custom settings were saved and whether secrets were captured.\n\nThis command is part of [sfdx-hardis Sandbox Refresh](https://sfdx-hardis.cloudity.com/salesforce-sandbox-refresh/) and is designed to be run before a sandbox refresh. It ensures that all Connected Apps, secrets, certificates, and custom settings are safely stored for later restoration.\n\n<details markdown=\"1\">\n<summary>Technical explanations</summary>\n\n- **Salesforce CLI Integration:** Uses `sf org list metadata`, `sf project retrieve start`, and other CLI commands to discover and retrieve Connected Apps, certificates, and custom settings.\n- **Metadata Handling:** Saves Connected App XML files and certificate files in a dedicated folder under `scripts/sandbox-refresh/<sandbox-folder>`.\n- **Consumer Secret Handling:** Uses Puppeteer to automate browser login and extraction of Consumer Secrets, falling back to manual prompts if needed.\n- **Custom Settings Handling:** Lists all custom settings, allows user selection, and exports their data using `sf data tree export` to JSON files.\n- **Config Management:** Updates `config/.sfdx-hardis.yml` with the list of selected apps for later use.\n- **Deletion Logic:** Optionally deletes Connected Apps from the org (required for re-upload after refresh), with user confirmation unless running in CI or with `--delete` flag.\n- **Error Handling:** Provides detailed error messages and guidance if retrieval or extraction fails.\n- **Reporting:** Sends summary and configuration files to the WebSocket client for reporting and traceability.\n\n</details>\n",
8004
8004
  "examples": [
8005
8005
  "$ sf hardis:org:refresh:before-refresh",
8006
8006
  "$ sf hardis:org:refresh:before-refresh --name \"MyConnectedApp\"",
@@ -8081,7 +8081,6 @@
8081
8081
  "pluginType": "core",
8082
8082
  "strict": true,
8083
8083
  "enableJsonFlag": true,
8084
- "title": "Save info to restore before org refresh",
8085
8084
  "requiresProject": true,
8086
8085
  "isESM": true,
8087
8086
  "relativePath": [
@@ -9643,6 +9642,109 @@
9643
9642
  "auth:configure:project:hardis"
9644
9643
  ]
9645
9644
  },
9645
+ "hardis:project:convert:profilestopermsets": {
9646
+ "aliases": [],
9647
+ "args": {},
9648
+ "description": "\n## Command Behavior\n\n**Converts existing Salesforce Profiles into Permission Sets, facilitating a more granular and recommended security model.**\n\nThis command helps in migrating permissions from Profiles to Permission Sets, which is a best practice for managing user access in Salesforce. It creates a new Permission Set for each specified Profile, adopting a naming convention of `PS_PROFILENAME`.\n\nKey functionalities:\n\n- **Profile to Permission Set Conversion:** Automatically extracts permissions from a Profile and creates a corresponding Permission Set.\n- **Naming Convention:** New Permission Sets are named with a `PS_` prefix followed by the Profile name (e.g., `PS_Standard_User`).\n- **Exclusion Filter:** Allows you to exclude specific Profiles from the conversion process using the `--except` flag.\n\n<details markdown=\"1\">\n<summary>Technical explanations</summary>\n\nThe command's technical implementation involves:\n\n- **External Plugin Integration:** It relies on the `shane-sfdx-plugins` (specifically the `sf shane:profile:convert` command) to perform the actual conversion.\n- **File System Scan:** It reads the contents of the `force-app/main/default/profiles` directory to identify all available Profile metadata files.\n- **Command Execution:** For each identified Profile (that is not excluded), it constructs and executes the `sf shane:profile:convert` command with the appropriate Profile name and desired Permission Set name.\n- **Error Handling:** Includes basic error handling for the external command execution.\n</details>\n",
9649
+ "examples": [
9650
+ "$ sf hardis:project:convert:profilestopermsets"
9651
+ ],
9652
+ "flags": {
9653
+ "json": {
9654
+ "description": "Format output as json.",
9655
+ "helpGroup": "GLOBAL",
9656
+ "name": "json",
9657
+ "allowNo": false,
9658
+ "type": "boolean"
9659
+ },
9660
+ "flags-dir": {
9661
+ "helpGroup": "GLOBAL",
9662
+ "name": "flags-dir",
9663
+ "summary": "Import flag values from a directory.",
9664
+ "hasDynamicHelp": false,
9665
+ "multiple": false,
9666
+ "type": "option"
9667
+ },
9668
+ "except": {
9669
+ "char": "e",
9670
+ "description": "List of filters",
9671
+ "name": "except",
9672
+ "default": [],
9673
+ "hasDynamicHelp": false,
9674
+ "multiple": true,
9675
+ "type": "option"
9676
+ },
9677
+ "debug": {
9678
+ "char": "d",
9679
+ "description": "Activate debug mode (more logs)",
9680
+ "name": "debug",
9681
+ "allowNo": false,
9682
+ "type": "boolean"
9683
+ },
9684
+ "websocket": {
9685
+ "description": "Websocket host:port for VsCode SFDX Hardis UI integration",
9686
+ "name": "websocket",
9687
+ "hasDynamicHelp": false,
9688
+ "multiple": false,
9689
+ "type": "option"
9690
+ },
9691
+ "skipauth": {
9692
+ "description": "Skip authentication check when a default username is required",
9693
+ "name": "skipauth",
9694
+ "allowNo": false,
9695
+ "type": "boolean"
9696
+ }
9697
+ },
9698
+ "hasDynamicHelp": false,
9699
+ "hiddenAliases": [],
9700
+ "id": "hardis:project:convert:profilestopermsets",
9701
+ "pluginAlias": "sfdx-hardis",
9702
+ "pluginName": "sfdx-hardis",
9703
+ "pluginType": "core",
9704
+ "strict": true,
9705
+ "enableJsonFlag": true,
9706
+ "title": "Convert Profiles into Permission Sets",
9707
+ "requiresProject": true,
9708
+ "requiresSfdxPlugins": [
9709
+ "shane-sfdx-plugins"
9710
+ ],
9711
+ "isESM": true,
9712
+ "relativePath": [
9713
+ "lib",
9714
+ "commands",
9715
+ "hardis",
9716
+ "project",
9717
+ "convert",
9718
+ "profilestopermsets.js"
9719
+ ],
9720
+ "aliasPermutations": [],
9721
+ "permutations": [
9722
+ "hardis:project:convert:profilestopermsets",
9723
+ "project:hardis:convert:profilestopermsets",
9724
+ "project:convert:hardis:profilestopermsets",
9725
+ "project:convert:profilestopermsets:hardis",
9726
+ "hardis:convert:project:profilestopermsets",
9727
+ "convert:hardis:project:profilestopermsets",
9728
+ "convert:project:hardis:profilestopermsets",
9729
+ "convert:project:profilestopermsets:hardis",
9730
+ "hardis:convert:profilestopermsets:project",
9731
+ "convert:hardis:profilestopermsets:project",
9732
+ "convert:profilestopermsets:hardis:project",
9733
+ "convert:profilestopermsets:project:hardis",
9734
+ "hardis:project:profilestopermsets:convert",
9735
+ "project:hardis:profilestopermsets:convert",
9736
+ "project:profilestopermsets:hardis:convert",
9737
+ "project:profilestopermsets:convert:hardis",
9738
+ "hardis:profilestopermsets:project:convert",
9739
+ "profilestopermsets:hardis:project:convert",
9740
+ "profilestopermsets:project:hardis:convert",
9741
+ "profilestopermsets:project:convert:hardis",
9742
+ "hardis:profilestopermsets:convert:project",
9743
+ "profilestopermsets:hardis:convert:project",
9744
+ "profilestopermsets:convert:hardis:project",
9745
+ "profilestopermsets:convert:project:hardis"
9746
+ ]
9747
+ },
9646
9748
  "hardis:project:clean:emptyitems": {
9647
9749
  "aliases": [],
9648
9750
  "args": {},
@@ -11128,12 +11230,12 @@
11128
11230
  "xml:clean:project:hardis"
11129
11231
  ]
11130
11232
  },
11131
- "hardis:project:convert:profilestopermsets": {
11233
+ "hardis:project:fix:profiletabs": {
11132
11234
  "aliases": [],
11133
11235
  "args": {},
11134
- "description": "\n## Command Behavior\n\n**Converts existing Salesforce Profiles into Permission Sets, facilitating a more granular and recommended security model.**\n\nThis command helps in migrating permissions from Profiles to Permission Sets, which is a best practice for managing user access in Salesforce. It creates a new Permission Set for each specified Profile, adopting a naming convention of `PS_PROFILENAME`.\n\nKey functionalities:\n\n- **Profile to Permission Set Conversion:** Automatically extracts permissions from a Profile and creates a corresponding Permission Set.\n- **Naming Convention:** New Permission Sets are named with a `PS_` prefix followed by the Profile name (e.g., `PS_Standard_User`).\n- **Exclusion Filter:** Allows you to exclude specific Profiles from the conversion process using the `--except` flag.\n\n<details markdown=\"1\">\n<summary>Technical explanations</summary>\n\nThe command's technical implementation involves:\n\n- **External Plugin Integration:** It relies on the `shane-sfdx-plugins` (specifically the `sf shane:profile:convert` command) to perform the actual conversion.\n- **File System Scan:** It reads the contents of the `force-app/main/default/profiles` directory to identify all available Profile metadata files.\n- **Command Execution:** For each identified Profile (that is not excluded), it constructs and executes the `sf shane:profile:convert` command with the appropriate Profile name and desired Permission Set name.\n- **Error Handling:** Includes basic error handling for the external command execution.\n</details>\n",
11236
+ "description": "\n## Command Behavior\n\n**Interactively updates tab visibility settings in Salesforce profiles, addressing a common issue where tab visibilities are not correctly retrieved by `sf project retrieve start`.**\n\nThis command provides a user-friendly interface to manage tab settings within your profile XML files, ensuring that your local project accurately reflects the intended tab configurations in your Salesforce org.\n\nKey functionalities:\n\n- **Interactive Tab Selection:** Displays a multi-select menu of all available tabs in your org, allowing you to choose which tabs to update.\n- **Visibility Control:** Lets you set the visibility for the selected tabs to either `DefaultOn` (Visible) or `Hidden`.\n- **Profile Selection:** Presents a multi-select menu of all .profile-meta.xml files in your project, allowing you to apply the tab visibility changes to specific profiles.\n- **XML Updates:** Modifies the <tabVisibilities> section of the selected profile XML files to reflect the chosen tab settings. If a tab visibility setting already exists for a selected tab, it will be updated; otherwise, a new one will be added.\n- **Sorted Output:** The <tabVisibilities> in the updated profile XML files are sorted alphabetically for consistency and readability.\n\n<details markdown=\"1\">\n<summary>Technical explanations</summary>\n\nThe command's technical implementation involves:\n\n- **SOQL Queries (Tooling API):** It queries the `TabDefinition` object using `soqlQueryTooling` to retrieve a list of all available tabs in the target org.\n- **File Discovery:** Uses `glob` to find all .profile-meta.xml files within the specified project path.\n- **Interactive Prompts:** Leverages the `prompts` library to create interactive menus for selecting tabs, visibility settings, and profiles.\n- **XML Parsing and Manipulation:** Uses `parseXmlFile` to read the content of profile XML files and `writeXmlFile` to write the modified content back. It manipulates the `tabVisibilities` array within the parsed XML to add or update tab settings.\n- **Array Sorting:** Employs the `sort-array` library to sort the `tabVisibilities` alphabetically by tab name.\n- **Logging:** Provides feedback to the user about which profiles have been updated and a summary of the changes.\n</details>\n",
11135
11237
  "examples": [
11136
- "$ sf hardis:project:convert:profilestopermsets"
11238
+ "$ sf hardis:project:fix:profiletabs"
11137
11239
  ],
11138
11240
  "flags": {
11139
11241
  "json": {
@@ -11151,13 +11253,13 @@
11151
11253
  "multiple": false,
11152
11254
  "type": "option"
11153
11255
  },
11154
- "except": {
11155
- "char": "e",
11156
- "description": "List of filters",
11157
- "name": "except",
11158
- "default": [],
11256
+ "path": {
11257
+ "char": "p",
11258
+ "description": "Root folder",
11259
+ "name": "path",
11260
+ "default": "/home/runner/work/sfdx-hardis/sfdx-hardis",
11159
11261
  "hasDynamicHelp": false,
11160
- "multiple": true,
11262
+ "multiple": false,
11161
11263
  "type": "option"
11162
11264
  },
11163
11265
  "debug": {
@@ -11179,56 +11281,168 @@
11179
11281
  "name": "skipauth",
11180
11282
  "allowNo": false,
11181
11283
  "type": "boolean"
11284
+ },
11285
+ "target-org": {
11286
+ "aliases": [
11287
+ "targetusername",
11288
+ "u"
11289
+ ],
11290
+ "char": "o",
11291
+ "deprecateAliases": true,
11292
+ "name": "target-org",
11293
+ "noCacheDefault": true,
11294
+ "required": true,
11295
+ "summary": "Username or alias of the target org. Not required if the `target-org` configuration variable is already set.",
11296
+ "hasDynamicHelp": true,
11297
+ "multiple": false,
11298
+ "type": "option"
11182
11299
  }
11183
11300
  },
11184
- "hasDynamicHelp": false,
11301
+ "hasDynamicHelp": true,
11185
11302
  "hiddenAliases": [],
11186
- "id": "hardis:project:convert:profilestopermsets",
11303
+ "id": "hardis:project:fix:profiletabs",
11187
11304
  "pluginAlias": "sfdx-hardis",
11188
11305
  "pluginName": "sfdx-hardis",
11189
11306
  "pluginType": "core",
11190
11307
  "strict": true,
11191
11308
  "enableJsonFlag": true,
11192
- "title": "Convert Profiles into Permission Sets",
11309
+ "title": "Fix profiles to add tabs that are not retrieved by SF CLI",
11193
11310
  "requiresProject": true,
11194
- "requiresSfdxPlugins": [
11195
- "shane-sfdx-plugins"
11196
- ],
11197
11311
  "isESM": true,
11198
11312
  "relativePath": [
11199
11313
  "lib",
11200
11314
  "commands",
11201
11315
  "hardis",
11202
11316
  "project",
11203
- "convert",
11204
- "profilestopermsets.js"
11317
+ "fix",
11318
+ "profiletabs.js"
11205
11319
  ],
11206
11320
  "aliasPermutations": [],
11207
11321
  "permutations": [
11208
- "hardis:project:convert:profilestopermsets",
11209
- "project:hardis:convert:profilestopermsets",
11210
- "project:convert:hardis:profilestopermsets",
11211
- "project:convert:profilestopermsets:hardis",
11212
- "hardis:convert:project:profilestopermsets",
11213
- "convert:hardis:project:profilestopermsets",
11214
- "convert:project:hardis:profilestopermsets",
11215
- "convert:project:profilestopermsets:hardis",
11216
- "hardis:convert:profilestopermsets:project",
11217
- "convert:hardis:profilestopermsets:project",
11218
- "convert:profilestopermsets:hardis:project",
11219
- "convert:profilestopermsets:project:hardis",
11220
- "hardis:project:profilestopermsets:convert",
11221
- "project:hardis:profilestopermsets:convert",
11222
- "project:profilestopermsets:hardis:convert",
11223
- "project:profilestopermsets:convert:hardis",
11224
- "hardis:profilestopermsets:project:convert",
11225
- "profilestopermsets:hardis:project:convert",
11226
- "profilestopermsets:project:hardis:convert",
11227
- "profilestopermsets:project:convert:hardis",
11228
- "hardis:profilestopermsets:convert:project",
11229
- "profilestopermsets:hardis:convert:project",
11230
- "profilestopermsets:convert:hardis:project",
11231
- "profilestopermsets:convert:project:hardis"
11322
+ "hardis:project:fix:profiletabs",
11323
+ "project:hardis:fix:profiletabs",
11324
+ "project:fix:hardis:profiletabs",
11325
+ "project:fix:profiletabs:hardis",
11326
+ "hardis:fix:project:profiletabs",
11327
+ "fix:hardis:project:profiletabs",
11328
+ "fix:project:hardis:profiletabs",
11329
+ "fix:project:profiletabs:hardis",
11330
+ "hardis:fix:profiletabs:project",
11331
+ "fix:hardis:profiletabs:project",
11332
+ "fix:profiletabs:hardis:project",
11333
+ "fix:profiletabs:project:hardis",
11334
+ "hardis:project:profiletabs:fix",
11335
+ "project:hardis:profiletabs:fix",
11336
+ "project:profiletabs:hardis:fix",
11337
+ "project:profiletabs:fix:hardis",
11338
+ "hardis:profiletabs:project:fix",
11339
+ "profiletabs:hardis:project:fix",
11340
+ "profiletabs:project:hardis:fix",
11341
+ "profiletabs:project:fix:hardis",
11342
+ "hardis:profiletabs:fix:project",
11343
+ "profiletabs:hardis:fix:project",
11344
+ "profiletabs:fix:hardis:project",
11345
+ "profiletabs:fix:project:hardis"
11346
+ ]
11347
+ },
11348
+ "hardis:project:fix:v53flexipages": {
11349
+ "aliases": [],
11350
+ "args": {},
11351
+ "description": "\n## Command Behavior\n\n**Fixes Salesforce FlexiPages for compatibility with API Version 53.0 (Winter '22 release) by adding missing identifiers to component instances.**\n\nSalesforce introduced a change in API Version 53.0 that requires `identifier` tags within `componentInstance` and `fieldInstance` elements in FlexiPage metadata. If these identifiers are missing, deployments to orgs with API version 53.0 or higher will fail. This command automates the process of adding these missing identifiers, ensuring your FlexiPages remain deployable.\n\nKey functionalities:\n\n- **Targeted FlexiPage Processing:** Scans all .flexipage-meta.xml files within the specified root folder (defaults to current working directory).\n- **Identifier Injection:** Inserts a unique `identifier` tag (e.g., `SFDX_HARDIS_REPLACEMENT_ID`) into `componentInstance` and `fieldInstance` elements that lack one.\n\n**Important Note:** After running this command, ensure you update your `apiVersion` to `53.0` (or higher) in your `package.xml` and `sfdx-project.json` files.\n\n<details markdown=\"1\">\n<summary>Technical explanations</summary>\n\nThe command's technical implementation involves:\n\n- **File Discovery:** Uses `glob` to find all .flexipage-meta.xml files.\n- **Content Reading:** Reads the XML content of each FlexiPage file.\n- **Regular Expression Replacement:** Employs a set of regular expressions to identify specific XML patterns (componentName.../componentName.../componentInstance, componentName.../componentName.../visibilityRule, fieldItem.../fieldItem.../fieldInstance) that are missing the `identifier` tag.\n- **Dynamic ID Generation:** For each match, it generates a unique identifier (e.g., `sfdxHardisIdX`) and injects it into the XML structure.\n- **File Writing:** If changes are made, the modified XML content is written back to the FlexiPage file using `fs.writeFile`.\n- **Logging:** Provides messages about which FlexiPages are being processed and a summary of the total number of identifiers added.\n</details>\n",
11352
+ "examples": [
11353
+ "$ sf hardis:project:fix:v53flexipages"
11354
+ ],
11355
+ "flags": {
11356
+ "json": {
11357
+ "description": "Format output as json.",
11358
+ "helpGroup": "GLOBAL",
11359
+ "name": "json",
11360
+ "allowNo": false,
11361
+ "type": "boolean"
11362
+ },
11363
+ "flags-dir": {
11364
+ "helpGroup": "GLOBAL",
11365
+ "name": "flags-dir",
11366
+ "summary": "Import flag values from a directory.",
11367
+ "hasDynamicHelp": false,
11368
+ "multiple": false,
11369
+ "type": "option"
11370
+ },
11371
+ "path": {
11372
+ "char": "p",
11373
+ "description": "Root folder",
11374
+ "name": "path",
11375
+ "default": "/home/runner/work/sfdx-hardis/sfdx-hardis",
11376
+ "hasDynamicHelp": false,
11377
+ "multiple": false,
11378
+ "type": "option"
11379
+ },
11380
+ "debug": {
11381
+ "char": "d",
11382
+ "description": "Activate debug mode (more logs)",
11383
+ "name": "debug",
11384
+ "allowNo": false,
11385
+ "type": "boolean"
11386
+ },
11387
+ "websocket": {
11388
+ "description": "Websocket host:port for VsCode SFDX Hardis UI integration",
11389
+ "name": "websocket",
11390
+ "hasDynamicHelp": false,
11391
+ "multiple": false,
11392
+ "type": "option"
11393
+ },
11394
+ "skipauth": {
11395
+ "description": "Skip authentication check when a default username is required",
11396
+ "name": "skipauth",
11397
+ "allowNo": false,
11398
+ "type": "boolean"
11399
+ }
11400
+ },
11401
+ "hasDynamicHelp": false,
11402
+ "hiddenAliases": [],
11403
+ "id": "hardis:project:fix:v53flexipages",
11404
+ "pluginAlias": "sfdx-hardis",
11405
+ "pluginName": "sfdx-hardis",
11406
+ "pluginType": "core",
11407
+ "strict": true,
11408
+ "enableJsonFlag": true,
11409
+ "title": "Fix flexipages for v53",
11410
+ "requiresProject": true,
11411
+ "isESM": true,
11412
+ "relativePath": [
11413
+ "lib",
11414
+ "commands",
11415
+ "hardis",
11416
+ "project",
11417
+ "fix",
11418
+ "v53flexipages.js"
11419
+ ],
11420
+ "aliasPermutations": [],
11421
+ "permutations": [
11422
+ "hardis:project:fix:v53flexipages",
11423
+ "project:hardis:fix:v53flexipages",
11424
+ "project:fix:hardis:v53flexipages",
11425
+ "project:fix:v53flexipages:hardis",
11426
+ "hardis:fix:project:v53flexipages",
11427
+ "fix:hardis:project:v53flexipages",
11428
+ "fix:project:hardis:v53flexipages",
11429
+ "fix:project:v53flexipages:hardis",
11430
+ "hardis:fix:v53flexipages:project",
11431
+ "fix:hardis:v53flexipages:project",
11432
+ "fix:v53flexipages:hardis:project",
11433
+ "fix:v53flexipages:project:hardis",
11434
+ "hardis:project:v53flexipages:fix",
11435
+ "project:hardis:v53flexipages:fix",
11436
+ "project:v53flexipages:hardis:fix",
11437
+ "project:v53flexipages:fix:hardis",
11438
+ "hardis:v53flexipages:project:fix",
11439
+ "v53flexipages:hardis:project:fix",
11440
+ "v53flexipages:project:hardis:fix",
11441
+ "v53flexipages:project:fix:hardis",
11442
+ "hardis:v53flexipages:fix:project",
11443
+ "v53flexipages:hardis:fix:project",
11444
+ "v53flexipages:fix:hardis:project",
11445
+ "v53flexipages:fix:project:hardis"
11232
11446
  ]
11233
11447
  },
11234
11448
  "hardis:project:deploy:notify": {
@@ -12406,221 +12620,6 @@
12406
12620
  "validate:deploy:project:hardis"
12407
12621
  ]
12408
12622
  },
12409
- "hardis:project:fix:profiletabs": {
12410
- "aliases": [],
12411
- "args": {},
12412
- "description": "\n## Command Behavior\n\n**Interactively updates tab visibility settings in Salesforce profiles, addressing a common issue where tab visibilities are not correctly retrieved by `sf project retrieve start`.**\n\nThis command provides a user-friendly interface to manage tab settings within your profile XML files, ensuring that your local project accurately reflects the intended tab configurations in your Salesforce org.\n\nKey functionalities:\n\n- **Interactive Tab Selection:** Displays a multi-select menu of all available tabs in your org, allowing you to choose which tabs to update.\n- **Visibility Control:** Lets you set the visibility for the selected tabs to either `DefaultOn` (Visible) or `Hidden`.\n- **Profile Selection:** Presents a multi-select menu of all .profile-meta.xml files in your project, allowing you to apply the tab visibility changes to specific profiles.\n- **XML Updates:** Modifies the <tabVisibilities> section of the selected profile XML files to reflect the chosen tab settings. If a tab visibility setting already exists for a selected tab, it will be updated; otherwise, a new one will be added.\n- **Sorted Output:** The <tabVisibilities> in the updated profile XML files are sorted alphabetically for consistency and readability.\n\n<details markdown=\"1\">\n<summary>Technical explanations</summary>\n\nThe command's technical implementation involves:\n\n- **SOQL Queries (Tooling API):** It queries the `TabDefinition` object using `soqlQueryTooling` to retrieve a list of all available tabs in the target org.\n- **File Discovery:** Uses `glob` to find all .profile-meta.xml files within the specified project path.\n- **Interactive Prompts:** Leverages the `prompts` library to create interactive menus for selecting tabs, visibility settings, and profiles.\n- **XML Parsing and Manipulation:** Uses `parseXmlFile` to read the content of profile XML files and `writeXmlFile` to write the modified content back. It manipulates the `tabVisibilities` array within the parsed XML to add or update tab settings.\n- **Array Sorting:** Employs the `sort-array` library to sort the `tabVisibilities` alphabetically by tab name.\n- **Logging:** Provides feedback to the user about which profiles have been updated and a summary of the changes.\n</details>\n",
12413
- "examples": [
12414
- "$ sf hardis:project:fix:profiletabs"
12415
- ],
12416
- "flags": {
12417
- "json": {
12418
- "description": "Format output as json.",
12419
- "helpGroup": "GLOBAL",
12420
- "name": "json",
12421
- "allowNo": false,
12422
- "type": "boolean"
12423
- },
12424
- "flags-dir": {
12425
- "helpGroup": "GLOBAL",
12426
- "name": "flags-dir",
12427
- "summary": "Import flag values from a directory.",
12428
- "hasDynamicHelp": false,
12429
- "multiple": false,
12430
- "type": "option"
12431
- },
12432
- "path": {
12433
- "char": "p",
12434
- "description": "Root folder",
12435
- "name": "path",
12436
- "default": "/home/runner/work/sfdx-hardis/sfdx-hardis",
12437
- "hasDynamicHelp": false,
12438
- "multiple": false,
12439
- "type": "option"
12440
- },
12441
- "debug": {
12442
- "char": "d",
12443
- "description": "Activate debug mode (more logs)",
12444
- "name": "debug",
12445
- "allowNo": false,
12446
- "type": "boolean"
12447
- },
12448
- "websocket": {
12449
- "description": "Websocket host:port for VsCode SFDX Hardis UI integration",
12450
- "name": "websocket",
12451
- "hasDynamicHelp": false,
12452
- "multiple": false,
12453
- "type": "option"
12454
- },
12455
- "skipauth": {
12456
- "description": "Skip authentication check when a default username is required",
12457
- "name": "skipauth",
12458
- "allowNo": false,
12459
- "type": "boolean"
12460
- },
12461
- "target-org": {
12462
- "aliases": [
12463
- "targetusername",
12464
- "u"
12465
- ],
12466
- "char": "o",
12467
- "deprecateAliases": true,
12468
- "name": "target-org",
12469
- "noCacheDefault": true,
12470
- "required": true,
12471
- "summary": "Username or alias of the target org. Not required if the `target-org` configuration variable is already set.",
12472
- "hasDynamicHelp": true,
12473
- "multiple": false,
12474
- "type": "option"
12475
- }
12476
- },
12477
- "hasDynamicHelp": true,
12478
- "hiddenAliases": [],
12479
- "id": "hardis:project:fix:profiletabs",
12480
- "pluginAlias": "sfdx-hardis",
12481
- "pluginName": "sfdx-hardis",
12482
- "pluginType": "core",
12483
- "strict": true,
12484
- "enableJsonFlag": true,
12485
- "title": "Fix profiles to add tabs that are not retrieved by SF CLI",
12486
- "requiresProject": true,
12487
- "isESM": true,
12488
- "relativePath": [
12489
- "lib",
12490
- "commands",
12491
- "hardis",
12492
- "project",
12493
- "fix",
12494
- "profiletabs.js"
12495
- ],
12496
- "aliasPermutations": [],
12497
- "permutations": [
12498
- "hardis:project:fix:profiletabs",
12499
- "project:hardis:fix:profiletabs",
12500
- "project:fix:hardis:profiletabs",
12501
- "project:fix:profiletabs:hardis",
12502
- "hardis:fix:project:profiletabs",
12503
- "fix:hardis:project:profiletabs",
12504
- "fix:project:hardis:profiletabs",
12505
- "fix:project:profiletabs:hardis",
12506
- "hardis:fix:profiletabs:project",
12507
- "fix:hardis:profiletabs:project",
12508
- "fix:profiletabs:hardis:project",
12509
- "fix:profiletabs:project:hardis",
12510
- "hardis:project:profiletabs:fix",
12511
- "project:hardis:profiletabs:fix",
12512
- "project:profiletabs:hardis:fix",
12513
- "project:profiletabs:fix:hardis",
12514
- "hardis:profiletabs:project:fix",
12515
- "profiletabs:hardis:project:fix",
12516
- "profiletabs:project:hardis:fix",
12517
- "profiletabs:project:fix:hardis",
12518
- "hardis:profiletabs:fix:project",
12519
- "profiletabs:hardis:fix:project",
12520
- "profiletabs:fix:hardis:project",
12521
- "profiletabs:fix:project:hardis"
12522
- ]
12523
- },
12524
- "hardis:project:fix:v53flexipages": {
12525
- "aliases": [],
12526
- "args": {},
12527
- "description": "\n## Command Behavior\n\n**Fixes Salesforce FlexiPages for compatibility with API Version 53.0 (Winter '22 release) by adding missing identifiers to component instances.**\n\nSalesforce introduced a change in API Version 53.0 that requires `identifier` tags within `componentInstance` and `fieldInstance` elements in FlexiPage metadata. If these identifiers are missing, deployments to orgs with API version 53.0 or higher will fail. This command automates the process of adding these missing identifiers, ensuring your FlexiPages remain deployable.\n\nKey functionalities:\n\n- **Targeted FlexiPage Processing:** Scans all .flexipage-meta.xml files within the specified root folder (defaults to current working directory).\n- **Identifier Injection:** Inserts a unique `identifier` tag (e.g., `SFDX_HARDIS_REPLACEMENT_ID`) into `componentInstance` and `fieldInstance` elements that lack one.\n\n**Important Note:** After running this command, ensure you update your `apiVersion` to `53.0` (or higher) in your `package.xml` and `sfdx-project.json` files.\n\n<details markdown=\"1\">\n<summary>Technical explanations</summary>\n\nThe command's technical implementation involves:\n\n- **File Discovery:** Uses `glob` to find all .flexipage-meta.xml files.\n- **Content Reading:** Reads the XML content of each FlexiPage file.\n- **Regular Expression Replacement:** Employs a set of regular expressions to identify specific XML patterns (componentName.../componentName.../componentInstance, componentName.../componentName.../visibilityRule, fieldItem.../fieldItem.../fieldInstance) that are missing the `identifier` tag.\n- **Dynamic ID Generation:** For each match, it generates a unique identifier (e.g., `sfdxHardisIdX`) and injects it into the XML structure.\n- **File Writing:** If changes are made, the modified XML content is written back to the FlexiPage file using `fs.writeFile`.\n- **Logging:** Provides messages about which FlexiPages are being processed and a summary of the total number of identifiers added.\n</details>\n",
12528
- "examples": [
12529
- "$ sf hardis:project:fix:v53flexipages"
12530
- ],
12531
- "flags": {
12532
- "json": {
12533
- "description": "Format output as json.",
12534
- "helpGroup": "GLOBAL",
12535
- "name": "json",
12536
- "allowNo": false,
12537
- "type": "boolean"
12538
- },
12539
- "flags-dir": {
12540
- "helpGroup": "GLOBAL",
12541
- "name": "flags-dir",
12542
- "summary": "Import flag values from a directory.",
12543
- "hasDynamicHelp": false,
12544
- "multiple": false,
12545
- "type": "option"
12546
- },
12547
- "path": {
12548
- "char": "p",
12549
- "description": "Root folder",
12550
- "name": "path",
12551
- "default": "/home/runner/work/sfdx-hardis/sfdx-hardis",
12552
- "hasDynamicHelp": false,
12553
- "multiple": false,
12554
- "type": "option"
12555
- },
12556
- "debug": {
12557
- "char": "d",
12558
- "description": "Activate debug mode (more logs)",
12559
- "name": "debug",
12560
- "allowNo": false,
12561
- "type": "boolean"
12562
- },
12563
- "websocket": {
12564
- "description": "Websocket host:port for VsCode SFDX Hardis UI integration",
12565
- "name": "websocket",
12566
- "hasDynamicHelp": false,
12567
- "multiple": false,
12568
- "type": "option"
12569
- },
12570
- "skipauth": {
12571
- "description": "Skip authentication check when a default username is required",
12572
- "name": "skipauth",
12573
- "allowNo": false,
12574
- "type": "boolean"
12575
- }
12576
- },
12577
- "hasDynamicHelp": false,
12578
- "hiddenAliases": [],
12579
- "id": "hardis:project:fix:v53flexipages",
12580
- "pluginAlias": "sfdx-hardis",
12581
- "pluginName": "sfdx-hardis",
12582
- "pluginType": "core",
12583
- "strict": true,
12584
- "enableJsonFlag": true,
12585
- "title": "Fix flexipages for v53",
12586
- "requiresProject": true,
12587
- "isESM": true,
12588
- "relativePath": [
12589
- "lib",
12590
- "commands",
12591
- "hardis",
12592
- "project",
12593
- "fix",
12594
- "v53flexipages.js"
12595
- ],
12596
- "aliasPermutations": [],
12597
- "permutations": [
12598
- "hardis:project:fix:v53flexipages",
12599
- "project:hardis:fix:v53flexipages",
12600
- "project:fix:hardis:v53flexipages",
12601
- "project:fix:v53flexipages:hardis",
12602
- "hardis:fix:project:v53flexipages",
12603
- "fix:hardis:project:v53flexipages",
12604
- "fix:project:hardis:v53flexipages",
12605
- "fix:project:v53flexipages:hardis",
12606
- "hardis:fix:v53flexipages:project",
12607
- "fix:hardis:v53flexipages:project",
12608
- "fix:v53flexipages:hardis:project",
12609
- "fix:v53flexipages:project:hardis",
12610
- "hardis:project:v53flexipages:fix",
12611
- "project:hardis:v53flexipages:fix",
12612
- "project:v53flexipages:hardis:fix",
12613
- "project:v53flexipages:fix:hardis",
12614
- "hardis:v53flexipages:project:fix",
12615
- "v53flexipages:hardis:project:fix",
12616
- "v53flexipages:project:hardis:fix",
12617
- "v53flexipages:project:fix:hardis",
12618
- "hardis:v53flexipages:fix:project",
12619
- "v53flexipages:hardis:fix:project",
12620
- "v53flexipages:fix:hardis:project",
12621
- "v53flexipages:fix:project:hardis"
12622
- ]
12623
- },
12624
12623
  "hardis:project:generate:bypass": {
12625
12624
  "aliases": [],
12626
12625
  "args": {},
@@ -15103,5 +15102,5 @@
15103
15102
  ]
15104
15103
  }
15105
15104
  },
15106
- "version": "6.0.7-beta202508172156.0"
15105
+ "version": "6.0.7-beta202508202323.0"
15107
15106
  }