{"id":49941163,"url":"https://github.com/exiahuang/sfdc-cli","last_synced_at":"2026-05-17T11:10:54.004Z","repository":{"id":57466086,"uuid":"243738555","full_name":"exiahuang/sfdc-cli","owner":"exiahuang","description":"sfdc-cli is a sfdc development kit. ","archived":false,"fork":false,"pushed_at":"2020-03-20T04:09:45.000Z","size":234,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-27T20:00:06.477Z","etag":null,"topics":["developer-tools","forcedotcom","salesforce","sfdc"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/exiahuang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-28T10:41:02.000Z","updated_at":"2023-09-29T13:12:19.000Z","dependencies_parsed_at":"2022-08-31T03:23:17.114Z","dependency_job_id":null,"html_url":"https://github.com/exiahuang/sfdc-cli","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/exiahuang/sfdc-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exiahuang%2Fsfdc-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exiahuang%2Fsfdc-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exiahuang%2Fsfdc-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exiahuang%2Fsfdc-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/exiahuang","download_url":"https://codeload.github.com/exiahuang/sfdc-cli/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exiahuang%2Fsfdc-cli/sbom","scorecard":{"id":387909,"data":{"date":"2025-08-11","repo":{"name":"github.com/exiahuang/sfdc-cli","commit":"0770b2cb66b7a564656fd6ea49232ce6f3d01ebe"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/9 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}}]},"last_synced_at":"2025-08-18T17:07:04.125Z","repository_id":57466086,"created_at":"2025-08-18T17:07:04.125Z","updated_at":"2025-08-18T17:07:04.125Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33136151,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T09:28:26.183Z","status":"ssl_error","status_checked_at":"2026-05-17T09:27:52.702Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["developer-tools","forcedotcom","salesforce","sfdc"],"created_at":"2026-05-17T11:10:50.358Z","updated_at":"2026-05-17T11:10:53.999Z","avatar_url":"https://github.com/exiahuang.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sfdc-cli\n\n[exiahuang/sfdc-cli](https://github.com/exiahuang/sfdc-cli) is a sfdc development kit.\nIt is licensed under the `Apache License 2.0`\n\n## feature\n\n-   This is the command line app of [exiahuang/SalesforceXyTools](https://github.com/exiahuang/SalesforceXyTools).\n-   Integrate with [exiahuang/xysfdx](https://github.com/exiahuang/xysfdx), and run in vscode.\n-   use python3\n\n# install\n\n## install from pip\n\n```sh\npip3 install sfdc-cli\n```\n\n## install from git\n\n```sh\ngit clone https://github.com/exiahuang/sfdc-cli\npython3 setup.py install\n```\n\n# Summary\n\n| command | description | \n| ---- | ---- | \n| sfdc project:init | init sfdc project | \n| sfdc meta:retrieve | retrieve metadata | \n| sfdc meta:template:apex:create | init apex from tempalte | \n| sfdc meta:template:trigger:create | init trigger from tempalte | \n| sfdc meta:template:page:create | init page(visualforce) from tempalte | \n| sfdc meta:template:component:create | init component(visualforce) from tempalte | \n| sfdc meta:new | create metadata in sfdc server | \n| sfdc meta:update | update metadata in sfdc server | \n| sfdc meta:update:force | force update metadata in sfdc server | \n| sfdc meta:delete | delete metadata in sfdc server | \n| sfdc meta:refresh | refresh metadata in sfdc server | \n| sfdc meta:attr | print metadata attribute | \n| sfdc meta:refresh:dir | refresh metadata dir from sfdc server | \n| sfdc packagexml:server | build all packagexml from server | \n| sfdc packagexml:local | scan local directory to build package.xml | \n| sfdc apex:execute | Executes anonymous Apex code | \n| sfdc apex:test:run | run apex testclass | \n| sfdc apex:test:coverage | get apex coverage | \n| sfdc sobject:list | list sobject | \n| sfdc sobject:fields:desc | describe sobject fields | \n| sfdc sobject:export:xlsx | export sfdc sobject as excel file | \n| sfdc sobject:data:create | insert sobject data from json data | \n| sfdc sobject:data:update | update sobject data from json data | \n| sfdc sobject:data:get | get sobject data from sfdc server | \n| sfdc sobject:data:delete | delete sobject data from sfdc server | \n| sfdc data:soql:query | soql query | \n| sfdc data:tooling:query | tooling query | \n| sfdc call:rest:api | call salesforce rest api | \n| sfdc coder:snippet:soql | soql snippet creator  | \n| sfdc coder:apex:snippet:insert:data:from:soql | create apex code from soql query  | \n| sfdc coder:apex:snippet:insert:ramdam:data | create insert sobject code, ramdam data | \n| sfdc coder:apex:testclass:generator | generator testclass from apex code | \n| sfdc coder:apex:page:generator | generator VisualForce/Controller/DTO/DAO Code from sobject | \n| sfdc coder:copy:aura | copy lightning | \n| sfdc coder:permission:build | create permission metadata | \n| sfdc folder:list | list folder | \n| sfdc download:attachment | download salesforce attachment | \n| sfdc ant:migration:tool | init Ant Migration Tool | \n\n\n# Usage\n\n## print help\n\n```sh\nsfdc -h\n```\n\n```\nusage: sfdc [-h]\n\nsfdc development kit v0.1.0\n\npositional arguments:\n\n    ant:migration:tool  see `ant:migration:tool -h`\n    apex:execute        see `apex:execute -h`\n    apex:test:coverage  see `apex:test:coverage -h`\n    apex:test:run       see `apex:test:run -h`\n    call:rest:api       see `call:rest:api -h`\n    coder:apex:page:generator\n                        see `coder:apex:page:generator -h`\n    coder:apex:snippet:insert:data:from:soql\n                        see `coder:apex:snippet:insert:data:from:soql -h`\n    coder:apex:snippet:insert:ramdam:data\n                        see `coder:apex:snippet:insert:ramdam:data -h`\n    coder:apex:testclass:generator\n                        see `coder:apex:testclass:generator -h`\n    coder:copy:aura     see `coder:copy:aura -h`\n    coder:permission:build\n                        see `coder:permission:build -h`\n    coder:permission:list\n                        see `coder:permission:list -h`\n    coder:snippet:soql  see `coder:snippet:soql -h`\n    data:soql:query     see `data:soql:query -h`\n    data:tooling:query  see `data:tooling:query -h`\n    download:attachment\n                        see `download:attachment -h`\n    folder:list         see `folder:list -h`\n    meta:attr           see `meta:attr -h`\n    meta:cache          see `meta:cache -h`\n    meta:delete         see `meta:delete -h`\n    meta:new            see `meta:new -h`\n    meta:refresh        see `meta:refresh -h`\n    meta:refresh:aura   see `meta:refresh:aura -h`\n    meta:refresh:dir    see `meta:refresh:dir -h`\n    meta:retrieve       see `meta:retrieve -h`\n    meta:template:apex  see `meta:template:apex -h`\n    meta:template:component\n                        see `meta:template:component -h`\n    meta:template:page  see `meta:template:page -h`\n    meta:template:trigger\n                        see `meta:template:trigger -h`\n    meta:update         see `meta:update -h`\n    packagexml:local    see `packagexml:local -h`\n    packagexml:server   see `packagexml:server -h`\n    project:init        see `project:init -h`\n    sobject:data:create\n                        see `sobject:data:create -h`\n    sobject:data:delete\n                        see `sobject:data:delete -h`\n    sobject:data:get    see `sobject:data:get -h`\n    sobject:data:update\n                        see `sobject:data:update -h`\n    sobject:export:xlsx\n                        see `sobject:export:xlsx -h`\n    sobject:fields:desc\n                        see `sobject:fields:desc -h`\n    sobject:list        see `sobject:list -h`\n    tools:json:format   json format\n    help                see `help -h`\n\noptional arguments:\n  -h, --help            show this help message and exit\n```\n\n## new project\n\n```sh\n# for product\nsfdc project:init -d project/sfdc-project1 -u username -p password -t security_token -s src -v api_version\n# for sandbox/stgfull\nsfdc project:init -d project/sfdc-project1 -u username -p password -t security_token -s src -v api_version --sandbox\n\ncd project/sfdc-project1\n```\n\n## metadata retrieve\n\n```sh\n# retrieve zip file of all metadata\nsfdc meta:retrieve -p . -d package_dir -n package.zip\n\n# retrieve zip file of choice metadata : ApexClass ApexTrigger ApexPage\nsfdc meta:retrieve -p . -d package_dir -n package1.zip -m ApexClass ApexTrigger ApexPage ApexComponent CustomObject\n\n# retrieve metadata and unzip, source path: src\nsfdc meta:retrieve -p . -d package_dir -n package2.zip -m ApexClass ApexTrigger ApexPage AuraDefinitionBundle LightningComponentBundle --unzip --delete_after_unzip\n\n\nsfdc meta:retrieve -p . -d package_dir -n package2.zip -m CustomObject --unzip --delete_after_unzip\n\nsfdc meta:retrieve -p . -d package_dir -n package2.zip -m PermissionSet --unzip --delete_after_unzip\n```\n\n## metadata template\n\n### init apex class from template\n\n```sh\nsfdc meta:template:apex -n HelloApex --template ApexClass.cls\nsfdc meta:template:apex -n HelloApexBatch --template BatchApexClass.cls\nsfdc meta:template:apex -n HelloApexTest --template UnitTestApexClass.cls\nsfdc meta:template:apex -n HelloApexBatchTest --template BDDUnitTestApexClass.cls\n```\n\n### init trigger from template\n\n```sh\nsfdc meta:template:trigger -n HelloApexTrigger --sobject Opportunity --template ApexTrigger.trigger\nsfdc meta:template:trigger -n HelloApexTriggerAllEvents --sobject Opportunity --template ApexTriggerAllEvents.trigger\nsfdc meta:template:trigger -n HelloApexTriggerBulk --sobject Opportunity --template ApexTriggerBulk.trigger\n```\n\n### init visualforce from template\n\n```sh\nsfdc meta:template:page -n HelloApexPage --template ApexPage.page\nsfdc meta:template:page -n HelloHeaderPageBlock --template HeaderPageBlock.page\n```\n\n### init visualforce component\n\n```sh\nsfdc meta:template:component -n HelloCmp\n```\n\n## metadata new/update/refresh/delete\n\n### new metadata\n\n```sh\nsfdc meta:new -p . -s ./src/classes/HelloApex.cls\nsfdc meta:new -p . -s ./src/classes/HelloApexBatch.cls\nsfdc meta:new -p . -s ./src/classes/HelloApexTest.cls\nsfdc meta:new -p . -s ./src/classes/HelloApexBatchTest.cls\nsfdc meta:new -p . -s ./src/pages/HelloApexPage.page\nsfdc meta:new -p . -s ./src/components/HelloCmp.component\nsfdc meta:new -p . -s ./src/triggers/HelloApexTrigger.trigger --sobject Opportunity\nsfdc meta:new -p . -s ./src/triggers/HelloApexTriggerAllEvents.trigger --sobject Opportunity\nsfdc meta:new -p . -s ./src/triggers/HelloApexTriggerBulk.trigger --sobject Opportunity\n```\n\n### update metadata\n\n```sh\nsfdc meta:update -p . -s ./src/classes/HelloApex.cls\nsfdc meta:update -p . -s ./src/classes/HelloApexBatch.cls\nsfdc meta:update -p . -s ./src/classes/HelloApexTest.cls\nsfdc meta:update -p . -s ./src/classes/HelloApexBatchTest.cls\nsfdc meta:update -p . -s ./src/pages/HelloApexPage.page\nsfdc meta:update -p . -s ./src/components/HelloCmp.component\nsfdc meta:update -p . -s ./src/triggers/HelloApexTrigger.trigger\nsfdc meta:update -p . -s ./src/triggers/HelloApexTriggerAllEvents.trigger\nsfdc meta:update -p . -s ./src/triggers/HelloApexTriggerBulk.trigger\n```\n\n### metadata refresh\n\n#### metadata refresh by filepath\n\n```sh\n# refresh apex/trigger/page/copmonent/ aura file\nsfdc meta:refresh -p . -s src/classes/HelloApex.cls\nsfdc meta:refresh -p . -s ./src/classes/HelloApex.cls\nsfdc meta:refresh -p . -s ./src/classes/HelloApexBatch.cls\nsfdc meta:refresh -p . -s ./src/aura/HelloWorld/HelloWorld.cmp\nsfdc meta:refresh -p . -s ./src/aura/HelloWorld/HelloWorld.css\nsfdc meta:refresh -p . -s ./src/aura/HelloWorld\n```\n\n#### metadata refresh by directory\n\nsupport directorys, [read more](README.meta-refresh.md)\n\n```sh\n\n# refresh directory, examples\nsfdc meta:refresh:dir -p . -d ./src/classes\nsfdc meta:refresh:dir -p . -d ./src/triggers\nsfdc meta:refresh:dir -p . -d ./src/components\nsfdc meta:refresh:dir -p . -d ./src/pages\nsfdc meta:refresh:dir -p . -d ./src/layouts\nsfdc meta:refresh:dir -p . -d ./src/lwc\nsfdc meta:refresh:dir -p . -d ./src/aura\n\n# refresh one aura componet\nsfdc meta:refresh:aura -p . -s ./src/aura/HelloWorld\n\n```\n\n### delete metadata\n\n```sh\nsfdc meta:delete -p . -s ./src/classes/HelloApex.cls\nsfdc meta:delete -p . -s ./src/classes/HelloApexBatch.cls\nsfdc meta:delete -p . -s ./src/classes/HelloApexTest.cls\nsfdc meta:delete -p . -s ./src/classes/HelloApexBatchTest.cls\nsfdc meta:delete -p . -s ./src/pages/HelloApexPage.page\nsfdc meta:delete -p . -s ./src/components/HelloCmp.component\nsfdc meta:delete -p . -s ./src/triggers/HelloApexTrigger.trigger\n```\n\n## metadata attribute\n\n```sh\nsfdc meta:attr -p . -s ./src/classes/HelloApex.cls\n```\n\n## package.xml\n\n### build from server\n\n```sh\n# build package in current directory, filename package.xml\nsfdc packagexml:server\n\nsfdc packagexml:server -p . -d . -n package.xml\n```\n\n### build from local\n\nscan directory and build package.xml\n\n```sh\nsfdc packagexml:local --scandir ./src --savedir . -n package.xml\n```\n\n## sfdc apex\n\n### Executes anonymous Apex code\n\n```sh\n# create a apex code\nmkdir ./tmp/\necho \"System.debug('hello world');\" \u003e ./tmp/HelloApex.apex\n\n# run the apex code\nsfdc apex:execute -p . -s ./tmp/HelloApex.apex\n\n# use pipe\ncat ./tmp/HelloApex.apex | sfdc apex:execute -p .\n```\n\n### run apex testclass\n\n```sh\nsfdc apex:test:run -p . -s ./src/classes/HelloApexTest.cls\nsfdc apex:test:run -p . -s ./src/classes/HelloApexBatchTest.cls\n```\n\n### get coverage\n\n```sh\nsfdc apex:test:coverage -p . -f ./log/apex_coverage.log\n```\n\n## sobject\n\n### create sobject data\n\n```sh\n# insert a account\necho \"{\\\"Name\\\":\\\"exiahuang\\\"}\" | sfdc sobject:data:create -s Account\n\n# use json_data_file to create sobject data\nsfdc sobject:data:create -s Account --data $json_data_file_path\n\n```\n\n### get sobject data\n\n```sh\nsfdc sobject:data:get -s Account --id $account_id\n```\n\n### delete sobject data\n\n```sh\nsfdc sobject:data:delete -s Account --id $account_id\n```\n\n### update sobject data\n\n```sh\n# update sobject data from pipe\necho \"{\\\"Phone\\\":\\\"080-0000-0000\\\"}\" | sfdc sobject:data:update -s Account --id $account_id\n\n# update sobject data from json file\nsfdc sobject:data:update -s Account --id $account_id --data $json_data_file_path\n```\n\n### list sobject\n\n```sh\ncd $project_dir\n# print in console\nsfdc sobject:list\n\n# save as markdown file\nsfdc sobject:list \u003e log/sobject.md\n```\n\n### export sobject as xlsx file\n\n```sh\ncd $project_dir\nsfdc sobject:export:xlsx -s log/sobject.xlsx\n```\n\n### describe fields\n\n```sh\nsfdc sobject:fields:desc -s $sobject_name\n```\n\n## data query\n\n### soql query\n\n```sh\nsfdc data:soql:query -s \"SELECT id,name from USER limit 10\"\n```\n\n### tooling query\n\n```sh\nsfdc data:tooling:query -s \"SELECT Id,Name FROM ApexClass limit 100\"\n```\n\n## call salesforce rest api\n\n### Get method\n\n```sh\n# call /services/data/v45.0/sobjects\nsfdc call:rest:api -e /services/data/v45.0/sobjects\n\n# call /services/data/v45.0/sobjects/Account\nsfdc call:rest:api -e /services/data/v45.0/sobjects/Account\nsfdc call:rest:api -e /services/data/v45.0/sobjects/Opportunity\n\n```\n\n### use file as params\n\n```sh\necho '{\"q\": \"Select Id, Name From ApexClass Limit 3\"}' \u003e tmp/sf_rest_test.json\nsfdc call:rest:api -m GET -e /services/data/v45.0/tooling/query --use_params --params tmp/sf_rest_test.json\n```\n\n### use pipe to call rest api\n\nexample : query ApexCodeCoverage\n\n```sh\n# example1 : query ApexCodeCoverage\necho '{\"q\": \"SELECT Id, ApexTestClassId, TestMethodName, ApexClassorTriggerId, NumLinesCovered, NumLinesUncovered, Coverage FROM ApexCodeCoverage\"}' | sfdc call:rest:api -m GET -e /services/data/v45.0/tooling/query --use_params\n\n\n# example1 : query ApexClass\necho '{\"q\": \"Select Id, Name From ApexClass Limit 3\"}' | sfdc call:rest:api -m GET -e /services/data/v45.0/tooling/query --use_params\n```\n\n## code creator\n\n### create soql\n\n```sh\n#\nsfdc coder:snippet:soql -s $sobject_name --custom_field_only --updateable_field_only --include_comment --include_relationship\n\n#\nsfdc coder:snippet:soql -s Account  --custom_field_only --updateable_field_only --include_comment --include_relationship\n```\n\n### insert sobject data code snippet from soql\n\n```sh\nsfdc coder:apex:snippet:insert:data:from:soql -s $soql\nsfdc coder:apex:snippet:insert:data:from:soql -s \"SELECT name, firstname, lastname FROM Account LIMIT 2\"\n```\n\n### insert sobject data code snippet\n\n```sh\nsfdc coder:apex:snippet:insert:ramdam:data -s $sobject_name --all_fields\nsfdc coder:apex:snippet:insert:ramdam:data -s Account --all_fields\n\n```\n\n### generator testclass from apex\n\n```sh\nsfdc coder:apex:testclass:generator -f $apex_code_file_path\n```\n\n### generator VisualForce/Controller/DTO/DAO Code from sobject\n\n```sh\nsfdc coder:apex:page:generator --sobject $sobject_name --savedir tmp/mycode/src --custom_field_only --include_validate\n```\n\n### copy lightning\n\n```sh\nsfdc coder:copy:aura -f $from_lightning_path -t $to_lightning_path\nsfdc coder:copy:aura -f /app/project/sfdc-project1/src/aura/HelloWorld -t /app/project/sfdc-project1/src/aura/HelloWorld1\n```\n\n### create permission metadata\n\nretrieve sobject metadata first\n\n```sh\n# retrieve sobject metadata\nsfdc meta:retrieve -p . -d package_dir -n package2.zip -m CustomObject --unzip --delete_after_unzip\n# or use meta:refresh:dir\nsfdc meta:refresh:dir -p . -d ./src/objects\n```\n\ncreate permission from sobject metadata\n\n```sh\n# include sobject permission and all fields permission\nsfdc coder:permission:build --sobject_dir ./src/objects --savefile ./src/permissionsets/dev_permission.permissionset --include_all_sobject_permission\n\n# fieldPermissions\nsfdc coder:permission:build --sobject_dir ./src/objects --savefile ./src/permissionsets/dev_permission.permissionset --fields Account.custom_field1 Account.custom_field2 Opportunity.custom_field1\n```\n\nlist fields from sobject metadata directory\n\n```sh\n# list fields\nsfdc coder:permission:list -t fields --sobject_dir ./src/objects\n\nsfdc coder:permission:list -t fields --sobject_dir ./src/objects | grep Account\n\n```\n\nlist sobject from sobject metadata directory\n\n```\n# list sobject\nsfdc coder:permission:list -t sobject --sobject_dir ./src/objects\n\n```\n\n## salesforce folder\n\n```sh\n# report folder\nsfdc folder:list -n ReportFolder\n\n# email folder\nsfdc folder:list -n EmailTemplate\n```\n\n## download salesforce attachment\n\ndownload salesforce attachment(ContentVersion):\n\n-   max limit size: 2000\n-   default filename template: `{Id}_{Title}_v{VersionNumber}.{FileExtension}`\n\n```sh\nsfdc download:attachment --savedir tmp/download --filename \"{Title}_v{VersionNumber}.{FileExtension}\" --limit 2000\n```\n\n## Ant Migration Tool\n\n### init Ant Migration Tool\n\n```sh\nsfdc ant:migration:tool\n# or\nsfdc ant:migration:tool -p .\n```\n\n## tools\n\n### json format\n\n```sh\ncat $json_file_path | sfdc tools:json:format\n\nsfdc tools:json:format -i $json_file_path\n```\n\n# For developer\n\n## Set up docker\n\n```sh\n# for windows user\ndocker run --rm -it -v %cd%:/app -w=/app -e TZ=Asia/Tokyo --name sfdc-cli_developer_1 python:3.8 bash\n# for linux/mac\ndocker run --rm -it -v `pwd`:/app -w=/app -e TZ=Asia/Tokyo --name sfdc-cli_developer_1 python:3.8 bash\n\n# git clone\ngit clone https://github.com/exiahuang/sfdc-cli\n\n# setup\ncd sfdc-cli\npip3 install -r requirement.dev.txt\npython3 -m sfdc_cli.cli\nalias sfdc=\"python3 -m sfdc_cli.cli\"\nexport PYTHONPATH=\"/app/sfdc-cli:$PYTHONPATH\"\nsfdc -h\n\n# remove commmand\nunalias sfdc\n\n```\n\n## remove pycache\n\n```sh\n### use find\nfind . | grep -E \"(__pycache__|\\.pyc|\\.pyo$)\" | xargs rm -rf\n### use py3clean\npy3clean .\n```\n\n## Run test case.\n\n### new project\n\n```sh\npython3 -m unittest tests.test_project\n```\n\n### init from template\n\n```sh\npython3 -m unittest tests.test_metadata_template\n```\n\n### sfdc metadata api\n\n```sh\n# new apex/trigger/page/component template\npython3 -m unittest tests.test_metadata_template\n\n# metadata api: new metadata\npython3 -m unittest tests.test_metadata_api.MetadataApiNewMetaTestCase.test_metadata_new\n\n# metadata api: reload cache\npython3 -m unittest tests.test_metadata_api.MetadataApiNewMetaTestCase.test_metadata_cache\n\n# metadata api: update metadata\npython3 -m unittest tests.test_metadata_api.MetadataApiUpdateTestCase.test_metadata_update\n\n# metadata api: update aura metadata\npython3 -m unittest tests.test_metadata_api.MetadataApiUpdateTestCase.test_metadata_update_arua\n\n# metadata api: refresh metadata\npython3 -m unittest tests.test_metadata_api.MetadataApiRefreshTestCase\n\n# metadata api: refresh aura metadata\npython3 -m unittest tests.test_metadata_api.MetadataApiRefreshAuraTestCase\n\n# metadata api: print attr\npython3 -m unittest tests.test_metadata_api.MetadataApiAttrTestCase\n\n# delete metadata\npython3 -m unittest tests.test_metadata_api.MetadataApiDeleteTestCase\n\n# test delete aura\npython3 -m unittest tests.test_metadata_api.MetadataApiDeleteTestCase.test_metadata_delete_arua\n\n# run testclass\npython3 -m unittest tests.test_testclass.TestclassTestCase.test_run_test\n\n# run retrieve apex coverage\npython3 -m unittest tests.test_testclass.TestclassTestCase.test_retrieve_apex_coverage\n\n# retrieve zip\npython3 -m unittest tests.test_metadata_api.RetrieveApiTestCase\n\n# package xml : retrieve from server\npython3 -m unittest tests.test_package_xml.PackageXmlTestCase.test_package_xml_from_server\n\n# package xml : build from local\npython3 -m unittest tests.test_package_xml.PackageXmlTestCase.test_package_xml_from_dir\n\n# open in browser\npython3 -m unittest tests.test_browser.BrowserTestCase.test_open_src\npython3 -m unittest tests.test_browser.BrowserTestCase.test_open_aura\n\n# open in browser : open sobject\npython3 -m unittest tests.test_browser.BrowserTestCase.test_open_account_sobject\npython3 -m unittest tests.test_browser.BrowserTestCase.test_open_opp_sobject\n\n\n```\n\n### sfdc file attribute\n\n```sh\n# file attr\n# file attr\npython3 -m unittest tests.test_metadata_api.FileAttrTestCase\n```\n\nresult:\n\n```json\n{\n  \"name\": \"MyApexController\",\n  \"file_path\": \"project/sfdc-projcet1/src/classes\",\n  \"file_name\": \"MyApexController.cls\",\n  \"dir\": \"classes\",\n  \"p_dir\": \"src\",\n  \"extension\": \"cls\",\n  \"metadata_type\": \"ApexClass\",\n  \"metadata_folder\": \"classes\",\n  \"metadata_sub_folder\": \"\",\n  \"is_sfdc_file\": true,\n  \"is_src\": true,\n  \"is_lux\": false,\n  \"is_lux_root\": false,\n  \"is_lwc\": false,\n  \"is_lwc_root\": false,\n  \"lux_type\": \"\",\n  \"lux_name\": \"\",\n  \"file_key\": \"classes/MyApexController.cls\"\n}\n\n\n{\n  \"name\": \"HelloWorld\",\n  \"file_path\": \"project/sfdc-projcet1/src/aura/HelloWorld\",\n  \"file_name\": \"HelloWorld.cmp\",\n  \"dir\": \"HelloWorld\",\n  \"p_dir\": \"aura\",\n  \"extension\": \"cmp\",\n  \"metadata_type\": \"AuraDefinition\",\n  \"metadata_folder\": \"aura\",\n  \"metadata_sub_folder\": \"HelloWorld\",\n  \"is_sfdc_file\": true,\n  \"is_src\": false,\n  \"is_lux\": true,\n  \"is_lux_root\": false,\n  \"is_lwc\": false,\n  \"is_lwc_root\": false,\n  \"lux_type\": \"COMPONENT\",\n  \"lux_name\": \"HelloWorld\",\n  \"file_key\": \"aura/HelloWorld/HelloWorld.cmp\"\n}\n```\n\n# package\n\n```sh\npython3 setup.py sdist\npython3 setup.py bdist_wininst\n```\n\n## py2exe build windows exe\n\n```sh\npy -3.4 -m venv .py34\n.py34\\Scripts\\activate.bat\n# python -m pip install --upgrade pip\npip install py2exe setuptools\npip install requests XlsxWriter\npython -V\npython setup.py py2exe\n```\n\n# Acknowledgement\n\n## Basic on OpenSource\n\n1. [xlsxwriter (License: BSD)](https://github.com/jmcnamara/XlsxWriter)\n2. [Simple-Salesforce (License: Apache 2.0)](https://pypi.python.org/pypi/simple-salesforce/0.72.2)\n3. [requests (License: Apache 2.0)](https://pypi.python.org/pypi/requests/2.12.3)\n4. [Apex Template From MavensMate](https://github.com/joeferraro/MavensMate/tree/master/app/lib/templates/github)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexiahuang%2Fsfdc-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexiahuang%2Fsfdc-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexiahuang%2Fsfdc-cli/lists"}