Skip to main content

preset-cli

A CLI to interact with Preset workspaces.

This tool is a command line interface (CLI) to interact with your Preset workspaces. Currently it can be used to sync resources (databases, datasets, charts, dashboards) from source control, either in native format or from a dbt project. It can also be used to run SQL against any database in any workspace. In the future, the CLI will also allow you to manage your workspaces and users.

Installation

Install the CLI with pip:

$ pip install -U setuptools setuptools_scm wheel  # for good measure
$ pip install preset-cli

Make sure you’re using Python 3.8 or newer.

You can also install from main, if you need recent features:

$ pip install "git+https://github.com/preset-io/backend-sdk.git"

Authentication

The CLI requires an API key for authentication, composed of token and an associated secret. Both can be defined in your environment as PRESET_API_TOKEN and PRESET_API_SECRET, respectively, or can be stored in a configuration file. To store the credentials in a configuration file simply run preset-cli auth. This should open https://manage.app.preset.io/app/user in your browser so you can generate a new token, and it will prompt you for the token and its secret:

% preset-cli auth
Please generate a new token at https://manage.app.preset.io/app/user if you don't have one already
API token: 35dac901-c775-43ff-8eb4-816edc061487
API secret: [will not echo]
Credentials stored in /Users/beto/Library/Application Support/preset-cli/credentials.yaml

The credentials will be stored in a system-dependent location, in a file that’s readable only by you.

This step is optional. If you try to run the CLI without the token/secret defined in your environment or stored in the expected location you will be prompted for them:

% preset-cli superset sql
You need to specify a JWT token or an API key (name and secret)
API token: 35dac901-c775-43ff-8eb4-816edc061487
API secret: [will not echo]
Store the credentials in /Users/beto/Library/Application Support/preset-cli/credentials.yaml? [y/N]

You can also pass the token/secret (or even the JWT token) directly as an option:

% preset-cli --api-token 35dac901-c775-43ff-8eb4-816edc061487 --api-secret XXX superset sql
% preset-cli --jwt-token XXX superset sql

In summary, there are 3 options for credentials:

  1. Stored in the environment as PRESET_API_TOKEN and PRESET_API_SECRET.

  2. Stored in a user-readable file called credentials.yaml, with system-dependent location.

  3. Passed directly to the CLI via --api-token and --api-secret (or --jwt-token) options.

Workspaces

The CLI can run commands against one or more Preset workspaces (Apache Superset instances). When running a command you can specify the workspace(s) by passing a comma-separated list of URLs to the --workspaces option:

% preset-cli \
> --workspaces=https://abcdef12.us1a.app.preset.io/,https://34567890.us1a.app.preset.io/ \
> superset sql

If you omit the --workspaces option you will be prompted interactively:

% preset-cli superset sql
Choose one or more workspaces (eg: 1-3,5,8-):

# Team 1 #
✅ (1) The Data Lab
🚧 (2) New workspace

# Dev #
⤴️ (3) Test workspace

Each workspace has an icon depicting its status:

  • ✅ ready

  • 📊 loading examples

  • 💾 creating/initializing metadata database

  • 🚧 migrating metadata database

  • 🕵️ migrating secrets

  • ⤴️ upgrading workspace

  • ❗️ error

  • ❓ unknown state

You can specify one or more workspaces by using a comma-separated list of numbers and/or ranges:

  • 1: workspace 1

  • 1,3: workspaces 1 and 3

  • 1,3-5: workspaces 1, 3, 4, and 5

  • -3: workspaces 1, 2, and 3

  • 1-: all workspaces

  • -: all workspaces

Commands

The following commands are currently available:

  • preset-cli auth: store authentication credentials.

  • preset-cli invite-users: invite users to Preset.

  • preset-cli import-users: automatically add users to Preset.

  • preset-cli list-group-membership: List SCIM groups from a team and their memberships.

  • preset-cli superset sql: run SQL interactively or programmatically against an analytical database.

  • preset-cli superset export-assets (alternatively, preset-cli superset export): export resources (databases, datasets, charts, dashboards) into a directory as YAML files.

  • preset-cli superset delete-assets: delete resources by filter with dry-run by default and optional best-effort rollback.

  • preset-cli superset export-ownership: export resource ownership (UUID -> email) into a YAML file.

  • preset-cli superset export-rls: export RLS rules into a YAML file.

  • preset-cli superset export-roles: export user roles into a YAML file.

  • preset-cli superset export-users: export users (name, username, email, roles) into a YAML file.

  • preset-cli superset sync native (alternatively, preset-cli superset import-assets): synchronize the workspace from a directory of templated configuration files.

  • preset-cli superset sync dbt-core: synchronize the workspace from a dbt Core project.

  • preset-cli superset sync dbt-cloud: synchronize the workspace from a dbt Cloud project.

Delete Rollback Semantics

The delete-assets command is API-driven and performs individual delete calls. When --rollback is enabled (default), the CLI attempts a best-effort rollback by re-importing a pre-delete backup if failures happen after at least one successful deletion.

This is not a single transaction, so partial failure is still possible. For recovery, the command prints the backup path and a restore command after each execute run.

All the superset sub-commands can also be executed against a standalone Superset instance, using the superset-cli command. This means that if you are running an instance of Superset at https://superset.example.org/ you can export its resources with the command:

% superset-cli https://superset.example.org/ export-assets /path/to/directory

And then import everything to a Preset workspace with:

% preset-cli superset sync native /path/to/directory

Running SQL

The CLI offers an easy way to run SQL against an analytical database in a workspace. This can be done programmatically or interactively. For example, to run the query SELECT COUNT(*) AS revenue FROM sales given a workspace URL and a database ID you can run:

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ superset sql \
> --database-id=1 -e "SELECT COUNT(*) AS revenue FROM sales"

https://abcdef12.us1a.app.preset.io/
  revenue
---------
       42

If you don’t specify the database ID you will be shown a list of available databases in order to choose one. If you don’t specify the SQL query via the -e option the CLI will start a simple REPL (read-eval-print loop) where you can run queries interactively.

Synchronizing from exports

You can use the CLI to manage workspaces resources — databases, datasets, charts, and dashboards — from source control. The configuration should be stored as YAML files, using the same format the Apache Superset uses for importing and exporting resources.

The easiest way to generate the configuration files is to build one or more dashboards in a Preset workspace, export them together, and unzip the generated file into a directory.

https://github.com/preset-io/preset-cli/raw/master/docs/images/export_dashboards.png

After unzipping the directory should look like this:

  • charts/

  • dashboards/

  • databases/

  • datasets/

  • metadata.yaml

You can see an example here.

To synchronize these files to a Preset workspace you only need to run:

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync native /path/to/directory/

If any of the resources already exist you need to pass the --overwrite flag in order to replace them. The CLI will warn you of any resources that already exist if the flag is not passed:

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync native /path/to/directory/
Error importing database
The following file(s) already exist. Pass --overwrite to replace them.
- databases/Google_Sheets.yaml
Error importing dataset
The following file(s) already exist. Pass --overwrite to replace them.
- datasets/Google_Sheets/country_cnt.yaml
Error importing chart
The following file(s) already exist. Pass --overwrite to replace them.
- charts/Total_count_134.yaml
Error importing dashboard
The following file(s) already exist. Pass --overwrite to replace them.
- dashboards/White_label_test.yaml

Synchronized resources can be marked as “externally managed” by passing the --disallow-edits flag to the command. When the flag is passed users won’t be able to edit the resources. It’s also possible to provide a URL where the resource can be modified, eg, a link to a file in a Github repository. This can be done by passing the --external-url-prefix flag:

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync native /path/to/directory/ --disallow-edits \
> --external-url-prefix=https://github.com/org/project/blob/master/

This way, the file dashboards/White_label_test.yaml would have an external URL pointing to https://github.com/org/project/blob/master/dashboards/White_label_test.yaml. Currently the URL is not displayed anywhere, but in the near future we should have affordances pointing users to it from the instance UI.

Using templates

One of the most powerful features of this command is that the YAML configuration files are treated as Jinja2 templates, allowing you to parametrize the synchronized files. For example, imagine a simple chart like this:

slice_name: Total sales
viz_type: big_number_total
params:
  metric: sum__sales
  adhoc_filters: []

The chart shows the metric sum__sales, representing the total (unfiltered) sales of a given product. We can change the chart configuration to look like this instead:

{% if country %}
slice_name: Sales in {{ country }}
{% else %}
slice_name: Total sales
{% endif %}
viz_type: big_number_total
params:
  metric: sum__sales
  {% if country %}
  adhoc_filters:
    - clause: WHERE
      expressionType: SQL
      sqlExpression: country = '{{ country }}'
      subject: null
      operator: null
      comparator: null
  {% else %}
  adhoc_filters: []
  {% endif %}

Now, if the country parameter is set the chart will have a different title and an additional filter. Multiple parameters can be passed as optiona via the command line:

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync native /path/to/directory/ -o country=BR

Templates also have access to the workspace name through the instance variable (a URL object):

params:
  metric: sum__sales
  adhoc_filters:
    - clause: WHERE
      expressionType: SQL
      {% if instance.host == '//abcdef12.us1a.app.preset.io/ %}
      sqlExpression: warehouse_id = 1
      {% elif instance.host == '//34567890.us1a.app.preset.io/ %}
      sqlExpression: warehouse_id = 2
      {% else %}
      sqlExpression: warehouse_id = 3
      {% endif %}

You can also load variables from the environment by passing the --load-env (or -e) flag:

database_name: Postgres
sqlalchemy_uri: postgres://{{ env["POSTGRES_HOSTNAME"] }}

Finally, as shown in the next section, templates can leverage user-defined functions.

User defined functions

You can create your own functions to be used in the configuration templates. Simply create a sub-directory called functions/ in the directory where the configuration files are stored, and add one or more Python files. As a simple example, imagine a file called functions/demo.py with the following content:

# functions/demo.py
def hello_world() -> str:
    return "Hello, world!"

The function can then be called from any template the following way:

slice_name: {{ functions.demo.hello_world() }}
viz_type: big_number_total
params:
  ...

Disabling Jinja Templating

Both the CLI and Superset support Jinja templating. To prevent the CLI from loading Superset Jinja syntax, the export operation automatically escapes Jinja syntax from YAML files. As a consequence, this query:

sql: 'SELECT action, count(*) as times
    FROM logs
    {% if filter_values(''action_type'')|length %}
        WHERE action is null
        {% for action in filter_values(''action_type'') %}
            or action = ''{{ action }}''
        {% endfor %}
    {% endif %}
    GROUP BY action'

Becomes this:

sql: 'SELECT action, count(*) as times
    FROM logs
    {{ '{% if' }} filter_values(''action_type'')|length {{ '%}' }}
        WHERE action is null
        {{ '{% for' }} action in filter_values(''action_type'') {{ '%}' }}
            or action = ''{{ '{{' }} action {{ '}}' }}''
        {{ '{% endfor %}' }}
    {{ '{% endif %}' }}
    GROUP BY action'

When performing the import, the CLI would load any templating syntax that isn’t escaped, and remove escaping. However, this escaping syntax isn’t compatible with UI imports. To avoid issues when running migrations using both the CLI and the UI, you can use:

  • --disable-jinja-escaping flag with the export-assets command to disable the escaping (so that exported assets can be imported via the UI)

  • --disable-jinja-templating flag with the sync native command to disable jinja templating (so that assets exported via the UI can be imported via the CLI)

Note that using these flags would remove the ability to dynamically modify the content through the CLI.

Synchronizing to and from dbt

The CLI also allows you to synchronize models, and metrics from a dbt project.

If you’re using dbt Core you can point the CLI to your compiled manifest and your profiles file, so that the database is automatically created, together with all the models and metrics. The full command is:

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync dbt-core /path/to/dbt/my_project/target/manifest.json \
> --project=my_project --target=dev --profiles=${HOME}/.dbt/profiles.yml \
> --exposures=/path/to/dbt/my_project/models/exposures.yaml \
> --import-db \
> --external-url-prefix=http://localhost:8080/

Running this command will:

  1. Read the dbt profile and create the $target database for the specified project in the Preset workspace.

  2. Every source in the project will be created as a dataset in the Preset workspace.

  3. Every model in the project will be created as a dataset in the Preset workspace.

  4. Any metrics will be added to the corresponding datasets.

  5. Every dashboard built on top of the dbt sources and/or models will be synchronized back to dbt as an exposure.

Descriptions, labels and other metadata is also synced from dbt models to the corresponding fields in the dataset. It’s also possible to specify values for Superset-only fields directly in the model definition, under model.meta.superset.{{field_name}}. For example, to specify the cache timeout for a dataset:

models:
  - name: my_dbt_model
    meta:
      superset:
        cache_timeout: 250 # Setting the dataset cache timeout to 250.

The same is applied for metrics. For example, to specify the d3 format for a metric:

- name: avg_revenue
  label: "AVG Revenue"
  model: ref('my_dbt_model')
  calculation_method: average
  expression: price_each
  timestamp: date
  meta:
    superset:
      d3format: '%d'

The --external-url-prefix should point to your dbt docs, so that the resources in the workspace can point to the source of truth where they are being managed. Similar to the native sync, the dbt sync also supports the --disallow-edits flag.

By default, the CLI sync would create a new database on the destination workspace using below name structure:

f"{project_name}_{target_name}"

If you want to sync data to an existing database connection on the workspace instead, you can specify the database connection name on the profiles YAML file. Add below structure under the <target-name>:

meta:
  superset:
    database_name: my DB name # <= specify the database connection/display name used on the workspace

Example:

jaffle_shop:
  outputs:
    dev:
      meta:
        superset:
          database_name: Postgres - Production

If --import-db was passed and a database connection was found on the workspace, the operation would update the connection configuration with the dbt connection settings.

If you’re using dbt Cloud you can instead pass a job ID and a service account access token:

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync dbt-cloud \
> $TOKEN $JOB_ID \
> --external-url-prefix=http://localhost:8080/

The token only needs access to the “Metadata only” permission set for your project. You can see the job ID by going to the project URL in dbt Cloud and looking at the last ID in the URL. For example, if the URL is https://cloud.getdbt.com/#/accounts/12345/projects/567890/jobs/ the job ID is 567890.

When syncing from dbt Cloud, the database connection must already exist on the target workspace. The connection display name on the workspace must match the database name from dbt Cloud.

Selecting models

By default all the models will be synchronized to the workspace. The CLI supports a subset of the syntax used by the dbt command line to select which models should be synchronized. Models that should be synchronized can be specified via the --select flag:

% preset-cli ... --select my_model    # sync only "my_model"
% preset-cli ... --select my_model+   # sync "my_model" and its children
% preset-cli ... --select my_model+2  # sync "my_model" and its children up to 2 degrees
% preset-cli ... --select +my_model   # sync "my_model" and its parents
% preset-cli ... --select +my_model+  # sync "my_model" with parents and children

Multiple selectors can be passed by repeating the --select flag (note that this is slightly different from dbt, which doesn’t require repeating the flag):

% preset-cli ... --select my_model --select my_other_model

The CLI also support the intersection operator:

% preset-cli ... --select my_model+,tag:test

The command above will synchronize my_model and its children, as long as the models have the “test” tag.

Finally, the CLI also supports the --exclude flag in a similar way:

% preset-cli --select my_model+ --exclude tag:test

The command above synchronizes “my_model” and its children, as long as the models don’t have the “test” tag.

Exporting resources

The CLI can also be used to export resources (databases, datasets, charts, and dashboards) from a given Preset workspace (using preset-cli) or Superset instance (using superset-cli). This is useful for migrating resources between workspaces, from an existing Superset installation to Preset, or even from Preset to Superset (one of the advantages of Preset is no vendor lock in!).

To export resources from a self-hosted Superset instance:

% superset-cli https://superset.example.org/ export /path/to/directory

This will create a nice directory structure in /path/to/directory, ready to be imported using the sync native command.

To export resources from a Preset workspace:

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset export /path/to/directory

It’s also possible to use the CLI to export specific resources:

Use --asset-type to export all assets from a given type. Available options:

  • dashboard

  • chart

  • dataset

  • database

For example, running below command would export all dashboards from this workspace (datasets, charts and DB connections wouldn’t be included):

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset export /path/to/directory --asset-type=dashboard

Use --asset-ids to filter for specific assets. Available options:

  • dashboard-ids

  • chart-ids

  • dataset-ids

  • database-ids

For example, running below command would export specified dashboards from this workspace (datasets, charts and DB connections would be included):

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset export /path/to/directory --dashboard-ids=9,10

To import the exported resources into a Preset workspace:

% preset-cli --workspaces=https://abcdef12.us1a.app.preset.io/ \
> superset sync native /path/to/directory

Finally, to import in a standalone Superset instance:

% superset-cli https://superset.example.org/ sync native /path/to/directory

Note that any existing Jinja2 template markers present will be escaped. For example, if you have a virtual dataset defined as:

SELECT action, count(*) as times
FROM logs
WHERE
    action in {{ filter_values('action_type')|where_in }}
GROUP BY action

The resulting YAML file will have the query defined as:

SELECT action, count(*) as times
FROM logs
WHERE
    action in {{ '{{' }} filter_values('action_type')|where_in }} '}}' }}
GROUP BY action

So that when processed by preset-cli superset sync native the original Jinja2 is reconstructed correctly.

Exporting users

The preset-cli superset export-users command can be used to export a list of users. These users can then be imported to Preset via the preset-cli import-users command.

Exporting roles

You can export roles via preset-cli superset export-roles, and import with import-roles.

Dataset permissions in new role exports include database, catalog, schema, and table names, so importing into another instance does not rely on local dataset IDs. For example:

permissions:
  - dataset access on [analytics].[warehouse].[public].[orders]
  - dataset access on [analytics].[].[public].[customers]

The four path components are always present. Empty brackets represent a missing catalog or schema. Dots inside brackets are part of the name; a closing bracket inside a name is escaped as ]]. Import resolves the complete path against the target dataset metadata. Multiple datasets with an identical complete path are ambiguous and fail the role import before its permissions or memberships change. Resolved permission IDs are deduplicated.

Qualified dataset grants require a CLI version that supports this format on import. Older CLI versions may silently omit these grants, so upgrade pinned CI jobs and other import clients before using new exports. dataset access is a portable role-file reference resolved by this CLI, rather than a native Superset permission name; other tools consuming these files must support it as well.

An empty catalog is matched literally, not as a wildcard. Superset versions before catalog support export paths such as [database].[].[schema].[table]. If the target uses a default catalog, update the YAML explicitly, for example to [database].[catalog].[schema].[table]. Re-exporting from the same older server cannot supply this missing catalog. Bulk edits should preserve the intended database, schema, and table identities.

Role files describe the complete intended permissions and memberships. All requested permissions must resolve on the target; a missing or ambiguous grant fails that role before it is created or updated. Unknown users and groups also fail the role. Legacy Superset imports reject nonempty group assignments because the legacy interface cannot apply them. Omitting groups means an empty list.

When migrating to Preset, action permissions are an explicit exception: they are skipped with warnings because Data Access Roles cannot represent them. Custom roles with only action grants are imported as empty Data Access Roles with a warning, since they can still be used for RLS or asset access. Built-in roles with data grants are imported with the _Preset suffix; built-ins without data grants are skipped. Missing data grants fail even for built-in roles.

If a previously imported <name>_Preset DAR exists when its source built-in has no data grants, the skip leaves that DAR’s permissions and memberships in place. The warning identifies this retained access; explicitly update or delete the mapped DAR to revoke it. A file containing both a built-in and its mapped name (for example, Gamma and Gamma_Preset) is rejected before any import writes, including with --continue-on-error.

By default, import-roles stops at the first failed role. With --continue-on-error, it records the failure and attempts the remaining roles, then exits nonzero if any role failed. These validation errors follow the same policy as API errors. Successful roles from earlier in the run are not rolled back; Superset REST permission, user, and group updates use separate requests, so an API failure during those writes can leave a role partially updated.

