YYLO Ledger — Git-Native Task Management
YYLO Ledger is a Git-native, shell-friendly task manager for developers and LLM workflows. Canonical current state is one safe Markdown/YAML file per task; history is a separate append-only ledger and SQLite is disposable.
Quick Start
# Install in development mode
pip install -e .
# Create your first task
yylo-ledger create "Implement user authentication" --tags backend security
# Optional title + body composition
yylo-ledger create --title "Auth" --body "Implement OAuth callback handling"
# List recent tasks
yylo-ledger list --limit 5
yylo-ledger list --status backlog,in_progress --sort asc # preserve explicit status order
# Search and filter
yylo-ledger search --status todo --tags backend
yylo-ledger search --status todo --format json # command-level --format is supported
# Aggregate tag usage (optionally by workflow status)
yylo-ledger tags --status todo,in_progress --format table
# Mark task progress with response (ID can be positional or flag)
yylo-ledger mark in_progress ABC123 --response "Started OAuth integration"
# Complete with commit hash
yylo-ledger mark done --id ABC123 --response "Auth completed" --commit abc123def
# Declare dependencies between tasks
yylo-ledger create "Deploy to staging" --blocked-by ABC123
# Find tasks ready to work on (all blockers resolved)
yylo-ledger ready
yylo-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
yylo-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:
yylo-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.
yylo-ledger archive-pack create --plan /external/receipts/archive-plan.json \
--report /external/receipts/archive-create.json
yylo-ledger archive-pack doctor
yylo-ledger doctor
yylo-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 (~/.yylo-ledger/projects.json) and route any read or write explicitly:
yylo-ledger project add juno-code --path /absolute/path/to/juno-code
yylo-ledger project list
yylo-ledger --project juno-code create --body "Issue discovered elsewhere" --tags bug
yylo-ledger --project juno-code list --status todo
yylo-ledger project remove juno-code
Environment policy has precedence over project config:
export YYLO_LEDGER_REGISTRY_ENABLED=true
export YYLO_LEDGER_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 yylo-ledger
The canonical distribution, command, and import are yylo-ledger, yylo-ledger,
and yylo_ledger. During the bounded 0.1 RC migration window, the six former
console scripts (juno-ledger, ledger-juno, jl, juno-kanban,
juno-feedback, and kanban-juno) emit a deprecation action and delegate to
the same runtime; the deprecated kanban import is a single-runtime bridge.
Development Mode
git clone https://github.com/yylo-dev/yylo-ledger.git
cd yylo-ledger
pip install -e .
Requirements
- Python 3.8+
- Runtime dependency
ruamel.yaml>=0.18.6,<0.19is installed automatically for safe round-trip YAML that preserves comments and ordering
Shell Completion (Tab Autocomplete)
yylo-ledger ships a native completion script generator for every command alias:
# One-time test in current shell
source <(yylo-ledger completion bash)
# Persist for bash
echo 'source <(yylo-ledger completion bash)' >> ~/.bashrc
# Persist for zsh
echo 'source <(yylo-ledger completion zsh)' >> ~/.zshrc
# Fish
yylo-ledger completion fish > ~/.config/fish/completions/yylo-ledger.fish
After reloading your shell, yylo-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>.mdfiles 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.sqlite3index; 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 auditedfullprojections
🏷️ Flexible Organization
- Configurable status workflows (backlog → todo → done)
- Feature tags for categorization
tagscommand for per-tag workload counts (supports status filtering + machine-readable formats)- Commit hash linking for git integration
🔗 Task Dependencies
- Declare blockers with
--blocked-byor 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
readycommand finds unblocked tasks for parallel executionordercommand returns topological sort for safe scheduling- Priority scoring ranks tasks by how much downstream work they unblock
- Every generic mutation to
doneis 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 sealedumbrella-admissionreceipt must bind the umbrella revision and every child revision and statetask_id,owner_id(the umbrella ID), andadmitted: trueper child. Admitted IDs must exactly equalblocked_by;related_tasksare 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
yylo-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_IDpositional or--id/--IDon key commands) - Agent-friendly create/deps parsing (
--title, flag-onlydeps --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
yylo-ledger create "Fix authentication bug"
# With tags and status
yylo-ledger create "Add user profile page" --status todo --tags frontend ui
# Using --body flag (both formats work)
yylo-ledger create --body "Implement OAuth" --tags security backend
# Optional title merged into body as: title:{title}\n\n{body}
yylo-ledger create --title "OAuth" --body "Implement provider callback validation"
# Read shell-sensitive markdown exactly from a UTF-8 file or stdin
yylo-ledger create --body-file task.md --status todo --tags feature backend
cat task.md | yylo-ledger create --body-file -
# Why file/stdin matters: shells expand unquoted backticks and $() before
# YYLO 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
yylo-ledger create --status todo --related-tasks ABC123 "Add integration tests for callback flow"
Searching & Listing
# List recent tasks (sorted by last modified)
yylo-ledger list --limit 10
# Search by status
yylo-ledger search --status in_progress
# Search by tags
yylo-ledger search --tags backend --tags security
# Aggregate tag counts across all tasks
yylo-ledger tags
# Aggregate tag counts only for active work
yylo-ledger tags --status todo,in_progress --format json
yylo-ledger tags --status todo in_progress --format table
# Search open tasks (no agent response)
yylo-ledger search --open
# Search recent tasks
yylo-ledger search --recent --limit 5
# Control search sort order by last_modified
yylo-ledger search --status todo --sort asc --limit 5
# Multiple conditions (AND logic)
yylo-ledger search --status todo --tags backend --limit 3
--sort asc|desc uses one shared contract across list, search, and ready:
asc= oldestlast_modifiedfirstdesc= newestlast_modifiedfirst- equal timestamps use task
idas deterministic tie-breaker - default
listbehavior preserves open-before-closed status priority (backlog/todo/in_progressbeforedone/archive) - when
listorreadyreceives--status ..., task groups follow the provided status order, then--sortapplies within each status group
Updating Tasks
# Update status (positional or --id both supported)
yylo-ledger update ABC123 --status in_progress
yylo-ledger update --id ABC123 --status in_progress
# Add agent response
yylo-ledger update --id ABC123 --response "Working on OAuth flow"
# Replace body/response from files without shell quoting risks
yylo-ledger update ABC123 --body-file task.md
yylo-ledger update ABC123 --response-file response.md
# Set commit hash
yylo-ledger update --id ABC123 --commit abc123def
# Update tags
yylo-ledger update ABC123 --tags urgent backend security
Mark Command (Streamlined Workflow)
# Mark with required response
yylo-ledger mark todo ABC123 --response "Ready to start"
# Mark as done with commit (recommended)
yylo-ledger mark done --id ABC123 --response "Feature completed" --commit abc123
# Read response from a file or stdin, preserving code fences/backticks/$VARIABLES
yylo-ledger mark done --id ABC123 --response-file response.md --commit abc123
cat response.md | yylo-ledger mark done --id ABC123 --response-file -
# Mark without commit (shows helpful reminder)
yylo-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
yylo-ledger create "Deploy to prod" --blocked-by ABC123
# Or declare blockers via body markup (auto-parsed)
yylo-ledger create "Run integration tests [blocked_by]ABC123, DEF456[/blocked_by]"
# Add/remove dependencies after creation
yylo-ledger deps add --id GHI789 --blocked-by ABC123 DEF456
yylo-ledger deps remove --id GHI789 --blocked-by ABC123
# Shorthand add (action inferred when --blocked-by is present)
yylo-ledger deps --id GHI789 --blocked-by ABC123 DEF456
# Query dependency info for a task
yylo-ledger deps ABC123
yylo-ledger deps --id ABC123
# Returns: blockers (met/unmet), dependents, priority score
# Find tasks ready to work on (all blockers resolved)
yylo-ledger ready
yylo-ledger ready --sort asc --limit 5 # oldest ready tasks first
yylo-ledger ready --status backlog,in_progress --sort desc # backlog group first, then in_progress
yylo-ledger ready --tag backend --sort desc # newest backend-ready tasks first
# Get safe execution order (topological sort)
yylo-ledger order
yylo-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)
yylo-ledger get ABC123
yylo-ledger get --id ABC123
yylo-ledger get ABC123 --compact # related task details are ID-only
yylo-ledger get ABC123 DEF456 --format json # ordered multi-ID lookup
yylo-ledger show ABC123 DEF456 --format json # alias
# Archive task (preserves data, sets status to archive)
yylo-ledger archive ABC123
yylo-ledger archive --id ABC123
# Preview one sealed merge plan, review it, then apply that exact plan.
yylo-ledger merge /path/to/source/.juno_task --into ./.juno_task \
--dry-run --plan-file /tmp/kanban-merge-plan.json
yylo-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
yylo-ledger --help
yylo-ledger COMMAND --help
Output Formats
NDJSON (Default)
yylo-ledger search --status todo
{"id": "ABC123", "status": "todo", "body": "Fix bug", "tags": ["backend"]}
{"id": "DEF456", "status": "todo", "body": "Add feature", "tags": ["frontend"]}
JSON (Structured)
yylo-ledger search --status todo --format json
# also supported: yylo-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
yylo-ledger search --status todo --format xml
Table (Human-readable)
yylo-ledger search --status todo --format table
# tags command renders markdown table output in table mode
yylo-ledger tags --status todo,in_progress --format table
Shell Integration
jq Compatibility
Perfect integration with jq for data processing:
# Extract task IDs
yylo-ledger list | jq -r '.id'
# Filter by specific criteria
yylo-ledger list | jq 'select(.status == "todo")'
# Count tasks by status
yylo-ledger list | jq -r '.status' | sort | uniq -c
# Get tasks with specific tags
yylo-ledger list | jq 'select(.feature_tags[]? == "backend")'
# Clean data output (suppress summary)
yylo-ledger list 2>/dev/null | jq '.'
Automation Examples
# Daily standup - get your current work
yylo-ledger search --status in_progress | jq -r '.body'
# Review completed work with commits
yylo-ledger search --status done | jq -r '"✅ \(.body) (\(.commit_hash // "no commit"))"'
# Find urgent tasks
yylo-ledger search --tags urgent | jq -r '"⚠️ \(.body)"'
# Git hook integration
git log -1 --format="%H" | xargs -I {} yylo-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
yylo-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
yylo-ledger update ABC123 --status done # (current: backlog)
Cannot transition from 'backlog' to 'done'.
Allowed transitions from 'backlog': todo, in_progress, archive
Use: yylo-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
yylo-ledger create "Review pull requests" --tags review daily
yylo-ledger create "Fix authentication bug" --tags backend urgent --status todo
# Start working
yylo-ledger mark in_progress -ID ABC123 --response "Investigating auth issue"
# During development
yylo-ledger update ABC123 --response "Found root cause in JWT validation"
# Complete work
yylo-ledger mark done -ID ABC123 --response "Fixed JWT expiry handling" --commit abc123
# End of day review
yylo-ledger search --status done | jq -r '"✅ \(.body)"'
Dependency-Aware Workflow
# Create a pipeline with dependencies
yylo-ledger create "Write unit tests" --tags backend testing --status todo
# Returns ID: A1b2C3
yylo-ledger create "Implement feature" --blocked-by A1b2C3 --tags backend
# Returns ID: D4e5F6
yylo-ledger create "Deploy to staging" --blocked-by D4e5F6 --tags devops
# Returns ID: G7h8I9
# See what's ready to work on
yylo-ledger ready --sort desc
# Only A1b2C3 shows — the others are blocked (newest ready tasks first)
# Get execution order with priority scores
yylo-ledger order --scores
# A1b2C3 (score: 2) → D4e5F6 (score: 1) → G7h8I9 (score: 0)
# Complete first task, check what's unblocked
yylo-ledger mark done -ID A1b2C3 --response "Tests written" --commit abc123
yylo-ledger ready --sort asc
# Now D4e5F6 is ready (and asc sort keeps oldest ready tasks first)
Team Coordination
# See what teammates are working on
yylo-ledger search --status in_progress | jq -r '"👤 \(.body) - \(.agent_response)"'
# Find tasks needing review
yylo-ledger search --status review --tags urgent
# Weekly retrospective
yylo-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: $(yylo-ledger search --commit $commit | jq -r '.body // "No task linked"')"
done
# Pre-commit hook: ensure task exists
if ! yylo-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 yylo-ledger
# Try reinstalling
pip install -e . --force-reinstall
Slow search performance:
# Rebuild the disposable query cache at any time
yylo-ledger cache rebuild
jq parsing errors:
# Ensure you're using recent version (v1.3.0+)
yylo-ledger --version
# Use stderr redirection if needed
yylo-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
- CLI Help:
yylo-ledger --helporyylo-ledger COMMAND --help - Issues: GitHub Issues
- Storage guide: See
docs/git-native-storage.md
Contributing
To contribute, open an issue or pull request in yylo-dev/yylo-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
tagscommand for tag-level workload aggregation (yylo-ledger tags) with--statusfiltering and output formats (json,table,xml,ndjson) - Added explicit status-order contract for
listandreadywhen--statusis provided (e.g.--status backlog,in_progresspreserves 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, andreadyall follow one--sort asc|desccontract with stable ID tie-breaks
v1.31.0 (2026-03-21)
- Added
search --sort asc|descto controllast_modifiedordering 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(yylo-ledger get ID1 ID2 ...) with ordered JSON output - Added native shell completion generator (
yylo-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.shprefers working-treesrc/over stale site-packages - Hardened
scripts/bump_version.pyto usemax(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_IDand flag form (--id/--ID)
- Supports positional
- Added
depsshorthand mode:deps --id TASK_ID --blocked-by ID...defaults toadddeps --id TASK_IDdefaults 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
- trailing quoted body recovery after list flags like
v1.28.0 (2026-03-03)
- Added
create --titlesupport (title:{title}\n\n{body}merge format) - Added support for title-only task creation
v1.27.0 (2026-03-03)
- Added
--id/--IDtask selection support forget/show - Expanded integration test coverage for ID parsing and create flows
v1.26.0 (2026-02-19)
- Added task dependency system with
blocked_byfield and body markup parsing - Added
depscommand for querying/managing task dependencies - Added
readycommand for finding unblocked tasks (parallel execution support) - Added
ordercommand for topological sort of open tasks - Added dependency graph engine with cycle detection, priority scoring, and critical path analysis
- Added
mergecommand for combining task databases across directories - Added
related_tasksfield for non-blocking task references - Enhanced
getcommand 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
Metadata
Release files for yylo-ledger 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| yylo_ledger-0.2.0.tar.gz | 151.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| yylo_ledger-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 298.6 kB
Release files / yylo_ledger-0.2.0.tar.gz
| Download URL | yylo_ledger-0.2.0.tar.gz |
|---|---|
| Size | 151.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
03b92425887a38b5985e24af0e479368b9a291b52dd3d36ef76315d08ea6db4a
|
|
BLAKE2b-256 checksum How to use checksums |
4da454b536072f9ac2337500e01523991f007c42425c020a2c72b1ac9eeabe0e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|
Release files / yylo_ledger-0.2.0-py3-none-any.whl
| Download URL | yylo_ledger-0.2.0-py3-none-any.whl |
|---|---|
| Size | 146.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c6eb19a6442704115e2e9ebcb60f4deb2c1b70c5744316648413b0ca64e3a648
|
|
BLAKE2b-256 checksum How to use checksums |
4f4a071f7e885884851c36ea196d38de1a01578a43c01030322cd46e73e66f2a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|