Releases: nickpricks/ft
Releases · nickpricks/ft
v0.1.7
Changelog
All notable changes to FeatherTrailMD are documented in this file.
[v0.1.7] — 2026-04-02
Major internal quality release. Resolves 24 of 25 items from the code review. No breaking changes to CLI commands or note file format.
Architecture
- NoteStore struct replaces global
BaseDir— all note operations are now encapsulated incore.NoteStorewith a private, validatedbaseDirfield. No more global mutable state. ([A1]) - Config returns value —
config.LoadOrInit()returns(string, error)instead of mutating a global. Config no longer importscore. ([A2]) - Sentinel errors —
ErrNoteNotFound,ErrNotesDirMissing,ErrMaxNotesPerDay, etc. replace string-based error templates. Useerrors.Is()for matching. ([A4]) - NoteID type —
ParseNoteID()validates and normalizes note IDs (numeric, 1-99, zero-padded) at the CLI boundary.ft read abcnow returns a clear error instead of silently searching. ([A3])
Bug Fixes
- Config: silent fallbacks eliminated — permission errors, corrupt JSON, missing home dir, and stdin failures now return explicit errors instead of silently falling back to defaults. ([C1-C6])
- Config file permissions —
~/.fmd.jsonis now written with0600instead of0644. ([I6]) - Config paths resolved to absolute — user-supplied relative paths are resolved via
filepath.Abs()before saving. ([I7]) - Help command skips config —
ft --helpno longer triggers the first-run setup prompt. ([I8]) - ID collision after 99 notes/day —
getNextIDcaps at 99 with a clear error.findNoteByIDuses exact ID matching instead of prefix matching. ([C7]) - Permission errors surfaced — unreadable folders in
findNoteByIDandList()now return permission errors instead of silently skipping or returning misleading "not found". ([I2, I4]) - filepath.Rel error handled —
List()no longer silently drops notes whenfilepath.Relfails. ([I1]) - Edit Close error captured —
Edit()uses named returns with deferredClose()to capture write errors on NFS/disk-full. ([I3]) - Error wrapping —
edit.goandread.gonow wrap OS errors with context, matchingadd.go's pattern. ([I5]) - tabwriter.Flush checked —
listCLI checks theFlush()error instead of discarding it. ([I9]) - Windows test detection —
isTestRun()now checks.test.exesuffix and usesfilepath.Separator. ([C6])
Tests
- Config package tests — 6 new tests covering valid config, corrupt JSON, empty dir, init error, roundtrip, and permission denied. Config coverage went from 0% to meaningful. ([T1])
- Edge case tests —
findNoteByIDwith missing dir,getNextIDon nonexistent dir,Editon read-only file,Listwith missing dir. ([T2-T5]) - Setup error checking — all test files now check
os.MkdirAll/os.WriteFileerrors witht.Fatal()guards. ([T6]) - NoteStore tests — constructor validation (empty dir, relative dir) and integration test (Add → Read → List → Edit cycle).
- Test count: 9 → 25
Documentation
- Updated
docs/man.md— current code listings forroot.go,add.go, new config section. ([D2]) - Updated
docs/ref.md— added config package, Makefile, Version constant. ([D3]) - Updated
docs/PLAN.md— Phase 1 marked ✅,fmd→ft, repo structure updated. - Updated
docs/ActualPlan.md— release verified, config subsection added. - Fixed
README.md— cross-platform path in first-run example. ([D4]) - Fixed
cmd/feathertrailmd/README.md— binary naming clarification. ([D5]) - Fixed
types.goBaseDir comment. ([D1]) - Cleaned
CODE_REVIEW.md— removed example code, kept checklist only. - Added
CLAUDE.mdfor Claude Code guidance.
[v0.1.6] — 2026-03-06
- Added global config storage (
~/.fmd.json) with first-run prompt. - Added
internal/config/package. - Added
internal/constants/for centralized strings. - Cross-platform installer scripts.
[v0.1.5] — 2026-03-06
- Renamed
cmd/fttocmd/feathertrailmdto resolve.gitignoreconflict.
[v0.1.4] — 2026-03-06
- Initial release with
add,list,read,editcommands. - Per-day incremental ID generation.
- Makefile with build, test, vet, cross-compile targets.
- GitHub Actions release workflow.
Full Changelog: v0.1.6...v0.1.7
Full Changelog: v0.1.6...v0.1.7
v0.1.6
Full Changelog: v0.1.5...v0.1.6
v0.1.5
Full Changelog: v0.1.4...v0.1.5
v0.1.4
Full Changelog: v0.1.2...v0.1.4