Commands
mani
repositories manager and task runner
Options
--color enable color (default true)
-c, --config string specify config
-h, --help help for mani
-u, --user-config string specify user config
run
Run tasks
Synopsis
Run tasks.
The tasks are specified in a mani.yaml file along with the projects you can target.
run <task>
Examples
# Execute task for all projects
mani run <task> --all
# Execute a task in parallel with a maximum of 8 concurrent processes
mani run <task> --projects <project> --parallel --forks 8
# Execute task for a specific projects
mani run <task> --projects <project>
# Execute a task for projects with specific tags
mani run <task> --tags <tag>
# Execute a task for projects matching specific paths
mani run <task> --paths <path>
# Execute a task for all projects matching a tag expression
mani run <task> --tags-expr 'active || git' <tag>
# Execute a task with environment variables from shell
mani run <task> key=value
Options
-a, --all select all projects
-k, --cwd select current working directory
--describe display task information
--dry-run display the task without execution
-e, --edit edit task
-f, --forks uint32 maximum number of concurrent processes (default 4)
-h, --help help for run
--ignore-errors continue execution despite errors
--ignore-non-existing skip non-existing projects
--omit-empty-columns hide empty columns in table output
--omit-empty-rows hide empty rows in table output
-o, --output string set output format [stream|table|markdown|html]
--parallel execute tasks in parallel across projects
-d, --paths strings select projects by path
-p, --projects strings select projects by name
-s, --silent hide progress output during task execution
-J, --spec string set spec
-t, --tags strings select projects by tag
-E, --tags-expr string select projects by tags expression
-T, --target string select projects by target name
--theme string set theme
--tty replace current process
exec
Execute arbitrary commands
Synopsis
Execute arbitrary commands. Use single quotes around your command to prevent file globbing and environment variable expansion from occurring before the command is executed in each directory.
exec <command> [flags]
Examples
# List files in all projects
mani exec --all ls
# List git files with markdown suffix in all projects
mani exec --all 'git ls-files | grep -e ".md"'
Options
-a, --all target all projects
-k, --cwd use current working directory
--dry-run print commands without executing them
-f, --forks uint32 maximum number of concurrent processes (default 4)
-h, --help help for exec
--ignore-errors ignore errors
--ignore-non-existing ignore non-existing projects
--omit-empty-columns omit empty columns in table output
--omit-empty-rows omit empty rows in table output
-o, --output string set output format [stream|table|markdown|html]
--parallel run tasks in parallel across projects
-d, --paths strings select projects by path
-p, --projects strings select projects by name
-s, --silent hide progress when running tasks
-J, --spec string set spec
-t, --tags strings select projects by tag
-E, --tags-expr string select projects by tags expression
-T, --target string target projects by target name
--theme string set theme
--tty replace current process
init
Initialize a mani repository
Synopsis
Initialize a mani repository.
Creates a new mani repository by generating a mani.yaml configuration file and a .gitignore file in the current directory.
With --source <provider>/<name>, mani fetches repositories from a remote source and scaffolds mani.yaml from them. The query is persisted in a 'sources:' block so 'mani refresh' can pick up new repos later.
Supported providers:
- github/<name> auto-detect org or user (requires 'gh')
- github-org/<name> explicit organization (requires 'gh')
- github-user/<name> explicit user (requires 'gh')
- gitea/<name>, forgejo/<name>, codeberg/<name> auto-detect (all Gitea-compatible) (requires 'tea')
- gitea-org/<name>, forgejo-org/<name>, codeberg-org/<name> (requires 'tea')
- gitea-user/<name>, forgejo-user/<name>, codeberg-user/<name> (requires 'tea')
The provider's CLI must be installed and authenticated before use. The auto-detect form (github/, gitea/, …) probes the org endpoint first and falls back to the user endpoint; explicit -org/-user forms skip the probe and go directly to the right endpoint.
init [flags]
Examples
# Initialize with default settings (local auto-discovery)
mani init
# Initialize from a GitHub organization
mani init --source github/my-org
# Initialize from a Codeberg user
mani init --source codeberg/some-user
# Initialize from a GitHub org, placing all repos under a common path
mani init --source github/my-org --source-path my-org
# Initialize from a Gitea org, including archived repos and forks
mani init --source gitea/my-org --archived
# Initialize from a GitHub org with a smaller limit and no topic tags
mani init --source github/my-org --limit 50 --no-topic-tags
# Initialize without auto-discovering projects
mani init --auto-discovery=false
# Initialize without updating .gitignore
mani init --sync-gitignore=false
Options
--archived include archived repositories (default: exclude)
--auto-discovery automatically discover and add Git repositories to mani.yaml (default true)
--fork include forked repositories (default true)
-h, --help help for init
--limit int maximum number of repositories to fetch from the remote source (default 1000)
--no-tags omit synthesized tags from generated projects
--no-topic-tags omit topic=<name> tags
--source string remote source to scaffold projects from (e.g. github/my-org, gitea/foo, codeberg/joe)
--source-path string common path prefix under which the source's projects are placed
-g, --sync-gitignore synchronize .gitignore file (default true)
refresh
Update mani.yaml with new projects from remote sources and local clones
Synopsis
Update the 'projects:' mapping in mani.yaml from two places:
- Remote sources — re-query each entry in the 'sources:' block and append any new upstream repositories.
- Local clones — unless --auto-discovery=false, walk the config directory for git repositories that aren't listed yet and append them (the same discovery 'mani init' performs). This is how a repo you 'git clone' into the workspace by hand gets picked up.
By default, refresh only adds projects. Existing entries are left untouched — any local edits (renames, custom tags, env, etc.) are preserved. Projects whose upstream repository is gone are reported as stale; use --prune to also remove them. Pruning is scoped to each source's remote, so projects from a different remote (or discovered locally) are never removed.
The 'sources:' block is optional: a config from a plain 'mani init' has none, and refresh still picks up local clones. Sources do require the provider CLI to be installed and authenticated:
- github sources need 'gh'
- gitea/forgejo/codeberg sources need 'tea'
refresh [flags]
Examples
# Append new upstream repos and locally-cloned repos to projects:
mani refresh
# Show what would change without writing
mani refresh --dry-run
# Only re-query remote sources, skip local discovery
mani refresh --auto-discovery=false
# Also delete projects whose upstream repo is gone
mani refresh --prune
Options
--auto-discovery discover locally-cloned git repositories and add them to mani.yaml (default true)
--dry-run show what would change but do not modify mani.yaml
-h, --help help for refresh
--prune remove projects whose upstream repository no longer exists
sync
Clone repositories and update .gitignore
Synopsis
Clone repositories and update .gitignore file. For repositories requiring authentication, disable parallel cloning to enter credentials for each repository individually.
sync [flags]
Examples
# Clone repositories one at a time
mani sync
# Clone repositories in parallel
mani sync --parallel
# Disable updating .gitignore file
mani sync --sync-gitignore=false
# Sync project remotes. This will modify the projects .git state
mani sync --sync-remotes
# Clone repositories even if project sync field is set to false
mani sync --ignore-sync-state
# Display sync status
mani sync --status
Options
-f, --forks uint32 maximum number of concurrent processes (default 4)
-h, --help help for sync
--ignore-sync-state sync project even if the project's sync field is set to false
-p, --parallel clone projects in parallel
-d, --paths strings clone projects by path
-w, --remove-orphaned-worktrees remove git worktrees not in config
-s, --status display status only
-g, --sync-gitignore sync gitignore (default true)
-r, --sync-remotes update git remote state
-t, --tags strings clone projects by tags
-E, --tags-expr string clone projects by tag expression
edit
Open up mani config file
Synopsis
Open up mani config file in $EDITOR.
edit [flags]
Examples
# Edit current context
mani edit
Options
-h, --help help for edit
edit project
Edit mani project
Synopsis
Edit mani project in $EDITOR.
edit project [project] [flags]
Examples
# Edit projects
mani edit project
# Edit project <project>
mani edit project <project>
Options
-h, --help help for project
edit task
Edit mani task
Synopsis
Edit mani task in $EDITOR.
edit task [task] [flags]
Examples
# Edit tasks
mani edit task
# Edit task <task>
mani edit task <task>
Options
-h, --help help for task
project
Add or remove projects in mani.yaml
Synopsis
Add or remove projects in mani.yaml.
Edits are lossless: comments, blank lines, indentation, and any hand-customized fields outside the touched entry are preserved byte-for-byte. The edited file is validated as YAML before it is written, so a failed edit never corrupts the config.
Examples
# Add a remote project (cloned on next sync)
mani project add my-repo --url git@github.com:org/my-repo.git --tags backend
# Remove a project
mani project rm my-repo
Options
-h, --help help for project
project add
Add a project to mani.yaml
Synopsis
Add a project to mani.yaml.
A repository URL is required — either as the argument or via --url:
- A git URL (https://…, ssh://…, git@host:org/repo.git) is recorded as the project's url and the project name is derived from the repo (the final path segment, minus ".git"). Override the derived name with --name.
- A plain name needs --url to supply the repository.
The project is appended to the 'projects:' mapping and cloned on the next 'mani sync'. Comments and formatting elsewhere in mani.yaml are preserved.
project add <name|url> [flags]
Examples
# Add from a URL — name is derived (-> "mani")
mani project add https://github.com/alajmo/mani.git
# Add from a URL but choose the name
mani project add https://github.com/alajmo/mani.git --name kaka
# Add by name with an explicit url and tags
mani project add my-repo --url git@github.com:org/my-repo.git --tags backend
# Add a remote, cloned to a custom path with a description
mani project add my-lib --url git@github.com:org/my-lib.git --path ./libs/my-lib --desc "shared lib"
Options
--desc string project description
-h, --help help for add
--name string project name (defaults to the repo name derived from a URL argument)
--path string local directory path relative to mani.yaml (defaults to the project name)
--tags string comma-separated tags
--url string git repository URL (cloned on next sync)
project remove
Remove a project from mani.yaml
Synopsis
Remove a project from mani.yaml.
The project entry, together with the comment and blank lines directly above it, is removed; all other formatting is preserved. The project's files on disk are NOT deleted. You are prompted for confirmation unless --force is given.
project remove <name> [flags]
Examples
# Remove a project (prompts for confirmation)
mani project rm my-repo
# Remove without prompting
mani project rm my-repo --force
Options
-f, --force skip the confirmation prompt
-h, --help help for remove
list projects
List projects
Synopsis
List projects.
list projects [projects] [flags]
Examples
# List all projects
mani list projects
# List projects by name
mani list projects <project>
# List projects by tags
mani list projects --tags <tag>
# List projects by paths
mani list projects --paths <path>
# List projects matching a tag expression
mani run <task> --tags-expr '<tag-1> || <tag-2>'
Options
-a, --all select all projects (default true)
-k, --cwd select current working directory
--headers strings specify columns to display [project, path, relpath, description, url, tag, worktree] (default [project,tag,description])
-h, --help help for projects
-d, --paths strings select projects by paths
-t, --tags strings select projects by tags
-E, --tags-expr string select projects by tags expression
-T, --target string select projects by target name
--tree display output in tree format
Options inherited from parent commands
-o, --output string set output format [table|markdown|html] (default "table")
--theme string set theme (default "default")
list tags
List tags
Synopsis
List tags.
list tags [tags] [flags]
Examples
# List all tags
mani list tags
Options
--headers strings specify columns to display [project, tag] (default [tag,project])
-h, --help help for tags
Options inherited from parent commands
-o, --output string set output format [table|markdown|html] (default "table")
--theme string set theme (default "default")
list tasks
List tasks
Synopsis
List tasks.
list tasks [tasks] [flags]
Examples
# List all tasks
mani list tasks
# List tasks by name
mani list task <task>
Options
--headers strings specify columns to display [task, description, target, spec] (default [task,description])
-h, --help help for tasks
Options inherited from parent commands
-o, --output string set output format [table|markdown|html] (default "table")
--theme string set theme (default "default")
describe projects
Describe projects
Synopsis
Describe projects.
describe projects [projects] [flags]
Examples
# Describe all projects
mani describe projects
# Describe projects by name
mani describe projects <project>
# Describe projects by tags
mani describe projects --tags <tag>
# Describe projects by paths
mani describe projects --paths <path>
# Describe projects matching a tag expression
mani run <task> --tags-expr '<tag-1> || <tag-2>'
Options
-a, --all select all projects (default true)
-k, --cwd select current working directory
-e, --edit edit project
-h, --help help for projects
-d, --paths strings filter projects by paths
-t, --tags strings filter projects by tags
-E, --tags-expr string target projects by tags expression
-T, --target string target projects by target name
Options inherited from parent commands
--theme string set theme (default "default")
describe tasks
Describe tasks
Synopsis
Describe tasks.
describe tasks [tasks] [flags]
Examples
# Describe all tasks
mani describe tasks
# Describe task <task>
mani describe task <task>
Options
-e, --edit edit task
-h, --help help for tasks
Options inherited from parent commands
--theme string set theme (default "default")
tui
TUI
Synopsis
Run TUI
tui [flags]
Examples
# Open tui
mani tui
Options
-h, --help help for tui
-r, --reload-on-change reload mani on config change
--theme string set theme (default "default")
check
Validate config
Synopsis
Validate config.
check [flags]
Examples
# Validate config
mani check
Options
-h, --help help for check
gen
Generate man page
gen
Options
-d, --dir string directory to save manpage to (default "./")
-h, --help help for gen