A shell-based kanban task manager with NDJSON storage and high-performance search
Project description
Juno Kanban - Dead Simple Shell Task Manager
A minimal, fast, and shell-friendly kanban task manager built for developers and LLM workflows. Store tasks in NDJSON format with high-performance search capabilities.
Quick Start
# Install in development mode
pip install -e .
# Create your first task
juno-kanban create "Implement user authentication" --tags backend security
# List recent tasks
juno-kanban list --limit 5
# Search and filter
juno-kanban search --status todo --tags backend
# Mark task progress with response
juno-kanban mark in_progress -ID ABC123 --response "Started OAuth integration"
# Complete with commit hash
juno-kanban mark done -ID ABC123 --response "Auth completed" --commit abc123def
Installation
PyPI (Recommended)
pip install juno-kanban
After installation, all three commands are available:
juno-kanban- Main command namejuno-feedback- Alias (same functionality)kanban-juno- Alternative naming
Development Mode
git clone https://github.com/askbudi/feedback-shell.git
cd feedback-shell
pip install -e .
Requirements
- Python 3.7+
- No external dependencies (uses Python stdlib only)
- Optional:
ripgrepfor 10-50x faster search performance
Core Features
🗂️ NDJSON Storage
- Human-readable JSON format (one task per line)
- Supports code snippets, HTML, and special characters
- Easily parseable by shell tools and scripts
🔍 High-Performance Search
- Ripgrep integration for blazing-fast search across large files
- Multiple filter conditions (status, tags, commit hash, open tasks)
- Automatic fallback to Python for portability
🏷️ Flexible Organization
- Configurable status workflows (backlog → todo → done)
- Feature tags for categorization
- Commit hash linking for git integration
🤖 LLM & Shell Optimized
- jq-compatible output for automation
- Educational error messages with examples
- Context-aware help text
- Clean, parseable formats
Usage Guide
Creating Tasks
# Basic task creation
juno-kanban create "Fix authentication bug"
# With tags and status
juno-kanban create "Add user profile page" --status todo --tags frontend ui
# Using --body flag (both formats work)
juno-kanban create --body "Implement OAuth" --tags security backend
Searching & Listing
# List recent tasks (sorted by last modified)
juno-kanban list --limit 10
# Search by status
juno-kanban search --status in_progress
# Search by tags
juno-kanban search --tags backend --tags security
# Search open tasks (no agent response)
juno-kanban search --open
# Search recent tasks
juno-kanban search --recent --limit 5
# Multiple conditions (AND logic)
juno-kanban search --status todo --tags backend --limit 3
Updating Tasks
# Update status
juno-kanban update ABC123 --status in_progress
# Add agent response
juno-kanban update ABC123 --response "Working on OAuth flow"
# Set commit hash
juno-kanban update ABC123 --commit abc123def
# Update tags
juno-kanban update ABC123 --tags urgent backend security
Mark Command (Streamlined Workflow)
# Mark with required response
juno-kanban mark todo -ID ABC123 --response "Ready to start"
# Mark as done with commit (recommended)
juno-kanban mark done -ID ABC123 --response "Feature completed" --commit abc123
# Mark without commit (shows helpful reminder)
juno-kanban mark done -ID ABC123 --response "Bug fixed"
# Output: Consider adding commit hash with --commit flag
Other Operations
# Get specific task
juno-kanban get ABC123
# Archive task (preserves data, sets status to archive)
juno-kanban archive ABC123
# Show help
juno-kanban --help
juno-kanban COMMAND --help
Output Formats
NDJSON (Default)
juno-kanban search --status todo
{"id": "ABC123", "status": "todo", "body": "Fix bug", "tags": ["backend"]}
{"id": "DEF456", "status": "todo", "body": "Add feature", "tags": ["frontend"]}
JSON (Structured)
juno-kanban --format json search --status todo
[
{"id": "ABC123", "status": "todo", "body": "Fix bug", "tags": ["backend"]},
{"id": "DEF456", "status": "todo", "body": "Add feature", "tags": ["frontend"]}
]
XML
juno-kanban --format xml search --status todo
Table (Human-readable)
juno-kanban --format table search --status todo
Shell Integration
jq Compatibility
Perfect integration with jq for data processing:
# Extract task IDs
juno-kanban list | jq -r '.id'
# Filter by specific criteria
juno-kanban list | jq 'select(.status == "todo")'
# Count tasks by status
juno-kanban list | jq -r '.status' | sort | uniq -c
# Get tasks with specific tags
juno-kanban list | jq 'select(.feature_tags[]? == "backend")'
# Clean data output (suppress summary)
juno-kanban list 2>/dev/null | jq '.'
Automation Examples
# Daily standup - get your current work
juno-kanban search --status in_progress | jq -r '.body'
# Review completed work with commits
juno-kanban search --status done | jq -r '"✅ \(.body) (\(.commit_hash // "no commit"))"'
# Find urgent tasks
juno-kanban search --tags urgent | jq -r '"⚠️ \(.body)"'
# Git hook integration
git log -1 --format="%H" | xargs -I {} juno-kanban search --commit {}
Configuration
Configuration file: .juno_task/tasks/config.json
Status Workflow
{
"status_values": ["backlog", "todo", "in_progress", "review", "done", "archive"],
"default_status": "backlog",
"enforce_transitions": true,
"allowed_transitions": {
"backlog": ["todo", "archive"],
"todo": ["in_progress", "archive"],
"in_progress": ["review", "done", "archive"],
"review": ["todo", "done", "archive"],
"done": ["archive"],
"archive": []
}
}
Tag Validation
{
"tag_pattern": "^[a-zA-Z0-9_-]+$",
"max_tags_per_task": 10,
"allowed_tags": ["frontend", "backend", "security", "urgent", "bug", "feature"]
}
Search Settings
{
"storage_file_pattern": "*.ndjson",
"storage_base_path": ".juno_task/tasks",
"default_limit": 5,
"enable_ripgrep": true
}
Task Schema
Each task is stored as a JSON object with these fields:
| Field | Type | Description |
|---|---|---|
id |
string | 6-character alphanumeric ID (e.g., "A1b2C3") |
status |
string | Current status (configurable workflow) |
body |
string | Task description (supports multiline, code, HTML) |
commit_hash |
string|null | Git commit hash when completed |
agent_response |
string | AI/human response or notes |
created_date |
string | Creation timestamp (YYYY-MM-DD HH:MM:SS) |
last_modified |
string | Last modification timestamp |
feature_tags |
string[] | Categorization tags |
Example Task
{
"id": "A1b2C3",
"status": "done",
"body": "Implement OAuth2 authentication flow\n\n```python\n@app.route('/auth')\ndef authenticate():\n return oauth.redirect()\n```",
"commit_hash": "abc123def456",
"agent_response": "Implemented OAuth2 with Google provider. Added tests and documentation.",
"created_date": "2025-10-22 14:30:00",
"last_modified": "2025-10-22 16:45:30",
"feature_tags": ["backend", "security", "oauth"]
}
Error Handling
Educational Error Messages
# Invalid tag format
juno-kanban create "Task" --tags "frontend v1"
Validation error: Invalid tag format: 'frontend v1'
Tags can only contain letters, numbers, underscores (_), and hyphens (-).
Found: spaces (not allowed)
Correct format examples:
--tags backend urgent fix-auth
--tags frontend_v1 initial feature
Did you mean: 'frontend_v1'?
Status Transition Validation
# Invalid status transition
juno-kanban update ABC123 --status done # (current: backlog)
Cannot transition from 'backlog' to 'done'.
Allowed transitions from 'backlog': todo, in_progress, archive
Use: juno-kanban update ABC123 --status todo
Performance
Benchmarks
| Operation | Small (100 tasks) | Large (10,000 tasks) | Notes |
|---|---|---|---|
| Create task | ~5ms | ~5ms | Constant time |
| Search by ID | ~10ms | ~15ms | With ripgrep |
| Search by status | ~20ms | ~50ms | With ripgrep |
| List recent | ~25ms | ~100ms | Sorted by timestamp |
Large File Handling
- Streaming: Memory-efficient reading of large files
- Ripgrep: 10-50x performance boost for search operations
- Split Files: Automatic discovery across multiple NDJSON files
- Indexing: Fast ID lookups even with thousands of tasks
Examples
Development Workflow
# Morning planning
juno-kanban create "Review pull requests" --tags review daily
juno-kanban create "Fix authentication bug" --tags backend urgent --status todo
# Start working
juno-kanban mark in_progress -ID ABC123 --response "Investigating auth issue"
# During development
juno-kanban update ABC123 --response "Found root cause in JWT validation"
# Complete work
juno-kanban mark done -ID ABC123 --response "Fixed JWT expiry handling" --commit abc123
# End of day review
juno-kanban search --status done | jq -r '"✅ \(.body)"'
Team Coordination
# See what teammates are working on
juno-kanban search --status in_progress | jq -r '"👤 \(.body) - \(.agent_response)"'
# Find tasks needing review
juno-kanban search --status review --tags urgent
# Weekly retrospective
juno-kanban search --status done | jq 'group_by(.commit_hash) | length'
Git Integration
# Link completed tasks to commits
git log --oneline | head -5 | while read commit message; do
echo "🔗 $commit: $(juno-kanban search --commit $commit | jq -r '.body // "No task linked"')"
done
# Pre-commit hook: ensure task exists
if ! juno-kanban search --status in_progress | grep -q "$(git log -1 --format='%s')"; then
echo "⚠️ No in-progress task found for this commit"
fi
Troubleshooting
Common Issues
Command not found after installation:
# Ensure pip installed to correct environment
which pip
pip show juno-kanban
# Try reinstalling
pip install -e . --force-reinstall
Slow search performance:
# Install ripgrep for better performance
brew install ripgrep # macOS
apt install ripgrep # Ubuntu/Debian
jq parsing errors:
# Ensure you're using recent version (v1.3.0+)
juno-kanban --version
# Use stderr redirection if needed
juno-kanban list 2>/dev/null | jq '.'
Configuration issues:
# Check config file location
ls -la .juno_task/tasks/config.json
# Validate JSON syntax
cat .juno_task/tasks/config.json | jq '.'
Getting Help
- CLI Help:
juno-kanban --helporjuno-kanban COMMAND --help - Issues: GitHub Issues
- Examples: See
.juno_task/specs/directory for detailed examples
Contributing
This project is developed using AI-powered workflows with juno-task. To contribute:
- Check
.juno_task/USER_FEEDBACK.mdfor current issues - Use
juno-task feedbackto report bugs or suggestions - Review
.juno_task/plan.mdfor development priorities
License
MIT License - see LICENSE file for details.
Changelog
v1.3.0 (2025-10-23)
- 🔧 Fixed jq compatibility by redirecting summary to stderr
- 📝 Compacted documentation for better token efficiency
- ✅ All automation workflows now function correctly
v1.2.0 (2025-10-22)
- 📦 Added pip installation with dual entry points
- 🔧 Fixed empty search results messaging
- 📚 Consistent help across command names
v1.1.0 (2025-10-22)
- 🗃️ Replaced delete with archive (data preservation)
- ⚡ Added mark command for streamlined workflow
- 📅 Simplified datetime format
v1.0.1 (2025-10-22)
- ➕ Added missing CRUD operations
- 📖 Improved help text and documentation
- 🏷️ Enhanced tag validation with educational errors
v1.0.0 (2025-10-22)
- 🎉 Initial release with full kanban functionality
- 🔍 High-performance search with ripgrep
- 🏷️ Flexible tagging and status workflows
Built with ❤️ for developers who live in the terminal
Project details
Release history Release notifications | RSS feed
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 juno_kanban-1.21.0.tar.gz.
File metadata
- Download URL: juno_kanban-1.21.0.tar.gz
- Upload date:
- Size: 36.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.8.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2da5bedb8d3a4f1024c9aca9f81074e7ef217a5b1befb21a05b96fae40434959
|
|
| MD5 |
61096d0e61a7f27893e957f6bf3b3164
|
|
| BLAKE2b-256 |
bd3b95e06a0e8ed128ca4be031a12fef52fcfca225d0535799be890c204fa956
|
File details
Details for the file juno_kanban-1.21.0-py3-none-any.whl.
File metadata
- Download URL: juno_kanban-1.21.0-py3-none-any.whl
- Upload date:
- Size: 42.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.8.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f5d6bd50bc9869c81b1cfb7758c56e6401fd9e4e13c123e1bbd577662de4e05
|
|
| MD5 |
ec422fd5462482d1abe34885180f071d
|
|
| BLAKE2b-256 |
678a87d3a4429499d10bf587cdb14e6c069616e8a0e59d631a19475e883cd741
|