cecli-dev 0.99.8__tar.gz → 0.99.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (620) hide show
  1. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/PKG-INFO +1 -1
  2. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/__init__.py +1 -1
  3. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/_version.py +3 -3
  4. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/agent_coder.py +2 -6
  5. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/base_coder.py +11 -4
  6. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/load_session.py +1 -1
  7. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/conversation/integration.py +3 -3
  8. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/conversation/manager.py +28 -0
  9. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/main.py +1 -1
  10. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/agent.yml +5 -2
  11. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/repo.py +23 -1
  12. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/sessions.py +83 -3
  13. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/edit_text.py +9 -9
  14. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/get_lines.py +73 -61
  15. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/utils/helpers.py +5 -5
  16. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/app.py +6 -0
  17. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli_dev.egg-info/PKG-INFO +1 -1
  18. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli_dev.egg-info/SOURCES.txt +2 -1
  19. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_sessions.py +112 -1
  20. cecli_dev-0.99.9/tests/tui/test_app.py +37 -0
  21. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.dockerignore +0 -0
  22. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.flake8 +0 -0
  23. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.gitattributes +0 -0
  24. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/ISSUE_TEMPLATE/issue.yml +0 -0
  25. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/workflows/check_pypi_version.yml +0 -0
  26. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/workflows/docker-build-test.yml +0 -0
  27. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/workflows/docker-release.yml +0 -0
  28. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/workflows/issues.yml +0 -0
  29. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/workflows/pages.yml +0 -0
  30. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/workflows/pre-commit.yml +0 -0
  31. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/workflows/release.yml +0 -0
  32. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/workflows/ubuntu-tests.yml +0 -0
  33. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/workflows/windows-tests.yml +0 -0
  34. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.github/workflows/windows_check_pypi_version.yml +0 -0
  35. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.gitignore +0 -0
  36. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/.pre-commit-config.yaml +0 -0
  37. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/CHANGELOG.md +0 -0
  38. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/CNAME +0 -0
  39. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/CONTRIBUTING.md +0 -0
  40. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/HISTORY.md +0 -0
  41. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/LICENSE.txt +0 -0
  42. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/MANIFEST.in +0 -0
  43. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/README.md +0 -0
  44. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/Dockerfile +0 -0
  45. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/README.md +0 -0
  46. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/__init__.py +0 -0
  47. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/benchmark.py +0 -0
  48. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/benchmark_classic.py +0 -0
  49. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/clone-exercism.sh +0 -0
  50. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/cpp-test.sh +0 -0
  51. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/docker.sh +0 -0
  52. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/docker_build.sh +0 -0
  53. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/install-docker-ubuntu.sh +0 -0
  54. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/npm-test.sh +0 -0
  55. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/over_time.py +0 -0
  56. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/plot.sh +0 -0
  57. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/plots.py +0 -0
  58. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/problem_stats.py +0 -0
  59. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/prompts.py +0 -0
  60. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/refactor_tools.py +0 -0
  61. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/rsync.sh +0 -0
  62. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/rungrid.py +0 -0
  63. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/swe-bench-lite.txt +0 -0
  64. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/swe-bench.txt +0 -0
  65. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/swe_bench.py +0 -0
  66. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/test_benchmark.py +0 -0
  67. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/variations.1.sh +0 -0
  68. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/variations.2.sh +0 -0
  69. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/variations.3.sh +0 -0
  70. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/benchmark/variations.4.sh +0 -0
  71. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/__main__.py +0 -0
  72. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/args.py +0 -0
  73. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/args_formatter.py +0 -0
  74. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/change_tracker.py +0 -0
  75. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/__init__.py +0 -0
  76. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/architect_coder.py +0 -0
  77. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/ask_coder.py +0 -0
  78. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/chat_chunks.py +0 -0
  79. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/context_coder.py +0 -0
  80. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/copypaste_coder.py +0 -0
  81. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/editblock_coder.py +0 -0
  82. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/editblock_fenced_coder.py +0 -0
  83. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/editblock_func_coder.py +0 -0
  84. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/editor_diff_fenced_coder.py +0 -0
  85. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/editor_editblock_coder.py +0 -0
  86. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/editor_whole_coder.py +0 -0
  87. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/hashline_coder.py +0 -0
  88. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/help_coder.py +0 -0
  89. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/patch_coder.py +0 -0
  90. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/search_replace.py +0 -0
  91. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/shell.py +0 -0
  92. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/single_wholefile_func_coder.py +0 -0
  93. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/udiff_coder.py +0 -0
  94. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/udiff_simple.py +0 -0
  95. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/wholefile_coder.py +0 -0
  96. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/coders/wholefile_func_coder.py +0 -0
  97. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/__init__.py +0 -0
  98. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/add.py +0 -0
  99. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/agent.py +0 -0
  100. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/agent_model.py +0 -0
  101. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/architect.py +0 -0
  102. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/ask.py +0 -0
  103. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/chat_mode.py +0 -0
  104. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/clear.py +0 -0
  105. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/code.py +0 -0
  106. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/command_prefix.py +0 -0
  107. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/commit.py +0 -0
  108. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/compact.py +0 -0
  109. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/context.py +0 -0
  110. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/context_blocks.py +0 -0
  111. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/context_management.py +0 -0
  112. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/copy.py +0 -0
  113. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/copy_context.py +0 -0
  114. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/core.py +0 -0
  115. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/diff.py +0 -0
  116. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/drop.py +0 -0
  117. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/editor.py +0 -0
  118. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/editor_model.py +0 -0
  119. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/exit.py +0 -0
  120. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/git.py +0 -0
  121. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/hashline.py +0 -0
  122. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/help.py +0 -0
  123. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/history_search.py +0 -0
  124. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/hooks.py +0 -0
  125. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/lint.py +0 -0
  126. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/list_sessions.py +0 -0
  127. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/load.py +0 -0
  128. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/load_hook.py +0 -0
  129. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/load_mcp.py +0 -0
  130. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/load_skill.py +0 -0
  131. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/ls.py +0 -0
  132. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/map.py +0 -0
  133. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/map_refresh.py +0 -0
  134. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/model.py +0 -0
  135. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/models.py +0 -0
  136. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/multiline_mode.py +0 -0
  137. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/paste.py +0 -0
  138. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/quit.py +0 -0
  139. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/read_only.py +0 -0
  140. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/read_only_stub.py +0 -0
  141. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/reasoning_effort.py +0 -0
  142. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/remove_hook.py +0 -0
  143. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/remove_mcp.py +0 -0
  144. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/remove_skill.py +0 -0
  145. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/report.py +0 -0
  146. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/reset.py +0 -0
  147. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/rules.py +0 -0
  148. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/run.py +0 -0
  149. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/save.py +0 -0
  150. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/save_session.py +0 -0
  151. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/settings.py +0 -0
  152. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/terminal_data/linux.keytab +0 -0
  153. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/terminal_setup.py +0 -0
  154. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/test.py +0 -0
  155. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/think_tokens.py +0 -0
  156. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/tokens.py +0 -0
  157. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/undo.py +0 -0
  158. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/utils/__init__.py +0 -0
  159. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/utils/base_command.py +0 -0
  160. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/utils/helpers.py +0 -0
  161. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/utils/registry.py +0 -0
  162. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/utils/save_load_manager.py +0 -0
  163. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/voice.py +0 -0
  164. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/weak_model.py +0 -0
  165. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/web.py +0 -0
  166. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/commands/workspace.py +0 -0
  167. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/deprecated_args.py +0 -0
  168. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/diffs.py +0 -0
  169. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/dump.py +0 -0
  170. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/editor.py +0 -0
  171. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/exceptions.py +0 -0
  172. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/format_settings.py +0 -0
  173. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/help.py +0 -0
  174. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/help_pats.py +0 -0
  175. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/__init__.py +0 -0
  176. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/background_commands.py +0 -0
  177. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/command_parser.py +0 -0
  178. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/conversation/__init__.py +0 -0
  179. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/conversation/base_message.py +0 -0
  180. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/conversation/files.py +0 -0
  181. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/conversation/service.py +0 -0
  182. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/conversation/tags.py +0 -0
  183. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/conversation/utils.py +0 -0
  184. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/copypaste.py +0 -0
  185. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/coroutines.py +0 -0
  186. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/file_searcher.py +0 -0
  187. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/grep_ast/__init__.py +0 -0
  188. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/grep_ast/dump.py +0 -0
  189. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/grep_ast/grep_ast.py +0 -0
  190. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/grep_ast/main.py +0 -0
  191. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/grep_ast/parsers.py +0 -0
  192. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/grep_ast/tsl.py +0 -0
  193. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/hashline.py +0 -0
  194. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/hashpos/__init__.py +0 -0
  195. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/hashpos/hashpos.py +0 -0
  196. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/leak_detect.py +0 -0
  197. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/model_providers.py +0 -0
  198. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/monorepo/__init__.py +0 -0
  199. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/monorepo/config.py +0 -0
  200. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/monorepo/project.py +0 -0
  201. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/monorepo/workspace.py +0 -0
  202. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/monorepo/worktree.py +0 -0
  203. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/nested.py +0 -0
  204. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/observations/__init__.py +0 -0
  205. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/observations/manager.py +0 -0
  206. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/plugin_manager.py +0 -0
  207. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/profiler.py +0 -0
  208. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/requests.py +0 -0
  209. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/responses.py +0 -0
  210. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/similarity.py +0 -0
  211. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/helpers/skills.py +0 -0
  212. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/history.py +0 -0
  213. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/hooks/__init__.py +0 -0
  214. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/hooks/base.py +0 -0
  215. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/hooks/integration.py +0 -0
  216. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/hooks/manager.py +0 -0
  217. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/hooks/registry.py +0 -0
  218. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/hooks/types.py +0 -0
  219. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/interruptible_input.py +0 -0
  220. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/io.py +0 -0
  221. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/linter.py +0 -0
  222. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/llm.py +0 -0
  223. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/mcp/__init__.py +0 -0
  224. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/mcp/manager.py +0 -0
  225. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/mcp/oauth.py +0 -0
  226. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/mcp/server.py +0 -0
  227. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/mcp/utils.py +0 -0
  228. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/mdstream.py +0 -0
  229. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/models.py +0 -0
  230. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/onboarding.py +0 -0
  231. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/__init__.py +0 -0
  232. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/architect.yml +0 -0
  233. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/ask.yml +0 -0
  234. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/base.yml +0 -0
  235. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/context.yml +0 -0
  236. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/copypaste.yml +0 -0
  237. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/editblock.yml +0 -0
  238. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/editblock_fenced.yml +0 -0
  239. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/editblock_func.yml +0 -0
  240. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/editor_diff_fenced.yml +0 -0
  241. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/editor_editblock.yml +0 -0
  242. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/editor_whole.yml +0 -0
  243. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/hashline.yml +0 -0
  244. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/help.yml +0 -0
  245. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/patch.yml +0 -0
  246. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/single_wholefile_func.yml +0 -0
  247. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/udiff.yml +0 -0
  248. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/udiff_simple.yml +0 -0
  249. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/utils/__init__.py +0 -0
  250. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/utils/registry.py +0 -0
  251. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/utils/system.py +0 -0
  252. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/wholefile.yml +0 -0
  253. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/prompts/wholefile_func.yml +0 -0
  254. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/README.md +0 -0
  255. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  256. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  257. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  258. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/clojure-tags.scm +0 -0
  259. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  260. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  261. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  262. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  263. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  264. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  265. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  266. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  267. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  268. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  269. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  270. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  271. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  272. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/matlab-tags.scm +0 -0
  273. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/ocaml-tags.scm +0 -0
  274. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +0 -0
  275. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  276. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  277. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  278. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  279. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  280. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  281. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  282. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  283. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  284. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  285. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/README.md +0 -0
  286. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/c-tags.scm +0 -0
  287. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  288. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  289. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/dart-tags.scm +0 -0
  290. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  291. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  292. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/elm-tags.scm +0 -0
  293. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/fortran-tags.scm +0 -0
  294. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/go-tags.scm +0 -0
  295. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/haskell-tags.scm +0 -0
  296. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  297. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/java-tags.scm +0 -0
  298. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  299. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/julia-tags.scm +0 -0
  300. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  301. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/matlab-tags.scm +0 -0
  302. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  303. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/ocaml_interface-tags.scm +0 -0
  304. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/php-tags.scm +0 -0
  305. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/python-tags.scm +0 -0
  306. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/ql-tags.scm +0 -0
  307. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  308. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/rust-tags.scm +0 -0
  309. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/scala-tags.scm +0 -0
  310. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  311. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/queries/tree-sitter-languages/zig-tags.scm +0 -0
  312. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/reasoning_tags.py +0 -0
  313. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/repomap.py +0 -0
  314. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/report.py +0 -0
  315. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/resources/__init__.py +0 -0
  316. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/resources/model-metadata.json +0 -0
  317. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/resources/model-settings.yml +0 -0
  318. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/resources/providers.json +0 -0
  319. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/run_cmd.py +0 -0
  320. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/scrape.py +0 -0
  321. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/sendchat.py +0 -0
  322. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/special.py +0 -0
  323. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/__init__.py +0 -0
  324. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/command.py +0 -0
  325. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/command_interactive.py +0 -0
  326. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/context_manager.py +0 -0
  327. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/explore_code.py +0 -0
  328. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/finished.py +0 -0
  329. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/git_branch.py +0 -0
  330. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/git_diff.py +0 -0
  331. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/git_log.py +0 -0
  332. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/git_remote.py +0 -0
  333. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/git_show.py +0 -0
  334. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/git_status.py +0 -0
  335. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/grep.py +0 -0
  336. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/load_skill.py +0 -0
  337. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/ls.py +0 -0
  338. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/remove_skill.py +0 -0
  339. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/thinking.py +0 -0
  340. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/undo_change.py +0 -0
  341. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/update_todo_list.py +0 -0
  342. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/utils/base_tool.py +0 -0
  343. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/utils/output.py +0 -0
  344. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tools/utils/registry.py +0 -0
  345. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/__init__.py +0 -0
  346. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/io.py +0 -0
  347. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/styles.tcss +0 -0
  348. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/widgets/__init__.py +0 -0
  349. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/widgets/completion_bar.py +0 -0
  350. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/widgets/file_list.py +0 -0
  351. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/widgets/footer.py +0 -0
  352. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/widgets/input_area.py +0 -0
  353. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/widgets/input_container.py +0 -0
  354. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/widgets/key_hints.py +0 -0
  355. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/widgets/output.py +0 -0
  356. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/widgets/status_bar.py +0 -0
  357. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/tui/worker.py +0 -0
  358. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/urls.py +0 -0
  359. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/utils.py +0 -0
  360. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/versioncheck.py +0 -0
  361. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/voice.py +0 -0
  362. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/waiting.py +0 -0
  363. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/watch.py +0 -0
  364. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/watch_prompts.py +0 -0
  365. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/Gemfile +0 -0
  366. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/blame.md +0 -0
  367. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/get-started.md +0 -0
  368. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/help-tip.md +0 -0
  369. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/help.md +0 -0
  370. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/install.md +0 -0
  371. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/keys.md +0 -0
  372. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/model-warnings.md +0 -0
  373. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/multi-line.md +0 -0
  374. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/python-m-aider.md +0 -0
  375. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/recording.css +0 -0
  376. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/recording.md +0 -0
  377. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_includes/works-best.md +0 -0
  378. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/_features.scss +0 -0
  379. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/_footer.scss +0 -0
  380. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/_hero.scss +0 -0
  381. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/_info.scss +0 -0
  382. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/_layout.scss +0 -0
  383. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/_reset.scss +0 -0
  384. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/_testimonials.scss +0 -0
  385. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/_typography.scss +0 -0
  386. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/_variables.scss +0 -0
  387. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/custom/custom.scss +0 -0
  388. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/_sass/global-overrides.scss +0 -0
  389. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/adv-model-settings.md +0 -0
  390. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/agent-mode.md +0 -0
  391. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/aider_conf.md +0 -0
  392. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/api-keys.md +0 -0
  393. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/custom-commands.md +0 -0
  394. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/custom-system-prompts.md +0 -0
  395. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/dotenv.md +0 -0
  396. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/editor.md +0 -0
  397. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/hooks.md +0 -0
  398. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/mcp.md +0 -0
  399. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/model-aliases.md +0 -0
  400. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/options.md +0 -0
  401. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/reasoning.md +0 -0
  402. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/security.md +0 -0
  403. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/skills.md +0 -0
  404. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/tui.md +0 -0
  405. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config/workspaces.md +0 -0
  406. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/config.md +0 -0
  407. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/faq.md +0 -0
  408. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/git.md +0 -0
  409. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/index.md +0 -0
  410. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/install/docker.md +0 -0
  411. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/install/optional.md +0 -0
  412. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/install.md +0 -0
  413. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/languages.md +0 -0
  414. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/legal/contributor-agreement.md +0 -0
  415. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/legal/privacy.md +0 -0
  416. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/anthropic.md +0 -0
  417. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/azure.md +0 -0
  418. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/bedrock.md +0 -0
  419. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/cohere.md +0 -0
  420. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/deepseek.md +0 -0
  421. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/gemini.md +0 -0
  422. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/github.md +0 -0
  423. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/groq.md +0 -0
  424. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/lm-studio.md +0 -0
  425. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/ollama.md +0 -0
  426. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/openai-compat.md +0 -0
  427. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/openai.md +0 -0
  428. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/openrouter.md +0 -0
  429. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/other.md +0 -0
  430. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/vertex.md +0 -0
  431. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/warnings.md +0 -0
  432. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms/xai.md +0 -0
  433. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/llms.md +0 -0
  434. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/more/analytics.md +0 -0
  435. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/more/edit-formats.md +0 -0
  436. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/more/infinite-output.md +0 -0
  437. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/more-info.md +0 -0
  438. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/repomap.md +0 -0
  439. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/scripting.md +0 -0
  440. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/troubleshooting/cecli-not-found.md +0 -0
  441. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/troubleshooting/edit-errors.md +0 -0
  442. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/troubleshooting/imports.md +0 -0
  443. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/troubleshooting/models-and-keys.md +0 -0
  444. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/troubleshooting/support.md +0 -0
  445. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/troubleshooting/token-limits.md +0 -0
  446. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/troubleshooting/warnings.md +0 -0
  447. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/troubleshooting.md +0 -0
  448. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/commands.md +0 -0
  449. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/conventions.md +0 -0
  450. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/copypaste.md +0 -0
  451. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/images-urls.md +0 -0
  452. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/lint-test.md +0 -0
  453. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/modes.md +0 -0
  454. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/not-code.md +0 -0
  455. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/notifications.md +0 -0
  456. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/sessions.md +0 -0
  457. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/tips.md +0 -0
  458. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/voice.md +0 -0
  459. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage/watch.md +0 -0
  460. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/docs/usage.md +0 -0
  461. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli/website/share/index.md +0 -0
  462. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli_dev.egg-info/dependency_links.txt +0 -0
  463. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli_dev.egg-info/entry_points.txt +0 -0
  464. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli_dev.egg-info/requires.txt +0 -0
  465. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/cecli_dev.egg-info/top_level.txt +0 -0
  466. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/docker/Dockerfile +0 -0
  467. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/docker/Dockerfile.local.nvidia.cuda.ubuntu +0 -0
  468. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/pyproject.toml +0 -0
  469. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/pytest.ini +0 -0
  470. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/requirements/common-constraints.txt +0 -0
  471. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/requirements/requirements-dev.in +0 -0
  472. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/requirements/requirements-dev.txt +0 -0
  473. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/requirements/requirements-help.in +0 -0
  474. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/requirements/requirements-help.txt +0 -0
  475. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/requirements/requirements-playwright.in +0 -0
  476. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/requirements/requirements-playwright.txt +0 -0
  477. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/requirements/requirements.in +0 -0
  478. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/requirements/tree-sitter.in +0 -0
  479. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/requirements.txt +0 -0
  480. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/30k-image.py +0 -0
  481. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/Dockerfile.jekyll +0 -0
  482. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/__init__.py +0 -0
  483. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/blame.py +0 -0
  484. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/clean_metadata.py +0 -0
  485. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/cost_analyzer.py +0 -0
  486. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/dl_icons.py +0 -0
  487. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/filter-chat-mode.js +0 -0
  488. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/generate_providers.py +0 -0
  489. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/get_contributor_list.js +0 -0
  490. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/get_hashline.py +0 -0
  491. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/history_prompts.py +0 -0
  492. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/homepage.py +0 -0
  493. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/issues.py +0 -0
  494. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/jekyll_build.sh +0 -0
  495. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/jekyll_run.sh +0 -0
  496. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/logo_svg.py +0 -0
  497. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/pip-compile.sh +0 -0
  498. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/recording_audio.py +0 -0
  499. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/redact-cast.py +0 -0
  500. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/rename_to_cecli.py +0 -0
  501. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/tmux_record.sh +0 -0
  502. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/tsl_pack_langs.py +0 -0
  503. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/update-blame.sh +0 -0
  504. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/update-docs.sh +0 -0
  505. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/update-history.py +0 -0
  506. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/versionbump.py +0 -0
  507. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/scripts/yank-old-versions.py +0 -0
  508. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/setup.cfg +0 -0
  509. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/shim.pyproject.toml +0 -0
  510. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/__init__.py +0 -0
  511. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/__init__.py +0 -0
  512. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_aws_credentials.py +0 -0
  513. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_background_commands.py +0 -0
  514. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_coder.py +0 -0
  515. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_commands.py +0 -0
  516. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_custom_commands.py +0 -0
  517. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_deprecated.py +0 -0
  518. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_editblock.py +0 -0
  519. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_editor.py +0 -0
  520. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_exceptions.py +0 -0
  521. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_find_or_blocks.py +0 -0
  522. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_hashline.py +0 -0
  523. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_history.py +0 -0
  524. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_io.py +0 -0
  525. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_linter.py +0 -0
  526. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_main.py +0 -0
  527. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_model_info_manager.py +0 -0
  528. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_model_provider_manager.py +0 -0
  529. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_models.py +0 -0
  530. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_onboarding.py +0 -0
  531. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_plugin_manager.py +0 -0
  532. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_prompts.py +0 -0
  533. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_reasoning.py +0 -0
  534. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_repo.py +0 -0
  535. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_repomap.py +0 -0
  536. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_run_cmd.py +0 -0
  537. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_sanity_check_repo.py +0 -0
  538. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_scripting.py +0 -0
  539. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_sendchat.py +0 -0
  540. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_skills.py +0 -0
  541. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_special.py +0 -0
  542. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_ssl_verification.py +0 -0
  543. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_udiff.py +0 -0
  544. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_urls.py +0 -0
  545. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_voice.py +0 -0
  546. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_watch.py +0 -0
  547. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/basic/test_wholefile.py +0 -0
  548. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/coders/test_copypaste_coder.py +0 -0
  549. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/conftest.py +0 -0
  550. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/conversations/test_conversation_integration.py +0 -0
  551. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/conversations/test_conversation_system.py +0 -0
  552. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/chat-history-search-replace-gold.txt +0 -0
  553. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/chat-history.md +0 -0
  554. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/arduino/test.ino +0 -0
  555. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/c/test.c +0 -0
  556. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/chatito/test.chatito +0 -0
  557. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/clojure/test.clj +0 -0
  558. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/commonlisp/test.lisp +0 -0
  559. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/cpp/test.cpp +0 -0
  560. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/csharp/test.cs +0 -0
  561. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/d/test.d +0 -0
  562. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/dart/test.dart +0 -0
  563. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/elisp/test.el +0 -0
  564. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/elixir/test.ex +0 -0
  565. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/elm/test.elm +0 -0
  566. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/gleam/test.gleam +0 -0
  567. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/go/test.go +0 -0
  568. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/haskell/test.hs +0 -0
  569. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/hcl/test.tf +0 -0
  570. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/java/test.java +0 -0
  571. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/javascript/test.js +0 -0
  572. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/kotlin/test.kt +0 -0
  573. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/lua/test.lua +0 -0
  574. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/matlab/test.m +0 -0
  575. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/ocaml/test.ml +0 -0
  576. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/ocaml_interface/test.mli +0 -0
  577. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/php/test.php +0 -0
  578. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/pony/test.pony +0 -0
  579. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/properties/test.properties +0 -0
  580. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/python/test.py +0 -0
  581. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/ql/test.ql +0 -0
  582. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/r/test.r +0 -0
  583. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/racket/test.rkt +0 -0
  584. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/ruby/test.rb +0 -0
  585. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/rust/test.rs +0 -0
  586. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/scala/test.scala +0 -0
  587. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/solidity/test.sol +0 -0
  588. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/swift/test.swift +0 -0
  589. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/tsx/test.tsx +0 -0
  590. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/typescript/test.ts +0 -0
  591. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/udev/test.rules +0 -0
  592. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/languages/zig/test.zig +0 -0
  593. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/sample-code-base/sample.js +0 -0
  594. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/sample-code-base/sample.py +0 -0
  595. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/sample-code-base-repo-map.txt +0 -0
  596. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/watch.js +0 -0
  597. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/watch.lisp +0 -0
  598. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/watch.py +0 -0
  599. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/fixtures/watch_question.js +0 -0
  600. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/help/test_help.py +0 -0
  601. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/helpers/monorepo/test_config.py +0 -0
  602. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/helpers/monorepo/test_config_active.py +0 -0
  603. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/helpers/monorepo/test_ignore_logic.py +0 -0
  604. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/helpers/monorepo/test_repomap_workspace.py +0 -0
  605. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/helpers/monorepo/test_workspace.py +0 -0
  606. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/helpers/observations/test_observation_manager.py +0 -0
  607. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/hooks/__init__.py +0 -0
  608. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/hooks/test_base.py +0 -0
  609. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/hooks/test_manager.py +0 -0
  610. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/hooks/test_registry.py +0 -0
  611. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/mcp/__init__.py +0 -0
  612. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/mcp/test_manager.py +0 -0
  613. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/scrape/test_playwright_disable.py +0 -0
  614. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/scrape/test_scrape.py +0 -0
  615. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/tools/test_get_lines.py +0 -0
  616. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/tools/test_git_branch.py +0 -0
  617. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/tools/test_git_diff.py +0 -0
  618. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/tools/test_grep.py +0 -0
  619. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/tools/test_insert_block.py +0 -0
  620. {cecli_dev-0.99.8 → cecli_dev-0.99.9}/tests/tools/test_registry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cecli-dev
