nur
A script discovery and execution engine for your project's tasks.
Run nur in a project and it discovers tasks across npm (package.json),
Makefile, PDM/poe (pyproject.toml), justfile, Taskfile.yml, mise
(mise.toml), and xc (README.md), then lets you run them from a TUI picker or
directly from the command line. Discovery is limited to the current directory.
Table of Contents
- Installation
- Usage
- Support
- Motivation
- Features
- Author
- Analysis
- Contributing
- Development
- Releasing
- Credits
- License
- Changelog
Installation
nur is a standalone command-line tool — install it into an isolated
environment rather than as a project dependency:
uv tool install nur
pipx install nur
Or run it without installing:
uvx nur
On macOS/Linux via Homebrew:
brew install hasansezertasan/tap/nur
On Windows via Scoop:
scoop bucket add hasansezertasan https://github.com/hasansezertasan/scoop-bucket
scoop install nur
To install the latest unreleased changes from source:
uv tool install git+https://github.com/hasansezertasan/nur
Or, from a clone:
uv tool install .
Usage
Run nur from the root of a project that contains any supported task file.
TUI
Run with no arguments to open the interactive picker:
nur
Browse and run the discovered tasks in a three-pane Textual UI. Press q to
exit.
CLI
nur test # run a task by name (if unambiguous)
nur make:test # run a task by its qualified name
nur test -- --watch # pass extra args through to the underlying runner
nur list # print all discovered tasks
nur --version
Debugging
Debug nur in VS Code using the provided launch configurations:
- Current File: Debug the currently open Python file.
- Tests: Debug pytest runs.
- Attach: Attach to a running process (with debugpy).
- CLI / TUI: Debug the
nurentry point — with arguments (CLI) or with none, which opens the TUI.
Select a configuration from the Run and Debug panel in VS Code.
Support :heart:
If you have any questions or need help, feel free to open an issue on the GitHub repository.
Motivation
Every project speaks a different task dialect — make test, npm run test,
just test, task test, pdm run test, poe test, mise run test, xc test. nur gives
you one command that discovers whatever a project already uses and runs it, with no config and
no need to remember which runner lives where. Discovery is pure text/JSON/TOML
parsing, so listing tasks never executes anything (no make -pRrq side effects).
Features
- Zero-config discovery across eight providers:
make,npm,just,task(Taskfile),pdm,poe,mise, andxc. mise is read from the first config file present, in priority order:mise.local.toml,mise.toml,.mise.local.toml,.mise.toml,.config/mise.toml. xc is read fromREADME.md: tasks come from the section marked with an<!-- xc-heading -->comment, or failing that from a heading namedTasks— which is how nur discovers the tasks documented below in this very file. - CLI Application: run any discovered task by name or qualified
prefix:name, with--passthrough to the underlying runner. - TUI Application: interactive three-pane task picker built with Textual.
- Safe by default: discovery parses files; it never shells out to a runner just to list tasks.
- Type Safety: full type hints checked by mypy, basedpyright, ty, pyrefly, and zuban.
- Code Quality: comprehensive linting and formatting with ruff, plus architecture-contract enforcement with import-linter.
- Testing: pytest with coverage reporting and parallel execution.
- Documentation: Sphinx documentation with the Shibuya theme, GitHub Pages deployment, and live per-PR documentation previews.
- CI/CD: automated testing, building, and publishing across multiple platforms.
- Security: CodeQL, OpenSSF Scorecard, dependency review, secret scanning (gitleaks), dependency auditing (pip-audit), GitHub Actions static analysis (zizmor — a blocking prek/CI gate plus a Security-tab dashboard, over hardened least-privilege workflows), and a CycloneDX SBOM attached to every release.
- Managed
.gitignore: kept in sync with the upstream github/gitignore templates by cobo, with a weekly drift check. - Modern Python: uv for dependency management, hatch for building.
Author :person_with_crown:
This project is maintained by Hasan Sezer Taşan, It's me :wave:
Analysis
- Snyk Python Package Health Analysis
- Libraries.io - PyPI
- Safety DB
- PePy Download Stats
- PyPI Download Stats
- Pip Trends Download Stats
- PyPI Map Dependency Graph
Contributing :heart:
Any contributions are welcome! Please follow the Contributing Guidelines to contribute to this project.
Development :toolbox:
Clone the repository and cd into the project directory:
git clone https://github.com/hasansezertasan/nur
cd nur
install
Install the dependencies:
uv sync
style
Run the style checks:
uv run --locked tox run -e style
ci
Run the CI pipeline:
uv run --locked tox run
docs-build
Build the documentation site:
uv run --locked tox run -e docs-build
docs-server
Start the live-reloading docs server:
uv run --locked tox run -e docs-server
docs-linkcheck
Check the documentation for broken links (also runs weekly in CI):
uv run --locked tox run -e docs-linkcheck
Releasing
Versioning and releases are automated with release-please, driven by Conventional Commit PR titles squash-merged into main. release-please maintains a release PR that bumps the version and CHANGELOG.md; merging it tags the release and publishes to PyPI. See the Contributing Guidelines for the commit conventions and the one-time Repository setup (squash-merge settings, Actions permissions, release immutability, and PyPI trusted publishing).
Credits
This package was created with Copier and the hasansezertasan/copier-pyproject project template.
License :scroll:
This project is licensed under the MIT License.
Changelog :memo:
For a detailed list of changes, see the GitHub Releases. A CHANGELOG.md is generated automatically by release-please on each release.
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 nur-0.2.1.tar.gz.
File metadata
- Download URL: nur-0.2.1.tar.gz
- Upload date:
- Size: 46.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6370a7ae2227722f859d93ab5d5e736651c55f38efd51ec4ffba6cade957071
|
|
| MD5 |
36d64903ce52937fd94d60edb14efe4c
|
|
| BLAKE2b-256 |
d173c825cb97db08e6c9c95b5857a705b3a722239c3d339c752d7a61bc7f85d5
|
Provenance
The following attestation bundles were made for nur-0.2.1.tar.gz:
Publisher:
release.yml on hasansezertasan/nur
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nur-0.2.1.tar.gz -
Subject digest:
f6370a7ae2227722f859d93ab5d5e736651c55f38efd51ec4ffba6cade957071 - Sigstore transparency entry: 2358330982
- Sigstore integration time:
-
Permalink:
hasansezertasan/nur@bae033beb29034bef012cc8661ca70458352e521 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/hasansezertasan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@bae033beb29034bef012cc8661ca70458352e521 -
Trigger Event:
push
-
Statement type:
File details
Details for the file nur-0.2.1-py3-none-any.whl.
File metadata
- Download URL: nur-0.2.1-py3-none-any.whl
- Upload date:
- Size: 28.4 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 |
b84b9aa47cc8e33966ef7a31f8566ecccf45454c69ff3d370448bbf43d04ba76
|
|
| MD5 |
935248000ce0b7dd7c838f6ea2a43cd5
|
|
| BLAKE2b-256 |
a1b14a04df1df63d5492d7310fda6e9ab30d4380410f9644b0c5f88a27316673
|
Provenance
The following attestation bundles were made for nur-0.2.1-py3-none-any.whl:
Publisher:
release.yml on hasansezertasan/nur
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nur-0.2.1-py3-none-any.whl -
Subject digest:
b84b9aa47cc8e33966ef7a31f8566ecccf45454c69ff3d370448bbf43d04ba76 - Sigstore transparency entry: 2358331036
- Sigstore integration time:
-
Permalink:
hasansezertasan/nur@bae033beb29034bef012cc8661ca70458352e521 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/hasansezertasan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@bae033beb29034bef012cc8661ca70458352e521 -
Trigger Event:
push
-
Statement type: