Download Latest Version v0.31.0 source code.tar.gz (1.1 MB)
Email in envelope

Get an email when there's a new version of GPTme

Home / v0.31.0
Name Modified Size InfoDownloads / Week
Parent folder
README.md 2025-12-15 29.0 kB
v0.31.0 source code.tar.gz 2025-12-15 1.1 MB
v0.31.0 source code.zip 2025-12-15 1.3 MB
Totals: 3 Items   2.5 MB 5

v0.30.0-101-ga2f2c305a

These are the release notes for gptme version v0.30.0-101-ga2f2c305a.

Contributors

Thanks to everyone who contributed to this release:

@0xbrayo, @erikbjare, @nikongo, @TimeToBuildBob

Changelog

Changes since v0.29.0:

📦 gptme

✨ Features (51)

  • feat(lessons): auto-discover lessons from plugins (#944) (ab531ad20)
  • feat(message): add MessageMetadata TypedDict for token/cost tracking (#943) (684bbb6ff)
  • feat(cost): implement cost_awareness hook for session cost tracking (#939) (ed409cb26)
  • feat(telemetry): improve trace quality with context propagation and rich metrics (#942) (5be5a39d4)
  • feat(shell): add background job support for long-running commands (#902) (c48bf9bd7)
  • feat(setup): validate API keys before saving (Issue #930) (#931) (bf1bc716b)
  • feat(lessons): add caching and deduplication to lesson index (#928) (3fdbf4186)
  • feat(hooks): add form auto-detection hook (Issue #591) (#919) (40dc68f45)
  • feat(logmanager): add content-addressable file storage (Issue #150) (#913) (86febf7de)
  • feat(tools): add form tool for structured user input (Issue #591) (#911) (92c475a47)
  • feat: add Docker container for GitHub bot (Issue #305) (#905) (ec1204fa9)
  • feat(tmux): add wait command to monitor long-running commands (#901) (0ee75e544)
  • feat(prompt): add multi-line input support (#899) (558ee3b5f)
  • feat(autocompact): add Phase 3 extractive compression for long messages (#886) (cca057c63)
  • feat: add diagnostic logging to shell tool for Issue #408 (#890) (750009193)
  • feat: support GPTME_TTS_SPEED and set exclude-newer for tts_server.py script to fix issues (eed3a987c)
  • feat(llm): add constrained decoding support (#776) (94621288d)
  • feat: add Cursor .mdc rules support (Issue #686 Phase 5) (#882) (59723c493)
  • feat: Enhanced plugin management with smart src/ layout discovery (#873) (0ccdfbe44)
  • feat: add compression analysis utilities and script (#864) (fd3d8edc2)
  • feat(eval): GEPA Week 3 - HybridOptimizer with adaptive multi-stage optimization (#859) (58cce70f8)
  • feat(context): implement hooks-based context compression architecture (#844) (20435f324)
  • feat(context): implement Phase 3.1.1 core infrastructure (#860) (b898c8550)
  • feat: implement active context discovery (#856) (990fdca36)
  • feat: add restart tool (#853) (418532ea8)
  • feat(context): Phase 1 - Core Context Selector Infrastructure (#831) (71416f6ca)
  • feat: convert default model and hook registry to ContextVar for thread safety (#848) (5a1ac7b95)
  • feat(plugins): implement Phase 3 command integration (#846) (c7304c43b)
  • feat(plugins): implement Phase 2 hook integration (#845) (e86fe8e08)
  • feat(plugins): implement Phase 1 plugin infrastructure (#843) (fe8b355cc)
  • feat(server): add API v2 client for programmatic interaction (#841) (dfd9f74f1)
  • feat: auto-enable complete tool in non-interactive mode and support multiple -t flags (#836) (a5ccb6cd0)
  • feat(gepa): Phase 2 test set expansion - 7 more tasks (#833) (7bbce0671)
  • feat(gepa): implement Phase 1 test set expansion (12 new tasks) (#832) (68bd60cfc)
  • feat: support OPENROUTER_API_KEY for perplexity (#828) (658c4450a)
  • feat(validation): add MESSAGE_POST_PROCESS hook for markdown codeblock cut-off detection (#824) (ed01e1cb4)
  • feat: add support for gptme.local.toml configuration layering (#617) (3dfcc9e5c)
  • feat(gepa): add PromptImprovementModule to fix InputField architecture issue (#823) (825d71aa7)
  • feat(lessons): Phase 5.5 - Dynamic top-K selection (#820) (7d7fcc455)
  • feat(lessons): Add ACE-inspired hybrid lesson matching (#817) (1bdd9de5c)
  • feat: add hook support to server API v2 (#769) (104aacff7)
  • feat(llm): add custom OpenAI-compatible providers support (#800) (cdf548ee4)
  • feat(subagent): add planner mode for task delegation (#753) (71b72b9bf)
  • feat(server): auto-generate auth token and document security risks (#803) (f652e752e)
  • feat(hooks): improve typing for hook registration with Protocol overloads (#801) (7bb17df7c)
  • feat(eval): implement Docker-based execution environment (#791) (7c6761684)
  • feat(dspy): implement multi-stage reasoning program for GEPA (#786) (a7f87c58d)
  • feat: log a warning when context command output is large (#787) (cf741f841)
  • feat(server): implement token-based authentication for dev environment (#782) (65507d7b8)
  • feat(lessons): add Cursor rules integration and project-local lessons support (#779) (2ddc0e004)
  • feat(tools/shell): store truncated output before discarding (#775) (b7c44982f)

🐛 Fixes (80)

Click to expand

- fix(config): remove quiet parameter from cache key to prevent duplicate entries ([`61b81b0f5`](https://github.com/gptme/gptme/commit/61b81b0f5)) - fix: mark plugins as loaded even if no tool_modules ([`8917b180f`](https://github.com/gptme/gptme/commit/8917b180f)) - fix: more fixes to invalid unicode handling in shell tool ([`65151ee60`](https://github.com/gptme/gptme/commit/65151ee60)) - fix: improved style of initial output ([`06730c6bb`](https://github.com/gptme/gptme/commit/06730c6bb)) - fix: fix invalid unicode handling in shell tool ([`d3b7ddd87`](https://github.com/gptme/gptme/commit/d3b7ddd87)) - fix: hide token/time/cost awareness messages by default ([`755070737`](https://github.com/gptme/gptme/commit/755070737)) - fix: suppress duplicate config log when loading conversation metadata ([`10148567b`](https://github.com/gptme/gptme/commit/10148567b)) - fix: reduce plugin logging spam by logging each plugin once when loaded ([`8e50bcde7`](https://github.com/gptme/gptme/commit/8e50bcde7)) - fix: handle interrupt detection when hooks add messages after interrupt ([`216f274da`](https://github.com/gptme/gptme/commit/216f274da)) - fix(autocompact): add minimum savings threshold to avoid wasteful compaction ([#946](https://github.com/gptme/gptme/issues/946)) ([`2f5b7825c`](https://github.com/gptme/gptme/commit/2f5b7825c)) - fix: suppress telemetry token warnings ([`2aa146e46`](https://github.com/gptme/gptme/commit/2aa146e46)) - fix: fixed metadata for xai models ([`d9c42f2ba`](https://github.com/gptme/gptme/commit/d9c42f2ba)) - fix: improved agent setup instructions with more extensive extra/optional/recommended packages ([`4f5b64dab`](https://github.com/gptme/gptme/commit/4f5b64dab)) - fix: handle unquoted glob patterns in Cursor .mdc files ([`b09f74dca`](https://github.com/gptme/gptme/commit/b09f74dca)) - fix(telemetry): remove noisy codeblock tracing (Issue [#199](https://github.com/gptme/gptme/issues/199)) ([#936](https://github.com/gptme/gptme/issues/936)) ([`c36e25089`](https://github.com/gptme/gptme/commit/c36e25089)) - fix: capture both stdout and stderr from context_cmd on error ([#933](https://github.com/gptme/gptme/issues/933)) ([`4e81c9187`](https://github.com/gptme/gptme/commit/4e81c9187)) - fix: attribute perplexity use to gptme on openrouter ([#929](https://github.com/gptme/gptme/issues/929)) ([`50792e65f`](https://github.com/gptme/gptme/commit/50792e65f)) - fix: fix prompt_systeminfo to work on android/termux ([`e5fa38fd8`](https://github.com/gptme/gptme/commit/e5fa38fd8)) - fix(tests): clean up gptme_N sessions in tmux test fixture ([#926](https://github.com/gptme/gptme/issues/926)) ([`dbe1676e4`](https://github.com/gptme/gptme/commit/dbe1676e4)) - fix: read [prompt] section in project config ([#927](https://github.com/gptme/gptme/issues/927)) ([`1ee053ad1`](https://github.com/gptme/gptme/commit/1ee053ad1)) - fix(telemetry): filter NotGiven attribute warnings from OTEL instrumentation ([#925](https://github.com/gptme/gptme/issues/925)) ([`a50b70623`](https://github.com/gptme/gptme/commit/a50b70623)) - fix(tmux): truncate long pane output to prevent context overflow (Issue [#923](https://github.com/gptme/gptme/issues/923)) ([#924](https://github.com/gptme/gptme/issues/924)) ([`7590830b8`](https://github.com/gptme/gptme/commit/7590830b8)) - fix(llm): add empty reasoning_content field for DeepSeek assistant messages with tool_calls ([#918](https://github.com/gptme/gptme/issues/918)) ([`20f4888cf`](https://github.com/gptme/gptme/commit/20f4888cf)) - fix(tests): add cleanup fixtures for ShellSession and subagents (Issue [#910](https://github.com/gptme/gptme/issues/910)) ([#912](https://github.com/gptme/gptme/issues/912)) ([`980917817`](https://github.com/gptme/gptme/commit/980917817)) - fix(mcp): preserve server process when conversation is interrupted ([#914](https://github.com/gptme/gptme/issues/914)) ([`c4b59c240`](https://github.com/gptme/gptme/commit/c4b59c240)) - fix(browser): improve error messages for search bot detection ([#904](https://github.com/gptme/gptme/issues/904)) ([`ba3c0233f`](https://github.com/gptme/gptme/commit/ba3c0233f)) - fix(config): remove assertions requiring prompt/env in user config ([#909](https://github.com/gptme/gptme/issues/909)) ([`06a451433`](https://github.com/gptme/gptme/commit/06a451433)) - fix(codeblock): handle nested codeblocks with same language tag ([#903](https://github.com/gptme/gptme/issues/903)) ([`79fdd6ea9`](https://github.com/gptme/gptme/commit/79fdd6ea9)) - fix(shell): prevent output mixing between commands (Issue [#408](https://github.com/gptme/gptme/issues/408)) ([#906](https://github.com/gptme/gptme/issues/906)) ([`25dac14f2`](https://github.com/gptme/gptme/commit/25dac14f2)) - fix(llm): handle mixed content types in Groq/DeepSeek transformation ([#896](https://github.com/gptme/gptme/issues/896)) ([`31ef55c01`](https://github.com/gptme/gptme/commit/31ef55c01)) - fix(message): resolve file paths to absolute when serializing ([#898](https://github.com/gptme/gptme/issues/898)) ([`4a62f837d`](https://github.com/gptme/gptme/commit/4a62f837d)) - fix(message): escape Rich markup in non-code-block content ([#894](https://github.com/gptme/gptme/issues/894)) ([`369c72c32`](https://github.com/gptme/gptme/commit/369c72c32)) - fix(lessons): lazy-load ACE to prevent import warnings ([#893](https://github.com/gptme/gptme/issues/893)) ([`5e5557d05`](https://github.com/gptme/gptme/commit/5e5557d05)) - fix: support custom providers in model selection and routing ([#891](https://github.com/gptme/gptme/issues/891)) ([`f20bdc18a`](https://github.com/gptme/gptme/commit/f20bdc18a)) - fix: add browser recovery logic to prevent deadlocks on connection errors ([#888](https://github.com/gptme/gptme/issues/888)) ([`ede5080f2`](https://github.com/gptme/gptme/commit/ede5080f2)) - fix: prevent file content inclusion in command arguments ([#889](https://github.com/gptme/gptme/issues/889)) ([`a665571df`](https://github.com/gptme/gptme/commit/a665571df)) - fix: prettier errors on fatal exceptions ([`d9f2c06e2`](https://github.com/gptme/gptme/commit/d9f2c06e2)) - fix: fix toolcall format to allow dots in call_id (fixes Kimi K2) ([`6e970e546`](https://github.com/gptme/gptme/commit/6e970e546)) - fix: add better cost telemetry logging in optimizable scenarios ([#883](https://github.com/gptme/gptme/issues/883)) ([`7092eae59`](https://github.com/gptme/gptme/commit/7092eae59)) - fix: added claude-opus-4-5 ([`4a9363a4b`](https://github.com/gptme/gptme/commit/4a9363a4b)) - fix(tests): explicitly disable chat history in server v2 test ([#872](https://github.com/gptme/gptme/issues/872)) ([`b888abbea`](https://github.com/gptme/gptme/commit/b888abbea)) - fix(shell): added SC1011 and SC1073 to shellcheck error codes ([`4acc3748e`](https://github.com/gptme/gptme/commit/4acc3748e)) - fix: skip large files in active_context hook ([`ecc1da20d`](https://github.com/gptme/gptme/commit/ecc1da20d)) - fix: detect git version from pip's direct_url.json for pipx installs ([#871](https://github.com/gptme/gptme/issues/871)) ([`f557c43b8`](https://github.com/gptme/gptme/commit/f557c43b8)) - fix(patch): implement relaxed whitespace matching for whitespace-only lines ([#861](https://github.com/gptme/gptme/issues/861)) ([`6681751aa`](https://github.com/gptme/gptme/commit/6681751aa)) - fix(server): add default model fallback and improve error messages ([#863](https://github.com/gptme/gptme/issues/863)) ([`ebdd3df98`](https://github.com/gptme/gptme/commit/ebdd3df98)) - fix(shell): properly terminate child processes on timeout ([#868](https://github.com/gptme/gptme/issues/868)) ([`00377049a`](https://github.com/gptme/gptme/commit/00377049a)) - fix(dspy): register metadata for complexity test tasks ([#867](https://github.com/gptme/gptme/issues/867)) ([`767264944`](https://github.com/gptme/gptme/commit/767264944)) - fix(tools): preserve full type information in tool signatures ([#865](https://github.com/gptme/gptme/issues/865)) ([`10ddeb6cb`](https://github.com/gptme/gptme/commit/10ddeb6cb)) - fix: initialize tools and model in subagent threads ([#854](https://github.com/gptme/gptme/issues/854)) ([`389549c7f`](https://github.com/gptme/gptme/commit/389549c7f)) - fix: added SC2016 as excluded shellcheck code ([`436b335de`](https://github.com/gptme/gptme/commit/436b335de)) - fix: fix broken favicon in the root path ([#847](https://github.com/gptme/gptme/issues/847)) ([`421194a15`](https://github.com/gptme/gptme/commit/421194a15)) - fix: remove xfail markers from previously flaky server tests ([#849](https://github.com/gptme/gptme/issues/849)) ([`1645926dd`](https://github.com/gptme/gptme/commit/1645926dd)) - fix(gepa): Phase 3.3 - Fix task source and auto parameter conflicts ([#837](https://github.com/gptme/gptme/issues/837)) ([`dbbbc8493`](https://github.com/gptme/gptme/commit/dbbbc8493)) - fix(security): block command injection via pipe-to-shell patterns ([#840](https://github.com/gptme/gptme/issues/840)) ([`87cd354d8`](https://github.com/gptme/gptme/commit/87cd354d8)) - fix(gepa): remove auto parameter conflict in MIPROv2 ([#835](https://github.com/gptme/gptme/issues/835)) ([`7e51e0ace`](https://github.com/gptme/gptme/commit/7e51e0ace)) - fix: fixed Kimi K2 thinking toolcall support via OpenRouter ([#830](https://github.com/gptme/gptme/issues/830)) ([`5a758dbc7`](https://github.com/gptme/gptme/commit/5a758dbc7)) - fix: resolve MCP tool loading issues and connection errors ([#825](https://github.com/gptme/gptme/issues/825)) ([`72a4d85bf`](https://github.com/gptme/gptme/commit/72a4d85bf)) - fix(subagent): add missing tool_format parameter to chat() calls ([`3167b3366`](https://github.com/gptme/gptme/commit/3167b3366)) - fix(gepa): export ANTHROPIC_API_KEY and suppress verbose logs ([#821](https://github.com/gptme/gptme/issues/821)) ([`aeefe9b44`](https://github.com/gptme/gptme/commit/aeefe9b44)) - fix(gepa): collect and save trajectory feedback in optimization results ([#819](https://github.com/gptme/gptme/issues/819)) ([`603ccfefc`](https://github.com/gptme/gptme/commit/603ccfefc)) - fix(eval): fix reflection model used in GEPA optimizer ([#814](https://github.com/gptme/gptme/issues/814)) ([`6345f0c2a`](https://github.com/gptme/gptme/commit/6345f0c2a)) - fix(eval): add defensive check for eval_result in task_success_metric ([#813](https://github.com/gptme/gptme/issues/813)) ([`644eadd97`](https://github.com/gptme/gptme/commit/644eadd97)) - fix(server): add GPTME_DISABLE_AUTH env var for k8s deployments ([#811](https://github.com/gptme/gptme/issues/811)) ([`dd4910174`](https://github.com/gptme/gptme/commit/dd4910174)) - fix(tmux): use dashes instead of underscores for tmux tool function ([#810](https://github.com/gptme/gptme/issues/810)) ([`e1119abee`](https://github.com/gptme/gptme/commit/e1119abee)) - fix(shell): added SC2002 to default shellcheck excludes ([`3c088d372`](https://github.com/gptme/gptme/commit/3c088d372)) - fix: improve shell error handling and add Anthropic debug logging ([`cdd90afb7`](https://github.com/gptme/gptme/commit/cdd90afb7)) - fix: fix session start hook msgs not being persisted ([#808](https://github.com/gptme/gptme/issues/808)) ([`43a8c55df`](https://github.com/gptme/gptme/commit/43a8c55df)) - fix(eval): run gptme agent inside Docker when --use-docker is used ([#805](https://github.com/gptme/gptme/issues/805)) ([`84f18eb3f`](https://github.com/gptme/gptme/commit/84f18eb3f)) - fix(shell): handle bashlex parsing errors for bash builtins like 'time' ([#799](https://github.com/gptme/gptme/issues/799)) ([`0e18bf538`](https://github.com/gptme/gptme/commit/0e18bf538)) - fix(shell): added rg, ag, ast-grep, hyperfine to mentioned installed shell commands ([`3c2b3f8ed`](https://github.com/gptme/gptme/commit/3c2b3f8ed)) - fix(tests): update test_auto_compact.py for timestamp-based naming ([#797](https://github.com/gptme/gptme/issues/797)) ([`8142f895c`](https://github.com/gptme/gptme/commit/8142f895c)) - fix(autocompact): restore manager state after fork to prevent name mutation ([#794](https://github.com/gptme/gptme/issues/794)) ([`ce25affc0`](https://github.com/gptme/gptme/commit/ce25affc0)) - fix(autocompact): resolve NameError and naming bug ([#792](https://github.com/gptme/gptme/issues/792)) ([`16032e481`](https://github.com/gptme/gptme/commit/16032e481)) - fix: dont mistake absolute path for command when given as prompt ([`55c5a92d9`](https://github.com/gptme/gptme/commit/55c5a92d9)) - fix(server): support query param token for SSE authentication ([#785](https://github.com/gptme/gptme/issues/785)) ([`66b418a5e`](https://github.com/gptme/gptme/commit/66b418a5e)) - fix: convert GEPA output_dir to absolute path to prevent FileNotFoundError ([#784](https://github.com/gptme/gptme/issues/784)) ([`ad5f47a1e`](https://github.com/gptme/gptme/commit/ad5f47a1e)) - fix(shell): handle logical OR operators (||) in pipe detection ([#777](https://github.com/gptme/gptme/issues/777)) ([`d52a17293`](https://github.com/gptme/gptme/commit/d52a17293)) - fix(anthropic): retry on RemoteProtocolError's ([#773](https://github.com/gptme/gptme/issues/773)) ([`9c7b4874d`](https://github.com/gptme/gptme/commit/9c7b4874d)) - fix(shell): denylist pkill and killall (fixes [#768](https://github.com/gptme/gptme/issues/768)) ([#770](https://github.com/gptme/gptme/issues/770)) ([`6c7939393`](https://github.com/gptme/gptme/commit/6c7939393))

🔨 Misc (34)

Click to expand

- chore: bump version to 0.31.0 ([`a2f2c305a`](https://github.com/gptme/gptme/commit/a2f2c305a)) - docs: add TODO comment to prompts.py about optimizing prompt caching of context_cmd ([`63c998da5`](https://github.com/gptme/gptme/commit/63c998da5)) - style: use consistent 'Using' prefix for local config log message ([`4fbcf8927`](https://github.com/gptme/gptme/commit/4fbcf8927)) - docs(bot): improve GitHub bot documentation ([#938](https://github.com/gptme/gptme/issues/938)) ([`bc3929e4e`](https://github.com/gptme/gptme/commit/bc3929e4e)) - chore: small fixes and formatting ([#934](https://github.com/gptme/gptme/issues/934)) ([`0e7edef0d`](https://github.com/gptme/gptme/commit/0e7edef0d)) - docs: updated agent setup guide ([`8d1b0b88d`](https://github.com/gptme/gptme/commit/8d1b0b88d)) - chore(config): disable fresh context mode ([`f71558992`](https://github.com/gptme/gptme/commit/f71558992)) - docs: add issue labeling guide to contributing docs (Issue [#874](https://github.com/gptme/gptme/issues/874)) ([#922](https://github.com/gptme/gptme/issues/922)) ([`606e7ead8`](https://github.com/gptme/gptme/commit/606e7ead8)) - refactor(bot): simplify action.yml to use github_bot.py script (Issue [#305](https://github.com/gptme/gptme/issues/305)) ([#915](https://github.com/gptme/gptme/issues/915)) ([`1e3c020d9`](https://github.com/gptme/gptme/commit/1e3c020d9)) - docs: add optional system dependencies section ([#897](https://github.com/gptme/gptme/issues/897)) ([`2718cb369`](https://github.com/gptme/gptme/commit/2718cb369)) - Fix: Use conservative token limit for Anthropic models to prevent overflow ([#887](https://github.com/gptme/gptme/issues/887)) ([`f94ecc3cb`](https://github.com/gptme/gptme/commit/f94ecc3cb)) - docs: added more model alternatives and notes on model and provider selection ([`c7b5fd8f7`](https://github.com/gptme/gptme/commit/c7b5fd8f7)) - docs: Phase 4 - Add plugin example links and decision guidance ([#881](https://github.com/gptme/gptme/issues/881)) ([`746fe1d04`](https://github.com/gptme/gptme/commit/746fe1d04)) - docs: clarify skills vs plugins architecture ([#880](https://github.com/gptme/gptme/issues/880)) ([`66168d633`](https://github.com/gptme/gptme/commit/66168d633)) - refactor: Adopt Anthropic skill format (replaces [#876](https://github.com/gptme/gptme/issues/876)) ([#877](https://github.com/gptme/gptme/issues/877)) ([`8d8faca55`](https://github.com/gptme/gptme/commit/8d8faca55)) - test: mark flaky test as flaky ([`6b91b0d5f`](https://github.com/gptme/gptme/commit/6b91b0d5f)) - test(dspy): add comprehensive unit tests for GptmeReasoningProgram ([#870](https://github.com/gptme/gptme/issues/870)) ([`8a8c04e8e`](https://github.com/gptme/gptme/commit/8a8c04e8e)) - docs(dspy): add comprehensive documentation for use_reasoning_program parameter ([#869](https://github.com/gptme/gptme/issues/869)) ([`f81301090`](https://github.com/gptme/gptme/commit/f81301090)) - tests: add xfail to flaky test ([`8f609310f`](https://github.com/gptme/gptme/commit/8f609310f)) - docs: more docs fixes ([#852](https://github.com/gptme/gptme/issues/852)) ([`15550cb1d`](https://github.com/gptme/gptme/commit/15550cb1d)) - docs: custom provider docs fix ([#851](https://github.com/gptme/gptme/issues/851)) ([`b57b22b68`](https://github.com/gptme/gptme/commit/b57b22b68)) - docs: fixes to docs, clean up ([#850](https://github.com/gptme/gptme/issues/850)) ([`0464aad99`](https://github.com/gptme/gptme/commit/0464aad99)) - chore: bump version to 0.30.0 ([`0361c2617`](https://github.com/gptme/gptme/commit/0361c2617)) - tests: add xfail to flaky test ([`0d9448af3`](https://github.com/gptme/gptme/commit/0d9448af3)) - tests: add xfail to flaky test ([`2db3c003f`](https://github.com/gptme/gptme/commit/2db3c003f)) - tests: fixed flaky tests ([`5eb817bdc`](https://github.com/gptme/gptme/commit/5eb817bdc)) - refactor: extract cwd tracking to hook and refactor time/token awareness to clean hooks ([#839](https://github.com/gptme/gptme/issues/839)) ([`32dc01f61`](https://github.com/gptme/gptme/commit/32dc01f61)) - Refactor threading.local to ContextVars support ([#827](https://github.com/gptme/gptme/issues/827)) ([`cb157ea1b`](https://github.com/gptme/gptme/commit/cb157ea1b)) - refactor: migrate TTS to hook-based architecture ([#816](https://github.com/gptme/gptme/issues/816)) ([`83cbe9ff2`](https://github.com/gptme/gptme/commit/83cbe9ff2)) - chore: change default TTS server port from 8000 to 8765 ([#815](https://github.com/gptme/gptme/issues/815)) ([`48f11f2ca`](https://github.com/gptme/gptme/commit/48f11f2ca)) - refactor: move len_tokens and related code into gptme.util.tokens ([#809](https://github.com/gptme/gptme/issues/809)) ([`62ba557b3`](https://github.com/gptme/gptme/commit/62ba557b3)) - perf: improve startup time by using `shutil.which` to check for pre-commit instead of `pre-commit --version` ([`630c0cc0a`](https://github.com/gptme/gptme/commit/630c0cc0a)) - docs: add comprehensive lesson system documentation ([#771](https://github.com/gptme/gptme/issues/771)) ([`5671da683`](https://github.com/gptme/gptme/commit/5671da683)) - docs(lessons): add Phase 6 comprehensive documentation ([#795](https://github.com/gptme/gptme/issues/795)) ([`8e11c24f7`](https://github.com/gptme/gptme/commit/8e11c24f7))

(excluded 11 less relevant commits)

Full Changelog: https://github.com/gptme/gptme/compare/v0.29.0...v0.30.0-101-ga2f2c305a

Source: README.md, updated 2025-12-15