3
- Version: 0.99.8
3
+ Version: 0.99.9
4
4
  Summary: we also can't pronounce cecli
5
5
  Project-URL: Homepage, https://github.com/dwash96/cecli
6
6
  Project-URL: Documentation, https://github.com/dwash96/cecli
@@ -1,6 +1,6 @@
1
1
  from packaging import version
2
2
 
3
- __version__ = "0.99.7.dev"
3
+ __version__ = "0.99.9.dev"
4
4
  safe_version = __version__
5
5
 
6
6
  try:
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.99.8'
22
- __version_tuple__ = version_tuple = (0, 99, 8)
21
+ __version__ = version = '0.99.9'
22
+ __version_tuple__ = version_tuple = (0, 99, 9)
23
23
 
24
- __commit_id__ = commit_id = 'g2e022d0e6'
24
+ __commit_id__ = commit_id = 'g7edfde9ea'
@@ -618,9 +618,7 @@ class AgentCoder(Coder):
618
618
  total_file_tokens += tokens
619
619
  editable_tokens += tokens
620
620
  size_indicator = (
621
- "🔴 Large"
622
- if tokens > 5000
623
- else "🟡 Medium" if tokens > 1000 else "🟢 Small"
621
+ "Large" if tokens > 5000 else "Medium" if tokens > 1000 else "Small"
624
622
  )
