Releases: bitflicker64/Termstory
Release list
v0.6.3
What's Changed
- feat: Batch 3 v4 — FTS5 + stress + AI contexts by @bitflicker64 in #11
- fix: replace monkeypatch of CliRunner.mix_stderr with CliRunner(mix_stderr=False) by @bitflicker64 in #13
- feat: profile command — database timing, formatter, CLI subcommand by @bitflicker64 in #12
- feat: by @bitflicker64 in #15
- feat: verify release workflow and build packages by @bitflicker64 in #14
- feat/batch 5 by @bitflicker64 in #16
- feat: batch 6 rpg classes + vampire coder index by @bitflicker64 in #17
- feat: batch 7 necromancer + rage-quit by @bitflicker64 in #18
- feat: batch 8 cyberpunk tui animations by @bitflicker64 in #19
- feat/unified tracker by @bitflicker64 in #20
- fix: mark batch 8 as merged in tracker by @bitflicker64 in #21
- feat/batch 9 by @bitflicker64 in #22
- feat: batch 10 ghost typer + web export by @bitflicker64 in #23
- fix: escape DOM insertion in web templates by @bitflicker64 in #24
- feat: batch 11 ai contexts + predict enhance by @bitflicker64 in #25
- feat: batch 12 docs cleanup + v0.6.0 prep by @bitflicker64 in #26
- feat: batch 13 mcp time-machine snapshots by @bitflicker64 in #27
- docs: batch 13p2 comprehensive agents.md by @bitflicker64 in #28
- docs: batch 13p3 cleanup and update all md files by @bitflicker64 in #29
- feat: batch 14 sqlite fts5 integration by @bitflicker64 in #30
- feat: batch 15 rem sleep context consolidation by @bitflicker64 in #31
- feat: batch 15 rem sleep context consolidation by @bitflicker64 in #32
- fix: batch bugfix 12 bugs by @bitflicker64 in #33
- fix: formal PR — 10 bug fixes (stats/db/exporter/sanitizer/predict/archive/session/search/replay) by @bitflicker64 in #36
- fix: remove unsupported mix_stderr arg from CliRunner by @bitflicker64 in #69
- chore: swarm audit batch 2 – comprehensive fixes by @bitflicker64 in #108
- fix: replace bare except in _handle_exception with logged warning (#112) by @Jpeg-create in #115
- fix: log warning on DB error in add_reminder instead of silent pass by @Jpeg-create in #126
- [Reminder] Add type and range validation to add_reminder by @AdithyaGanji in #127
- fix: log warning on DB errors in ai.py context lookups instead of silent pass by @Jpeg-create in #128
- Fix config loading error handling by @Urvity03 in #114
- Improve zsh history file read error handling by @Urvity03 in #129
- fix: repair install script and cleanup project config by @bitflicker64 in #130
- fix: build venv in-place instead of staging+mv pattern by @bitflicker64 in #131
- v0.6.2: build venv in-place with proper rollback by @bitflicker64 in #132
- fix: migrate FTS5 virtual tables whose column set drifted from current schema by @bitflicker64 in #133
- Bound database query logs by @WujunhaoGPU in #135
- install: shell RC integration + dedicated uninstall.sh by @bitflicker64 in #136
- fix: NoneType crash in save_data + archive orphan skip by @bitflicker64 in #137
- fix: match conflict-recovery SELECT by start_time only by @bitflicker64 in #139
- fix: replace self.dismiss() with call_after_refresh in message handlers by @bitflicker64 in #140
- docs: replace TUI ASCII sample with actual v0.6.0 screenshot by @bitflicker64 in #141
- fix: wrap set_timer(self.dismiss) callbacks in call_after_refresh by @bitflicker64 in #142
- Fix: secrets leaking into LLM prompts via ask/chronicle (and commit messages everywhere) by @bitflicker64 in #143
- docs: privacy documentation update — secret redaction parity fix by @bitflicker64 in #144
- Handle date parsing errors with specific exceptions by @Urvity03 in #157
- fix: prevent CI hangs from leaking @work workers and animation timers by @bitflicker64 in #159
- [TUI] Make tool keywords list configurable via config by @github-ftnayan in #161
- fix: catch specific ValueError instead of broad Exception in shlex split by @AK-Lmn in #162
- Read AI provider settings from nested config by @andrewkernel in #164
- Narrow timestamp date parse exceptions by @andrewkernel in #166
- fix(test_tui): bypass Textual 8.x AwaitComplete screen dismiss hangs in 6 ModalScreen tests by @bitflicker64 in #163
- fix(test_tui): restore install_sync_dismiss_workaround helper (#165) by @bitflicker64 in #167
- Replace broad exception handling when reading install log by @Urvity03 in #168
- [TUI] Make default branch names configurable via config by @github-ftnayan in #177
- [Reminder] Make poll interval configurable via config by @github-ftnayan in #178
- fix: make circuit breaker limits configurable via config (closes #118) by @SemTiOne in #179
- fix: make cosine clustering threshold configurable (closes #119) by @SemTiOne in #186
- fix: make SQLite connection timeout configurable (closes #123) by @SemTiOne in #187
- fix: replace call_after_refresh with set_timer for screen dismisses (fixes #175) by @bitflicker64 in #188
- chore: expand .miku.yml area/kind label coverage by @bitflicker64 in #202
- refactor: replace magic number with _FAR_FUTURE_TS by @Sapair-og in #201
- fix(date_utils): chain exception in parse_date_range_helper by @Maqbool61 in #203
- Add missing tests for logging, OSError, ValueError fallback, and debug logs by @Mubashir78 in #208
- fix: replace bare except blocks with specific types and logging in formatter by @Mubashir78 in #195
- refactor: hoist duplicated max_tokens default to _DEFAULT_MAX_TOKENS by @qorexdevs in #209
- fix: make NFS timeout cache TTL configurable via nfs_timeout_cache_ttl (closes #199) by @Maqbool61 in #210
- fix(ai): replace silent exception handlers with specific logging by @Urvity03 in #211
- Fix issue #222 bare exception blocks in reminder.py by @advik604 in #226
- fix: log errors in stats.py bare except blocks by @ZachDreamZ in #227
- Fix bare exception blocks in database.py by @advik604 in #230
- [MCP Snapshot] Narrow bare except blocks silently swallowing errors by @SemTiOne in #231
- fix: replace COALESCE(-1) sentinel index and scope orphan-session prune by @SemTiOne in #233
- docs: add test suite agent guide by @vku2018 in #212
- issue #198 : fixed query=None calls by @advik604 in #234
- refactor: extract magic numbers to named constants in replay.py by @ishita-0301 in #194
- [Web] Log daily activity heatmap query errors by @sjsjsjjs534 in #207
- Resolve
_send_llm_requestdefaultmax_tokensbinding to support runtime overrides by @bitflicker64 with @Copilot in #235 - [Ask] Replace hardcoded max_tokens/timeout with shared constant and config by @SemTiOne in https:...
v0.5.0
What's Changed
- feat: pending cli.py and tui.py changes by @bitflicker64 in #7
- fix: CliRunner mix_stderr compat + bump v0.5.0 by @bitflicker64 in #9
Full Changelog: v0.2.14...v0.5.0
v0.2.14
v0.2.13
What's Changed
- Fix onboarding .zshrc idempotency, reset cleanup, and API key validation by @bitflicker64 in #5
- Bugfix/legacy timestamp spread by @bitflicker64 in #6
Full Changelog: v0.2.11...v0.2.13
v0.2.11
What's Changed
- Fix repeated onboarding timestamp prompt by @bitflicker64 in #2
- Fix AI error surfacing, onboarding reminder, Timestamp Detective project_paths wiring, and dynamic git commit ingestion window by @bitflicker64 in #4
Full Changelog: v0.2.10...v0.2.11
v0.2.10 — PR Review Fixes & Improvements
🔍 v0.2.10 — PR Review Fixes & Improvements
This release addresses all review feedback and fixes from Pull Request #1:
- CLI Config Parsing: Configuration keys set via CLI (like request_timeout_seconds) are now converted to their correct types (integer/float/boolean) instead of raw strings, preventing socket connection crashes.
- Installer log timezone offsets: Fixed detect_macos_syslog to correctly match and parse installer log timezone offsets, producing accurate timestamps aligned with local timezone settings.
- Syslog package matching: Fixed package filtering logic to avoid matching unrelated brew lines when the package is not present.
- AI Timeout Override: Allowed explicit timeout parameters passed to public AI functions to take precedence over default/on-disk configurations.
- Documentation: README.md updated to document the request_timeout_seconds option.
v0.2.9 — The Timestamp Detective
🔍 v0.2.9 — The Timestamp Detective
The biggest upgrade to TermStory's data recovery engine. If you've been using your terminal for years without EXTENDED_HISTORY, your shell history had no dates — every command appeared to have happened today. This release fixes that.
What's New
🔍 Timestamp Detective (timestamp_detective.py) — NEW module
A 3-phase forensic engine that recovers the real timestamps of legacy commands by mining artifacts that already exist on your machine.
Phase A — Virtual CWD Tracker
Replays cd, pushd, and popd commands in sequence to compute the exact working directory at every point in history, so git searches are scoped to the right repository.
Phase B — Five Forensic Detectors
Run in priority order, each returning a real Unix timestamp + source attribution:
| Detector | Evidence Used |
|---|---|
| Git Commit Matcher | Fuzzy-matches git commit -m messages against git log (threshold ≥ 0.85) |
| File Stat | Stats artifacts created by touch, mkdir, npm init, git init, python -m venv, etc. |
| Package Manager | Stats Homebrew Cellar, pip dist-info, npm node_modules, Cargo registry, gem dirs |
| Docker Inspector | Runs docker image inspect <tag> --format='{{.Created}}' |
| Venv / Lockfile | Stats Gemfile.lock, go.sum, composer.lock, cloned .git dirs, ssh-keygen output |
Multi-Repo Collision Trap: Git searches are scoped to the CWD-derived repo first, preventing the same commit message from matching the wrong project.
Phase C — Anchor Interpolation Engine
Commands between two detected anchors are distributed linearly:
t_i = t_a + (t_b − t_a) × (i − i_a) / (i_b − i_a)
Example:
[500] npm install express → 🔍 ANCHOR Tue 14:00 (package.json mtime)
[501] npm start → 📐 INTERP Tue 14:07 (interpolated between anchors)
[502] git commit -m add → 🔍 ANCHOR Tue 14:15 (git log: myapp@a3f9b2c)
🏷️ Chain of Custody Badge
Every recovered command gets a recovery_source string persisted to the database. It renders in the TUI as a badge below the command:
• 14:00:03 npm install express
[🔍 stat: package.json mtime]
• 14:07:31 npm start
[🔍 Interpolated (between stat: package.json mtime → git log: myapp@a3f9b2c)]
• 14:15:44 git commit -m "add express"
[🔍 git log: myapp@a3f9b2c]
🌲 TUI Session Labels
| Label | Meaning |
|---|---|
✨ session (14:00 - 14:45) |
Real EXTENDED_HISTORY timestamp |
🔍 Recovered Archive (38 cmds • 14:00 - 14:45) |
Detective found anchors + interpolated |
📦 Legacy Archive (12 recovered cmds) |
Zero forensic evidence, fully synthetic |
Database Changes
- New
recovery_source TEXTcolumn oncommandstable (safe migration, NULL for real timestamps) - All four
get_*_sessionsmethods updated to readrecovery_sourceback from DB
Test Suite
155 passed, 1 skipped, 0 failures
New tests/test_timestamp_detective.py with full coverage of:
- Virtual CWD tracker (cd/pushd/popd edge cases)
- All 5 forensic detectors
- Anchor interpolation (prefix/suffix gaps, multi-anchor gaps, empty list)
- Full
resolve_all()pipeline integration
Install / Upgrade
pip install termstory==0.2.9
# or
pip install --upgrade termstoryPyPI: https://pypi.org/project/termstory/0.2.9/
Docs: See README for full Timestamp Detective architecture deep-dive.