pykaxe
A terminal UI for discovering and running small Python CLI tools.
pykaxe scans a tools directory you choose for standalone Python scripts,
lets you fuzzy-search and launch them from a single prompt, and streams
their output live — with sandboxing (memory/CPU/runtime limits, output caps)
so a runaway tool can't take the terminal down with it.
Install
pip install pykaxe
Or with pipx (recommended for CLI tools):
pipx install pykaxe
Usage
pykaxe
The first time you run it, pykaxe asks where to keep your tools:
Where should pykaxe store your tools? [~/.pykaxe/tools]:
Press Enter to accept the default or type a different path. It creates that
folder, seeds it with a few example tools, and remembers your choice in
~/.pykaxe/config.json — you won't be asked again. Override it for a single
run with the PYKAXE_TOOLS_DIR environment variable.
Type / to see available tools, fuzzy-filter by typing part of a name, and
press Enter to select. If a tool declares arguments, pykaxe prompts for each
one in turn — showing its choices/default/help when it declares them —
before running it.
| Key | Action |
|---|---|
/ |
List / filter tools |
esc |
Interrupt running tool |
ctrl+y |
Copy output to clipboard |
ctrl+s |
Re-scan tools directory |
ctrl+c |
Quit |
Getting an AI to write a tool
pykaxe prompt --copy
copies a short prompt to your clipboard that explains the tool contract below. Paste it into ChatGPT or Claude.ai once, then ask for tools in plain language:
Generate a pykaxe script to convert Celsius to Fahrenheit.
Save what it gives you as a .py file and run:
pykaxe add path/to/the-script.py
which checks it against the contract and copies it into your tools folder —
it shows up next time you type /.
If you're using a coding agent with filesystem access (e.g. Claude
Code), run pykaxe skill once to install a
skill that writes tools directly into your tools folder — no pykaxe add
step needed. Just ask it directly:
Create a pykaxe tool that reverses a string.
Writing a tool by hand
A tool is a Python script placed in your configured tools folder (see
pykaxe tools-dir) that exposes this contract:
import argparse
import sys
TOOL_NAME = "my-tool"
TOOL_DESCRIPTION = "One-line description shown in the tool list."
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(prog=TOOL_NAME, description=TOOL_DESCRIPTION)
parser.add_argument("--text", required=True, help="Text to process.")
return parser
def main() -> int:
args = build_parser().parse_args()
print(f"you said: {args.text}")
return 0
if __name__ == "__main__":
sys.exit(main())
Each tool runs as its own subprocess (python <script> --arg value ...), so
it must be runnable standalone and communicate purely through stdout/stderr
and its exit code. Drop it straight into your tools folder, or validate it
first with pykaxe add path/to/script.py.
Contributing
-
Fork the repo and create a virtualenv.
-
Install in editable mode with dev dependencies:
make dev -
Add or edit a bundled example tool under
src/pykaxe/examples/, or make changes to the app insrc/pykaxe/app.py. -
Run the tests and linter:
make test make lint
-
Open a pull request.
Building & releasing
This project uses hatchling as its build backend.
The version lives in src/pykaxe/__init__.py.
make build # bumps the patch version, then builds sdist + wheel into dist/
make publish # builds, then uploads dist/* to PyPI via twine
To bump a minor or major version instead of a patch:
make bump-minor
make bump-major
License
MIT — see LICENSE.
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 pykaxe-0.1.1.tar.gz.
File metadata
- Download URL: pykaxe-0.1.1.tar.gz
- Upload date:
- Size: 14.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
06ef9a3153f4de451f162bce6d74d46433621294b41e5a00d5a2ab3eae3c4433
|
|
| MD5 |
5b0898cd6699475764d10032f2f0bf36
|
|
| BLAKE2b-256 |
7b1e19d8fa8647b08e583066c8973dfb100956cd8f1309f61663b828318596fe
|
Provenance
The following attestation bundles were made for pykaxe-0.1.1.tar.gz:
Publisher:
release.yml on murshidm/pykaxe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pykaxe-0.1.1.tar.gz -
Subject digest:
06ef9a3153f4de451f162bce6d74d46433621294b41e5a00d5a2ab3eae3c4433 - Sigstore transparency entry: 2637435335
- Sigstore integration time:
-
Permalink:
murshidm/pykaxe@ad58062c140cce1d04e10544398529b95b90ac6b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/murshidm
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ad58062c140cce1d04e10544398529b95b90ac6b -
Trigger Event:
push
-
Statement type:
File details
Details for the file pykaxe-0.1.1-py3-none-any.whl.
File metadata
- Download URL: pykaxe-0.1.1-py3-none-any.whl
- Upload date:
- Size: 19.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
70a2ff01d4890660090fd44d476ed4fc85250d805753141c633708db69ec6703
|
|
| MD5 |
df6eabfde55dfe3061561144b9f72b79
|
|
| BLAKE2b-256 |
603a42f6f7701261de6023a4b8521ecb5067ffb477005b8f9dba4abf81c83103
|
Provenance
The following attestation bundles were made for pykaxe-0.1.1-py3-none-any.whl:
Publisher:
release.yml on murshidm/pykaxe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pykaxe-0.1.1-py3-none-any.whl -
Subject digest:
70a2ff01d4890660090fd44d476ed4fc85250d805753141c633708db69ec6703 - Sigstore transparency entry: 2637435355
- Sigstore integration time:
-
Permalink:
murshidm/pykaxe@ad58062c140cce1d04e10544398529b95b90ac6b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/murshidm
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ad58062c140cce1d04e10544398529b95b90ac6b -
Trigger Event:
push
-
Statement type: