Skip to main content

Juno Ledger — Git-Native Task Management

Juno Ledger is the Git-native, shell-friendly task and workflow ledger for developers and LLM agents. It works alongside Juno Code, the AI coding-agent orchestration CLI, and Juno Benchmark, the longitudinal evaluation and immutable-evidence system for agent runs.

Canonical current state is one safe Markdown/YAML file per task; history is a separate append-only ledger and SQLite is disposable.

Version Python License Shell jq

Quick Start

# Install in development mode
pip install -e .

# Create your first task
juno-ledger create "Implement user authentication" --tags backend security

# Optional title + body composition
juno-ledger create --title "Auth" --body "Implement OAuth callback handling"

# List recent tasks
juno-ledger list --limit 5
juno-ledger list --status backlog,in_progress --sort asc   # preserve explicit status order

# Search and filter
juno-ledger search --status todo --tags backend
juno-ledger search --status todo --format json             # command-level --format is supported

# Aggregate tag usage (optionally by workflow status)
juno-ledger tags --status todo,in_progress --format table

# Mark task progress with response (ID can be positional or flag)
juno-ledger mark in_progress ABC123 --response "Started OAuth integration"

# Complete with commit hash
juno-ledger mark done --id ABC123 --response "Auth completed" --commit abc123def

# Declare dependencies between tasks
juno-ledger create "Deploy to staging" --blocked-by ABC123

# Find tasks ready to work on (all blockers resolved)
juno-ledger ready
juno-ledger ready --sort asc   # oldest ready tasks first by last_modified
# ready now includes list-like summary counters (Displayed/Total + status breakdown)

# Get safe execution order respecting dependencies
juno-ledger order --scores

Immutable cold archive packs

Boards can explicitly move up to 1,000 old terminal tasks at a time from hot Markdown/ledger files into bounded, immutable NDJSON packs. Default list, search, ready, and order remain hot-only; exact get ID and history ID transparently verify and read either tier. Existing archive ID still only changes status.

Archival is never automatic. With owner authorization, a clean Git worktree/index, and durable new report paths outside the repository:

juno-ledger archive-pack plan --status done,archive --older-than 90d --max-tasks 1000 \
  --target-bytes 26214400 --hard-max-bytes 47185920 \
  --report /external/receipts/archive-plan.json
# Independently review source HEAD, config/policy hashes, selected IDs/revisions, and batches.
juno-ledger archive-pack create --plan /external/receipts/archive-plan.json \
  --report /external/receipts/archive-create.json
juno-ledger archive-pack doctor
juno-ledger doctor
juno-ledger archive-search --tag backend --before 2026-01-01 --limit 20 --projection metadata

Plans are revision-bound and fail closed when Git/config/reservations/archive inventory or selected task history changes. Sealed packs/manifests must never be edited or appended. Archived IDs stay terminal and globally reserved; create a new hot task related to the archived ID for follow-up work. Production archival, push/deploy, and post-deploy E2E require separate authorization. Receipts contain hashes/IDs/instructions, not duplicated task bodies or responses.

Scale evidence is generated only through the installed public commands:

python3 scripts/benchmark_cold_archive.py --tasks 10000 --report evidence/cold-archive-10k.json
python3 scripts/benchmark_cold_archive.py --tasks 100000 --report evidence/cold-archive-100k.json
python3 scripts/verify_wheel_install.py

Opt-in cross-project registry

Cross-project access is disabled by default. Enable only the aliases that the current source project may reach in .juno_task/config.json:

{
  "kanbanRegistry": {
    "enabled": true,
    "allowedProjects": ["juno-code", "convert-if-chat"]
  }
}

Register initialized local projects in the single user registry (~/.juno-kanban/projects.json) and route any read or write explicitly:

juno-ledger project add juno-code --path /absolute/path/to/juno-code
juno-ledger project list
juno-ledger --project juno-code create --body "Issue discovered elsewhere" --tags bug
juno-ledger --project juno-code list --status todo
juno-ledger project remove juno-code

Environment policy has precedence over project config:

export JUNO_KANBAN_REGISTRY_ENABLED=true
export JUNO_KANBAN_REGISTRY_ALLOWED_PROJECTS=juno-code,convert-if-chat

Enabling without an allowlist grants access to nothing. Routing executes the destination project's .juno_task/scripts/kanban.sh, so its controller, .venv_juno, compatibility checks, stdin rules, and write guards remain authoritative. Missing, stale, malformed, disallowed, or recursive routes fail without falling back to the source board. This backing destination-wrapper boundary matters because selecting a foreign storage path with the caller runtime could bypass project-specific safety. Two-project subprocess tests verify the implementation preserves exact stdin and reaches only the selected target.

Installation

PyPI (Recommended)

pip install juno-ledger

The preferred command is juno-ledger; ledger-juno and jl are equivalent new spellings. Complete backward compatibility is preserved: juno-kanban, juno-feedback, and kanban-juno remain registered and route to the same CLI. The canonical PyPI distribution is juno-ledger, and the Python import remains kanban. Existing installations of the legacy juno-kanban distribution keep their registered commands; new releases are discovered under juno-ledger.

Development Mode

git clone https://github.com/askbudi/juno-ledger.git
cd juno-ledger
pip install -e .

Requirements

  • Python 3.8+
  • Runtime dependency ruamel.yaml>=0.18.6,<0.19 is installed automatically for safe round-trip YAML that preserves comments and ordering

Shell Completion (Tab Autocomplete)

juno-ledger ships a native completion script generator for every command alias:

# One-time test in current shell
source <(juno-ledger completion bash)

# Persist for bash
echo 'source <(juno-ledger completion bash)' >> ~/.bashrc

# Persist for zsh
echo 'source <(juno-ledger completion zsh)' >> ~/.zshrc

# Fish
juno-ledger completion fish > ~/.config/fish/completions/juno-ledger.fish

After reloading your shell, juno-ledger c<TAB><TAB> suggests commands like create/completion, and command-specific flags/choice values are also suggested (e.g. list --sort <TAB>).

Core Features

🗂️ Git-Native Storage

  • Stable .juno_task/tasks/<prefix>/<ID>.md files with safe round-trip YAML and hidden Markdown boundaries
  • Per-task locks/CAS receipts and segmented, hash-chained ledgers under .juno_task/ledger/
  • Different-task worktree changes merge independently; status updates never rename files

🔍 Disposable Cached Search

  • Rebuildable .juno_task/cache/kanban.sqlite3 index; canonical Markdown remains authoritative
  • Core/tag/body filters plus typed custom fields, date ranges, and --overdue
  • Bounded/redacted broad output with explicit metadata, summary, and audited full projections

🏷️ Flexible Organization

  • Configurable status workflows (backlog → todo → done)
  • Feature tags for categorization
  • tags command for per-tag workload counts (supports status filtering + machine-readable formats)
  • Commit hash linking for git integration

🔗 Task Dependencies

  • Declare blockers with --blocked-by or body markup ([blocked_by]ID[/blocked_by])
  • Declare non-blocking related references with [task_id]...[/task_id] or ## ID1 ID2 ##
  • Cycle detection prevents circular dependencies
  • ready command finds unblocked tasks for parallel execution
  • order command returns topological sort for safe scheduling
  • Priority scoring ranks tasks by how much downstream work they unblock
  • Every generic mutation to done is refused before any task/ledger write when a declared blocker is missing or non-terminal; reopening a resolved blocker is likewise refused when it would block a completed dependent
  • Umbrella child reconciliation is available only through umbrella-finalize. Its sealed umbrella-admission receipt must bind the umbrella revision and every child revision and state task_id, owner_id (the umbrella ID), and admitted: true per child. Admitted IDs must exactly equal blocked_by; related_tasks are never closed. A sealed evidence receipt bound to that umbrella ID and commit is required. Activation updates all task/ledger pairs in one recoverable transaction, and replay emits no additional events
juno-ledger umbrella-finalize UMB123 \
  --admission-receipt /external/admission.json \
  --evidence-receipt /external/evidence.json --commit abc123 \
  --receipt-file /external/finalization.json

🤖 LLM & Shell Optimized

  • jq-compatible output for automation
  • Educational error messages with examples
  • Context-aware help text
  • Flexible task ID input (TASK_ID positional or --id/--ID on key commands)
  • Agent-friendly create/deps parsing (--title, flag-only deps --id ... --blocked-by ..., trailing quoted body recovery)
  • Clean, parseable formats

Operational conversion, rollback, reconciliation, cache, safety, test, and benchmark contracts are documented in docs/git-native-storage.md.

Usage Guide

Creating Tasks

# Basic task creation
juno-ledger create "Fix authentication bug"

# With tags and status
juno-ledger create "Add user profile page" --status todo --tags frontend ui

# Using --body flag (both formats work)
juno-ledger create --body "Implement OAuth" --tags security backend

# Optional title merged into body as: title:{title}\n\n{body}
juno-ledger create --title "OAuth" --body "Implement provider callback validation"

# Read shell-sensitive markdown exactly from a UTF-8 file or stdin
juno-ledger create --body-file task.md --status todo --tags feature backend
cat task.md | juno-ledger create --body-file -

# Why file/stdin matters: shells expand unquoted backticks and $() before
# Juno Ledger can inspect argv. For quoted literals that survive parsing,
# create rejects inline backticks, $(), heredoc-like <<, and multiline bodies
# and asks you to use --body-file PATH or --body-file - instead.

# Trailing quoted body after list flags is supported
juno-ledger create --status todo --related-tasks ABC123 "Add integration tests for callback flow"

Searching & Listing

# List recent tasks (sorted by last modified)
juno-ledger list --limit 10

# Search by status
juno-ledger search --status in_progress

# Search by tags
juno-ledger search --tags backend --tags security

# Aggregate tag counts across all tasks
juno-ledger tags

# Aggregate tag counts only for active work
juno-ledger tags --status todo,in_progress --format json
juno-ledger tags --status todo in_progress --format table

# Search open tasks (no agent response)
juno-ledger search --open

# Search recent tasks
juno-ledger search --recent --limit 5

# Control search sort order by last_modified
juno-ledger search --status todo --sort asc --limit 5

# Multiple conditions (AND logic)
juno-ledger search --status todo --tags backend --limit 3

--sort asc|desc uses one shared contract across list, search, and ready:

  • asc = oldest last_modified first
  • desc = newest last_modified first
  • equal timestamps use task id as deterministic tie-breaker
  • default list behavior preserves open-before-closed status priority (backlog/todo/in_progress before done/archive)
  • when list or ready receives --status ..., task groups follow the provided status order, then --sort applies within each status group

Updating Tasks

# Update status (positional or --id both supported)
juno-ledger update ABC123 --status in_progress
juno-ledger update --id ABC123 --status in_progress

# Add agent response
juno-ledger update --id ABC123 --response "Working on OAuth flow"

# Replace body/response from files without shell quoting risks
juno-ledger update ABC123 --body-file task.md
juno-ledger update ABC123 --response-file response.md

# Set commit hash
juno-ledger update --id ABC123 --commit abc123def

# Update tags
juno-ledger update ABC123 --tags urgent backend security

Mark Command (Streamlined Workflow)

# Mark with required response
juno-ledger mark todo ABC123 --response "Ready to start"

# Mark as done with commit (recommended)
juno-ledger mark done --id ABC123 --response "Feature completed" --commit abc123

# Read response from a file or stdin, preserving code fences/backticks/$VARIABLES
juno-ledger mark done --id ABC123 --response-file response.md --commit abc123
cat response.md | juno-ledger mark done --id ABC123 --response-file -

# Mark without commit (shows helpful reminder)
juno-ledger mark done ABC123 --response "Bug fixed"
# Output: Consider adding commit hash with --commit flag

Dependency Management

# Create a task that's blocked by another
juno-ledger create "Deploy to prod" --blocked-by ABC123

# Or declare blockers via body markup (auto-parsed)
juno-ledger create "Run integration tests [blocked_by]ABC123, DEF456[/blocked_by]"

# Add/remove dependencies after creation
juno-ledger deps add --id GHI789 --blocked-by ABC123 DEF456
juno-ledger deps remove --id GHI789 --blocked-by ABC123

# Shorthand add (action inferred when --blocked-by is present)
juno-ledger deps --id GHI789 --blocked-by ABC123 DEF456

# Query dependency info for a task
juno-ledger deps ABC123
juno-ledger deps --id ABC123
# Returns: blockers (met/unmet), dependents, priority score

# Find tasks ready to work on (all blockers resolved)
juno-ledger ready
juno-ledger ready --sort asc --limit 5                         # oldest ready tasks first
juno-ledger ready --status backlog,in_progress --sort desc     # backlog group first, then in_progress
juno-ledger ready --tag backend --sort desc                    # newest backend-ready tasks first

# Get safe execution order (topological sort)
juno-ledger order
juno-ledger order --scores  # includes priority scores

Body Markup for Dependencies

Dependencies and related tasks can be declared inline in the task body:

# Blockers (all synonyms are equivalent)
[blocked_by]ABC123[/blocked_by]
[block_by]ABC123[/block_by]
[block]ABC123[/block]
[parent_task]ABC123[/parent_task]

# Multiple blockers (comma or space separated)
[blocked_by]ABC123, DEF456[/blocked_by]

# Related tasks (non-blocking references)
[task_id]ABC123[/task_id]
## ABC123
##ABC123
## ABC123 DEF456 ##

# If a related ID is valid format but not found yet, it is kept as a
# forward reference and a warning is emitted.

Other Operations

# Get specific task(s) (includes dependency info)
juno-ledger get ABC123
juno-ledger get --id ABC123
juno-ledger get ABC123 --compact              # related task details are ID-only
juno-ledger get ABC123 DEF456 --format json   # ordered multi-ID lookup
juno-ledger show ABC123 DEF456 --format json  # alias

# Archive task (preserves data, sets status to archive)
juno-ledger archive ABC123
juno-ledger archive --id ABC123

# Preview one sealed merge plan, review it, then apply that exact plan.
juno-ledger merge /path/to/source/.juno_task --into ./.juno_task \
  --dry-run --plan-file /tmp/kanban-merge-plan.json
juno-ledger merge /path/to/source/.juno_task --into ./.juno_task \
  --apply-plan /tmp/kanban-merge-plan.json \
  --receipt-file /tmp/kanban-merge-receipt.json

# Show help
juno-ledger --help
juno-ledger COMMAND --help

Output Formats

NDJSON (Default)

juno-ledger search --status todo
{"id": "ABC123", "status": "todo", "body": "Fix bug", "tags": ["backend"]}
{"id": "DEF456", "status": "todo", "body": "Add feature", "tags": ["frontend"]}

JSON (Structured)

juno-ledger search --status todo --format json
# global format placement is also supported
juno-ledger --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-ledger search --status todo --format xml

Table (Human-readable)

juno-ledger search --status todo --format table

# tags command renders markdown table output in table mode
juno-ledger tags --status todo,in_progress --format table

Shell Integration

jq Compatibility

Perfect integration with jq for data processing:

# Extract task IDs
juno-ledger list | jq -r '.id'

# Filter by specific criteria
juno-ledger list | jq 'select(.status == "todo")'

# Count tasks by status
juno-ledger list | jq -r '.status' | sort | uniq -c

# Get tasks with specific tags
juno-ledger list | jq 'select(.feature_tags[]? == "backend")'

# Clean data output (suppress summary)
juno-ledger list 2>/dev/null | jq '.'

Automation Examples

# Daily standup - get your current work
juno-ledger search --status in_progress | jq -r '.body'

# Review completed work with commits
juno-ledger search --status done | jq -r '"✅ \(.body) (\(.commit_hash // "no commit"))"'

# Find urgent tasks
juno-ledger search --tags urgent | jq -r '"⚠️  \(.body)"'

# Git hook integration
git log -1 --format="%H" | xargs -I {} juno-ledger 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": {"base_path": ".juno_task/tasks", "file_pattern": "*/*.md"},
  "custom_fields": {"due_date": {"type": "date"}},
  "search": {"default_limit": 5}
}

Task Schema

Each task is stored in safe YAML front matter plus marker-delimited Markdown body/response. CLI renderers expose 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
blocked_by string[]|null Task IDs that must complete before this task
related_tasks string[]|null Non-blocking task references

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"],
  "blocked_by": ["X4y5Z6"],
  "related_tasks": ["D7e8F9"]
}

Error Handling

Educational Error Messages

# Invalid tag format
juno-ledger 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-ledger update ABC123 --status done  # (current: backlog)
Cannot transition from 'backlog' to 'done'.
Allowed transitions from 'backlog': todo, in_progress, archive

Use: juno-ledger update ABC123 --status todo

Performance

Benchmarks

Operation Small (100 tasks) Large (10,000 tasks) Notes
Create task ~5ms ~5ms Constant time
Existing-ID get p95 <75ms Warm canonical path lookup
Cached list/search p95 <200/250ms 140k synthetic fixture
List recent ~25ms ~100ms Sorted by timestamp

Large File Handling

  • Streaming: Memory-efficient reading of large files
  • SQLite cache: indexed broad queries without becoming source of truth
  • Per-task files: bounded Git blobs and isolated merge boundaries
  • Indexing: Fast ID lookups even with thousands of tasks

Examples

Development Workflow

# Morning planning
juno-ledger create "Review pull requests" --tags review daily
juno-ledger create "Fix authentication bug" --tags backend urgent --status todo

# Start working
juno-ledger mark in_progress -ID ABC123 --response "Investigating auth issue"

# During development
juno-ledger update ABC123 --response "Found root cause in JWT validation"

# Complete work
juno-ledger mark done -ID ABC123 --response "Fixed JWT expiry handling" --commit abc123

# End of day review
juno-ledger search --status done | jq -r '"✅ \(.body)"'

Dependency-Aware Workflow

# Create a pipeline with dependencies
juno-ledger create "Write unit tests" --tags backend testing --status todo
# Returns ID: A1b2C3

juno-ledger create "Implement feature" --blocked-by A1b2C3 --tags backend
# Returns ID: D4e5F6

juno-ledger create "Deploy to staging" --blocked-by D4e5F6 --tags devops
# Returns ID: G7h8I9

# See what's ready to work on
juno-ledger ready --sort desc
# Only A1b2C3 shows — the others are blocked (newest ready tasks first)

# Get execution order with priority scores
juno-ledger order --scores
# A1b2C3 (score: 2) → D4e5F6 (score: 1) → G7h8I9 (score: 0)

# Complete first task, check what's unblocked
juno-ledger mark done -ID A1b2C3 --response "Tests written" --commit abc123
juno-ledger ready --sort asc
# Now D4e5F6 is ready (and asc sort keeps oldest ready tasks first)

Team Coordination

# See what teammates are working on
juno-ledger search --status in_progress | jq -r '"👤 \(.body) - \(.agent_response)"'

# Find tasks needing review
juno-ledger search --status review --tags urgent

# Weekly retrospective
juno-ledger 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-ledger search --commit $commit | jq -r '.body // "No task linked"')"
done

# Pre-commit hook: ensure task exists
if ! juno-ledger 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-ledger

# Try reinstalling
pip install -e . --force-reinstall

Slow search performance:

# Rebuild the disposable query cache at any time
juno-ledger cache rebuild

jq parsing errors:

# Ensure you're using recent version (v1.3.0+)
juno-ledger --version

# Use stderr redirection if needed
juno-ledger 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

Contributing

To contribute, open an issue or pull request in askbudi/juno-ledger, add tests for behavioral changes, and run python3 -m pytest -q before submission.

License

MIT License - see LICENSE file for details.

Changelog

v1.32.0 (2026-03-22)

  • Added tags command for tag-level workload aggregation (juno-ledger tags) with --status filtering and output formats (json, table, xml, ndjson)
  • Added explicit status-order contract for list and ready when --status is provided (e.g. --status backlog,in_progress preserves that group order)
  • Added ready --status ... filter support to match list/search filtering workflows
  • Added list/search parity summaries to ready (Displayed: X of Y + status breakdown; JSON summary object for --format json)
  • Added shared deterministic sort helpers so list, search, and ready all follow one --sort asc|desc contract with stable ID tie-breaks

v1.31.0 (2026-03-21)

  • Added search --sort asc|desc to control last_modified ordering in both ripgrep and Python fallback paths
  • Added command-level search --format ... support (in addition to global --format) and list-like result summaries for search output
  • Added multi-ID retrieval for get / show (juno-ledger get ID1 ID2 ...) with ordered JSON output
  • Added native shell completion generator (juno-ledger completion [bash|zsh|fish]) with parser-driven command/option completions

v1.30.0 (2026-03-20)

  • Added ## related-task markup parsing (##ID, ## ID, ## ID1 ID2 ##) alongside [task_id]...[/task_id]
  • Preserved forward related-task references for valid-but-not-yet-existing IDs (with warning instead of silent drop)
  • Hardened local development wrapper resolution so kanban.sh prefers working-tree src/ over stale site-packages
  • Hardened scripts/bump_version.py to use max(local, PyPI) as baseline and avoid accidental version rollback bumps

v1.29.0 (2026-03-04)

  • Added flexible task ID handling across key commands (get, update, archive, mark, deps)
    • Supports positional TASK_ID and flag form (--id / --ID)
  • Added deps shorthand mode:
    • deps --id TASK_ID --blocked-by ID... defaults to add
    • deps --id TASK_ID defaults to dependency info (show)
  • Improved create parser resilience for agent workflows:
    • trailing quoted body recovery after list flags like --related-tasks / --blocked-by
    • maintained strict validation for true no-body cases

v1.28.0 (2026-03-03)

  • Added create --title support (title:{title}\n\n{body} merge format)
  • Added support for title-only task creation

v1.27.0 (2026-03-03)

  • Added --id/--ID task selection support for get/show
  • Expanded integration test coverage for ID parsing and create flows

v1.26.0 (2026-02-19)

  • Added task dependency system with blocked_by field and body markup parsing
  • Added deps command for querying/managing task dependencies
  • Added ready command for finding unblocked tasks (parallel execution support)
  • Added order command for topological sort of open tasks
  • Added dependency graph engine with cycle detection, priority scoring, and critical path analysis
  • Added merge command for combining task databases across directories
  • Added related_tasks field for non-blocking task references
  • Enhanced get command with dependency info and related task details
  • 350+ tests (pytest), 9 Python modules

v1.25.0 (2026-02-18)

  • Migrated into the Juno monorepo
  • Added comprehensive pytest test suite (210 tests, 46% coverage)
  • Cleaned git bloat (removed dist/, .venv_juno/, stale files)
  • Updated repository references for the monorepo migration
  • Fixed Python version badge and requirements to 3.8+

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
  • 🔍 Indexed search through a disposable SQLite cache
  • 🏷️ Flexible tagging and status workflows

Built with ❤️ for developers who live in the terminal

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

juno_ledger-2.0.7.tar.gz (149.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

juno_ledger-2.0.7-py3-none-any.whl (144.8 kB view details)

Uploaded Python 3

File details

Details for the file juno_ledger-2.0.7.tar.gz.

File metadata

  • Download URL: juno_ledger-2.0.7.tar.gz
  • Upload date:
  • Size: 149.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.9

File hashes

Hashes for juno_ledger-2.0.7.tar.gz
Algorithm Hash digest
SHA256 b6d940f3515da50d0ffcf2be4aa7bb6ee632ba1b13da8ac195ca85865545f5ae
MD5 3dd8f62be2571f9b69fec541bf7bd24d
BLAKE2b-256 66c0b45cf24c2b936eaf92056a9469596ce41bdf6919de22b71eb84424775167

See more details on using hashes here.

File details

Details for the file juno_ledger-2.0.7-py3-none-any.whl.

File metadata

  • Download URL: juno_ledger-2.0.7-py3-none-any.whl
  • Upload date:
  • Size: 144.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.9

File hashes

Hashes for juno_ledger-2.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 1fdf32a241cbf0c3c156a68a5c8dcb0f42b8ea2a1263cbf9f1aebe1693e13df6
MD5 6c43a01083d312e2f184d815b5c2a49d
BLAKE2b-256 efc32b1b620fad6b136030e2c17b48502d969248d03c82c5311d53f1fb0c9473

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

2.0.7 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page