{"id":34046092,"url":"https://github.com/zooniverse/panoptes-cli","last_synced_at":"2026-04-08T12:02:10.991Z","repository":{"id":9240294,"uuid":"49655777","full_name":"zooniverse/panoptes-cli","owner":"zooniverse","description":"A command-line interface for Panoptes","archived":false,"fork":false,"pushed_at":"2025-11-03T18:14:44.000Z","size":328,"stargazers_count":20,"open_issues_count":23,"forks_count":5,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-12-15T17:00:39.687Z","etag":null,"topics":["client"],"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/zooniverse.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-01-14T15:27:46.000Z","updated_at":"2025-11-03T18:14:49.000Z","dependencies_parsed_at":"2025-05-29T18:28:39.150Z","dependency_job_id":"dc51b8f5-861e-4de3-9a49-ab27af0443df","html_url":"https://github.com/zooniverse/panoptes-cli","commit_stats":{"total_commits":180,"total_committers":16,"mean_commits":11.25,"dds":0.3833333333333333,"last_synced_commit":"3a727ce687462a4cbf2ad4e5fefa22842c3651ca"},"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/zooniverse/panoptes-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zooniverse%2Fpanoptes-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zooniverse%2Fpanoptes-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zooniverse%2Fpanoptes-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zooniverse%2Fpanoptes-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zooniverse","download_url":"https://codeload.github.com/zooniverse/panoptes-cli/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zooniverse%2Fpanoptes-cli/sbom","scorecard":{"id":1239261,"data":{"date":"2025-10-20","repo":{"name":"github.com/zooniverse/panoptes-cli","commit":"066181f11a39379b5159149465220b79f0c88915"},"scorecard":{"version":"v5.3.1-0.20251020080748-9e702f4c9dc6","commit":"9e702f4c9dc6992745395f4c8ac89942d0cf87ea"},"score":5.3,"checks":[{"name":"Code-Review","score":7,"reason":"Found 5/7 approved changesets -- score normalized to 7","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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#code-review"}},{"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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#binary-artifacts"}},{"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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#dangerous-workflow"}},{"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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:26","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:27","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/publish-to-pypi.yml:1","Warn: no topLevel permission defined: .github/workflows/publish-to-test-pypi.yml:1","Warn: no topLevel permission defined: .github/workflows/run_tests_CI.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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#vulnerabilities"}},{"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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#fuzzing"}},{"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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#license"}},{"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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish-to-pypi.yml:6"],"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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md","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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#branch-protection"}},{"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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#security-policy"}},{"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/codeql-analysis.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/publish-to-pypi.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/publish-to-pypi.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/publish-to-pypi.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-test-pypi.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/publish-to-test-pypi.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-test-pypi.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/publish-to-test-pypi.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-to-test-pypi.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/publish-to-test-pypi.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run_tests_CI.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/run_tests_CI.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run_tests_CI.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/run_tests_CI.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run_tests_CI.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/zooniverse/panoptes-cli/run_tests_CI.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile.dev:1: pin your Docker image by updating python:3.9-alpine to python:3.9-alpine@sha256:f4b6234fd621f280bce58b3f4e8669d92346f36f2f73d8cc912f4a3aed28cb5d","Warn: containerImage not pinned by hash: Dockerfile.dev2:1: pin your Docker image by updating python:2-alpine to python:2-alpine@sha256:724d0540eb56ffaa6dd770aa13c3bc7dfc829dec561d87cb36b2f5b9ff8a760a","Warn: containerImage not pinned by hash: Dockerfile.stable:1: pin your Docker image by updating python:3-alpine to python:3-alpine@sha256:8373231e1e906ddfb457748bfc032c4c06ada8c759b7b62d9c73ec2a3c56e710","Warn: containerImage not pinned by hash: Dockerfile.stable2:1: pin your Docker image by updating python:2.7-alpine to python:2.7-alpine@sha256:724d0540eb56ffaa6dd770aa13c3bc7dfc829dec561d87cb36b2f5b9ff8a760a","Warn: pipCommand not pinned by hash: Dockerfile.dev:6","Warn: pipCommand not pinned by hash: Dockerfile.dev:10","Warn: pipCommand not pinned by hash: Dockerfile.dev2:6","Warn: pipCommand not pinned by hash: Dockerfile.dev2:10","Warn: pipCommand not pinned by hash: Dockerfile.stable:5","Warn: pipCommand not pinned by hash: Dockerfile.stable2:4","Warn: pipCommand not pinned by hash: .github/workflows/publish-to-pypi.yml:17","Warn: pipCommand not pinned by hash: .github/workflows/publish-to-pypi.yml:18","Warn: pipCommand not pinned by hash: .github/workflows/publish-to-test-pypi.yml:17","Warn: pipCommand not pinned by hash: .github/workflows/publish-to-test-pypi.yml:18","Warn: pipCommand not pinned by hash: .github/workflows/run_tests_CI.yml:25","Warn: pipCommand not pinned by hash: .github/workflows/run_tests_CI.yml:26","Info:   0 out of  11 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of   4 containerImage dependencies pinned","Info:   0 out of  12 pipCommand 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/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 5 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/9e702f4c9dc6992745395f4c8ac89942d0cf87ea/docs/checks.md#sast"}}]},"last_synced_at":"2025-10-27T17:31:41.148Z","repository_id":9240294,"created_at":"2025-10-27T17:31:41.149Z","updated_at":"2025-10-27T17:31:41.149Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31554110,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T10:21:54.569Z","status":"ssl_error","status_checked_at":"2026-04-08T10:21:38.171Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["client"],"created_at":"2025-12-13T23:34:42.060Z","updated_at":"2026-04-08T12:02:10.940Z","avatar_url":"https://github.com/zooniverse.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Panoptes CLI\n\nA command-line interface for [Panoptes](https://github.com/zooniverse/Panoptes),\nthe API behind [the Zooniverse](https://www.zooniverse.org/).\n\n## Installation\n\nThe Panoptes CLI is written in Python, so in order to install it you will need\nto install Python 3 along with `pip`. Please note: while still compatible with\nPython 2.7, we have ended support for use of the CLI with this deprecated version.\nmacOS and Linux already come with Python installed, so run this to see if you\nalready have everything you need:\n\n```\n$ python --version \u0026\u0026 pip --version\n```\n\nIf you see an error like `python: command not found` or `pip: command not found`\nthen you will need to install this:\n\n- [Python installation](https://wiki.python.org/moin/BeginnersGuide/Download)\n  (or [Miniconda installation](https://docs.conda.io/en/latest/miniconda.html))\n- [Pip installation](https://pip.pypa.io/en/stable/installing/)\n\nOnce these are installed you can just use `pip` to install the latest release of\nthe CLI:\n\n```\n$ pip install panoptescli\n```\n\nAlternatively, if you want to preview the next release you can install HEAD\ndirectly from GitHub (though be aware that this may contain\nbugs/untested/incomplete features):\n\n```\n$ pip install -U git+https://github.com/zooniverse/panoptes-cli.git\n```\n\nTo upgrade an existing installation to the latest version:\n\n```\npip install -U panoptescli\n```\n\n## Built-in help\n\nEvery command comes with a built in `--help` option, which explains how to use\nit.\n\n```\n$ panoptes --help\nUsage: panoptes [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n  -e, --endpoint TEXT  Overides the default API endpoint\n  -a, --admin          Enables admin mode. Ignored if you're not logged in as\n                       an administrator.\n  --version            Show the version and exit.\n  --help               Show this message and exit.\n\nCommands:\n  configure    Sets default values for configuration options.\n  info         Displays version and environment information for debugging.\n  project      Contains commands for managing projects.\n  subject      Contains commands for retrieving information about subjects.\n  subject-set  Contains commands for managing subject sets.\n  user         Contains commands for retrieving information about users.\n  workflow     Contains commands for managing workflows.\n```\n\n```\n$ panoptes project --help\nUsage: panoptes project [OPTIONS] COMMAND [ARGS]...\n\n  Contains commands for managing projects.\n\nOptions:\n  --help  Show this message and exit.\n\nCommands:\n  create    Creates a new project.\n  delete\n  download  Downloads project-level data exports.\n  info\n  ls        Lists project IDs and names.\n  modify    Changes the attributes of an existing project..\n```\n\n```\n$ panoptes subject-set upload-subjects --help\nUsage: panoptes subject-set upload-subjects [OPTIONS] SUBJECT_SET_ID\n                                            MANIFEST_FILES...\n\n  Uploads subjects from each of the given MANIFEST_FILES.\n\n  Example with only local files:\n\n  $ panoptes subject-set upload-subjects 4667 manifest.csv\n\n  Local filenames will be automatically detected in the manifest and\n  uploaded, or filename columns can be specified with --file-column.\n\n  If you are hosting your media yourself, you can put the URLs in the\n  manifest and specify the column number(s):\n\n  $ panoptes subject-set upload-subjects -r 1 4667 manifest.csv\n\n  $ panoptes subject-set upload-subjects -r 1 -r 2 4667 manifest.csv\n\n  Any local files will still be detected and uploaded.\n\nOptions:\n  -M, --allow-missing            Do not abort when creating subjects with no\n                                 media files.\n  -r, --remote-location INTEGER  Specify a field (by column number) in the\n                                 manifest which contains a URL to a remote\n                                 media location. Can be used more than once.\n  -m, --mime-type TEXT           MIME type for remote media. Defaults to\n                                 image/png. Can be used more than once, in\n                                 which case types are mapped one to one with\n                                 remote locations in the order they are given.\n                                 Has no effect without --remote-location.\n  -f, --file-column INTEGER      Specify a field (by column number) in the\n                                 manifest which contains a local file to be\n                                 uploaded. Can be used more than once.\n                                 Disables auto-detection of filename columns.\n  --help                         Show this message and exit.\n```\n\n## Uploading non-image media types\n\nIf you wish to upload subjects with non-image media (e.g. audio or video),\nit is desirable to have the `libmagic` library installed for type detection.\nIf you don't already have `libmagic`, please see the [dependency information \nfor python-magic](https://github.com/ahupp/python-magic#installation) for more\ndetails.\n\nTo check if `libmagic` is installed, run this command:\n\n```\n$ panoptes info\n```\n\nIf you see `libmagic: False` in the output then it isn't installed.\n\nIf `libmagic` is not installed, assignment of MIME types (e.g., image/jpeg,\nvideo/mp4, text/plain, application/json, etc) will be based on file extensions.\nBe aware that if file names and extension aren't accurate, this could lead to\nissues when the media is loaded.\n\n## Command Line Examples\n\nThis readme does not list everything that the CLI can do. For a full list of\ncommands and their options, use the built in help as described above.\n\n### Log in and optionally set the API endpoint\n\n```\n$ panoptes configure\nusername []:\npassword:\n```\n\nPress enter without typing anything to keep the current value (shown in\nbrackets). You probably don't need to change the endpoint, unless you're running\nyour own copy of the Panoptes API.\n\n### Create a new project\n\n```\n$ panoptes project create \"My Project\" \"This is a description of my project\"\n*2797 zooniverse/my-project My Project\n```\n\nThe `*` before the project ID indicates that the project is private.\n\n### Create a subject set in your new project\n\n```\n$ panoptes subject-set create 2797 \"My first subject set\"\n4667 My first subject set\n```\n\n### Make your project public\n\n```\n$ panoptes project modify --public 2797\n2797 zooniverse/my-project My Project\n```\n\n### Upload subjects\n\n```\n$ panoptes subject-set upload-subjects 4667 manifest.csv\n```\n\nLocal filenames will be automatically detected in the manifest and uploaded. If\nyou are hosting your media yourself, you can put the URLs in the manifest and\nspecify the column number(s) and optionally set the file type if you're not\nuploading PNG images:\n\n```\n$ panoptes subject-set upload-subjects -m image/jpeg -r 1 4667 manifest.csv\n$ panoptes subject-set upload-subjects -r 1 -r 2 4667 manifest.csv\n```\n\nA manifest is a CSV file which contains the names of local media files to upload (one per column) or remote URLs (matching the `-r` option)\nand any other column is recorded as subject metadata, where the column name is the key and the row/column entry is the value, for example:\n\nfile_name_1 | file_name_2 | metadata | !metadata_hidden_from_classification | #metadata_hidden_from_all\n-- | -- | -- | -- | --\nlocal_image_file_1.jpeg | local_image_file_2.jpeg | image_01 | giraffe | kenya_site_1\n\n### Resuming a failed upload\n\nIf an upload fails for any reason, the CLI should detect the failure and give you the option of resuming the upload at a later time:\n\n```\n$ panoptes subject-set upload-subjects -m image/jpeg -r 1 4667 manifest.csv\nUploading subjects  [------------------------------------]    0%  00:41:05\nError: Upload failed.\nWould you like to save the upload state to resume the upload later? [Y/n]: y\nEnter filename to save to [panoptes-upload-4667.yaml]:\n```\n\nThis will save a new manifest file which you can use to resume the upload. The new manifest file will be in YAML format rather than CSV, and the YAML file contains all the information about the original upload (including any command-line options you specified) along with a list of the subjects which have not yet been uploaded.\n\nTo resume the upload, simply run the `upload-subjects` command specifying the same subject set ID with the new manifest file. Note that you do not need to include any other options that you originally specified (such as `-r`, `-m`, and so on):\n\n```\n$ panoptes subject-set upload-subjects 4667 panoptes-upload-4667.yaml\n```\n\n### Generate and download a classifications export\n\n```\n$ panoptes project download --generate 2797 classifications.csv\n```\n\nIt is also possible to generate and download workflow classification or subject set classification exports\n```\n$ panoptes workflow download-classifications --generate 18706 workflow-18706-classifications.csv\n\n$ panoptes subject-set download-classifications --generate 79758 subjectset-79759-classifications.csv\n```\n\n### Generate and download a talk comments export\n\n```\n$ panoptes project download --generate --data-type talk_comments 2797 2797_comments.tar.gz\n```\n\n### List subject sets in a project\n\n```\n$ panoptes subject-set ls -p 2797\n```\n\n### Verify that subject set 4667 is in project 2797\n\n```\n$ panoptes subject-set ls -p 2797 4667\n```\n\n### Add known subjects to a subject set\n\n```\n# for known subjects with ids 3, 2, 1 and subject set with id 999\n$ panoptes subject-set add-subjects 999 3 2 1\n```\n\n### List workflows in your project\n\n```\n$ panoptes workflow ls -p 2797\n1579 Example workflow 1\n2251 Example workflow 2\n```\n\n### Add a subject set to a workflow\n\n```\n$ panoptes workflow add-subject-sets 1579 4667\n```\n\n### List subject sets in a workflow\n\n```\n$ panoptes subject-set ls -w 1579\n4667 My first subject set\n```\n\n### Retire subjects in a workflow\n\nFor known subjects with ids 2001 and 2002, workflow with id 101\n```\n$ panoptes workflow retire-subjects 101 2001 2002\n```\n\n### Un-Retire subjects in a workflow\n\nTo unretire subjects according to subject ID, for known subjects with ids 2001, 2002 and workflow with id 101\n```\n$ panoptes workflow unretire-subjects 101 2001 2002\n```\n\nTo unretire all subjects in a given subject set, for subject sets with ids 300, 301 and workflow with id 101\n```\npanoptes workflow unretire-subject-sets 101 300 301\n```\n\n### Run aggregations\n\nTo run batch aggregation on workflow with id 101, notify logged-in user (default), and delete existing run\n```\n$ panoptes workflow run-aggregation 101 -d\n```\n\n### Get batch aggregations\n\nFor fetching existing batch aggregation on workflow with id 101\n```\n$ panoptes workflow get-batch-aggregation 101\n```\n\n### Check batch aggregation run status\n\nFor checking status of batch aggregation run on workflow with id 101\n```\n$ panoptes workflow get-batch-aggregation-status 101\n```\n\n### Get batch aggregation links\n\nFor fetching download URLs for the run aggregation on workflow with id 101\n```\n$ panoptes workflow get-batch-aggregation-links 101\n```\n\n### Importing iNaturalist observations\n\nImporting iNaturalist observations to the Zooniverse as subjects is possible via an API endpoint, which is accessible via this client.\n\nThis command initiates a background job on the Zooniverse platform to import Observations. The request will return a 200 upon success, and the import will begin as the Zooniverse and iNaturalist APIs talk to each other. Once the command is issued, the work is being done remotely and you can refresh the subject set in the project builder to check its progress. The authenticated user will receive an email when this job is completed; you don't have to keep the terminal open.\n\nThis command imports “verifiable” observations, which  according to the iNat docs means “observations with a quality_grade of either `needs_id` or `research`.\" Project owners and collaborators can use this CLI to send a request to begin that import process:\n\n```\n# Requires an iNaturalist taxon id and a Zooniverse subject set (both integers). This will import all observations for that taxon id.\n$ panoptes inaturalist import-observations --taxon-id 46017 --subject-set-id 999999\n```\n\nOptional: include an updated_since timestamp (string) to include only observations updated after that date:\n\n```\n$ panoptes inaturalist import-observations --taxon-id 46017 --subject-set-id 999999 --updated-since 2022-12-03\n```\n\nThe `--updated-since` argument is a standard ISO timestamp, such as '2022-12-03' or `2022-12-03T18:56:06+00:00'. It is passed directly to the iNat Observations v2 API as the 'updated_since' query parameter.\n\n\n\n## Debugging\n\nTo view the various requests as sent to the Panoptes API as well as other info,\ninclude the env var `PANOPTES_DEBUG=true` before your command, like so:\n\n`PANOPTES_DEBUG=true panoptes workflow ls -p 1234`\n\n### Usage\n\n1. Run `docker-compose build` to build the containers. Note there are mulitple containers for different envs, see docker-compose.yml for more details\n\n2. Create and run all the containers with `docker-compose up`\n\n### Testing\n\n1. Use docker to run a testing environment bash shell and run test commands .\n    1. Run `docker-compose run --rm dev sh` to start an interactive shell in the container\n    1. Run `python -m unittest discover` to run the full test suite\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzooniverse%2Fpanoptes-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzooniverse%2Fpanoptes-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzooniverse%2Fpanoptes-cli/lists"}