{"id":20571837,"url":"https://github.com/fairdatapipeline/fair-cli","last_synced_at":"2025-08-18T11:05:03.259Z","repository":{"id":37863880,"uuid":"377398464","full_name":"FAIRDataPipeline/FAIR-CLI","owner":"FAIRDataPipeline","description":"Command line interface for the FAIR Data Pipeline","archived":false,"fork":false,"pushed_at":"2025-04-30T13:51:33.000Z","size":6274,"stargazers_count":4,"open_issues_count":15,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-05T09:05:00.510Z","etag":null,"topics":["data","data-pipeline","fair"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FAIRDataPipeline.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-06-16T06:46:42.000Z","updated_at":"2025-04-11T08:57:21.000Z","dependencies_parsed_at":"2024-05-17T10:25:22.516Z","dependency_job_id":"810172e7-83c2-402d-b5a8-acce7afb4fa9","html_url":"https://github.com/FAIRDataPipeline/FAIR-CLI","commit_stats":{"total_commits":661,"total_committers":13,"mean_commits":50.84615384615385,"dds":"0.40998487140695916","last_synced_commit":"ecec8bba0ebf3a20348557dcaeb8f0d8f5e5c185"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/FAIRDataPipeline/FAIR-CLI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FAIRDataPipeline%2FFAIR-CLI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FAIRDataPipeline%2FFAIR-CLI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FAIRDataPipeline%2FFAIR-CLI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FAIRDataPipeline%2FFAIR-CLI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FAIRDataPipeline","download_url":"https://codeload.github.com/FAIRDataPipeline/FAIR-CLI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FAIRDataPipeline%2FFAIR-CLI/sbom","scorecard":{"id":48143,"data":{"date":"2025-08-11","repo":{"name":"github.com/FAIRDataPipeline/FAIR-CLI","commit":"b337f49f65d351870e863a984d41c0dff393a776"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.9,"checks":[{"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":"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":"Code-Review","score":0,"reason":"Found 0/11 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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: topLevel 'contents' permission set to 'write': .github/workflows/deploy.yaml:7","Warn: no topLevel permission defined: .github/workflows/fair-cli.yaml:1","Warn: no topLevel permission defined: .github/workflows/gh-pages.yaml:1","Warn: no topLevel permission defined: .github/workflows/implementations.yml:1","Info: no jobLevel write permissions found"],"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yaml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yaml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:76: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:86: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:90: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yaml:100: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:113: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:127: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:130: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yaml:143: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:164: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:169: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yaml:174: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yaml:179: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/deploy.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/fair-cli.yaml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/fair-cli.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/fair-cli.yaml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/fair-cli.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/fair-cli.yaml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/fair-cli.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/gh-pages.yaml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/gh-pages.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:101: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:103: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:108: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:115: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:166: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:172: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:179: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:186: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/implementations.yml:191: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/implementations.yml:196: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/implementations.yml:202: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:257: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:259: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/implementations.yml:267: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:276: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:322: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:325: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/implementations.yml:332: update your workflow using https://app.stepsecurity.io/secureworkflow/FAIRDataPipeline/FAIR-CLI/implementations.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yaml:60","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yaml:97","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yaml:137","Warn: pipCommand not pinned by hash: .github/workflows/fair-cli.yaml:36","Warn: pipCommand not pinned by hash: .github/workflows/implementations.yml:40","Warn: pipCommand not pinned by hash: .github/workflows/implementations.yml:42","Warn: pipCommand not pinned by hash: .github/workflows/implementations.yml:44","Warn: downloadThenRun not pinned by hash: .github/workflows/implementations.yml:53","Warn: pipCommand not pinned by hash: .github/workflows/implementations.yml:133","Warn: downloadThenRun not pinned by hash: .github/workflows/implementations.yml:139","Warn: pipCommand not pinned by hash: .github/workflows/implementations.yml:223","Warn: downloadThenRun not pinned by hash: .github/workflows/implementations.yml:231","Warn: pipCommand not pinned by hash: .github/workflows/implementations.yml:288","Warn: downloadThenRun not pinned by hash: .github/workflows/implementations.yml:296","Warn: pipCommand not pinned by hash: .github/workflows/implementations.yml:358","Warn: downloadThenRun not pinned by hash: .github/workflows/implementations.yml:366","Info:   0 out of  34 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  11 third-party GitHubAction dependencies pinned","Info:   0 out of  11 pipCommand dependencies pinned","Info:   0 out of   5 downloadThenRun dependencies pinned"],"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":"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":"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"}},{"name":"CII-Best-Practices","score":2,"reason":"badge detected: InProgress","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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 2-Clause \"Simplified\" License: 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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.8.0 not signed: https://api.github.com/repos/FAIRDataPipeline/FAIR-CLI/releases/111491010","Warn: release artifact v0.2.3 not signed: https://api.github.com/repos/FAIRDataPipeline/FAIR-CLI/releases/53559935","Warn: release artifact v0.8.0 does not have provenance: https://api.github.com/repos/FAIRDataPipeline/FAIR-CLI/releases/111491010","Warn: release artifact v0.2.3 does not have provenance: https://api.github.com/repos/FAIRDataPipeline/FAIR-CLI/releases/53559935"],"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"SAST","score":6,"reason":"SAST tool is not run on all commits -- score normalized to 6","details":["Warn: 17 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-14T23:11:17.255Z","repository_id":37863880,"created_at":"2025-08-14T23:11:17.255Z","updated_at":"2025-08-14T23:11:17.255Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270982194,"owners_count":24679447,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-18T02:00:08.743Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["data","data-pipeline","fair"],"created_at":"2024-11-16T05:17:27.485Z","updated_at":"2025-08-18T11:05:03.222Z","avatar_url":"https://github.com/FAIRDataPipeline.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FAIR Data Pipeline Command Line Interface\n\n[![PyPI](https://img.shields.io/pypi/v/fair-cli)](https://pypi.org/project/fair-cli/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/fair-cli)](https://pypi.org/project/fair-cli/) [![DOI](https://zenodo.org/badge/377398464.svg)](https://zenodo.org/badge/latestdoi/377398464) ![PyPI - License](https://img.shields.io/pypi/l/fair-cli)  [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/5411/badge)](https://bestpractices.coreinfrastructure.org/projects/5411)\n\n[![FAIR Data Pipeline CLI](https://github.com/FAIRDataPipeline/FAIR-CLI/actions/workflows/fair-cli.yaml/badge.svg?branch=main)](https://github.com/FAIRDataPipeline/FAIR-CLI/actions/workflows/fair-cli.yaml)  [![codecov](https://codecov.io/gh/FAIRDataPipeline/FAIR-CLI/branch/dev/graph/badge.svg?token=h93TkTiiWf)](https://codecov.io/gh/FAIRDataPipeline/FAIR-CLI) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=FAIRDataPipeline_FAIR-CLI\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=FAIRDataPipeline_FAIR-CLI)\n\nFAIR-CLI forms the main interface for synchronising changes between local and shared remote FAIR Data Pipeline registries, it is also used to instantiate model runs/data submissions to the pipeline. Full documentation of the FAIR Data Pipeline can be found on the project [website](https://www.fairdatapipeline.org/).\n\n## Installation\n\nThe package is installed using Pip:\n\n```sh\npip install fair-cli\n```\n\nTo enable tab completion you need to modify your shell:\n\n### Bash\n```\n_FAIR_COMPLETE=bash_source fair \u003e ~/.config/.fair-complete.bash\necho '. ~/.config/.fair-complete.bash' \u003e\u003e ~/.bashrc\n```\n\n### zsh\n```\n_FAIR_COMPLETE=zsh_source fair \u003e ~/.fair-complete.zsh\necho '. ~/.fair-complete.zsh' \u003e\u003e ~/.bashrc\n```\n\n### Fish\n```\n_FAIR_COMPLETE=bash_source fair \u003e ~/.config/fish/.fair-complete.fish\necho '. ~/.config/fish/.fair-complete.fish' \u003e\u003e ~/.bashrc\n```\n\n## Uninstallation\nTo uninstall the CLI run:\n```\nfair purge --all\npip uninstall fair\n```\n\n## The User Configuration File\nJob runs are configured via `config.yaml` files. Upon initialisation of a project, FAIR-CLI automatically generates a starter configuration file with all requirements in place. To execute a process (e.g. perform a model run from a compiled binary/script) an additional key of either `script` or `script_path` must be provided. Alternatively the command `fair run bash` can be used to append the key and run a command directly.\n\nBy default the shell used to execute a process is `sh` or `batch` for UNIX and Windows systems respectively. This can be overwritten by assigning the optional `shell` key with one of the following values (where `{0}` is the script file):\n\n| **Shell**    | **Command**                     |\n| ------------ | ------------------------------- |\n| `bash`       | `bash -eo pipefail {0}`         |\n| `java`       | `java {0}`                      |\n| `julia`      | `julia {0}`                     |\n| `powershell` | `powershell -command \". '{0}'\"` |\n| `pwsh`       | `pwsh -command \". '{0}'\"`       |\n| `python2`    | `python2 {0}`                   |\n| `python3`    | `python3 {0}`                   |\n| `python`     | `python {0}`                    |\n| `R`          | `R -f {0}`                      |\n| `sh`         | `sh -e {0}`                     |\n| `batch`      | `{0}`                           |\n\nA full description of `config.yaml` files can be found [here](https://www.fairdatapipeline.org/docs/interface/config/).\n\n## Available Commands\n\n### `init`\n\nInitialises a new FAIR repository within the given directory. This should ideally be the same location as the `.git` folder for the current project, however during setup an option is given to specify an alternative. The command will ask the user a series of questions which will provide metadata for tracking run authors, and also allow for the creation of a starter `config.yaml` file. Initialisation will also configure the CLI itself.\n\n#### Custom CLI Configuration\nAfter setup is complete, the current CLI configuration can also be saved using the command:\n```\nfair init --export\n```\nthe created file can then be re-read at a later point during setup. Alternatively, if creating a configuration from scratch the YAML file should contain the following information:\n\n```yaml\nnamespaces:\n  input: testing\n  output: testing\nregistries:\n  local:\n    data_store: /path/to/local/data_store/,\n    directory: /local/registry/install/directory\n    uri: http://127.0.0.1:8000/api/\n  origin:\n    data_store: /remote/registry/data/store/path/\n    token: /path/to/remote/token\n    uri: https://data.fairdatapipeline.org/api/'\nuser:\n  email: 'test@noreply',\n  family_name: 'Test'\n  given_names: 'Interface'\n  orcid: None,\n  uuid: '2ddb2358-84bf-43ff-b2aa-3ac7dc3b49f1'\ngit:\n  local_repo: /local/repo/path\n  remote: origin\ndescription: Testing Project\n```\nthis file is then read during the initialisation:\n\n```sh\nfair init --using \u003ccli-config.yaml file\u003e\n```\n\nFor integration into a CI workflow, the setup can be skipped by running:\n\n```sh\nfair init --ci\n```\n\nwhich will create temporary directories for some of the required location paths.\n\n\n### `run`\n\nThe purpose of `run` is to execute a model/submission run and submit results to the local registry. Outputs of a run will be stored within the `coderun` folder in the directory specified under the `data_store` tag in the `config.yaml`, by default this is `$HOME/.fair/data/coderun`.\n\n```sh\nfair run\n```\n\nIf you wish to use an alternative `config.yaml` then specify it as an additional argument:\n\n```sh\nfair run /path/to/config.yaml\n```\n\nYou can also launch a bash command directly, this will be automatically written into the `config.yaml`:\n\n```sh\nfair run --script 'echo \"Hello World\"'\n```\n\nnote the command itself must be quoted as it is a single argument.\n\nBy default the CLI will not allow the user to perform a run if the state of the analysis repository is such that it is behind the git remote, or contains uncommitted changes. To override this behaviour use the `--dirty` flag.\n\n### `pull`\n\nThe command `pull` will update any entries within the `config.yaml` under the `register` heading creating `external_object` and `data_product` objects on the registry and downloading the data to the local data storage. Any data required for a run is downloaded and stored within the local registry. In addition any data products requested that are available on the remote registry are pulled locally.\n\n```sh\nfair pull /path/to/config.yaml\n```\n\n### `status`\nThis command displays objects which are awaiting staging or have been staged behaving in a manner similar to `git status`:\n```sh\nfair status\n```\nstaged changes are displayed in green, and unstaged in red.\n\n### `add`\nBefore changes can be pushed to the remote registry they must be staged. This command allows you to stage objects displayed when running `fair status` so that they can be sent to the remote registry. Data products are displayed and staged in the form `namespace:data_product_name@version`:\n```sh\nfair add my_namespace:data_object@v0.1.0\n```\n\n### `push`\nThe `push` command will push any staged data products to the remote registry:\n\n```sh\nfair push\n```\n\n### `purge`\n\nThe `purge` command removes setup of the current project so it can bereinitialised:\n\n```sh\nfair purge\n```\n\nTo remove all configurations entirely (including those global to all projects) run:\n\n```sh\nfair purge --global\n```\n\nTo remove the data directory itself run:\n\n```sh\nfair purge --data\n```\n\n**WARNING**: This is not recommended as the registry may still have entries pointing to this location!\n\nFinally to remove everything run:\n\n```sh\nfair purge --all\n```\n\nthis will remove the current repository `.fair` folder and the global FAIR directory which also contains the local registry.\n\nYou can skip any confirmation messages by running:\n\n```sh\nfair purge --yes\n```\n\n### `registry`\n\nBy default the CLI will launch the registry whenever a synchronisation or run is called. The server will only be halted once all ongoing CLI processes (in the case of multiple parallel calls) have been completed.\n\nHowever the user may also specify a manual launch that will override this behaviour, instead leaving the server running constantly allowing them to view the registry in the browser.\n\nThe commands:\n\n```sh\nfair registry start\n```\n\nand\n\n```sh\nfair registry stop\n```\n\nwill launch and halt the server respectively.\n\nThe registry can be installed using the CLI as well by running:\n```sh\nfair registry install\n```\nwith the additional options to specify the installation location, and the data registry repository tag to install from:\n```sh\nfair registry install --directory ~/.fair/my_registry --version v1.0-rc5\n```\n\n### `log`\n\nRuns are logged locally within the local FAIR repository. A full list of runs is shown by running:\n\n```sh\nfair log\n```\n\nThis will present a list of runs in a summary analogous to a `git log` call:\n\n```yaml\nrun 0db35c20946a1ebeaafdc3b30103cd74a57eb6b6\nAuthor: Joe Bloggs \u003cjbloggs@noreply.uk\u003e\nDate:   Wed Jun 30 09:09:30 2021\n```\n\n| **NOTE**                                                                                                                            |\n| ----------------------------------------------------------------------------------------------------------------------------------- |\n| The SHA for a job is *not* related to a registry code run identifier as multiple code runs can be executed within a single job. |\n\n### `view`\n\nTo view the `stdout` of a run given its SHA as shown by running `fair log` use the command:\n\n```sh\nfair view \u003csha\u003e\n```\n\nyou do not need to specify the full SHA but rather the first few unique characters.\n\n## Template Variables\n\nWithin the `config.yaml` file, template variables can be specified by using the notation `${{ VAR }}`, the following variables are currently recognised:\n\n| **Variable**        | **Description**                                                                  |\n| ------------------- | -------------------------------------------------------------------------------- |\n| `DATE`              | Date in the form `%Y%m%d`                                                        |\n| `DATETIME`          | Date and time in the form `%Y-%m-%sT%H:%M:S`                                     |\n| `DATETIME-%Y%H%M`   | Date and time in custom format (where `%Y%H%M` can be any valid form)            |\n| `USER`              | The current user as defined in the CLI                                           |\n| `USER_ID`           | The unique identifier for the current user        |\n| `REPO_DIR`          | The FAIR repository root directory                                               |\n| `CONFIG_DIR`        | The directory containing the `config.yaml` after template substitution           |\n| `LOCAL_TOKEN`       | The token for access to the local registry                                       |\n| `SOURCE_CONFIG`     | Path of the user defined `config.yaml`                                           |\n| `GIT_BRANCH`        | Current branch of the `git` repository                                           |\n| `GIT_REMOTE`        | The URI of the git repository specified during setup                             |\n| `GIT_TAG`           | The latest tag on `git`                                                          |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffairdatapipeline%2Ffair-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffairdatapipeline%2Ffair-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffairdatapipeline%2Ffair-cli/lists"}