Skip to content

Releases: queelius/jot

v0.5.0: Journal Snapshot Command

16 Mar 08:00

Choose a tag to compare

New Features

jot stats — LLM-first journal snapshot data

Pre-computed journal snapshot data as JSON, designed for LLM consumption. Five sections, all optional:

jot stats                              # default: summary + overdue + blocked
jot stats --all                        # all five sections
jot stats --section=health             # specific section
jot stats --tags=myproject             # scoped to a tag
jot stats --type=task --status=open    # scoped by type/status

Sections:

Section Description
summary Aggregate counts by type, status, priority, tag count
overdue Active entries past their due date
blocked Entries with status=blocked, sorted by staleness
health Per-tag project health: open/done/blocked/overdue/stale counts
recent Entries modified in the last 7 days

Key design decisions:

  • Always outputs JSON (LLM-first — intelligence stays in the LLM layer)
  • Single filesystem walk regardless of how many sections are requested
  • Reuses existing store.Filter flags for scoping (--tags, --type, --status, --since, etc.)
  • --stale-days flag controls the staleness threshold for the health section (default: 30)

Other improvements

  • EntrySummary now includes blocked_by field (backward-compatible via omitempty)

v0.4.0: Tag Management Command

03 Mar 22:43

Choose a tag to compare

New Features

jot tag command — first-class tag management

Three subcommands for managing entry tags without editing YAML frontmatter:

jot tag add <slug> <tag1,tag2,...>   # Add tags (additive, deduplicates)
jot tag rm <slug> <tag1,tag2,...>    # Remove tags (silent if missing)
jot tag set <slug> <tag1,tag2,...>   # Replace all tags

Batch mode via --stdin — reads slugs from stdin for pipeline composability:

# Tag all open tasks with sprint-5
jot list --type=task --status=open --json | jq -r '.slug' | jot tag add --stdin sprint-5

# Remove a tag from all entries that have it
jot list --tags=old-name --json | jq -r '.slug' | jot tag rm --stdin old-name

Other improvements

  • parseTags() now deduplicates input tags
  • Updated CLAUDE.md with current architecture documentation

v0.3.0

03 Feb 02:01

Choose a tag to compare

What's Changed

Bug Fixes

  • Fix nil-pointer panic in newos.Stat error on temp file was silently ignored; dereference of nil FileInfo caused panic
  • Fix nil-pointer panic in showos.Stdout.Stat() error ignored; now defaults to terminal rendering when stat fails
  • Fix duplicate --force flag in rm — was a cobra-conflicting alias for --yes; removed
  • Defensive yaml.Marshal handling in entry.ToMarkdown — writes error comment instead of silently producing empty YAML

Enhancements

  • done works on any entry type — no longer restricted to tasks; ideas, notes, plans can all be marked done
  • search gains --status and --priority filters — combine with text search for targeted results
  • lint supports partial slug matching — uses ResolveSlug like other commands

Breaking Changes

  • --tag renamed to --tags in list and search commands for consistency

Code Quality

  • Fix variable shadowing in lint.go error loop
  • Fix gofmt formatting in config_test.go
  • Add tests for done-on-non-tasks, search filters, lint partial slugs

v0.2.0

31 Jan 18:27

Choose a tag to compare

Bug Fixes

  • Fix infinite loop in highlightMatch — empty search query caused strings.Index to match at position 0 indefinitely
  • Fix timezone mismatch in filterByDue — due dates parsed as UTC were incorrectly compared against local-timezone "today", causing off-by-one-day errors
  • Fix ParseDate silent failure — invalid date strings now return an error instead of zero time with nil error

Code Quality

  • Replace manual bubble sorts with sort.Slice in list and tasks commands
  • Extract shared truncateSlug/truncateTitle helpers to eliminate duplication
  • Remove unused mustGetStore function and dead imports
  • Replace manual status validation loop with entry.Contains()
  • Define named entryImporter interface to replace 3 identical inline declarations
  • Simplify path manipulation in slug.go with strings.TrimSuffix
  • Clean up parsePositiveInt to idiomatic (int, error) return signature

Tests

  • Add command-level unit tests and integration tests (1,300+ lines)
  • All 78 tests passing