#task #npm #deno #just

app task-keeper

Task keeper to manage tasks from different task runners

25 releases (11 breaking)

0.13.1 Oct 31, 2023
0.12.4 Sep 9, 2023
0.12.1 Apr 28, 2023
0.10.0 Mar 9, 2023
0.7.1 Oct 11, 2022

#138 in Command line utilities

Download history 21/week @ 2023-08-12 50/week @ 2023-08-26 7/week @ 2023-09-02 47/week @ 2023-09-09 26/week @ 2023-09-16 3/week @ 2023-09-23 3/week @ 2023-09-30 3/week @ 2023-10-14 7/week @ 2023-10-21 86/week @ 2023-10-28 8/week @ 2023-11-04 27/week @ 2023-11-11 7/week @ 2023-11-18 56/week @ 2023-11-25

102 downloads per month



Task Keeper

tk(Task Keeper) is a tool to manage tasks from different task files, such as Makefile,justfile, package.json , deno.jso, .fleet/run.json etc, and call tasks from different project management tools, such as Apache Maven, Gradle, Cargo and npm etc.

Task Keeper


  • List tasks from different task files: tk --list
  • Invoke task: tk task_name
  • Invoke task from a runner: tk --runner=npm start
  • Sync tasks between sources: tk --from=npm --to=fleet task1 task2
  • .env support by default: tk --no-dotenv to disable
  • --doctor support: check your system for potential problems to run tasks
  • Execute command line: tk -- node hello.js with correct language version and PATH

How to get started?

  • Install by cargo: cargo install task-keeper
  • Download and install from GitHub Releases

After install, execute tk --help for usage. Some commands as following:

  • list tasks: tk --list
  • execute task: tk task_name

Why task keeper?

Sorry, I got lost in different task files and management tools, and sometimes I even can not remember how to run them.

  • Find tasks: Makefile,justfile, package.json, deno.json, Taskfile.yml, tasks.py, README.md etc, and too many task files to check tasks.
  • Run task: just taskName, npm run task_name, deno task task_name, composer run-script task_name etc
  • Check outdated deps: mvn versions:display-dependency-updates, ./gradlew dependencyUpdates, npm outdated etc
  • Build project: mvn -DskipTests package, ./gradlew assemble, cargo build etc

Too many differences, I want to save my brain and keyboard, and you know MacBook keyboard's price tag is $400+.

Task runners support


Fleet Run configurations

command type support now:

  • command
  • maven/gradle
  • cargo
  • go
  • maven-run
  • cargo-run
  • docker-run

For details, please refer https://www.jetbrains.com/help/fleet/run-configurations.html

Language version detection and PATH

Task Keeper uses .java-version, .node-version files to detect language version and bound with local installed SDK.

To make task runner run tasks smoothly, Task Keeper will append following directories to PATH automatically:

  • node-modules/.bin
  • venv/bin or .venv/bin
  • vendor/bin
  • bin
  • .bin

For example, if you use Python virtual env to manage your project, Task Keeper will add venv/bin to PATH automatically, and you don't need to do anything.

  python hello.py

Tips: you can use double dash to run command with language detection and correct PATH, such as tk -- mvn spring-boot:run. To make life easy, and you can use alias e='tk --' to create an alias, then you can run e mvn spring-boot:run to run your project.

Package manager support

Common tasks for all package managers:

  • init: create project by manager mvn archetype:generate, npm init, cargo new xxx etc
  • install: install all dependencies npm istall, dependency:resolve
  • compile: compile source code, not available for some script languages
  • build: cargo: tk build -- --release, maven: mvn -DskipTests clean package, npm: npm run build
  • start: start project go run main.go
  • test: run test npm: npm test, maven: mvn test, cargo: cargo test
  • doc: generate documentation mvn javadoc:javadoc
  • deps: list all dependencies
  • clean: clean build artifacts, maven: mvn clean, cargo: cargo clean
  • outdated: display outdated dependencies go list -u -m all
  • update: update outdated dependencies go get -u
  • add dependency: tk add dependency or tk -D add dependency or tk --runner=npm add dependency

Attention: if package manager's task name is in a task runner, and task keeper will not execute package manager's command.

Apache Maven



Please set up gradle-versions-plugin for dependency version management. You can transparently add the plugin to every Gradle project that you run via a Gradle init script. $HOME/.gradle/init.d/plugins.gradle with following code:

initscript {
  repositories {

  dependencies {
    classpath 'com.github.ben-manes:gradle-versions-plugin:+'

allprojects {
  apply plugin: com.github.benmanes.gradle.versions.VersionsPlugin

  tasks.named("dependencyUpdates").configure {
    // configure the task, for example wrt. resolution strategies


Please add sbt-updates and DependencyTreePlugin as global plugins. $HOME/.sbt/1.0/plugins/plugins.sbt with following code:

addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.6.3")



  • If npm-check command available, npm-check -u will be used as outdated task.
  • yarn, pnpm, bun support







Go Module



Only support cmake-conan, and conanfile.txt required.

Default build directory is cmake-build-debug, and you override it by CMAKE_BINARY_DIR=_build tk build.


Available. Please install swift-outdated for outdated operation.




Available with following tools:

  • Rye: please commit requirements.lock to git
  • Poetry
  • pipenv
  • requirements.txt



Please set up antq for outdated dependencies. $HOME/.lein/profiles.clj

 {:dependencies [[com.github.liquidz/antq "RELEASE"]]
  :aliases {"outdated" ["run" "-m" "antq.core"]}

Mix package manager


Rebar3 package manager


Dart package manager


Tasks from README.md

Task keeper will parse README.md and extract tasks with following code block format:

```shell {#task_name}
curl https://httpbin.org/ip

Now only shell, sh, javascript and typescript are supported.

Run JavaScript/TypeScript by node or deno:

```javascript {#task_name .deno}
console.log("hello world");

Task options/params and global options

  • Task options: tk hello --name linux_china
  • Task params: tk hello - Jackie, use - to separate task params
  • Global options for command: tk hello --name Jack -- --verbose, use -- double dash to separate global options


Task Runners

Package Managers

Version detection

Task Keeper will detect version configuration file and adjust the environment variables to run tasks.


.java-version is used for version management, and values as following:

Task Keeper will try to find Java from $HOME/.jbang/cache/jdks or $HOME/.sdkman/candidates/java/.

.sdkmanrc support, and set HOME and PATH environment variables automatically. Please refer https://sdkman.io/usage#env for detail.


.node-version is used for Node.js version management, and values as following:

  • 18: match major version of Node.js
  • 16.16.0: match version of Node.js

Task Keeper will try to find Node from $HOME/.nvm/versions/node or $HOME/.volta/tools/image/node.


Task scripts in Markdown

$ curl https://httpbin.org/get
$ curl -X POST https://httpbin.org/post
curl --silent https://httpbin.org/ip | jq '.origin'
curl https://httpbin.org/ip \
    --user-agent "Task Keeper/0.1.0" \
curl https://httpbin.org/headers
let name: string = "linux_china";


~398K SLoC