CLI commands
The Tessl CLI provides commands for managing plugins, workspaces, authentication, repository configuration, and Tessl projects. This page provides a comprehensive reference for all available commands.
On this page, repository means your Git repository. Tessl project means the stable home for Tessl in that repository.
Getting started
tessl help command
To see all available commands, run:
To get detailed information about a specific command or command group, use the --help flag:
Authentication
tessl login
Authenticate with Tessl.
Usage
Use --device to sign in with a device code instead of a local browser redirect.
Use --loopback to sign in with a local browser redirect. Use only one of these flags.
Organizations using the EU region log in with --region eu. The CLI saves the region with your session, so later commands use it without the flag:
--region works on every command and takes precedence over the TESSL_REGION environment variable, the region field in tessl.json, and the region you last logged in to. It doesn't appear in tessl --help. See Using the EU region for the full setup, including CI and MCP servers.
Alternative
tessl logout
Sign out and clear credentials.
Usage
Alternative
tessl whoami
Show current authenticated user.
Usage
Alternative
Setup and initialization
tessl init
Set up your repository and configure your coding agent.
Usage
Flags
--agent(string, optional, repeatable): Configure MCP for coding agent. Supported values:claude-code,cursor,gemini,antigravity,codex,openhands,openclaw,copilot,copilot-vscode,agents,tessl-agent. Can specify multiple agents. See Custom Agents for information on configuring additional agents.--name(string, optional): Project name for newtessl.json(default: current directory name)
Notes
- Configures MCP server settings for AI coding agents
- Creates a
tessl.jsonmanifest at the repository root
Examples
tessl project
Create, link, or repair the Tessl project for this repository.
A Tessl project gives Tessl a stable place to attach eval runs and other repository-connected data, so your results stay tied to your codebase over time.
Use these commands to create a new project, link this checkout to an existing project, or repair a missing or broken reference in tessl.json. For a workflow guide, see Manage projects from the CLI.
Usage
tessl project create
Create a new Tessl project for the current repository.
Usage
Flags
--nested(boolean, optional): Required when a parent directory has atessl.jsonbut the current directory has none. Creates a separatetessl.jsonand project for the current directory instead of reusing the parent project.--new(boolean, optional): Create a new project for a different workspace. Use with--workspaceand provide a project name when you intentionally want a separate new project for the same repository.--workspace(string, optional): Name or ID of workspace
Arguments
project-name(string, optional): Name for the new project. If omitted, you'll be prompted.
Notes
- Use this when this repository is not linked to a project yet and you want to create one in Tessl
- This command always creates a new project
- If this repository should use a project that already exists, use
tessl project linkinstead
tessl project link
Link the current repository to an existing Tessl project.
Usage
Flags
--workspace(string, optional): Name or ID of workspace to search
Notes
- Use this when the project already exists in Tessl and you want this repository to use it
- This command only links to an existing project
- If you want to create a brand new project for this repository, use
tessl project createinstead
tessl project repair
Inspect or repair the Tessl project link for the current repository.
Usage
Flags
--json(boolean, optional): Output as JSON, for automation or agent workflows--relink(boolean, optional): Relink this repository to a different existing project--workspace(string, optional): Workspace name or ID for--relink--project(string, optional): Project name for--relinktarget--update-source(boolean, optional): Approve this repository as the linked project source--update-name(boolean, optional): Rename the linked project to matchtessl.json--yes/-y(boolean, optional): Confirm and apply requested repair
Notes
- Use this when this repository should already be linked to a project, but the link is missing, broken, outdated, or no longer matches the expected repository or project details
tessl project list
List all projects in a workspace.
Usage
Flags
--workspace(string, optional): Name or ID of workspace.--json(boolean, optional): Output as JSON.
Notes
- Shows every project you can access in the selected workspace, with its name, ID, and source.
- The workspace is resolved in this order:
--workspace, theTESSL_WORKSPACEenvironment variable, the project linked intessl.json, then the workspace prefix in a.tessl-plugin/plugin.jsonwhen notessl.jsonexists. If none of those apply and you belong to more than one workspace, you are prompted to pick one, or must pass--workspacein a non-interactive shell.
Examples
tessl project delete
Delete a Tessl project.
Usage
Flags
--org(string, optional): Name or ID of organization--json(boolean, optional): Output the deleted project as JSON. Skips the confirmation prompt, like--yes--yes/-y(boolean, optional): Skip confirmation prompt and delete immediately
Arguments
project(string, required): ID,workspace/projectreference, or name of the project. A name alone must match exactly one project in the organization.
Notes
- You need the publisher role or higher in the project's workspace.
- Deleting a project removes it from normal views and frees its name and repository link for reuse. Its run history is kept.
- The organization is resolved in this order:
--org, theTESSL_ORGenvironment variable, your only organization, then an interactive pick. With--jsonor no terminal, several organizations produce an error that asks for--orginstead of a pick. A project ID needs no organization. A value shaped like a UUID is always read as a project ID, so reference a project with such a name asworkspace/project. - When a name matches projects in more than one workspace, the command stops and lists them. Run it again with the
workspace/projectreference or the ID.
Examples
Project dependencies
tessl install
Install plugins into your repository. plugins are versioned bundles of reusable, agent-agnostic context that make coding agents more effective. They can contain skills, documentation, and rules.
Alias: tessl i
Usage
Arguments
source(string, required): plugin or GitHub URL to install. Can be:- Registry plugin:
workspace/plugin[@version](version optional, defaults to latest) - GitHub repository:
- Full URL:
https://github.com/owner/repo - Shorthand:
github:owner/repo(e.g.,github:softaworks/agent-toolkit)
- Full URL:
- File path:
file:<path>to install from local directory
- Registry plugin:
Flags
--global/-g(boolean, optional): Install plugins globally to~/.tessl/instead of the current repository. Global plugins are available across all your repositories.--skill(string, repeatable, optional): Select specific skills to install from GitHub repositories. Used when a repository contains multiple skills. If omitted, you'll be prompted interactively to select from available skills. Can be specified multiple times to install multiple skills from the same repository.--yes(boolean, optional): Skip confirmation prompts and auto-select all skills--verbose/-v(boolean, optional): Show detailed warning messages during installation--watch-local(boolean, optional): Watch local file-source plugins and reinstall on changes--accept-warnings(boolean, optional): Pre-accept install policy warnings (no interactive prompt)--strict(boolean, optional): Fail if a version is too new rather than installing an older fallback--agent(string, optional, repeatable): Override agents to install for. Supported values:claude-code,cursor,gemini,antigravity,codex,openhands,openclaw,copilot,copilot-vscode,agents,tessl-agent.
Notes
- Plugins are installed to
.tessl/plugins/<plugin-name>/in your repository (or~/.tessl/plugins/when using--global) - Your repository's
tessl.jsonis automatically updated with the plugin reference - If a plugin is already installed and up-to-date, it will be skipped
- GitHub URL formats:
https://github.com/owner/repo,github:owner/repo,git@github.com:owner/repo.git, or with branch/path:https://github.com/owner/repo/tree/main/skills/pdf - Private repositories: Tessl clones over HTTPS first and falls back to SSH, so a private repository installs if git can authenticate over either one as an account with read access to the repository: an HTTPS credential for that account (for GitHub, run
gh auth setup-git), or an SSH key for it.tessl.jsonstores thehttps://form, so teammates can use either credential. The SSH fallback runs OpenSSH without prompting. If your git ssh command runs another program, such as plink or a wrapper script, Tessl reads over HTTPS only. - File system installation: Use
file:<path>to install from a local directory (.tessl-plugin/plugin.jsonexpected in the path) - Install policy warnings: If a plugin triggers install policy warnings (such as critical or high Snyk security findings), you will be asked for permission before installation continues. You can always choose to proceed — installation is never blocked. Use
--accept-warningsto pre-accept these warnings and skip the prompt.
Examples
tessl search
Search for plugins and skills in the Tessl registry by name, PURL, or HTTP URL.
Usage
Flags
--global/-g(boolean, optional): Install selected plugins and skills globally to~/.tessl/instead of the current project--type(string, optional): Filter by content type. Supported values:skills,docs,rules--org(string, optional): Limit results to an organization you can access, identified by its slug or ID--workspace(string, optional): Limit results to a workspace you can access, identified byorg/workspaceor its ID--json(boolean, optional): Output search results as JSON
--org and --workspace require authentication and cannot be used together.
Arguments
query(string, optional): Search query (name, PURL, or HTTP URL). If omitted, you'll be prompted interactively.
Examples
tessl uninstall
Uninstall plugins from your repository.
Usage
Arguments
workspace/plugin(string, required): Full plugin name in the formatworkspace/plugin
Flags
--global/-g(boolean, optional): Uninstall plugins from the global~/.tessl/directory instead of the current repository--skill(string, repeatable, optional): Remove specific skills instead of the entire plugin (repeatable)
Notes
- Removes the plugin from
tessl.jsonand deletes files from.tessl/plugins/ - Does not require authentication (local operation only)
Examples
tessl list
List all installed plugins in your repository.
Usage
Flags
--global/-g(boolean, optional): List plugins installed in global~/.tessl/instead of the current repository--json(boolean, optional): Output plugins as JSON instead of human-readable format
Notes
- Lists all plugins installed in your repository based on
tessl.json - Shows plugin names in the format
workspace/pluginwith their versions - Does not require authentication (local operation only)
Examples
tessl outdated
Check for available plugin updates.
Usage
Flags
--json(boolean, optional): Output as JSON
Examples
tessl update
Update plugins to newer versions.
Usage
Flags
--yes/-y(boolean, optional): Skip prompts and update all compatible plugins--force/-f(boolean, optional): Include breaking updates--global/-g(boolean, optional): Update plugins installed globally in~/.tessl/instead of the current repository--accept-warnings(boolean, optional): Pre-accept install policy warnings (no interactive prompt)--agent(string, optional, repeatable): Override agents to sync for. Supported values:claude-code,cursor,gemini,antigravity,codex,openhands,openclaw,copilot,copilot-vscode,agents,tessl-agent.
Arguments
plugin(string, optional): plugin to update in the formatworkspace/plugin. If omitted, updates all plugins.
Notes
- If a plugin triggers install policy warnings in the new version (such as critical or high Snyk security findings), you will be asked for permission before the update is applied. Use
--accept-warningsto pre-accept these warnings and skip the prompt.
Examples
Skill management
tessl skill new
Create a new skill with an interactive wizard or using flags.
Usage
Flags
--name(string, optional): Skill name--description(string, optional): When the skill should be triggered--workspace(string, optional): Workspace for the skill (default: local)--path(string, optional): Directory path where the skill will be created--install(boolean, optional): Automatically install in the current repository after creation--public(boolean, optional): Make the skill public (default: private)
Notes
- If flags are omitted, an interactive wizard will guide you through skill creation
- The skill will be created as a directory with the proper Agent Skills specification structure
- Use
--installto immediately add the skill to your local agent configuration
Examples
tessl skill import
Create .tessl-plugin/plugin.json from a local SKILL.md file.
Usage
Flags
--workspace(string, optional): Workspace for the skill (default: local)--public(boolean, optional): Make skill public (default: private)--force(boolean, optional): Overwrite existing.tessl-plugin/plugin.jsonwithout prompting
Arguments
path(string, optional): Local path to directory containing SKILL.md or to SKILL.md file. Defaults to current directory if omitted.
Notes
skill importhandles oneSKILL.md. It writes.tessl-plugin/plugin.jsoninside that skill folder with"skills": ["."], so the skill folder becomes the plugin root.- For a repository with several skills, do not run
skill importfor each skill: that makes one plugin per skill, each with its ownevals/. Create one plugin at the repository root instead, with a.tessl-plugin/plugin.jsonwhoseskillsfield points at the skills. See Import an existing skill.
Examples
tessl skill lint
Validate skill structure and contents.
Usage
Arguments
source(string, optional): Path to skill folder or plugin.json. Defaults to current directory if omitted.
Notes
- Checks for required files and proper structure
- Validates frontmatter fields (name, description, etc.)
- Verifies conformance to the Agent Skills specification at agentskills.io/specification
- Returns validation errors and warnings
Examples
tessl skill publish
Import (if needed) and publish skill to the registry. This command bundles skills, rules, documentation into a plugin.
Usage
Flags
--workspace(string, optional): Workspace for the skill (used if importing)--public(boolean, optional): Make skill public (used if importing)--force(boolean, optional): Overwrite existing.tessl-plugin/plugin.jsonwithout prompting--bump(string, optional): Auto-bump version if it already exists in the registry. Supported values:patch,minor,major--dry-run(boolean, optional): Run all pre-publish checks without publishing--skip-evals(boolean, optional): Skip publishing eval scenarios from evals/ directory--with-scenario-quality-check(boolean, optional): Exclude misleading scenarios from the publish-time eval run--eval-scenarios(string, optional): Path to eval scenarios directory (default:<path>/evals)--resolve-symlinks(boolean, optional): Resolve symlinked files to their target contents when packing
Arguments
path(string, optional): Path to the skill directory to publish. Defaults to current directory if omitted.
Notes
- Skills are automatically linted before publishing
- Published skills are versioned based on the version in the skill manifest
- Eval scenarios from the
evals/directory are published by default; use--skip-evalsto exclude them - Automatic evaluation: When published, skills are automatically evaluated and review scores are calculated (see Check a skill's quality using review)
Examples
tessl skill unpublish
Prints guidance explaining that skills cannot be unpublished on their own. Performs no registry action. tessl skill archive and tessl skill delete print the same guidance.
Skills are published inside a plugin. To remove a published skill, delete the skill and republish the plugin, unpublish the plugin, or archive the plugin. See tessl plugin unpublish and tessl plugin archive.
Tessl Review
The tessl review family runs an asynchronous review pipeline server-side. These commands require authentication; run and fix also require a workspace. The pipeline is bundle-aware, and tessl review run polls until it completes. This is the primary path for authenticated users and CI gating.
tessl review run
Run an asynchronous quality review of a skill — it scores the skill against a reviewer rubric. tessl review run is shorthand for tessl review run quality; to run a security scan instead, use tessl review run security (documented below). Requires authentication and a workspace.
Usage
Flags
--json(boolean, optional): Output as JSON--workspace/-w(string, optional): Workspace name or ID. Required when--jsonis set--threshold(number, optional): Exit non-zero if the review score is below this percentage.0never fails (skips validation and score gating)--label/-l(string, optional): Label to describe this review run--force/-f(boolean, optional): Run a fresh review even when cached results exist--review-plugin(string, optional): Reviewer plugin — a path to a local plugin directory, or a registry refworkspace/plugin[@version]. Requires a paid plan; on a Free organisation, passing this flag returns an upgrade error--wait/--no-wait(boolean, optional): Wait for the review to finish before returning (default: wait; use--no-waitto submit and return the run id immediately, then reconnect withtessl review view). Cannot be combined with--threshold, which needs the completed score
Arguments
path(string, optional): Path to a skill file or skill directory. Defaults to current directory if omitted.
Notes
- Requires authentication; sign in with
tessl loginor set theTESSL_TOKENAPI key in the environment --workspaceis required when--jsonis set, since non-interactive runs cannot prompt for a workspace- The command polls until the review completes, then prints the results
--thresholdcauses a non-zero exit when the score falls below the percentage, making it a CI gate- Press Ctrl+C to detach — the review continues server-side and can be viewed later with
tessl review view runhas two subcommands:quality(the default, documented here) andsecurity(below).tessl review run qualityis the explicit form of the default
Examples
tessl review run security
Run an asynchronous security scan of a skill, powered by Snyk. Reports findings and the highest severity. Requires authentication and a workspace.
Usage
Flags
--json(boolean, optional): Output as JSON--workspace/-w(string, optional): Workspace name or ID. Required when--jsonis set--label/-l(string, optional): Label to describe this security review run--force/-f(boolean, optional): Run a fresh scan even when cached results exist--fail-on(string, optional): Exit non-zero if the highest severity is at or above this level:low,medium,high,critical--wait/--no-wait(boolean, optional): Wait for the scan to finish before returning (default: wait; use--no-waitto submit and return the run id immediately, then reconnect withtessl review view). Cannot be combined with--fail-on, which needs the completed findings
Arguments
path(string, optional): Path to a skill file or skill directory. Defaults to current directory if omitted.
Notes
- Requires authentication; sign in with
tessl loginor set theTESSL_TOKENAPI key in the environment - The scan runs server-side; the command polls until it completes, then prints the findings and the highest severity
--fail-ongates the exit code on severity, making it a CI gate — the security equivalent of--thresholdon a quality review
Examples
tessl review view
View results for a review run of either kind. The run ID resolves whether it is a quality or a security review, and the results are rendered accordingly.
Usage
Flags
--json(boolean, optional): Output as JSON, in the same shape astessl review run --json--last(boolean, optional): View results for the most recent review run--threshold(number, optional): Quality reviews only. Exit non-zero if the review score is below this percentage (0-100)--fail-on(string, optional): Security reviews only. Exit non-zero if the highest severity is at or above this level:low,medium,high,critical--workspace/-w(string, optional): Workspace name or ID. Only applies with--last; an explicit review run ID already identifies its workspace.
Arguments
id(string, optional): Review run ID. Provide an ID or use--last.
Notes
- Provide a review run ID or use
--last; one is required - The gate flag follows the run's kind:
--thresholdgates a quality run,--fail-ongates a security run. Passing the flag for the other kind is a usage error --workspaceis only accepted with--last; passing it alongside an explicit review run ID fails with a validation error
Examples
tessl review list
List recent review runs.
Usage
Flags
--json(boolean, optional): Output as JSON--limit(number, optional): Maximum number of review runs to display (default: 20)--workspace/-w(string, optional): Workspace name or ID
Examples
tessl review retry
Re-run a failed review run.
Usage
Flags
--json(boolean, optional): Output as JSON--workspace/-w(string, optional): Workspace name or ID. Only applies with--last; an explicit review run ID already identifies its workspace.--last(boolean, optional): Retry the most recent review run
Arguments
id(string, optional): Review run ID to retry. Provide an ID or use--last.
Notes
--workspaceis only accepted with--last; passing it alongside an explicit review run ID fails with a validation error
Examples
tessl review fix
Improve a skill by running an automated review-and-fix loop server-side. Requires authentication and a workspace.
Usage
Flags
--json(boolean, optional): Output as JSON--workspace/-w(string, optional): Workspace name or ID--threshold(number, optional): Stop once a review scores at or above this percentage (0-100, default 90)--max-iterations(number, optional): Maximum improve→review iterations to attempt (1-10, default 3)--yes/-y(boolean, optional): Apply the improved skill without confirmation--review-plugin(string, optional): Reviewer plugin — a path to a local plugin directory, or a registry refworkspace/plugin[@version]. Requires a paid plan; on a Free organisation, passing this flag returns an upgrade error
Arguments
path(string, optional): Path to a local skill file or skill directory. Defaults to current directory if omitted.
Notes
- Requires authentication; sign in with
tessl loginor set theTESSL_TOKENAPI key in the environment --workspaceis required when--jsonis set, since non-interactive runs cannot prompt for a workspace- Runs an asynchronous improve→review loop, stopping early once
--thresholdis met
Examples
Plugin management
tessl plugin new
Create a new plugin with an interactive wizard.
Usage
Flags
--name(string, optional): plugin name in formatworkspace/plugin-name--summary(string, optional): Brief description of the plugin--path(string, optional): Directory path where plugin will be created--rules(string, optional): Include rule by name--rule-description(string, optional): Initial rule instructions to include in generated rule file--workspace(string, optional): Workspace for the plugin--skill(boolean, optional): Include a skill in the plugin--skill-name(string, optional): Skill name (implies--skill)--skill-description(string, optional): Skill description (required with--skillor--skill-name)--install(boolean, optional): Automatically install in the current repository--public(boolean, optional): Make plugin public (default: private)
Notes
- Creates a new plugin directory with a basic
.tessl-plugin/plugin.jsontemplate - If run without flags, launches an interactive wizard to guide you through plugin creation
- For non-interactive use, include at least one component with
--skill,--skill-name, or--rules - Use
--skillor--skill-nameto create a plugin with a skill component
Examples
tessl plugin lint
Validate plugin structure and contents
Usage
Arguments
source(string, optional): Path to the plugin directory to lint. Defaults to current directory if omitted.
tessl plugin migrate
Migrate tile.json to .tessl-plugin/plugin.json.
Usage
Flags
--force(boolean, optional): Overwrite existing.tessl-plugin/plugin.json
Arguments
path(string, optional): Path to plugin directory. Defaults to current directory if omitted.
tessl plugin pack
Package a plugin into a .tgz file.
Usage
Flags
--output(string, optional): Output path for .tgz file. If omitted, uses the plugin name and version to create a file in your current directory.
Arguments
source(string, optional): Path to plugin folder. Defaults to current directory if omitted.
tessl plugin info
Show plugin details from the registry.
Usage
Arguments
name-or-path(string, optional): plugin name (workspace/plugin[@version]) or path to plugin directory. Defaults to current directory if omitted.
Examples
tessl plugin publish
Publish plugins to the Tessl registry. This command bundles skills, rules, documentation into a plugin.
Usage
Flags
--dry-run(boolean, optional): Run all pre-publish checks without publishing--bump(string, optional): Auto-bump version if it already exists in the registry. Supported values:patch,minor,major--skip-evals(boolean, optional): Skip publishing eval scenarios from evals/ directory--with-scenario-quality-check(boolean, optional): Have the backend's LLM judge filter out misleading scenarios (low feasibility, rubric leakage, low value) from the publish-time eval run. Equivalent totessl eval run --quality-checkfor the eval that runs as part of publishing.--workspace(string, optional): Workspace to publish under when the plugin manifest name is flat (noworkspace/prefix)--version(string, optional): Version to publish when the plugin manifest omits one--verbose/-v(boolean, optional): Print every archived file with the reason it was included
Arguments
path(string, optional): Path to the plugin directory to publish. Defaults to current directory if omitted.
Examples
Not sure what your published plugin's URL will look like? See Workspaces to learn how workspace and plugin names map to Registry URLs.
tessl plugin unpublish
Unpublish a plugin version from the registry.
Usage
Flags
--plugin(string, required): plugin version to unpublish in the formatworkspace/plugin@version.
Notes
- Unpublishing permanently deletes the version.
- A version can't be unpublished when all of these are true: the plugin is public, the version was published more than 48 hours ago, and the plugin has 500 or more downloads. Archive the plugin instead, or contact support@tessl.io.
- Requires the publisher role on the plugin's workspace.
Examples
tessl plugin archive
Archive plugins in the registry.
Usage
Flags
--plugin(string, optional): plugin to archive in the formatworkspace/plugin(archives all versions) orworkspace/plugin@version(archives a single version)--reason(string, required): Reason for archiving the plugin
Notes
- Prevents new installations while preserving existing installations
Examples
Organization management
tessl org list
List all organizations that you are a member of.
Usage
tessl org usage
Show your Tessl credit usage.
Usage
Flags
--org(string, optional): Organization name or ID. You are prompted when you belong to several.--json(boolean, optional): Output as JSON. The payload containsplanandcreditsfields.
Examples
Workspace management
Workspaces enable you to create private collections of plugins that are restricted to yourself or your organization. You can control member access and permissions. To learn more, see Distributing via registry.
tessl workspace create
Create a new workspace.
Usage
Flags
--org(string, optional): Organization name or ID to own the workspace. When omitted and you belong to several organizations, interactive terminals prompt you to pick one; noninteractive callers must pass--org <nameOrId>.
Arguments
name(string, optional): Name for the workspace. The name must be lowercase. If omitted, you'll be prompted.
Examples
tessl workspace list
List all workspaces that you are a member of.
Usage
Flags
--has-publish-access(boolean, optional): Only show workspaces where you have permission to publish.
Examples
tessl workspace delete
Delete an existing workspace.
Usage
Arguments
name(string, optional): The name or ID of the workspace. If omitted, you'll be prompted.
Examples
If a workspace has published a public plugin, deleting it permanently reserves its name: the name cannot be used again, in this organization or any other. To move a workspace between organizations, do not delete it. Email support@tessl.io and we can move it for you after a review.
tessl workspace add-member
Add a user to a workspace with specified permissions.
Usage
Flags
--workspace(string, optional): Name or ID of workspace--username(string, optional): Username or ID of user to add--role(string, optional): Role to assign. Supported values:member,publisher,manager,owner
See Roles for more information
Examples
tessl workspace remove-member
Remove a user from a workspace.
Usage
Flags
--workspace(string, optional): Name or ID of workspace--username(string, optional): Username or ID of user to remove
Examples
tessl workspace list-members
List all members of a workspace.
Usage
Arguments
name(string, optional): The name or ID of the workspace. If omitted, you'll be prompted.
Examples
tessl workspace archive
Archive a workspace. An archived workspace won't be available to publish to or read from, but can be unarchived later.
Usage
Flags
--reason(string, required): Reason for archiving the workspace
Arguments
name(string, optional): The name or ID of the workspace. If omitted, you'll be prompted.
Notes
- Archiving is a safer alternative to deleting, as archived workspaces can be restored
- Use
tessl workspace unarchiveto restore an archived workspace
Examples
tessl workspace unarchive
Unarchive an archived workspace, making it active again.
Usage
Arguments
name(string, required): The name or ID of the workspace.
Examples
Configuration management
tessl config get
Get a configuration value or show all configuration.
Usage
Arguments
key(string, optional): Configuration key to get. If omitted, shows all configuration.
Examples
tessl config set
Set a configuration value.
Usage
Arguments
key(string, required): Configuration key to set. Supported values:shareUsageData,termsAcceptedAt,evalDefaultModelNoticeShownAt,evalDefaultModelNoticeModel,agentsvalue(string, required): Configuration value to set
Examples
tessl config list
List all configuration values.
Usage
Arguments
key(string, optional): Configuration key to list. If omitted, lists all configuration.
Notes
- Similar to
tessl config getbut specifically for listing configuration values
Examples
tessl config add
Add one or more values to a configuration array.
Usage
Arguments
key(string, required): Configuration key for the arrayvalue(string, required, repeatable): One or more values to add to the array
Notes
- Use this command to add values to array-type configuration settings
- Can specify multiple values in a single command
Examples
tessl config remove
Remove a value from a configuration array.
Usage
Arguments
key(string, required): Configuration key for the arrayvalue(string, required): Value to remove from the array
Notes
- Use this command to remove values from array-type configuration settings
- Only removes the specified value, not the entire configuration key
Examples
Diagnostics and utilities
tessl doctor
Run authentication and manifest diagnostics to troubleshoot issues.
Usage
Flags
--json(boolean, optional): Output diagnostics as JSON for programmatic processing--automations(boolean, optional): Validate theactions,triggers, andschedulesblocks oftessl.json, and report the agent each action selects, the project's loops, and whether the events of each trigger the file declares reach the workspace. It doesn't check delivery for loops defined in the Tessl app.
Notes
--automationsreads configuration and asks the platform about delivery. It sends no event and starts no run, so a clean result doesn't prove that a run starts. See Troubleshoot factory runs.
Examples
tessl feedback
Send feedback to the Tessl team.
Usage
Arguments
message(string, optional): Feedback message to send. If omitted, you'll be prompted interactively.
Examples
CLI self-management
tessl cli update
Update the CLI to the latest or specified version.
Usage
Flags
--target/-t(string, optional): Target version to update to (example: v1.0.0)--channel/-c(string, optional): Release channel to switch to. Supported values:latest,beta--dry-run(boolean, optional): Show what would be run without executing the update
Examples
API key management
tessl api-key create
Create an API key for a workspace.
Usage
Flags
--workspace(string, optional): Name or ID of workspace--name(string, optional): Name for the API key--role(string, optional): Role to assign. Supported values:member,publisher,manager,owner--expiry-date(string, optional): Expiry date in ISO 8601 format (example: 2027-12-31T00:00:00Z). Defaults to 30 days from creation--ttl(string, optional): Time until expiry as a positive whole number followed byh(hours),d(days),w(weeks),mo(30-day months), ory(365-day years), such as3h,4w, or1y. Minutes are not supported. Calculated using the local clock after interactive prompts, just before the creation request. Use either--ttlor--expiry-date. Without either flag, keys expire 30 days from creation
Examples
tessl api-key list
List API keys for a workspace.
Usage
Flags
--workspace(string, optional): Name or ID of workspace
Examples
tessl api-key delete
Delete an API key from a workspace.
Usage
Flags
--workspace(string, optional): Name or ID of workspace--yes/-y(boolean, optional): Skip confirmation prompt and delete immediately
Arguments
api-key-id(string, optional): ID of the API key to delete. If omitted, you'll be prompted.
Examples
Environment management
An environment is a named set of variables that a scheduled run, a launch, or a cloud run executes inside. Your organization holds it, and a run can use it only when the run's project is bound to it. Its values are sealed and write-only: you can set and replace them, but never read them back. Use an environment to supply the GitHub token, API keys, and any other credentials a run needs.
For what belongs in an environment and how runs consume it, see Environments.
tessl env is a short alias for tessl environment. A run gets a GitHub token scoped to its repository at the environment's --github-access level, which is read by default. For a schedule that opens pull requests, create the environment with --github-access pull-requests. To supply your own GITHUB_TOKEN (or GH_TOKEN) instead, set --github-access none: Tessl rejects an environment that holds one of those tokens at any other level.
The environment commands act on one organization, resolved in this order: --org, the TESSL_ORG environment variable, the organization of the workspace given by --workspace or TESSL_WORKSPACE or linked in tessl.json, then your only organization. If you belong to several and none of those apply, you are prompted to pick one, or must pass --org in a non-interactive shell.
Some environments are still held by a workspace. view, update, and delete look a name up in the organization first and then in the workspace in context, and list shows the workspace's environments after the organization's.
tessl environment create
Create an environment for an organization.
Usage
Arguments
name(string, required): Name for the environment.
Flags
--org(string, optional): Name or ID of organization. The default is the organization of the project.--project(string, optional): Project to bind the environment to, as a name,workspace/name, or ID. The default is the project the current directory is linked to.--env-file(string, optional): Path to a.envfile with environment variables.--github-access(none,read,pull-requests, orwrite, optional): GitHub access granted to runs that use this environment. The default isread.--linear-access(none,read, orwrite, optional): Linear access granted to cloud launch runs that use this environment. The default isnone.--read-other-run-logs(boolean, optional): Allow live runs to read other runs' transcripts in the same workspace. The default is off.
none mints no GitHub credential. The environment must supply a GITHUB_TOKEN or GH_TOKEN, or both TESSL_GITHUB_APP_ID and TESSL_GITHUB_APP_PRIVATE_KEY to mint a token as that GitHub App. Without either credential source, a run can't start. Tessl rejects an environment that holds a GITHUB_TOKEN or GH_TOKEN at any level other than none.
read can clone the repository but cannot push. pull-requests can push branches and open pull requests. write adds write access to issues, statuses, checks, Actions, and workflow files.
A person remains responsible for reviewing the changes and deciding whether to merge them. See Least privilege for environments.
For Linear access, none injects no platform credential. read permits Linear queries, while write also permits mutations. An environment cannot grant read or write while defining a non-empty LINEAR_TOKEN or LINEAR_API_URL. Tools must use LINEAR_TOKEN for authorization and LINEAR_API_URL as the API base URL; a tool that ignores LINEAR_API_URL sends the run key to Linear, which rejects it.
Notes
--env-fileis required unless a runtime access flag is given.- The new environment is bound to the project from
--project, else to the linked project, so that project's runs can use it straight away. - With neither, no project can use the environment until you bind one with
tessl environment bindor on the environment's page in the web app. See Bind projects to an environment. - With
--org, the project must be in that organization.
Examples
tessl environment list
List environments for an organization, with the projects bound to each.
Usage
Flags
--org(string, optional): Name or ID of organization.--workspace(string, optional): Name or ID of a workspace whose environments are listed after the organization's.--json(boolean, optional): Output as JSON. Organization environments are underenvironments, and workspace environments underworkspaceEnvironments.
Examples
tessl environment view
View metadata and bound projects for an environment.
Usage
Arguments
name(string, required): Name or ID of the environment to view.
Flags
--org(string, optional): Name or ID of organization.--workspace(string, optional): Name or ID of a workspace to search when the organization holds no environment by that name.--json(boolean, optional): Output as JSON.
Notes
- This shows metadata only, such as the variable names, bound projects, GitHub access, Linear access, and MCP servers wired in. Sealed values are write-only and are never returned.
- The output includes a link to the environment in the Tessl web app (
webUrlin--jsonoutput).
Examples
tessl environment update
Update an environment.
Usage
Arguments
name(string, required): Name or ID of the environment to update.
Flags
--org(string, optional): Name or ID of organization.--workspace(string, optional): Name or ID of a workspace to search when the organization holds no environment by that name.--env-file(string, optional): Path to a.envfile with environment variables.--remove-key(string, optional, repeatable): Stored key to remove.--github-access(none,read,pull-requests, orwrite, optional): GitHub access granted to runs that use this environment.--linear-access(none,read, orwrite, optional): Linear access granted to cloud launch runs that use this environment.--read-other-run-logs(boolean, optional): Allow live runs to read other runs' transcripts in the same workspace. Use--no-read-other-run-logsto disable.--mcp-server(string, optional, repeatable): Name of an MCP server to configure. Workspace environments only.--clear-mcp-servers(boolean, optional): Remove all MCP servers wired into a workspace environment.
none mints no GitHub credential, so the run must bring its own token. read can clone the repository but cannot push. write can push branches and open pull requests.
For Linear access, none injects no platform credential. read permits Linear queries, while write also permits mutations. An environment cannot grant read or write while defining a non-empty LINEAR_TOKEN or LINEAR_API_URL. Tools must use both injected variables: LINEAR_TOKEN for authorization and LINEAR_API_URL as the API base URL.
Notes
--env-fileis required unless--remove-keyor a runtime access flag is given. An update with no--env-filechanges just those settings and leaves every other stored value untouched. Passing--env-filereplaces the plain values instead: the env file becomes the complete set of plain values, so it must include every plain credential you want to keep. An organization environment keeps its secret references, except that a name set in the file becomes a plain value and its reference is removed. The command prints the names it converted.--remove-keyremoves a name whether it is a plain value or a secret reference.--remove-keycannot be combined with--env-file.--mcp-serverand--clear-mcp-serversapply to workspace environments only.--clear-mcp-serversalways requires--env-file.
Examples
tessl environment bind
Bind a project to an organization environment, so the project's loops can use it.
Usage
Arguments
name(string, required): Name or ID of the environment to bind the project to.
Flags
--org(string, optional): Name or ID of organization. The default is the organization of the project.--project(string, optional): Project to bind, as a name,workspace/name, or ID. The default is the project the current directory is linked to.--json(boolean, optional): Output as JSON, with the environment, the project, andstatusset toboundoralready-bound.
Notes
- Binding a project that is already bound succeeds, says so, and changes nothing.
- The project must be in the environment's organization.
- An environment still held by a workspace has no project bindings, so the command refuses it and changes nothing.
- Without
--project, the command fails when the current directory is not linked to a project.
Examples
tessl environment unbind
Unbind a project from an organization environment, so the project's loops can no longer use it.
Usage
Arguments
name(string, required): Name or ID of the environment to unbind the project from.
Flags
--org(string, optional): Name or ID of organization. The default is the organization of the project.--project(string, optional): Project to unbind, as a name,workspace/name, or ID. The default is the project the current directory is linked to.--json(boolean, optional): Output as JSON, with the environment, the project, andstatusset tounboundornot-bound.
Notes
- Unbinding a project that is not bound succeeds, says so, and changes nothing.
- An environment still held by a workspace has no project bindings, so the command refuses it and changes nothing.
- Without
--project, the command fails when the current directory is not linked to a project.
Examples
tessl environment delete
Delete an environment.
Usage
Arguments
name(string, optional): Name or ID of the environment to delete. You are prompted when it is omitted.
Flags
--org(string, optional): Name or ID of organization.--workspace(string, optional): Name or ID of a workspace to search when the organization holds no environment by that name.
Examples
Model Context Protocol (MCP)
tessl mcp start
Start the Tessl MCP (Model Context Protocol) server for integration with AI coding agents.
Usage
tessl mcp proxy
Bridge a coding agent to a workspace MCP server through the Tessl MCP gateway. Starts a stdio MCP proxy that forwards JSON-RPC messages to an upstream MCP server held by the workspace or moved from it into the organization. It authenticates to the gateway with your Tessl credentials (tessl login) or TESSL_TOKEN. See MCP gateway for which servers the proxy reaches and how to wire it into an agent or plugin .mcp.json.
Usage
Arguments
workspace/mcp(string, required): Slug of the workspace and the name of the MCP server (for exampleengteam/linear).
Authentication
- Interactive use — sign in once with
tessl login; the proxy reuses the same credentials. - CI or other non-interactive contexts — set
TESSL_TOKENto a Tessl API key for the workspace. Seetessl api-key create.
Examples
Repository
tessl repo select-commits
Browse recent commits in a repository and select which ones to evaluate. Used as the first step in generating codebase scenarios.
This command is not listed in tessl --help but works when invoked directly.
Usage
Arguments
org/repo(string, required): Repository inorg/repoformat
Flags
--keyword(string, optional): Filter by commit message keyword--author(string, optional): Filter by author name--since/--until(string, optional): Date range in YYYY-MM-DD format--count/-n(number, optional): Number of commits to show (1–100)--workspace/-w(string, optional): Required outside interactive mode--json(boolean, optional): Output as JSON
Prerequisite: your GitHub or GitLab account must be connected in workspace settings. If it isn't, the error message includes a direct link to the settings page.
Examples
GitHub integration
Tessl App is a GitHub App your workspace installs. These commands mint short-lived installation tokens so CI steps and coding agents can act as the Tessl App bot without holding the App's private key.
A workspace can reach the Tessl App on more than one GitHub account. Pass --repo owner/name to say which: the owner selects the installation to mint from, and the repository names limit what the token can reach. Without it, the most recently updated installation is used, which may not be the one that owns the repositories you want.
tessl github token
Mint a short-lived GitHub installation token for the Tessl App bot and print it to stdout.
Usage
Flags
--workspace(string, optional): Name or ID of workspace--repo(string, optional, repeatable): Scope the token to a repository and select its installation by owner, inowner/nameform. All values must share one owner, since a token is minted against a single installation.
Notes
- The token is written to stdout so it can be captured directly, for example
GH_TOKEN=$(tessl github token ...). The expiry is written to stderr, so it does not pollute that capture. - The minted token is a GitHub App installation token, not a user token. Installation-scoped endpoints such as
/installation/repositorieswork; user-scoped endpoints such asgh org listfail. - Without
--repo, the token covers everything the selected installation can reach.
Examples
tessl github setup-auth
Configure gh and git on this machine to act as the Tessl App bot, so subsequent commands authenticate without a token in the environment.
Usage
Flags
--workspace(string, optional): Name or ID of workspace--repo(string, optional, repeatable): Scope the token to a repository and select its installation by owner, inowner/nameform. All values must share one owner.--force(boolean, optional): Overwrite an existinggh/gitauth configuration. Without it, the command stops rather than replacing one already in place.--auto-refresh(boolean, optional): Spawn a background process that re-mints the token periodically, for steps that outlive a single token.--refresh-interval-seconds(number, optional): How often that background process re-mints, in seconds. Defaults to 2700, which is 45 minutes.
Notes
- Signs in
ghand sets a global git identity for the bot. This persists after the command exits, so prefer an ephemeral runner or container. - Refuses to run when
ghis already signed in or a global git identity is already set. Use--forceto replace them. - Clear
GH_TOKENandGITHUB_TOKENfirst.ghprefers a token in the environment over the credential this writes. - Without
--auto-refreshthe credential lasts until the expiry the command prints. - With
--repo, refreshes re-mint against the same owner and repositories. Without it, each refresh picks the most recently updated installation.
Examples
Inventory
tessl inventory import
Scan a GitHub account or org for installed skills and upload an inventory. Forked repos are skipped.
Usage
Flags
--org(string, optional): GitHub account or org to scan. Prompted if omitted.--workspace(string, optional): Name or ID of workspace to upload to. Prompted if omitted.--repo(string, repeatable, optional): Limit scan to this repo (repeatable)--ignore-repo(string, repeatable, optional): Exclude this repo from the scan (repeatable)--dry-run(string, optional): Write inventory JSON to the given path instead of uploading
Notes
--organd--workspaceare prompted when omitted in interactive sessions, but required as flags in non-interactive environments (including with--dry-run)
Examples
Scenario management
Scenario management and evals are in public beta. Workflows and output formats may change in upcoming releases.
Scenario commands generate and manage eval scenarios from real repository commits. For a full walkthrough, see Prove a skill works using evaluation.
tessl scenario generate
Generate eval scenarios from a plugin or repository commits. Runs server-side — the CLI polls until complete. Ctrl-C detaches without cancelling; check progress with tessl scenario list.
Alias: tessl scenarios generate
Usage
Arguments
source(string, required): plugin path ororg/repoto generate scenarios from
Flags
--commits(string, optional): Comma-separated commit hashes to generate scenarios from (repo only)--prs(string, optional): Comma-separated PR numbers to resolve as commit ranges (repo only)--count/-n(number, optional): Number of new scenarios to add (plugin only)--context(string, optional): Glob patterns for context files to exclude from baseline, comma-separated (repo only). These patterns are stored in each generatedscenario.jsonasfixture.exclude— they are stripped for the baseline eval variant and injected back for the with-context variant. Defaults to*.mdc,*.md,tile.json,.tessl-plugin/plugin.json,tessl.json,.tessl/when omitted.--workspace/-w(string, optional): Workspace name or ID (repo only). Required outside interactive mode.--json(boolean, optional): Output as JSON--wait/--no-wait(boolean, optional): Wait for the generation to finish before returning (default: wait when interactive; a non-interactive run, such as CI, submits and returns without waiting; use--no-waitto force that anywhere, then reconnect withtessl scenario view).--jsonon its own also detaches; pass--wait --jsonto poll to completion and still get JSON.
Examples
tessl scenario list
List recent scenario generation runs in reverse chronological order.
Alias: tessl scenarios list
Usage
Flags
--mine(boolean, optional): Only show generation runs created by you--workspace/-w(string, optional): Filter by workspace name--limit(number, optional): Maximum number of runs to display (default: 20)--status(string, optional): Filter by status. Supported values:pending,in_progress,completed,failed--json(boolean, optional): Output as JSON
tessl scenario view
Inspect a scenario generation run. Shows run metadata and a table of generated scenarios with titles and checklist item counts.
Alias: tessl scenarios view
Usage
Flags
--last(boolean, optional): View the most recent generation run--json(boolean, optional): Output as JSON
Arguments
id(string, optional): Generation run ID. Eitheridor--lastis required.
Examples
tessl scenario download
Download generated scenarios to your local evals/ folder.
Alias: tessl scenarios download
Usage
Flags
--output/-o(string, optional): Output directory. Default:<plugin-root>/evalswhen run from inside a plugin (the plugin root or any subdirectory of it), otherwise./evals. The default depends only on the current directory, not on the plugin the scenarios were generated from--strategy/-s(string, optional): Write strategy:merge(default) adds new scenarios alongside existing ones and overwrites only a folder with the same name;replaceclears the directory first--json(boolean, optional): Output as JSON--last(boolean, optional): Download from your most recent generation run, from any plugin or directory. If you started another generation since, pass its generation ID instead
Arguments
id(string, required, repeatable): Generation IDs to download. Can specify multiple IDs. Eitheridor--lastis required.
If the generation run is still in progress or pending, the command reports the status and exits.
Scenario folders are named scenario-0/, scenario-1/, and so on. In recent CLI versions, tessl scenario generate <plugin-root> sends the plugin's existing evals/ with the plugin, so new scenarios are numbered from the next free index and merge keeps the existing folders. A downloaded folder overwrites an existing folder only when the names match, for example when you download the same generation twice. With an older CLI, a second generation starts again at scenario-0/, so merge overwrites the earlier folders.
Run the download from inside the plugin you generated from, or pass --output <plugin-root>/evals. From outside a plugin, the scenarios land in ./evals, and tessl eval run <plugin-root> finds no scenarios.
Downloaded structure:
Examples
Evaluations
For more information on workflows and usage, see Prove a skill works using evaluation.
tessl eval run
Run evals from a scenarios directory. The context under test, if any, comes from --context; with no context, the run is the baseline variant alone (see Notes).
- Codebase eval: source directory contains
scenario.jsonfixtures → runs with smart defaults (agentclaude, modeldeepseek-v4.1-flash, context pattern fromfixture.exclude, context refinfer) - Plugin eval — source contains
.tessl-plugin/plugin.json→ runs the plugin's own evals. Pass the plugin root directory (the directory that contains.tessl-plugin/, not.tessl-plugin/itself).
Pointing at a plugin directory is shorthand: tessl eval run ./my-plugin expands to tessl eval run ./my-plugin/evals --context ./my-plugin — the plugin's evals/ as the scenarios, the plugin itself as the context. An explicit --context opts out of the shorthand.
Usage
Flags
-
--agent(string, optional): Agent to run with (e.g.claude). May be passed alone or together with--model. Runtessl eval run --list-agentsto see supported values and combinations. Default pair when neither override is supplied:claude/deepseek-v4.1-flash -
--model(string, optional): Model to run with (e.g.claude-sonnet-4-5). May be passed alone or together with--agent. Runtessl eval run --list-agentsto see supported values and combinations. Default pair when neither override is supplied:claude/deepseek-v4.1-flash -
--scorer-agent(string, optional): Override the agent used for the scoring step; the solver agent is unchanged. May be passed alone or together with--scorer-model. -
--scorer-model(string, optional): Override the model used for the scoring step; the solver model is unchanged. May be passed alone or together with--scorer-agent. -
--context(string, optional): Context to test — a local path (a plugin directory, or a file/glob), or a publishedworkspace/plugin@version. Adds the with-context variant alongside the baseline. See the examples below. -
--context-commit(string, optional): Commit, branch, or tag to source a local--contextfrom instead of the working tree. Requires--context. -
--skill(string, optional, repeatable): Narrow a local plugin--contextto specific skills. Local plugin contexts only — not valid with a published context. -
--skip-baseline(boolean, optional): Skip the always-on baseline variant, running only the with-context variant. -
--variant-json(string, optional): Test variants to run, as a JSON array or the path to a JSON file (up to 1 MiB). The run solves only the variants you list. No baseline is added. Cannot be combined with--skip-baselineor--arms-json. Each object in the array can contain:label(string, required): A unique name for the variant. Labels use lowercase letters, digits, hyphens, and underscores; they start with a letter or digit and are at most 64 characters.agent(string, optional): Overrides the run's agent.model(string, optional): Overrides the run's model.fixtures(object, optional): Replaces, adds, or removes named fixtures. Set a fixture tonullto remove it; omitted fixtures inherit the run's setup.includeContext(boolean, optional, deprecated): Controls whether the subject context fixture is included. Object variants include it by default; set this tofalseto remove it.forceContextActivation(boolean, optional, deprecated): Overrides whether the context fixtures are forced to activate.agentMustRead(string array, optional): Names fixtures whose installed locations the solve agent must read before starting.
For example, run 2 variants with different models:
See Comparing test variants for fixture details and examples.
-
--arms-json(string, optional): Deprecated. Use--variant-json. -
--allow-unsafe-fixture-paths(boolean, optional): Allow directory fixtures,localPathvariant fixtures, and packed symlinks that resolve outside the repository (or the source directory, when it is not in a repository). The CLI packages and uploads that external content for remote evaluation, where the evaluation agent can access it. Use this flag only for content you intend to share, including resolved symlink targets. -
--runs/-n(number, optional): Number of times to repeat each variant, from 1 to 10. -
--label/-l(string, optional): A short description to attach to this eval run. Visible intessl eval listand the Tessl web UI. -
--env-file(string, optional): Path to a.envfile whose variables are encrypted client-side and made available to the run's sandbox environment. -
--skip-forced-context-activation(boolean, optional): Omit the prompt line that tells the agent to use the injected context, so the run measures whether the agent activates the context on its own. Default off (the agent is told to use the context). -
--skip-scoring(boolean, optional): Skip the rubric scoring step. Default off (runs are scored). -
--force/-f(boolean, optional): Re-run all evals, including previously solved cases. -
--quality-check(boolean, optional): Exclude misleading scenarios (low feasibility, rubric leakage, low value) from the run. Excluded scenarios appear intessl eval viewunder a✗ Excluded by quality checkline. -
--list-agents(boolean, optional): Print the supported--agent/--modelvalues, then exit without running an eval. Combine with--jsonfor a machine-readable shape. -
--yes/-y(boolean, optional): Skip the confirmation prompt for large-scale eval runs. -
--json(boolean, optional): Output eval run IDs as JSON. On its own it detaches and prints the run ids immediately without polling; pass--wait --jsonto poll to completion and emit each run id with its final status. -
--wait/--no-wait(boolean, optional): Wait for the run to finish before returning (default: wait when interactive; use--no-waitto submit and return the run ids immediately, then reconnect withtessl eval view).--jsonon its own detaches; pass--wait --jsonto poll to completion and still get JSON.
Arguments
source(string, optional): Path to a plugin folder or scenarios directory. Defaults to the current directory if omitted.
Notes
- Without
--variant-json, a run has up to two variants. The baseline solves each scenario as authored; the with-context variant solves it with the injected context added on top. Baseline is not an empty run: each scenario keeps any fixtures it defines; no context is injected on top. The with-context variant runs when context is specified. Baseline runs by default; use--skip-baselineto run only the with-context variant. With--variant-json, the run has exactly the variants you list. - Eval runs require this directory to be linked to a Tessl project first, and always run under that project's workspace. See Projects overview.
- To measure whether the agent activates the injected context on its own, with no rubric scoring, combine both flags:
--skip-forced-context-activation --skip-scoring. - Ctrl-C detaches without cancelling: runs continue server-side. The CLI prints each run ID.
--no-waitsubmits the runs and returns their ids without polling; reconnect later withtessl eval view.--jsonalone also detaches, so pass--wait --jsonwhen a pipeline needs to block for the final per-run status.
Agent and model: --agent and --model are independent overrides; supply either or both. Run tessl eval run --list-agents for the supported combinations.
Examples
tessl eval list
List recent eval runs in reverse chronological order.
Usage
Flags
--json(boolean, optional): Output results as JSON--limit(number, optional): Maximum number of eval runs to display (default: 20)--mine(boolean, optional): Only show eval runs created by you--workspace/-w(string, optional): Filter by workspace name--plugin(string, optional): Filter by plugin name--status(string, optional): Filter by run status. Supported values:pending,completed,failed--context-type(string, optional): Filter by eval type. Supported values:plugin,plugin-directory,files,commit,no-context
Notes
- The output table includes ID, Type, Subject, Status, Created By, and Created columns
- The Type column reflects the context fixture used by the run:
plugin→Pluginplugin-directory→Plugin directoryfiles(alias for thedirectoryfixture) →Selected fileswhen globs filter it to a subset, otherwiseDirectorycommit→Commit
- The Subject column formats entries by fixture:
pluginruns asworkspace/plugin@version(or justworkspace/pluginwhen no version is set);plugin-directoryandfilesas the source path;commitasorg/repo@ref --context-type no-contextfilters to baseline runs that did not inject any context fixturefilesis the documented spelling of the canonicaldirectoryfixture — both names accepted
Examples
tessl eval view
View results for a specific eval run.
Usage
Flags
--json(boolean, optional): Output results as JSON--last(boolean, optional): View results for the most recent eval run
Arguments
id(string, optional): Eval run ID
Examples
tessl eval compare
Compare two to ten distinct eval runs side-by-side.
Usage
Flags
--json(boolean, optional): Output as JSON--full(boolean, optional): Show the full distribution (minimum, quartiles, median, mean, maximum, and standard deviation) for each cell--turns(boolean, optional): Append the per-turn and tool-usage section. This data is currently untrustworthy.
Arguments
id(string, required, repeatable): Distinct eval run ID
Examples
tessl eval list-solutions
List the results produced by an eval run.
Usage
Flags
--json(boolean, optional): Output raw JSON
Arguments
eval-run-id(string, required): Eval run ID
Examples
tessl eval download-solutions
Download files from an eval run.
Usage
Flags
--solution/-s(string, optional, repeatable): ID to download. When omitted, downloads all completed solution entries from the eval run.--output/-o(string, required): Output directory
Arguments
eval-run-id(string, required): Eval run ID
Examples
tessl eval retry
Re-run a failed eval run.
Usage
Flags
--json(boolean, optional): Output as JSON--last(boolean, optional): Retry the most recent eval run
Arguments
id(string, optional): Eval run ID to retry. Eitheridor--lastis required.
Examples
tessl eval lint
Validate eval scenario structure. This checks the shape of the scenarios, not skill quality.
Usage
Arguments
source(string, optional): Path to a plugin folder or a scenarios directory.
Notes
- A scenario directory is recognized by the presence of
task.md. Directories withouttask.mdare skipped rather than reported as invalid, so an intended scenario that is missing the file passes lint silently. Each recognized scenario directory should contain a non-emptytask.mdand acriteria.jsonweighted checklist rubric. scenario.json, aresources/directory, andsetup.share optional.resources/is included automatically andsetup.shruns automatically when present.- Run
tessl eval lint --helpfor the fullcriteria.jsonandscenario.jsonfield reference, including the supported fixture types.
Examples
Agent
The tessl agent command runs the Tessl agent directly from the CLI. The tessl agent mcp subcommands manage MCP server entries used by the Tessl agent.
tessl agent
Run the Tessl agent in an interactive or non-interactive session.
Usage
Arguments
prompt(string, optional): Prompt to send to the agent.
Flags
--permission-mode(string, optional): Permission mode for this run (supported values:ask,accept-edits,auto,yolo) (default:auto)--yolo(boolean, optional): Auto-approve every permission check (alias for--permission-mode yolo)--print/-p(boolean, optional): Run non-interactively, print the response, and exit--output(string, optional): Output format when--printis set (supported values:text,json) (default:text)--message(string, optional): Initial user message to send to the agent--model(string, optional): Model ID to use (example:anthropic/claude-opus-4-6)--thinking(string, optional): Thinking level (supported values:off,minimal,low,medium,high,xhigh)--continue/-c(boolean, optional): Resume the most recent session for this directory--resume/-r(string, optional): Resume a specific session by ID (uuid or unambiguous prefix)--no-session(boolean, optional): Disable agent session persistence--session-dir(string, optional): Agent session storage directory--ephemeral(boolean, optional): Use in-memory agent settings for this run only--tools(string, optional): Comma-separated tool allowlist (example:read,grep,find,ls)--no-builtin-tools(boolean, optional): Disable built-in tools but keep extension tools enabled--no-tools(boolean, optional): Disable all tools--extension(string, repeatable, optional): Extension source to load (example:./my-extension.tsornpm:my-ext)--no-extensions(boolean, optional): Disable extension discovery while keeping explicit--extension--skill(string, repeatable, optional): Skill path to load--no-skills(boolean, optional): Disable skill discovery while keeping explicit--skill--prompt-template(string, repeatable, optional): Prompt template path to load--no-prompt-templates(boolean, optional): Disable prompt template discovery while keeping explicit--prompt-template--theme(string, repeatable, optional): Theme path to load--no-themes(boolean, optional): Disable theme discovery while keeping explicit--theme--no-context-files(boolean, optional): Disable AGENTS.md and CLAUDE.md discovery--no-memory(boolean, optional): Disable.tessl/memoryinjection and updates
Notes
- Uses Tessl-managed model settings and shared Tessl authentication.
tessl loginand/logininside the agent are equivalent. - Use
--print/-pfor non-interactive use (combine with--output jsonfor structured output). - Use
--continue/-cto resume the most recent session for the current directory, or--resume/-r <id>to reopen a specific session.
Examples
tessl agent mcp add
Add or update an MCP server entry in the agent's MCP configuration.
Usage
Arguments
name(string, required): MCP server name.
Flags
--scope(string, optional): Config scope (supported values:project,global) (default:project).projectwrites to.mcp.jsonin the current directory;globalwrites to~/.tessl/.--url(string, optional): HTTP MCP server URL. Omit for stdio servers.--env/-e(string, repeatable, optional): Environment variable for stdio servers inKEY=VALUEformat.--header(string, repeatable, optional): HTTP header for HTTP servers inHeader: valueformat.
Notes
- For stdio servers: omit
--urland pass the server command after--(e.g.,-- npx my-server). - For HTTP servers: pass
--url. Use--headerfor authentication headers. - If the server name already exists, it is overwritten.
Examples
tessl agent mcp get
Show a configured MCP server entry.
Usage
Arguments
name(string, required): MCP server name.
Flags
--json(boolean, optional): Emit the resolved server entry as JSON.
tessl agent mcp list
List all configured MCP servers.
Usage
Flags
--scope(string, optional): Config scope to list (supported values:project,global). When omitted, servers from all scopes are listed.--json(boolean, optional): Output as JSON.
tessl agent mcp remove
Remove an MCP server entry from the agent's MCP configuration.
Usage
Arguments
name(string, required): MCP server name.
Flags
--scope(string, optional): Config scope to remove from (supported values:project,global) (default:project)
Change
The tessl change family assesses and verifies the current diff against your team's policies. Commands require a checked-in configuration and produce structured output suitable for CI use.
tessl change risk
Assess the risk of the current PR/diff against the team's checked-in risk policy and decide whether it requires human review.
Usage
Flags
--base(string, optional): Diff base ref (default: thebaseRefin the risk config, ororigin/main)--output(string, optional): Write results to a file--fail-if-review-required(boolean, optional): Exit non-zero when scoring succeeds but human review is required--json(boolean, optional): Output as JSON
Notes
- Requires a risk policy under
.github/pr-review-gate. Runtessl change risk initfirst if it is missing. - Scoring is split into deterministic git measurements, an advisory agent risk judgment, strict validation, and a deterministic gate decision.
- Tooling failures (missing config, failed agent call, malformed output) are reported as distinct errors rather than a "human review required" result.
Examples
tessl change risk init
Write PR review-gate starter files under .github/pr-review-gate.
Usage
Flags
--policy(string, optional): Starter policy to write. Supported values:conservative-starter: strict — clears only clearly surface-level changes; requires review for real behavior changes, sensitive paths, migrations, auth, architecture, and policy/config changes.official-review-policy-parity: permissive — requires human review only when the official written review policy requires it.- If omitted, prompts interactively.
--force(boolean, optional): Overwrite existing files.--json(boolean, optional): Output as JSON.
Notes
- Writes
config.json,policy.md, andprompt.mdunder.github/pr-review-gate. - Existing files are left untouched unless
--forceis passed. - Read and edit the generated policy and config before relying on the gate.
- This command does not change branch protection rules or create any GitHub workflow.
Examples
tessl change verify
Verify changed files against configured verifiers.
Usage
Arguments
path(string, repeatable, optional): Optional path scope (file or directory) to verify
Flags
--json(boolean, optional): Output as JSON--all(boolean, optional): Verify every matching file, not just the diff--recursive(boolean, optional): Verify each configured root from this project plus its child manifests--base(string, optional): Diff base ref (default:main)--changed-files-mode(string, optional): How to judge changed files. Supported values:introduced-only(gates on diff-attributable violations),whole-file(judges each changed file in full) (default:introduced-only)--group(string, optional): Run only this verifier group from the manifest--verifier(string, repeatable, optional): Run only this verifier id (repeatable)--include(string, repeatable, optional): Override include glob (repeatable)--exclude(string, repeatable, optional): Override exclude glob (repeatable)--max-concurrency(number, optional): Cap parallel judge calls (default: 48)--max-calls(number, optional): Refuse broad runs above this many judge calls (default: 300)--sample(number, optional): Run a deterministic sample of verifier targets--batch-timeout(number, optional): Abort the judge batch if it runs longer than this many seconds--dry-run(boolean, optional): Show what a verify run would do without spending judge calls--show-files(boolean, optional): Print the matched file list for each verifier (use with--dry-run)--include-disabled(boolean, optional): Also run groups markedenabled=false--output(string, optional): Write the report to a file instead of stdout--report-json(string, optional): Write the structured JSON report to a file, leaving stdout as-is. Uses the same shape as--json(a recursive run writes the per-root envelope). Combine with--githubto write the report and emit annotations in one run--no-cache(boolean, optional): Skip the local result cache entirely (no reads, no writes)--refresh-cache(boolean, optional): Skip cache reads but save new results--verbose(boolean, optional): Show every considered file/verifier target--strict-coverage(boolean, optional): Stalecovered_bylinks cause non-zero exit even when judges pass--fail-on-warn(boolean, optional): Treat warning verdicts as non-zero exit--github(boolean, optional): Emit GitHub Actions warning/error annotations for findings
Examples
tessl change verify suggest-scopes
Suggest repo-specific verifier scopes for a group.
Usage
Flags
--json(boolean, optional): Output as JSON--group(string, optional): Suggest scopes only for this verifier group--heuristic(boolean, optional): Use the offline heuristic instead of the default LLM suggestion--no-llm(boolean, optional): Alias for--heuristic--apply(boolean, optional): Write suggestions intotessl.json--force(boolean, optional): Replace existing verifier-level overrides
tessl change verify lint
Validate a verifier JSON file against the schema.
Usage
Arguments
verifier.json(string, required): Path to the verifier JSON file to validate
Code review
tessl code review
Run a Tessl Code Review over a code change and print the result. tessl code review is shorthand for tessl code review run.
Usage
Flags
--profile(string, optional): Review profile. Use the built-instandardprofile (the default), or pass an explicit path to a repository-owned.ymlor.yamlfile.--skill(string, repeatable, optional): Reviewer lens: a local SKILL.md path or skill directory, an installed skill name, or a registry refworkspace/plugin[@version]#skill-name. Order is preserved, and a maximum of 12 lenses is supported, unless your organization has a different limit. Passing--skillreplaces the profile's default lens set entirely rather than adding to it.--pr(string, optional): Review a GitHub pull request or GitLab merge request by reference (number, URL, or provider ref) and capture its context. Mutually exclusive with--baseand--head.--base(string, optional): Base ref of an explicit Git range to review. Defaults to the repository's own default branch when omitted. No pull request is required.--head(string, optional): Head ref of an explicit Git range to review. Defaults to the local working tree, including uncommitted changes, when omitted.--pr-fixture(string, optional): Replay a versioned pull-request fixture file instead of resolving a live pull request (experimental). Mutually exclusive with--pr,--base, and--head.--effort(string, optional): How hard each review lens thinks:low,medium,high, oradaptive. Applies to every lens, overriding anyeffortthe profile sets.adaptiveusesmediumfor a full review andlowfor a re-review;low,medium, andhighstay fixed at that level. The built-instandardprofile usesadaptive, so omitting--efforton a standard review already scales this way. Omit it and each lens uses its owneffortwhere the profile gives it one, then the profile'seffort, then the model's own default. Higher settings take longer.--approver(string, repeatable, optional): A comment-author login permitted to ask the review to approve the pull request instead of reviewing it, beyond the repository members who always may. The same allowlist also permits requesting a full re-review of the whole change (rather than the narrower incremental round), so a login named here gains both privileged intents, not just approval. Repository owners, members, and collaborators can already do both; a GitHub App cannot, because it comments with associationNONEwhatever its permissions, so name its[bot]login here to let it approve or request a full review. Capitalization does not matter. Omit it to name no extra login, which does not stop a member using either.--publish(string, optional): Publish the completed review to the pull request or merge request it reviewed. On GitHub,commentpublishes a review that neither approves nor blocks;verdictapproves or requests changes according to the review result. On GitLab, publication posts a summary and inline discussions;verdictfalls back to a comment and does not submit native approvals or request-changes decisions. Cannot be combined with--pr-fixture.--json(boolean, optional): Output as JSON
Notes
- With no selection flags, the review auto-selects its subject: the current GitHub pull request or GitLab merge request in a supported CI environment, otherwise the complete local change. A local change is diffed against the repository's default branch, taken from the remote's recorded
origin/HEADand, in a clone that records none, fromorigin/mainororigin/master. Where none of those resolves, the command says so rather than guessing, and--basenames the ref to use instead. - A local commit range with nothing in it is not reviewed. On a clean, up-to-date checkout the command exits successfully reporting that there are no changes to review, having run no lens, rather than reporting an approval it has no change to base one on. A working-tree change and a pull request are always reviewed.
- Reviewing a GitHub pull request in CI requires GitHub authentication:
GITHUB_TOKENorGH_TOKENin the environment, or an authenticatedghsession. Local runs without credentials fall back to anonymous access to public repositories. - GitLab authentication uses
GITLAB_TOKENorGL_TOKEN, then an authenticatedglabsession. Context requiresread_api; publication requiresapi.CI_JOB_TOKENalone is insufficient. Tessl authentication usesTESSL_TOKENseparately in CI. See Run Code Review with GitLab. - Full request URLs select their provider explicitly. Local numbers are rejected when fetch or push remotes span GitHub and GitLab; use a full URL. GitHub Actions selects GitHub when
GITHUB_ACTIONS=trueandGITHUB_REPOSITORYare present. GitLab merge request pipelines select GitLab whenGITLAB_CI=trueandCI_MERGE_REQUEST_PROJECT_PATHare present. Outside those cases, use a full URL when remotes are mixed. - The default lenses come from the
standardprofile and are pinned to a specific version of thetessl/code-reviewplugin, so the default review does not change when the plugin publishes a new version. - Selected lenses contribute to one review of the whole change.
- Transcript capture and upload require the internal
TESSL_CODE_REVIEW_USAGE_DIAGNOSTICS=1gate during the initial release. A gated CI or Cloud Launch run captures without project configuration; a gated developer run also requires agent-log collection with thetessl-cliprovider enabled. The general usage-sharing preference does not control this diagnostic-only capture. - By default the command runs a review and prints the result, publishing nothing. Pass
--publishto post the completed review to the request it reviewed. GitLab receives a summary note and inline discussions. GitHub receives one native review: a summary body, an inline comment on each finding GitHub can anchor to a changed line, and a reply on each earlier finding's thread this round reconciled. - The following publication fallback and receipt details describe GitHub. For GitLab thread reconciliation, revision checks, and comment-only verdict behavior, see Run Code Review with GitLab.
- Inline placement is attempted, not guaranteed. A finding GitHub cannot anchor to a changed line is carried in the summary body instead. If GitHub rejects the whole batch because it cannot resolve an anchor, the CLI retries once with every finding in the summary instead, and that retry can itself fail or find that the head has moved on. Replies to earlier threads are best effort in the same way: a failure to read or post them warns and leaves the published review standing.
--publishtakes a value rather than being a boolean, because the two ways to publish differ in what they claim.commentstates no position on the change.verdictcarries the review's own conclusion, and the CLI resolves it into an approval or a request for changes once the review has run, since the verdict does not exist before then. There is no way to ask for an approval that contradicts what the review found. Some rejections of a review carrying that event lead the CLI to retry once as a plain comment, and the receipt records that downgrade; others end the run without publishing. Repository policy and token permissions are the usual reasons, but the receipt does not establish the cause, and the retry can fail as well.- Publishing applies to pull requests and merge requests, needs provider credentials that can write reviews or discussions, and is refused for a replayed fixture.
- With
--json, apublicationreceipt appears once the run reaches a terminal publication state, and is absent otherwise, including when the review itself failed and when publication failed. Itsstatusispublished,published-with-policy-fallback(the verdict was downgraded to a comment),superseded(the pull request head moved while the review ran, so nothing was published), orreused(this attempt had already published its review). A consumer that depends on the review event should branch onstatusfirst:publishedEventis carried bypublishedandpublished-with-policy-fallbackonly, and it says what was submitted rather than what was requested. - The Tessl Review GitHub App is the supported way to run reviews on GitHub pull requests automatically.
YAML file profiles
Pass a profile path explicitly. Tessl does not discover profile files automatically:
The file must be a block-style YAML mapping with schemaVersion: 1 and a non-empty, ordered lenses list:
Each ref is a local SKILL.md path or skill directory, an installed skill name, or a registry reference. Local paths are resolved relative to the profile and must remain inside the repository. A lens without globs applies to the whole change.
Globs are case-sensitive, repository-relative POSIX patterns. Each list must contain at least one positive pattern. Patterns are evaluated in order: a matching positive pattern includes a path, a matching pattern prefixed with ! excludes it, and a later positive pattern can include it again. For a renamed file, the lens is selected when either the old or new path matches.
The top-level ignore list bounds which paths any lens reviews, so you exclude generated code, lockfiles, snapshots, or vendored directories once instead of repeating a ! negation in every lens. Each pattern is a repository-relative POSIX glob, and each is positive: it excludes what it matches, so a leading ! is rejected rather than read as a double negative. The list applies to every lens, including a lens that declares no globs of its own; a lens's own globs still narrow it further, and ignore overrides anything a lens selected. At most 64 patterns are allowed, and a bare ** (which would exclude everything) is rejected. Because a file is selected when either rename endpoint matches, a file renamed into an ignored path is still reviewed, and that ignored path appears in the rename patch. ignore bounds which paths a lens reviews; it is not a way to keep paths or their contents out of a model's context.
Each lens receives only its selected files in its prompt and the diff_stat, diff_files, diff_file, and diff_full tools. Lenses with no matching files do not run or count toward the lens limit. If no lens matches, the command exits successfully with a skipped result and does not imply approval.
Passing --skill replaces the file profile's complete lens list and its routing.
The file may set effort for every lens, and any lens may set its own effort to think harder or less hard than the rest. A lens without one runs at the file's effort; with neither, the model applies its own default. --effort applies to every lens and takes precedence over both.
reviewMode controls the blocking strength required from an eligible finding. strict blocks at zero, standard at one, and relaxed at two. Omit it to use standard. Low-confidence fresh findings are omitted in every mode. Pre-existing findings never block.
Each valid finding is assessed internally by consequence severity, likelihood, confidence, and relationship to the change. The CLI combines consequence and likelihood into the stable published severity: Critical consequence becomes Critical, Major, or Minor at High, Medium, or Low likelihood; Major consequence becomes Major, Major, or Minor; Minor consequence becomes Minor, Minor, or Nit; and Nit remains Nit. Confidence remains supporting assessment data rather than changing severity or blocking strength.
requestChangesAt sets the minimum consequence severity eligible to block: critical, major, minor, or nit, defaulting to major. Each consequence level above that baseline adds one strength point; Low, Medium, and High likelihood add zero, one, and two. A finding blocks when its strength reaches the selected review mode's threshold.
Because published severity also reflects likelihood, a Strict or Standard review can require a change for a finding displayed below requestChangesAt. The finding's requiresChanges value is authoritative.
The first review and an authorised full re-review show every valid optional finding. An incremental re-review shows a fresh finding only when it blocks and continues to reconcile earlier findings.
Whether a changes-requested result blocks a merge depends on how the review runs, and in every case a merge is held only by the repository's branch protection or ruleset. Under the Tessl Review GitHub App, the repository's review behavior (Enforcing by default, or Advisory) sets whether the Tessl Reviewer check passes or fails on a changes-requested result; that check holds a merge only when branch protection requires it. Under the unsupported GitHub Action, the Action's mode input decides whether its check fails, and again branch protection decides whether a failing check holds the pull request.
File profiles also work with the GitHub Action. Set its profile input to the repository-relative path.
Examples
tessl code repo view
Show Tessl settings for one GitHub repository.
Usage
Arguments
owner/repo-or-id(string, required): Repository full name or GitHub repository ID.
Flags
--org(string, optional): Organization name or ID (prompted when you belong to several).--json(boolean, optional): Output as JSON.
Examples
tessl code repo update
Update Tessl settings for one GitHub repository the Tessl Review GitHub App can access. Only the settings you pass change.
Usage
Arguments
owner/repo-or-id(string, required): Repository full name or GitHub repository ID.
Flags
--org(string, optional): Organization name or ID (prompted when you belong to several).--review-enabled/--no-review-enabled(boolean, optional): Turn Tessl Code Review on or off.--review-trigger(string, optional): When Code Review runs on pull requests. Supported values:open-and-command,every-push.--review-publication(string, optional): Whether reviews can approve or request changes. Supported values:enforcing,advisory.--review-auto-approve/--no-review-auto-approve(boolean, optional): Approve once blocking findings are resolved.--review-cli-channel(string, optional): Tessl CLI release channel for new review runs. Supported values:latest,beta,nightly,head.--review-cli-version(string, optional): Exact Tessl CLI version for new review runs. Mutually exclusive with--review-cli-channel.--json(boolean, optional): Output as JSON.
Notes
- Changing these settings needs an organization admin.
- Code Review is a repository setting, not a loop, so pausing loops doesn't stop it.
Examples
Launch
The tessl launch family runs agent workflows. Use tessl launch skill to run a specific skill with a chosen agent, or tessl launch <agent> to open an interactive agent session. The list, view, progress, and logs subcommands inspect cloud launch runs, and cancel stops one. To work out why a factory run didn't start or failed, see Troubleshoot factory runs.
tessl launch <agent>
Launch a coding agent in an interactive session.
Usage
Arguments
agent(string, required): Coding agent to launch. Supported values:claude-code,codex,gemini,antigravity,cursor,copilot,openhands,tessl-agent.
Examples
tessl launch skill
Run a skill using an agent.
Usage
Arguments
-
skill(string, required): The skill to run. The local and cloud modes accept different argument forms.Local (without
--cloud)- Installed skill name: a bare name with no slashes (e.g.,
canary-reporter), resolved from skills installed in the current project. file:path: resolved on your machine. Without a#skillselector, the directory must contain a top-levelSKILL.md. With a#skillselector (e.g.,file:./my-plugin#review-diff), it looks forskills/<name>/SKILL.mdinside the directory.
Any value containing a
/is treated as a filesystem path, not a registry ref. Registry-style values (e.g.,workspace/plugin) do not resolve remotely in local mode; they are looked up as relative paths on disk.Cloud (with
--cloud)- Registry ref:
workspace/plugin[@version], or a bareplugin[@version]resolved across the workspaces you can see. file:path/to/plugin: a path inside the cloned target repository (not the caller's machine), pointing at the plugin root (the directory holding.tessl-plugin/plugin.jsonortile.json).
Either cloud form may carry a trailing
#skillselector (for exampleworkspace/plugin@1.0.0#review-difforfile:tiles/my-plugin#review-diff). It installs the whole plugin and runs the named skill. The selector is required when the plugin exposes more than one skill. - Installed skill name: a bare name with no slashes (e.g.,
Flags
--agent(string, optional): Agent to run the skill with. Supported values:claude-code,codex,gemini,antigravity,cursor,copilot,openhands,tessl-agent. Required for local (non-cloud) runs; with--cloudit selects the cloud strategy (supported:claude-code,cursor,codex,tessl-agent).--interactive/-i(boolean, optional): Run the agent in the foreground instead of streaming output.--yolo(boolean, optional): Skip agent permission prompts and approval checks.--instructions(string, optional): Instructions to append to the skill prompt.
Notes
- In cloud mode, a
file:path must point at the plugin root inside the target repository. Pointing it at a skill subdirectory fails at the install step because that subdirectory has no.tessl-plugin/plugin.jsonortile.json. Use the plugin root with a#skillselector instead. - In local mode, the
#skillselector looks forskills/<name>/SKILL.mdrelative to the given directory. It applies when the directory is a multi-skill plugin root. It does not apply to a single-skill directory (which uses a top-levelSKILL.md) or a bare installed skill name. - Local mode does not resolve registry-style refs (e.g.,
workspace/plugin). Any value with a/is treated as a filesystem path.
Cloud flags
Run the skill against a repository in the cloud rather than locally.
--cloud(boolean, optional): Run the skill against a repo in the cloud.--repo(string, optional): Target repository asowner/nameor URL (required with--cloud).--base-branch(string, optional): Branch to clone and target the PR against (default:main).--env-file(string, optional): Path to a.envfile whose variables are encrypted and made available to the cloud launch.--workspace(string, optional): Name of workspace to launch in (default: linked project workspace).--wait/--no-wait(boolean, optional): Wait for the cloud launch to finish before returning (default: wait; use--no-waitto return immediately).--label(string, optional): Label to describe this launch run.--model(string, optional): Model to use for the cloud launch run. Runtessl launch modelsto list the agent and model pairs accepted in the launch workspace.--cwd(string, optional): Subdirectory to run the skill in, relative to the current directory (default: repo root).
Examples
tessl launch models
List the agents and models accepted by cloud launches in a workspace. The list reflects the workspace's organization, the Tessl region serving it, and any configured bring-your-own model provider.
Usage
Flags
--workspace(string, optional): Name of workspace to inspect (default: linked project workspace).--json(boolean, optional): Output as JSON.
Examples
tessl launch list
List recent launch runs in reverse chronological order.
Usage
Flags
--workspace/-w(string, optional): Filter by workspace name.--limit(number, optional): Maximum number of launch runs to display (default: 20).--status(string, optional): Filter by status:pending,completed,failed, orcancelled.--link-rel(string, optional): Filter by link relationship:producedorreferences.--link-type(string, optional): Filter by link type:github_pr,github_issue, orlinear_issue.--link-value(string, optional): Filter by link value. Requires--link-type.--since(string, optional): Show launch runs created at or after this timestamp.--after(string, optional): Next-page cursor from a previous listing.--json(boolean, optional): Output as JSON.
Notes
- With
--json, each run carries awebUrlthat opens the run in the browser. - When more runs match than one page holds, the table is followed by a hint carrying the next cursor, and
--jsonoutput carries it asnextCursor(nullon the last page). Repeat the command with the same filters and--after <cursor>to read the next page.
Examples
tessl launch resume
Resume a completed cloud launch run with its saved workspace archive. A run stays resumable for 7 days after that archive is saved. After that the archive is deleted, so start a new launch run instead.
Usage
Arguments
id(string, required): Parent launch run ID to resume.
Flags
--instructions/-i(string, optional): Follow-up instructions for the resumed run. Overrides the parent's instructions.--label(string, optional): Label for the resumed run.--json(boolean, optional): Output as JSON.
Examples
tessl launch view
View status and details for a launch run.
Usage
Arguments
id(string, required): Launch run ID.
Flags
--json(boolean, optional): Output as JSON.
Notes
- Shows a
Web URLthat opens the run in the browser. When the Factory is enabled, a run started by a Loop opens on its Loop run page; otherwise the link opens the workspace run page. With--json, the run carries the same link aswebUrl.
Examples
tessl launch cancel
Request cancellation of a launch run.
Usage
Arguments
id(string, required): Launch run ID to cancel.
Flags
--json(boolean, optional): Output as JSON.
Notes
- Cancellation is asynchronous. The command returns once it is requested, and the run reads
cancelledintessl launch viewafter it stops. - Canceling a run that has already finished does nothing.
- Pausing or deleting a loop doesn't cancel its runs in progress. See Stop, remove, and move loops.
Examples
tessl launch progress
Print a live-progress file that a cloud launch run uploaded.
Usage
Arguments
launchRunId(string, required): Launch run ID.
Flags
--filename(string, optional): Progress file to fetch:metrics.json(default) orprepare-subphases.json.
Notes
prepare-subphases.jsonrecords each step Tessl ran to prepare the run before the agent started.first_failednames the step that failed, such asclone,cloud-launch-setup,manifest-sync, orskill-install, and isnullwhen preparation succeeded.- A
metrics.jsonread while the run is still going may carry"partial": true. - The command fails with a message when the run hasn't uploaded the file yet.
Examples
tessl launch logs
Print agent logs for a launch run.
Usage
Arguments
launchRunId(string, required): Launch run ID.
Flags
--watch(boolean, optional): Follow the run live. Polls the run's events and prints each new event as one JSON line, waiting 2 seconds after a page that is not full while the run is still going. Retries transient request failures and follows the current attempt when the run retries. Exits 0 once the run's event history ends, whether the run succeeded or failed; usetessl launch viewfor the outcome. Exits with an error when the event history has a gap, is unavailable, or holds an event too large to stream, or when requests keep failing. Without it, the command prints the most recent transcript, which is available after the run's upload completes.
Examples
Schedules
The tessl schedule family runs a plugin against a repository on a cron. The plugin owns the task; the schedule owns the timing. Each time a schedule fires, Tessl starts a cloud launch run and records the result. Inspect schedules with list, view, and runs, and manage them with pause, resume, update, trigger, and delete.
For the concepts and a walkthrough, see Schedules. For the secrets a run executes with, see Environments.
Tessl skips a tick if the previous run from the same schedule is still active when the next one would start. There is no queue, so a skipped tick does not run later.
tessl schedule list
List scheduled runs.
Usage
Flags
--workspace/-w(string, optional): Filter by workspace name.--project-id(string, optional): Filter by ID of project that owns the schedule.--status(string, optional): Filter by status. Supported values:active,paused.--limit(number, optional): Maximum number of scheduled runs to display (default: 20).--json(boolean, optional): Output as JSON.
Notes
- With
--json, each schedule carries awebUrlthat opens the schedule in the browser.
Examples
tessl schedule view
View config, triggers, and next/last run for a scheduled run.
Usage
Arguments
id(string, required): Scheduled run ID.
Flags
--json(boolean, optional): Output as JSON.
Notes
- Lists the schedule's cron triggers under Schedules, each with its cron expression and timezone. When the last run a trigger asked for could not start, the line under the trigger gives the reason and the time. Under each trigger it also lists the settings the trigger overrides, with their values. The schedule's own inputs appear with its configuration.
Examples
tessl schedule runs
List the launch runs a scheduled run has spawned.
Usage
Arguments
id(string, required): Scheduled run ID.
Flags
--limit(number, optional): Maximum number of launch runs to display (default: 20).--json(boolean, optional): Output as JSON.
Examples
tessl schedule pause
Pause a scheduled run.
Usage
Arguments
id(string, required): Scheduled run ID.
Flags
--json(boolean, optional): Output as JSON.
Examples
tessl schedule resume
Resume a paused scheduled run.
Usage
Arguments
id(string, required): Scheduled run ID.
Flags
--json(boolean, optional): Output as JSON.
Examples
tessl schedule update
Update a scheduled run's cron, timezone, or label.
Usage
Arguments
id(string, required): Scheduled run ID.
Flags
--cron(string, optional): New cron expression, interpreted in the schedule timezone unless--timezoneis also provided.--timezone(string, optional): New IANA timezone the cron is interpreted in.--label(string, optional): New label to describe this schedule.--json(boolean, optional): Output as JSON.
Notes
- At least one of
--cron,--timezone, or--labelis required. - Only the cron, timezone, and label can be changed. To change the skill, repo, environment, or any other launch config, delete the schedule and create a new one.
Examples
tessl schedule trigger
Fire a scheduled run now, out of band.
Usage
Arguments
id(string, required): Scheduled run ID.
Flags
--json(boolean, optional): Output as JSON.--trigger(string, optional): Name of one of the schedule's cron triggers to run as. The run uses that trigger's overrides. Without it, the run uses the schedule's own action, so a schedule with no cron trigger can be run too.
Notes
- Triggering dispatches a launch run asynchronously and returns immediately. It does not change the cron and does not affect the next scheduled tick. Use
tessl schedule runs <id>to see the spawned run and its result. - Prints a link to the schedule in the browser. With
--json, the schedule carries the same link aswebUrl. The launch run does not exist yet when the command returns, so there is no run link.
Examples
tessl schedule delete
Delete a scheduled run.
Usage
Arguments
id(string, required): Scheduled run ID.
Notes
- Deleting a schedule stops future runs. Launch runs it has already spawned are kept.
Examples