625
623
  editable_files.append(
626
624
  f"- {rel_fname}: {tokens:,} tokens ({size_indicator})"
@@ -642,9 +640,7 @@ class AgentCoder(Coder):
642
640
  total_file_tokens += tokens
643
641
  readonly_tokens += tokens
644
642
  size_indicator = (
645
- "🔴 Large"
646
- if tokens > 5000
647
- else "🟡 Medium" if tokens > 1000 else "🟢 Small"
643
+ "Large" if tokens > 5000 else "Medium" if tokens > 1000 else "Small"
648
644
  )
649
645
  readonly_files.append(
650
646
  f"- {rel_fname}: {tokens:,} tokens ({size_indicator})"
@@ -2178,6 +2178,8 @@ class Coder:
2178
2178
  # Notify IO that LLM processing is starting
2179
2179
  self.io.llm_started()
2180
2180
 
2181
+ ConversationService.get_manager(self).flush_queue()
2182
+
2181
2183
  if inp:
2182
2184
  # Make sure current coder actually has control of conversation system
2183
2185
  ConversationService.get_chunks(self).initialize_conversation_system()
@@ -3723,7 +3725,7 @@ class Coder:
3723
3725
  self.check_for_dirty_commit(path)
3724
3726
  return True
3725
3727
 
3726
- if self.repo and self.repo.git_ignored_file(path):
3728
+ if self.repo and self.repo.git_ignored_file(path) and not self.add_gitignore_files:
3727
3729
  self.io.tool_warning(f"Skipping edits to {path} that matches gitignore spec.")
3728
3730
  return
3729
3731
 
@@ -3742,7 +3744,8 @@ class Coder:
3742
3744
  # actually already part of the repo.
3743
3745
  # But let's only add if we need to, just to be safe.
3744
3746
  if need_to_add:
3745
- self.repo.repo.git.add(full_path)
3747
+ if not (self.add_gitignore_files and self.repo.git_ignored_file(path)):
3748
+ self.repo.repo.git.add(full_path)
3746
3749
 
3747
3750
  self.abs_fnames.add(full_path)
3748
3751
  self.check_added_files()
@@ -3756,7 +3759,8 @@ class Coder:
3756
3759
  return
3757
3760
 
3758
3761
  if need_to_add:
3759
- self.repo.repo.git.add(full_path)
3762
+ if not (self.add_gitignore_files and self.repo.git_ignored_file(path)):
3763
+ self.repo.repo.git.add(full_path)
3760
3764
 
3761
3765
  self.abs_fnames.add(full_path)
3762
3766
  self.check_added_files()
@@ -4003,7 +4007,10 @@ class Coder:
4003
4007
  return edits
4004
4008
 
4005
4009
  def local_agent_folder(self, path):
4006
- os.makedirs(f".cecli/agents/{GLOBAL_DATE}/{self.uuid}", exist_ok=True)
4010
+ os.makedirs(
4011
+ self.abs_root_path(f".cecli/agents/{GLOBAL_DATE}/{self.uuid}"),
4012
+ exist_ok=True,
4013
+ )
4007
4014
 
4008
4015
  stripped = path.lstrip("/")
4009
4016
  return f".cecli/agents/{GLOBAL_DATE}/{self.uuid}/{stripped}"
@@ -18,7 +18,7 @@ class LoadSessionCommand(BaseCommand):
18
18
  from cecli import sessions
19
19
 
20
20
  session_manager = sessions.SessionManager(coder, io)
21
- session_manager.load_session(args.strip())
21
+ await session_manager.load_session(args.strip())
22
22
 
23
23
  return format_command_result(io, "load-session", f"Loaded session: {args.strip()}")
24
24
 
@@ -446,7 +446,7 @@ class ConversationChunks:
446
446
  dict(role="user", content=repo_content),
447
447
  dict(
448
448
  role="assistant",
449
- content="Ok, I won't try and edit those files without asking first.",
449
+ content="Thank you, these files will help with navigating the codebase.",
450
450
  ),
451
451
  ]
452
452
 
@@ -781,14 +781,14 @@ class ConversationChunks:
781
781
  }
782
782
 
783
783
  # Add to conversation manager
784
- ConversationService.get_manager(coder).add_message(
784
+ ConversationService.get_manager(coder).queue_message(
785
785
  message_dict=user_msg,
786
786
  tag=MessageTag.FILE_CONTEXTS,
787
787
  hash_key=("file_context_user", file_path),
788
788
  force=True,
789
789
  )
790
790
 
791
- ConversationService.get_manager(coder).add_message(
791
+ ConversationService.get_manager(coder).queue_message(
792
792
  message_dict=assistant_msg,
793
793
  tag=MessageTag.FILE_CONTEXTS,
794
794
  hash_key=("file_context_assistant", file_path),
@@ -25,6 +25,7 @@ class ConversationManager:
25
25
  self._tag_cache: Dict[str, List[Dict[str, Any]]] = {}
26
26
  self._ALL_MESSAGES_CACHE_KEY = "__all__"
27
27
  self.DEFAULT_TAG_PROMOTION_VALUE: int = 999
28
+ self._queue: List[Dict[str, Any]] = []
28
29
 
29
30
  @classmethod
30
31
  def get_instance(cls, coder) -> "ConversationManager":
@@ -193,6 +194,33 @@ class ConversationManager:
193
194
  self._tag_cache.pop(self._ALL_MESSAGES_CACHE_KEY, None)
194
195
  return message
195
196
 
197
+ def queue_message(self, **kwargs) -> None:
198
+ """
199
+ Queue an add_message() call for later insertion.
200
+
201
+ Accepts the same keyword arguments as add_message()
202
+ and stores them in an internal queue to be flushed
203
+ later via flush_queue().
204
+ """
205
+ self._queue.append(kwargs)
206
+
207
+ def flush_queue(self) -> List[Any]:
208
+ """
209
+ Flush all queued add_message() calls.
210
+
211
+ Calls add_message() for each set of kwargs in the
212
+ internal queue, then clears the queue.
213
+
214
+ Returns:
215
+ List of BaseMessage instances returned by add_message()
216
+ """
217
+ results = []
218
+ while self._queue:
219
+ kwargs = self._queue.pop(0)
220
+ result = self.add_message(**kwargs)
221
+ results.append(result)
222
+ return results
223
+
196
224
  def base_sort(self, messages: List[BaseMessage]) -> List[BaseMessage]:
197
225
  """
198
226
  Sorts messages by effective priority (promotion if mark_for_demotion has not elapsed yet), then timestamp.
@@ -1198,7 +1198,7 @@ async def main_async(argv=None, input=None, output=None, force_git_root=None, re
1198
1198
  from cecli.sessions import SessionManager
1199
1199
 
1200
1200
  session_manager = SessionManager(coder, io)
1201
- session_manager.load_session(
1201
+ await session_manager.load_session(
1202
1202
  args.auto_save_session_name if args.auto_save_session_name else "auto-save"
1203
1203
  )
1204
1204
  except Exception:
@@ -14,6 +14,10 @@ files_no_full_files_with_repo_map: |
14
14
  I have a repository map. I will use it to target my navigation and add relevant files to the context.
15
15
  </context>
16
16
 
17
+ repo_content_prefix: |
18
+ Here are summaries of some files present in my git repository.
19
+ These files should be helpful for navigating the codebase.
20
+
17
21
  main_system: |
18
22
  <context name="role_and_directives">
19
23
  ## Core Directives
@@ -34,7 +38,7 @@ main_system: |
34
38
  uXdn::def example_method():
35
39
  WAR5:: return "example"
36
40
  vwkS::
37
- </context>
41
+ </context>
38
42
 
39
43
  <context name="workflow_and_tool_usage">
40
44
  ## Core Workflow
@@ -60,7 +64,6 @@ system_reminder: |
60
64
  ## Operational Rules
61
65
  - **Scope**: No unrequested refactors. Edit files incrementally; avoid full-file rewrites.
62
66
  - **Hygiene**: Use `ContextManager`/`RemoveSkill` to evict unneeded files/skills immediately after use.
63
- - **Preparation**: Use `GetLines` to verify hashline ranges before every edit. Capture entire functions, logical blocks and closures.
64
67
  - **Outputs**: Tool calls trigger turns. Never include tool syntax in final user summaries.
65
68
  - **Sandbox**: Perform all verification and temp logic in `.cecli/temp`.
66
69
  - **Vibe**: Zero conversational filler. Do not confirm instructions or state "I understand." Provide status updates only when you have new information.
@@ -348,12 +348,28 @@ class GitRepo:
348
348
  cmd.append("--no-verify")
349
349
  if fnames:
350
350
  fnames = [str(self.abs_root_path(fn)) for fn in fnames]
351
+ added_fnames = []
351
352
  for fname in fnames:
352
353
  try:
354
+ # Check if file is git-ignored before trying to add
355
+ if (
356
+ coder
357
+ and hasattr(coder, "add_gitignore_files")
358
+ and coder.add_gitignore_files
359
+ ):
360
+ rel_fname = self.get_rel_fname(fname)
361
+ if self.git_ignored_file(rel_fname):
362
+ # Skip git-ignored files when add_gitignore_files is enabled
363
+ continue
353
364
  self.repo.git.add(fname)
365
+ added_fnames.append(fname)
354
366
  except ANY_GIT_ERROR as err:
355
367
  self.io.tool_error(f"Unable to add {fname}: {err}")
356
- cmd += ["--"] + fnames
368
+ if added_fnames:
369
+ cmd += ["--"] + added_fnames
370
+ else:
371
+ # No files to commit (all were git-ignored or failed to add)
372
+ return
357
373
  else:
358
374
  cmd += ["-a"]
359
375
 
@@ -392,6 +408,12 @@ class GitRepo:
392
408
  except (ValueError, OSError):
393
409
  return self.repo.git_dir
394
410
 
411
+ def get_rel_fname(self, fname):
412
+ try:
413
+ return os.path.relpath(fname, self.root)
414
+ except ValueError:
415
+ return fname
416
+
395
417
  async def get_commit_message(self, diffs, context, user_language=None):
396
418
  diffs = "# Diffs:\n" + diffs
397
419
 
@@ -88,7 +88,7 @@ class SessionManager:
88
88
 
89
89
  return sessions
90
90
 
91
- def load_session(self, session_identifier: str) -> bool:
91
+ async def load_session(self, session_identifier: str) -> bool:
92
92
  """Load a saved session by name or file path."""
93
93
  if not session_identifier:
94
94
  self.io.tool_error("Please provide a session name or file path.")
@@ -112,7 +112,17 @@ class SessionManager:
112
112
  return False
113
113
 
114
114
  # Apply session data
115
- return self._apply_session_data(session_data, session_file)
115
+ applied = await self._apply_session_data(session_data, session_file)
116
+ if applied:
117
+ from cecli.commands import SwitchCoderSignal
118
+
119
+ raise SwitchCoderSignal(
120
+ edit_format=self.coder.edit_format,
121
+ from_coder=self.coder,
122
+ summarize_from_coder=False,
123
+ show_announcements=True,
124
+ )
125
+ return applied
116
126
 
117
127
  def _build_session_data(self, session_name) -> Dict:
118
128
  """Build session data dictionary from current coder state."""
@@ -140,6 +150,39 @@ class SessionManager:
140
150
  self.io.tool_warning(f"Could not read todo list file: {e}")
141
151
 
142
152
  # Get CUR and DONE messages from ConversationManager
153
+ connected_mcps = []
154
+ if hasattr(self.coder, "mcp_manager") and self.coder.mcp_manager:
155
+ connected_mcps = [server.name for server in self.coder.mcp_manager.connected_servers]
156
+
157
+ # Get CUR and DONE messages from ConversationManager
158
+ connected_mcps = []
159
+ if hasattr(self.coder, "mcp_manager") and self.coder.mcp_manager:
160
+ connected_mcps = [server.name for server in self.coder.mcp_manager.connected_servers]
161
+
162
+ skills_data = None
163
+ if hasattr(self.coder, "skills_manager") and self.coder.skills_manager:
164
+ skills_data = {
165
+ "skills_paths": [str(p) for p in self.coder.skills_manager.directory_paths],
166
+ "skills_includelist": (
167
+ list(self.coder.skills_manager.include_list)
168
+ if self.coder.skills_manager.include_list is not None
169
+ else []
170
+ ),
171
+ "skills_excludelist": (
172
+ list(self.coder.skills_manager.exclude_list)
173
+ if self.coder.skills_manager.exclude_list is not None
174
+ else []
175
+ ),
176
+ }
177
+
178
+ agent_config_data = None
179
+ if hasattr(self.coder, "agent_config"):
180
+ agent_config_data = {
181
+ "tools_paths": self.coder.agent_config.get("tools_paths", []),
182
+ "tools_includelist": self.coder.agent_config.get("tools_includelist", []),
183
+ "tools_excludelist": self.coder.agent_config.get("tools_excludelist", []),
184
+ }
185
+
143
186
  return {
144
187
  "version": 1,
145
188
  "session_name": session_name,
@@ -168,6 +211,9 @@ class SessionManager:
168
211
  "auto_test": self.coder.auto_test,
169
212
  },
170
213
  "todo_list": todo_content,
214
+ "mcps": connected_mcps,
215
+ "skills": skills_data,
216
+ "tools": agent_config_data,
171
217
  }
172
218
 
173
219
  def _find_session_file(self, session_identifier: str) -> Optional[Path]:
@@ -194,7 +240,7 @@ class SessionManager:
194
240
  self.io.tool_output("Use /list-sessions to see available sessions.")
195
241
  return None
196
242
 
197
- def _apply_session_data(self, session_data: Dict, session_file: Path) -> bool:
243
+ async def _apply_session_data(self, session_data: Dict, session_file: Path) -> bool:
198
244
  """Apply session data to current coder state."""
199
245
  try:
200
246
  # Clear current state
@@ -303,6 +349,40 @@ class SessionManager:
303
349
  )
304
350
  self.io.tool_output(f"Loaded {num_messages} messages and {num_files} files")
305
351
 
352
+ # Load MCPs
353
+ saved_mcps = session_data.get("mcps", [])
354
+ if hasattr(self.coder, "mcp_manager") and self.coder.mcp_manager:
355
+ current_mcps = {server.name for server in self.coder.mcp_manager.connected_servers}
356
+ saved_mcps_set = set(saved_mcps)
357
+
358
+ to_disconnect = current_mcps - saved_mcps_set
359
+ for mcp_name in to_disconnect:
360
+ await self.coder.mcp_manager.disconnect_server(mcp_name)
361
+
362
+ to_connect = saved_mcps_set - current_mcps
363
+ for mcp_name in to_connect:
364
+ await self.coder.mcp_manager.connect_server(mcp_name)
365
+
366
+ # Load skills
367
+ skills_data = session_data.get("skills")
368
+ if skills_data and hasattr(self.coder, "skills_manager") and self.coder.skills_manager:
369
+ self.coder.skills_manager.directory_paths = skills_data.get("skills_paths", [])
370
+ self.coder.skills_manager.include_list = set(
371
+ skills_data.get("skills_includelist", [])
372
+ )
373
+ self.coder.skills_manager.exclude_list = set(
374
+ skills_data.get("skills_excludelist", [])
375
+ )
376
+
377
+ # Load tools config
378
+ agent_config_data = session_data.get("tools")
379
+ if agent_config_data and hasattr(self.coder, "agent_config"):
380
+ self.coder.agent_config.update(agent_config_data)
381
+ from cecli.tools.utils.registry import ToolRegistry
382
+
383
+ ToolRegistry.build_registry(agent_config=self.coder.agent_config)
384
+ self.coder.loaded_custom_tools = ToolRegistry.loaded_custom_tools
385
+
306
386
  return True
307
387
 
308
388
  except Exception as e:
@@ -56,9 +56,9 @@ class Tool(BaseTool):
56
56
  "type": "string",
57
57
  "enum": ["replace", "delete", "insert"],
58
58
  "description": (
59
- "The type of operation: 'replace' (replace range with text), "
60
- "'delete' (remove range), or 'insert' (insert text after start_line). "
61
- "Defaults to 'replace'."
59
+ "The type of operation: 'replace' (replace range with"
60
+ " text), 'delete' (remove range), or 'insert' (insert text"
61
+ " after start_line). Defaults to 'replace'."
62
62
  ),
63
63
  },
64
64
  "text": {
@@ -78,8 +78,8 @@ class Tool(BaseTool):
78
78
  "end_line": {
79
79
  "type": "string",
80
80
  "description": (
81
- 'Hashline format for end line: "{4 char hash}" (without the '
82
- "braces)"
81
+ 'Hashline format for end line: "{4 char hash}" (without the'
82
+ " braces)"
83
83
  ),
84
84
  },
85
85
  },
@@ -179,8 +179,8 @@ class Tool(BaseTool):
179
179
  if operation in ("replace", "delete"):
180
180
  if edit_start_line is None:
181
181
  raise ToolError(
182
- f"Edit {edit_index + 1}: 'start_line' parameter is required "
183
- f"for '{operation}' operation"
182
+ f"Edit {edit_index + 1}: 'start_line' parameter is required"
183
+ f" for '{operation}' operation"
184
184
  )
185
185
  if edit_end_line is None:
186
186
  raise ToolError(
@@ -190,8 +190,8 @@ class Tool(BaseTool):
190
190
  if operation == "insert":
191
191
  if edit_start_line is None:
192
192
  raise ToolError(
193
- f"Edit {edit_index + 1}: 'start_line' parameter is required "
194
- "for 'insert' operation"
193
+ f"Edit {edit_index + 1}: 'start_line' parameter is required"
194
+ " for 'insert' operation"
195
195
  )
196
196
  # For insert, end_line defaults to start_line
197
197
  edit_end_line = edit_end_line or edit_start_line
@@ -19,16 +19,17 @@ class Tool(BaseTool):
19
19
  "function": {
20
20
  "name": "GetLines",
21
21
  "description": (
22
- "Get hashline prefixes of context between start and end patterns in multiple files."
23
- " Accepts an array of show objects, each with file_path, start_text,"
24
- " end_text, and optional padding. Special markers '@000' and '000@' can be"
25
- " used for start_text and end_text to represent the first and last lines of"
26
- " the file respectively. Never use hashlines as the start_text and end_text"
27
- " values. These values must be lines from the content of the file."
22
+ "Get hashline prefixes of content between start and end patterns in files."
23
+ " Accepts an array of `show` objects, each with file_path, start_text,"
24
+ " end_text, and optional padding."
25
+ " These values must be lines from the content of the file."
28
26
  " They can contain up to 3 lines but newlines should generally be avoided."
29
- " Avoid using generic keywords."
27
+ " Avoid using generic keywords and symbols. Special markers '@000' and '000@' can be"
28
+ " used for start_text and end_text to represent the first and last lines of"
29
+ " the file respectively. Avoid using the special markers on non-empty files."
30
+ " Never use hashlines as the start_text and end_text values."
30
31
  " Do not use the same pattern for the start_text and end_text."
31
- " It is usually best to use function names and other block identifiers as "
32
+ " It is best to use function names, variable declarations and other block identifiers as "
32
33
  " start_texts and end_texts."
33
34
  ),
34
35
  "parameters": {
@@ -47,14 +48,14 @@ class Tool(BaseTool):
47
48
  "type": "string",
48
49
  "description": (
49
50
  "The content marking the beginning of the context range."
50
- " Use '@000' for the first line."
51
+ " Use '@000' for the first line on empty files."
51
52
  ),
52
53
  },
53
54
  "end_text": {
54
55
  "type": "string",
55
56
  "description": (
56
- "The content marking the end of the context range. Use"
57
- " '000@' for the last line."
57
+ "The content marking the end of the context range."
58
+ " Use '000@' for the last line on empty files."
58
59
  ),
59
60
  },
60
61
  "padding": {
@@ -76,6 +77,8 @@ class Tool(BaseTool):
76
77
  },
77
78
  }
78
79
 
80
+ _last_invocation = {} # file_path -> {start_idx, end_idx}
81
+
79
82
  @classmethod
80
83
  def execute(cls, coder, show, **kwargs):
81
84
  """
@@ -172,59 +175,68 @@ class Tool(BaseTool):
172
175
  end_indices.append(i + len(end_pattern_lines) - 1)
173
176
 
174
177
  if len(start_indices) > 5:
175
- raise ToolError(
176
- f"Start pattern '{start_text}' too broad. Do not search for"
177
- " it again. Be more specific."
178
- )
179
-
180
- # if len(end_indices) > 5:
181
- # raise ToolError(
182
- # f"End pattern '{end_text}' too broad. Do not search for it"
183
- # " again. Be more specific."
184
- # )
185
-
186
- best_pair = None
187
- min_dist = float("inf")
188
-
189
- for s in start_indices:
190
- for e in [idx for idx in end_indices if idx >= s]:
191
- dist = e - s
192
- if dist < min_dist:
193
- min_dist = dist
194
- best_pair = (s, e)
195
-
196
- if not start_indices:
197
- raise ToolError(
198
- f"Start pattern '{start_text}' not found in {file_path}. Do not search"
199
- " for it again."
200
- )
201
-
202
- if not end_indices:
203
- raise ToolError(
204
- f"End pattern '{end_text}' not found in {file_path}. Do not search for"
205
- " it again."
206
- )
207
-
208
- if best_pair is None:
209
- raise ToolError(
210
- f"End pattern '{end_text}' not found after start pattern in"
211
- f" {file_path}."
212
- )
178
+ # Too many matches - use _last_invocation to disambiguate
179
+ last = cls._last_invocation.get(abs_path)
180
+ if last is None:
181
+ raise ToolError(
182
+ f"Start pattern '{start_text}' too broad. Do not search for"
183
+ " it again. Be more specific."
184
+ )
185
+ # Find the best match: smallest sum of absolute distances to last start/end
186
+ # that comes after the range, with tie-breaking by smallest sum
187
+ last_s, last_e = last["start_idx"], last["end_idx"]
188
+ candidates = []
189
+ for s in start_indices:
190
+ for e in [idx for idx in end_indices if idx >= s]:
191
+ dist_sum = abs(s - last_s) + abs(e - last_e)
192
+ candidates.append((dist_sum, s, e))
193
+ # Sort by distance sum, then prefer ranges after the last range
194
+ candidates.sort(key=lambda x: (x[0], x[1] < last_s, x[1], x[2]))
195
+ best_pair = (candidates[0][1], candidates[0][2])
196
+ else:
197
+ best_pair = None
198
+ min_dist = float("inf")
199
+
200
+ for s in start_indices:
201
+ for e in [idx for idx in end_indices if idx >= s]:
202
+ dist = e - s
203
+ if dist < min_dist:
204
+ min_dist = dist
205
+ best_pair = (s, e)
206
+
207
+ if not start_indices:
208
+ raise ToolError(
209
+ f"Start pattern '{start_text}' not found in {file_path}. Do not search"
210
+ " for it again."
211
+ )
212
+
213
+ if not end_indices:
214
+ raise ToolError(
215
+ f"End pattern '{end_text}' not found in {file_path}. Do not search for"
216
+ " it again."
217
+ )
218
+
219
+ if best_pair is None:
220
+ raise ToolError(
221
+ f"End pattern '{end_text}' not found after start pattern in"
222
+ f" {file_path}."
223
+ )
213
224
  s_idx, e_idx = best_pair
225
+ # Store the found indices for future disambiguation
226
+ cls._last_invocation[abs_path] = {"start_idx": s_idx, "end_idx": e_idx}
214
227
 
215
- found_by = f"range '{start_text}' to '{end_text}'"
216
-
217
- try:
218
- padding_int = int(padding)
219
- if padding_int < 0:
220
- raise ValueError()
221
- except ValueError:
222
- coder.io.tool_warning(f"Invalid padding '{padding}', using default 5.")
223
- padding_int = 5
228
+ found_by = f"range '{start_text}' to '{end_text}'"
224
229
 
225
- start_line_idx = max(0, s_idx - padding_int)
226
- end_line_idx = min(num_lines - 1, e_idx + padding_int)
230
+ try:
231
+ padding_int = int(padding)
232
+ if padding_int < 0:
233
+ raise ValueError()
234
+ except ValueError:
235
+ coder.io.tool_warning(f"Invalid padding '{padding}', using default 5.")
236
+ padding_int = 5
227
237
 
238
+ start_line_idx = max(0, s_idx - padding_int)
239
+ end_line_idx = min(num_lines - 1, e_idx + padding_int)
228
240
  if start_line_idx == -1 or end_line_idx == -1:
229
241
  raise ToolError("Internal error: Could not determine line range.")
230
242
  # 6. Format output for this operation
@@ -279,7 +291,7 @@ class Tool(BaseTool):
279
291
  coder.io.tool_output("File contents already up to date")
280
292
  return (
281
293
  "File contents already up to date."
282
- "Do not call GetLines again with these parameters until you edit the file."
294
+ " Do not call `GetLines` again with these parameters until you edit the file."
283
295
  )
284
296
  else:
285
297
  coder.io.tool_output(f"✅ Successfully retrieved context for {len(show)} file(s)")
@@ -55,11 +55,11 @@ def validate_file_for_edit(coder, file_path):
55
55
  raise ToolError(
56
56
  f"File '{file_path}' is read-only. Make editable with `ContextManager` first."
57
57
  )
58
- else:
59
- # File exists but is not in context at all
60
- raise ToolError(
61
- f"File '{file_path}' not in context. Make editable with `ContextManager` first."
62
- )
58
+ # else:
59
+ # # File exists but is not in context at all
60
+ # raise ToolError(
61
+ # f"File '{file_path}' not in context. Make editable with `ContextManager` first."
62
+ # )
63
63
 
64
64
  # Reread content immediately before potential modification
65
65
  content = coder.io.read_text(abs_path)