Locus is a Git-aware, local-first task management CLI, designed to streamline your development workflow, especially when working with AI coding assistants.
Born from extensive collaboration with AI coding assistants, Locus solves a fundamental problem: to get high-quality work from an agent, you need well-structured Markdown briefs for every task. And when running multiple agents in parallel, you need a fast, local way to manage those files. While GitHub Issues is conceptually close, it lives in the cloud and is awkward to drive from a CLI that an agent can call.
Locus is the solution: a Git-native, local-first CLI task manager where each task lives in its own Markdown file that an AI assistant can read and write. Think of it as a simple, local version of GitHub Issues that helps you break down complex work into small, manageable pieces, enabling agents to work more autonomously and produce higher-quality results for tasks like large-scale refactoring or test generation.
Of course, it's also a great tool for managing your own daily tasks without cluttering up your official project boards.
AI-Assisted Development Workflow
Locus is useful for AI-assisted development workflows. By breaking down complex work into a series of well-defined tasks, you can more effectively guide an AI to perform large-scale or repetitive work.
Here's a common workflow for generating test files using Locus and an AI assistant:
First, create a generic template for the task. This template can include placeholders like $FILE_NAME.
test_template.md:
# Create tests for $FILE_NAME
- [ ] Read `docs/testing.md` to understand our testing strategy.
- [ ] Scan the entire repository to grasp the project's context.
- [ ] Read the code in `$FILE_NAME` to understand its responsibilities and goals.
- [ ] Based on the above, create a new test file for `$FILE_NAME`.
- [ ] For each function in the file, write test cases for both happy paths and edge cases.
- [ ] Review and improve the tests you've written from the perspective of `docs/testing.md`.
- [ ] Finally, use the `gh` command to create a Pull Request.Next, use a simple shell script to generate a task for every file you want to target.
# Generate a task for every .ts file in the `src` directory
for FILE in src/**/*.ts; do
# Replace the placeholder in the template with the actual filename
TASK_BODY=$(sed "s/\\$FILE_NAME/$FILE/g" test_template.md)
# Create the task using `locus add` with --body option
locus add "Create tests for $FILE" --tags test,autogen --body "$TASK_BODY"
doneNow you have a list of clearly defined tasks. You can pass them one by one to your AI agent of choice.
# Get the content of a specific task and pipe it to your agent
locus read "Create-tests-for-src-services-user-service.ts" | your-ai-agentThis method provides the AI agent with a narrow, well-defined scope for each run, which can help improve the consistency and reliability of its output.
- Git-aware organization: Tasks are automatically organized by Git repository (
~/locus/<username>/<repo>/) - Markdown-based: Tasks are stored as Markdown files with YAML frontmatter
- Flexible properties: Support for tags, status, priority, and unlimited custom properties
- Smart file naming: Automatic file naming with date, slug, and hash
- Task property management: Get/set any property without editing files
- fzf-friendly output: Default oneline format optimized for command-line filtering
- JSON output: Machine-readable output for scripting and automation
- Internationalization: Full support for English and Japanese interfaces
- Cross-platform: Works on macOS, Linux, and Windows
# Install from JSR
deno install -g -A -n locus jsr:@tesso/locus# Run without installation
npx @tesso/locus --version
# Install globally
npm install -g @tesso/locus# 1. Add your first task
locus add "Fix authentication bug" --tags bug,urgent --priority high
# 2. List your tasks
locus list
# 3. View a task
locus read "Fix authentication bug"
# 4. Update task status
locus tags set "Fix authentication bug" status done
# 5. Find tasks interactively with fzf
locus list | fzf --preview='locus read {7} --raw'Commands:
add <title> - Add a new task
edit <fileName> - Edit task content
list - List tasks (default: oneline format)
tags - Manage task file properties
set <fileName> - Set task properties (flexible key=value syntax)
get <fileName> - Get task properties
config - Manage configuration
read <fileName> - Display task content (supports full paths)
path <fileName> - Show absolute path of task file
help - Show help
Command Examples
# Basic usage
locus add "Fix authentication bug"
# With body content using command substitution
TASK_BODY="Need to fix the JWT token validation"
locus add "Fix authentication bug" --body "$TASK_BODY"
# With body content directly
locus add "Fix bug" --body "Details about the bug fix"
# With tags and properties
locus add "Implement dark mode" --tags ui,feature --priority high --status in-progress
# With custom properties using key=value syntax
locus add "Database migration" --tags backend assignee=alice estimate=3h
# Create task without Git context
locus add "Personal task" --no-git
# Output task info as JSON
locus add "New feature" --json# Edit existing task (appends by default)
locus edit "fix-auth-bug" --body "Additional notes about the fix"
# Create new task if it doesn't exist
locus edit "new-task" --body "Task description"
# Overwrite entire task content
locus edit "update-readme" --body "New content" --overwrite
# Edit from stdin
echo "Task updates from script" | locus edit "automated-task" --body -
# Edit without Git context
locus edit "personal-note" --body "Update" --no-git
# Output result as JSON
locus edit "task" --body "content" --json# List all tasks in current repository (default: oneline format)
locus list
# Output format: [repository] [status] [priority] [title] [tags] [created] [path]
# Example: myproject/api todo high Fix auth bug bug,security 2024-01-15 /home/user/locus/myproject/api/fix-auth-bug.md
# Use table format (previous default)
locus list --table
# Filter by status
locus list --status todo
locus list --status in-progress
locus list --status done
# Filter by priority
locus list --priority high
locus list --priority normal
locus list --priority low
# Filter by tags
locus list --tags bug,critical
# Sort tasks
locus list --sort created # Sort by creation date (default)
locus list --sort status # Sort by status
locus list --sort priority # Sort by priority
locus list --sort title # Sort by title
# Group by repository
locus list --group-by-repo
# Show detailed view
locus list --detail
# List all tasks across repositories
locus list --all
# Output as JSON
locus list --jsonThe default oneline format is optimized for use with command-line filtering tools like fzf:
# Interactive task selection with preview
locus list | fzf --delimiter=$'\t' \
--with-nth=1,2,3,4 \
--preview='locus read {7} --raw' \
--bind='enter:execute(${EDITOR:-vim} {7})'
# Filter todo tasks and open selected file
locus list --status todo | fzf | cut -f7 | xargs -I{} ${EDITOR:-vim} {}
# Quick navigation to task directory
cd $(locus list | fzf | cut -f7 | xargs dirname)
# Search tasks by content and open
locus list | fzf --preview='locus read {7} --raw | head -20' | cut -f7 | xargs open
# Copy task path to clipboard (macOS)
locus list | fzf | cut -f7 | pbcopy
# Copy task path to clipboard (Linux)
locus list | fzf | cut -f7 | xclip -selection clipboard# List all task files
locus tags list
# Show properties of a specific file
locus tags list "fix-auth-bug"
# Get a specific property
locus tags get "fix-auth-bug" status
# Set/update a property
locus tags set "fix-auth-bug" status done
locus tags set "fix-auth-bug" priority high
# Remove a property
locus tags rm "fix-auth-bug" assignee
# Clear all properties
locus tags clear "fix-auth-bug"# Set properties using key=value syntax
locus set "fix-auth-bug" status=done priority=high
locus set "feature-task" assignee=bob estimate=5h
# Set multiple properties at once
locus set "complex-task" status=in-progress assignee=alice reviewer=bob due=tomorrow
# Smart value parsing
locus set "data-task" count=42 active=true tags=backend,urgent
# Date patterns
locus set "deadline-task" due=today start=tomorrow end=+7d
# Get a specific property
locus get "fix-auth-bug" status
# Output: done
# Get all properties
locus get "fix-auth-bug"
# Output:
# date: 2024-01-15
# created: 2024-01-15T10:00:00Z
# status: done
# priority: high
# JSON output for scripting
locus get "task" --json
locus get "task" status --json# Read a task file (automatic pager for long content)
locus read "fix-auth-bug"
# Read with raw markdown (including frontmatter)
locus read "implement-dark-mode" --raw
# Read without pager
locus read "update-readme" --pager never
# Use specific pager
locus read "long-task" --pager less
# Disable colored output
locus read "task" --no-color
# Output as JSON for scripting
locus read "add-tests" --json
# Read by absolute path
locus read /path/to/task.md# Get the absolute path of a task
locus path "fix-auth-bug"
# Search for task across all repositories
locus path "implement-feature" --all
# Search by partial filename or title
locus path "auth" # Finds files matching "auth" in name or title
# Output as JSON with additional metadata
locus path "task-name" --json
# Work without Git context
locus path "task" --no-git
# Use in scripts or with other commands
cat $(locus path "my-task")
editor $(locus path "todo-task")# Show current configuration
locus config show
locus config show --json # JSON output
# Show configuration file path
locus config path
# Initialize configuration file
locus config init
locus config init --force # Overwrite existing configLocus supports both English and Japanese interfaces. The language can be configured in multiple ways:
# Set language via environment variable (highest priority)
locus add "New task"
# Set language in configuration file
locus config init
# Edit ~/.config/locus/settings.yml and set language.default to "en" or "ja"
# The language detection order is:
# 1. LOCUS_LANG environment variable
# 2. Configuration file setting
# 3. System LANG environment variable
# 4. Default to English ("en")Most commands support JSON output with the --json flag for scripting and automation:
locus add "task" --json
locus list --json
locus read "task" --json
locus path "task" --json
locus config show --jsonConfiguration is stored in ~/.config/locus/settings.yml (follows XDG Base Directory specification).
For detailed configuration documentation, see:
- Configuration Guide - Complete configuration reference
- 設定ガイド - 日本語版設定ガイド
# Task storage directory
task_directory: "~/locus"
# Language settings
language:
default: "en" # Available: "en" (English) or "ja" (Japanese)
# Git integration settings
git:
extract_username: true
username_from_remote: true
# File naming configuration
file_naming:
pattern: "{slug}.md"
date_format: "YYYY-MM-DD"
hash_length: 8
# Default values for new tasks
defaults:
status: "todo"
priority: "normal"
tags: []
custom: {}
# Add your custom default properties here
# Example: assignee: "unassigned"
# Example: category: "general"Tasks are stored as Markdown files with YAML frontmatter:
---
date: 2024-01-15
created: 2024-01-15T10:30:00Z
tags:
- feature
- backend
status: in-progress
priority: high
# Custom properties
assignee: alice
estimate: 8h
reviewer: bob
---
# Implement user authentication
Add JWT-based authentication to the API endpoints.
## Requirements
- [ ] Login endpoint
- [ ] Token refresh mechanism
- [ ] Logout functionality- Deno >= 2.0
# Clone the repository
git clone https://github.com/tesso57/locus.git
cd locus
# Run in development mode
deno task dev
# Run tests
deno task test
# Build binaries
deno task compiledeno task dev- Run in development modedeno task test- Run tests with coveragedeno task lint- Run linterdeno task fmt- Format codedeno task check- Run format check, lint, and testsdeno task compile- Build binaries for all platformsdeno task install-local- Install locally as 'locus' command
You can also run the CLI directly without using tasks:
# Run with deno
deno run src/cli.ts
# Run with npx (if Deno is installed via npm)
npx deno run src/cli.ts
# Run directly from JSR
deno run jsr:@tesso/locus
# Run with npx from JSR
npx @tesso/locus- Configuration Guide - Comprehensive guide to configuring Locus
- 日本語版 README - Japanese version of this README
- 設定ガイド - Configuration guide in Japanese
This project is licensed under the MIT License - see the LICENSE file for details.