A CLI for tracking local goals, tasks, and ideas. It is not Jira, and it is not shared with a team. Use it to break the work you need to do into smaller changes that are easy to track.
You work on one active goal. Everything else is Next (ready to start) or Later (not yet).
Two problems:
- Coming back to a project after time away.
goal statusshows what you were doing and any notes on it. - Ideas, bugs, and other work show up while you are in the middle of
something.
goal newwrites them down (they start in Later) so you can stay on the active goal.
Linux and macOS, x86_64 and aarch64. No Windows builds.
mise use -g github:Zooce/goalA specific release. Drop the leading v from the tag (1.0):
mise use -g github:Zooce/goal@1.0curl -fsSL https://raw.githubusercontent.com/Zooce/goal/master/install.sh | shThe script downloads the archive, checks it against SHA256SUMS, and
copies bin/goal to ~/.local/bin. A different directory:
curl -fsSL https://raw.githubusercontent.com/Zooce/goal/master/install.sh | GOAL_BIN="$HOME/bin" shA specific release:
curl -fsSL https://raw.githubusercontent.com/Zooce/goal/master/install.sh | GOAL_VERSION=v1.0 shIf ~/.local/bin is not on PATH:
export PATH="$HOME/.local/bin:$PATH"Then:
npx skills add Zooce/goal -gRequires Zig 0.17.
zig buildThe binary is zig-out/bin/goal. goal --version prints major.minor
(zon 1.0.0 prints goal 1.0).
goal setup # once on this machine
goal init # once in this project
goal new "fix the picker"
goal start 1
goal status
goal note "repro: empty list"
goal close --yesAdd .goal/ to .gitignore. It is a local store of short-lived tasks
and is not meant to be shared with the project.
On a terminal, goal new with no title opens your editor. The first line
is the title; the rest is the body.
goal list # active, next, and later
goal show 3 # full goal file and notes
goal start 3 # make 3 the active goal
goal stop # active -> next
goal stop --later # active -> later
goal later 3 # next -> later
goal next 3 # later -> next (or move next to the front)
goal edit 3 # open the goal in your editor
goal search fix # search goal text (needs ripgrep)
goal close --yes # active goal
goal close 3 --yes # that goal
goal close --old --yes # old Next and Later goalsThere is no parent/child tree. If a goal is too big, create new goals for the pieces and close the original.
Pass IDs and content on the command line. Do not pipe IDs or bodies on stdin.
id=$(goal new "title" -q)
goal start "$id"
title="$(goal show --title)"
goal new --file notes.md
goal edit 3 --file notes.md
goal close --yes
goal close "$id" --yesNon-TTY runs need --yes on confirm commands (close, deinit).
Commands that pick a goal need an explicit ID (no picker).
The goal skill documents the CLI and maps phrases such as "create a goal
for ..." to commands. When you ask "what's next?", the agent continues
the active goal, or asks which Next goal to start. If this project
is not initialized, the agent suggests goal init.
Install it with the Skills CLI:
npx skills add Zooce/goal
npx skills add Zooce/goal@goalgoal status --full prints the active goal body and notes.
Pushing a git tag v<major>.<minor> (zon 1.0.0 is tag v1.0)
publishes a GitHub Release with Linux and macOS tarballs (x86_64 and
aarch64) and SHA256 checksums. The Linux binaries are musl builds, so
one file runs on most Linux systems.
mise use github:Zooce/goal installs those tarballs:
goal-linux-x86_64.tar.gz, goal-linux-aarch64.tar.gz,
goal-macos-x86_64.tar.gz, and goal-macos-aarch64.tar.gz. Each
archive contains bin/goal.
How to cut a release is in CONTRIBUTING.md.
goal help
goal help startPer-command flags live there. Configuration: goal help config
(base-dir, editor, old-after; env GOAL_BASE_DIR, GOAL_EDITOR, GOAL_OLD_AFTER).