Reusable environment detection, activation, and wrapper tooling for developer CLIs.
Project description
dekk
Make project CLIs runnable with one config and zero manual activation.
Install
pipx install dekk
Fallback:
python -m pip install --upgrade dekk
Minimal Setup
dekk install ./tools/cli.py
If .dekk.toml is missing, dekk install and dekk wrap create a starter
file from the repo context first.
Explicit template-driven setup is still available:
dekk init --example conda
eval "$(dekk activate --shell bash)"
Optional (no activation after this):
dekk wrap myapp ./tools/cli.py
Worktree-safe default:
dekk install ./tools/cli.py # no shell rc PATH edits by default
dekk install ./tools/cli.py --update-shell
Project Command Routing
All project commands go through dekk <appname>, which finds the nearest
.dekk.toml and runs with cwd set to that project root:
dekk myapp # project-aware help
dekk myapp --help
dekk myapp server --port 8080
dekk myapp build
dekk myapp test
This is worktree-friendly by default:
dekkwalks up from your current directory to find the nearest.dekk.toml- the app name must match
[project].name - the command runs with
cwdset to that project root, not whatever nested directory you happened to be in - activation is scoped to that project config before the command runs
That means dekk myapp server works correctly from a repo root, a nested
subpackage, or a separate Git worktree for the same project, without relying
on global shell state.
Built-in Project Tools
Built-in tools (setup, agents, worktree) are project-scoped — they require
the app name so dekk knows which project context to use:
dekk myapp setup
dekk myapp agents init
dekk myapp agents generate --target all
dekk myapp worktree create feature-x --base main
dekk myapp worktree list
Why the app name? Because dekk resolves paths from your current directory.
The app name selects the project (validates against [project].name in
.dekk.toml), and all paths resolve relative to that project root. This
makes every command worktree-safe — it works correctly from any checkout.
Agents
Source of truth: .agents/
dekk myapp agents init
dekk myapp agents generate --target all
dekk myapp agents clean --target codex
dekk myapp agents install # optional (installs Codex skills to ~/.codex/skills)
Generated files: AGENTS.md, CLAUDE.md, .cursorrules, .github/copilot-instructions.md, .agents.json
Worktrees
dekk myapp worktree create feature-x --base main
dekk myapp worktree list
dekk myapp worktree remove feature-x
dekk myapp worktree prune
Worktrees with .dekk.toml get automatic environment setup on creation.
Auto-scaffolded as an agent skill via dekk myapp agents init for git repos.
Inheriting Tools in Downstream CLIs
CLIs built with dekk.Typer can also inherit these tools directly,
useful when worktree isolation is not a concern:
from dekk import Typer
app = Typer(
name="myapp",
auto_activate=True,
add_doctor_command=True,
add_version_command=True,
add_worktree_command=True,
add_agents_command=True,
)
Docs
- Getting Started
- .dekk.toml Specification
- Real-World Examples — annotated configs from carts and apxm
- Agent Workflows
- Worktree Management
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dekk-1.11.5.tar.gz.
File metadata
- Download URL: dekk-1.11.5.tar.gz
- Upload date:
- Size: 290.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e17800e936874d231ce960bbfcb4090fa07f95cef544670bfd498a6c7189e26f
|
|
| MD5 |
0fda395a96c3fc37acba3165331490f9
|
|
| BLAKE2b-256 |
c959f62e75452fc3326ee2a82b03514277ab061ddfb62cd6089a138a268f6407
|
Provenance
The following attestation bundles were made for dekk-1.11.5.tar.gz:
Publisher:
python-publish.yml on randreshg/dekk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dekk-1.11.5.tar.gz -
Subject digest:
e17800e936874d231ce960bbfcb4090fa07f95cef544670bfd498a6c7189e26f - Sigstore transparency entry: 1634082662
- Sigstore integration time:
-
Permalink:
randreshg/dekk@d0a0f67ecf85afca2268c4b5f2f54afa6a87b9da -
Branch / Tag:
refs/tags/v1.11.5 - Owner: https://github.com/randreshg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@d0a0f67ecf85afca2268c4b5f2f54afa6a87b9da -
Trigger Event:
release
-
Statement type:
File details
Details for the file dekk-1.11.5-py3-none-any.whl.
File metadata
- Download URL: dekk-1.11.5-py3-none-any.whl
- Upload date:
- Size: 217.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e079aed547b002a32aa11e60731f0a8d69f234358b22796605b7b55ab30b1c31
|
|
| MD5 |
4126d73c24ecf52a5e758513749a64c5
|
|
| BLAKE2b-256 |
28f540ffe497f1b9e9b47195c184e14435da274427a8d971d041a977783f55a9
|
Provenance
The following attestation bundles were made for dekk-1.11.5-py3-none-any.whl:
Publisher:
python-publish.yml on randreshg/dekk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dekk-1.11.5-py3-none-any.whl -
Subject digest:
e079aed547b002a32aa11e60731f0a8d69f234358b22796605b7b55ab30b1c31 - Sigstore transparency entry: 1634082673
- Sigstore integration time:
-
Permalink:
randreshg/dekk@d0a0f67ecf85afca2268c4b5f2f54afa6a87b9da -
Branch / Tag:
refs/tags/v1.11.5 - Owner: https://github.com/randreshg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@d0a0f67ecf85afca2268c4b5f2f54afa6a87b9da -
Trigger Event:
release
-
Statement type: