Releases: queelius/jot
Releases · queelius/jot
v0.5.0: Journal Snapshot Command
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/statusSections:
| 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.Filterflags for scoping (--tags,--type,--status,--since, etc.) --stale-daysflag controls the staleness threshold for the health section (default: 30)
Other improvements
EntrySummarynow includesblocked_byfield (backward-compatible via omitempty)
v0.4.0: Tag Management Command
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 tagsBatch 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-nameOther improvements
parseTags()now deduplicates input tags- Updated CLAUDE.md with current architecture documentation
v0.3.0
What's Changed
Bug Fixes
- Fix nil-pointer panic in
new—os.Staterror on temp file was silently ignored; dereference of nilFileInfocaused panic - Fix nil-pointer panic in
show—os.Stdout.Stat()error ignored; now defaults to terminal rendering when stat fails - Fix duplicate
--forceflag inrm— 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
doneworks on any entry type — no longer restricted to tasks; ideas, notes, plans can all be marked donesearchgains--statusand--priorityfilters — combine with text search for targeted resultslintsupports partial slug matching — usesResolveSluglike other commands
Breaking Changes
--tagrenamed to--tagsinlistandsearchcommands for consistency
Code Quality
- Fix variable shadowing in
lint.goerror loop - Fix
gofmtformatting inconfig_test.go - Add tests for done-on-non-tasks, search filters, lint partial slugs
v0.2.0
Bug Fixes
- Fix infinite loop in
highlightMatch— empty search query causedstrings.Indexto 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
ParseDatesilent failure — invalid date strings now return an error instead of zero time with nil error
Code Quality
- Replace manual bubble sorts with
sort.Slicein list and tasks commands - Extract shared
truncateSlug/truncateTitlehelpers to eliminate duplication - Remove unused
mustGetStorefunction and dead imports - Replace manual status validation loop with
entry.Contains() - Define named
entryImporterinterface to replace 3 identical inline declarations - Simplify path manipulation in
slug.gowithstrings.TrimSuffix - Clean up
parsePositiveIntto idiomatic(int, error)return signature
Tests
- Add command-level unit tests and integration tests (1,300+ lines)
- All 78 tests passing