Within one import-roles run, the command prepares shared target lookups and passes them into each role import. Permissions, role names, users, groups, and resolved dataset names are reused. User and group listings are read only when memberships are requested; empty lists still clear existing memberships. Role indexes track successful writes, including creation before a later relationship update fails. Independent runs fetch fresh reference data.

Standalone Superset imports read security/permissions-resources before selecting the REST implementation. A 404 during permission or role-search detection selects the legacy HTML interface. Authentication, authorization, and server errors fail the role. Errors during REST writes never retry via HTML.

Older role files remain readable. Their datasource access permissions lack schema/catalog identity and use database/table-name matching with a warning; ambiguous matches fail. If an older Superset server cannot expose dataset metadata, export retains this legacy format and logs a warning. Importing the new qualified format requires target dataset metadata and never falls back to table-name matching. Re-export older files where metadata is available to obtain qualified paths.

Missing or stale target dataset-permission candidates are ignored when resolving qualified paths; the requested grant still fails if no verified full-path match exists, or if multiple permission IDs match. Dataset metadata is fetched in batches; when an older server ignores the ID filter and returns unrelated IDs, the complete response is reused instead of repeating the full scan per batch. Incomplete dataset metadata is a contract error and fails export rather than silently dropping path information. Roles are fetched and serialized before the output file is opened, preserving an existing file if preparation fails.

Schema permissions must match the target exactly. Older Superset exports use schema access on [database].[schema]; catalog-aware targets may instead use schema access on [database].[catalog].[schema]. Unmatched schema permissions fail the role import before any permissions or memberships are changed. Update the YAML to specify the intended target catalog explicitly; import never guesses the catalog or expands a schema grant across catalogs.

Action permissions can also change between Superset versions. An OSS-to-OSS import fails if the target no longer supports a permission declared in the YAML; remove or update that grant explicitly rather than expecting it to be skipped.

Exporting RLS rules

The preset-cli superset export-rls command can be used to export a list of RLS rules. Currently there’s no way to import this into a workspace, but work is in progress.

Exporting ownership

The preset-cli superset export-ownership command generates a YAML file with information about ownership of different resources. The file maps resource UUIDs to user email address, and in the future will be used to recreate ownership on a different instance of Superset.

Listing SCIM Groups

The preset-cli list-group-membership command prints all SCIM groups (including membership) associated with a Preset team. Instead of printing the results on the terminal (whcih can be useful for quick troubleshooting), it’s possible to use --save-report=yaml or --save-report=csv to write results to a file. The file name would be {TeamSlug}__user_group_membership.{FileExtension}.

Metadata

Release files for preset-cli 0.3.14

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for preset-cli 0.3.14
File Size Uploaded Provenance Actions
preset_cli-0.3.14.tar.gz 572.5 kB Without provenance Details for preset_cli-0.3.14.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for preset-cli 0.3.14
File Interpreter ABI Platform Actions
preset_cli-0.3.14-py3-none-any.whl Python 3 none any Details for preset_cli-0.3.14-py3-none-any.whl

Total release size: 697.2 kB

Release files / preset_cli-0.3.14.tar.gz

Download URL preset_cli-0.3.14.tar.gz
Size 572.5 kB
Tags Source
SHA-256 checksum
How to use checksums
f0ccbc0e0727c800b7cedc6cae017b1af47f96466a1da4443652d56a8d89b3cf
BLAKE2b-256 checksum
How to use checksums
187474a5799d805dcd266154ad47b277751169f7ded1aabf9b644f38432e3f47
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Release files / preset_cli-0.3.14-py3-none-any.whl

Download URL preset_cli-0.3.14-py3-none-any.whl
Size 124.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
08f1d4c5e752594acef65404db930bfc5730b49a2e3035ae13d99a09816aafea
BLAKE2b-256 checksum
How to use checksums
5d23a0651d3ee64517535b18c201bc5899884a1b0caf2b6cbb7e65a786be02b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Security for preset-cli 0.3.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.3.14 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page