cecli-dev 0.98.2__tar.gz → 0.99.1__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 (612) hide show
  1. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/workflows/ubuntu-tests.yml +6 -0
  2. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/workflows/windows-tests.yml +6 -0
  3. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/PKG-INFO +2 -1
  4. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/README.md +1 -0
  5. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/__init__.py +1 -1
  6. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/_version.py +3 -3
  7. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/args.py +13 -0
  8. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/agent_coder.py +29 -20
  9. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/base_coder.py +21 -4
  10. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/__init__.py +3 -0
  11. cecli_dev-0.99.1/cecli/commands/workspace.py +72 -0
  12. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/background_commands.py +175 -15
  13. cecli_dev-0.99.1/cecli/helpers/monorepo/config.py +149 -0
  14. cecli_dev-0.99.1/cecli/helpers/monorepo/project.py +89 -0
  15. cecli_dev-0.99.1/cecli/helpers/monorepo/workspace.py +36 -0
  16. cecli_dev-0.99.1/cecli/helpers/monorepo/worktree.py +21 -0
  17. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/main.py +47 -25
  18. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/repo.py +119 -3
  19. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/command.py +79 -18
  20. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/command_interactive.py +3 -0
  21. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/delete_text.py +4 -2
  22. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/finished.py +1 -0
  23. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/insert_text.py +4 -8
  24. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/replace_text.py +4 -2
  25. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/show_context.py +19 -8
  26. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/utils/base_tool.py +5 -4
  27. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/app.py +8 -2
  28. cecli_dev-0.99.1/cecli/website/docs/config/workspaces.md +80 -0
  29. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli_dev.egg-info/PKG-INFO +2 -1
  30. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli_dev.egg-info/SOURCES.txt +13 -2
  31. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/pytest.ini +5 -2
  32. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_io.py +4 -0
  33. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/coders/test_copypaste_coder.py +2 -2
  34. cecli_dev-0.99.1/tests/helpers/monorepo/test_config.py +50 -0
  35. cecli_dev-0.99.1/tests/helpers/monorepo/test_config_active.py +79 -0
  36. cecli_dev-0.99.1/tests/helpers/monorepo/test_repomap_workspace.py +227 -0
  37. cecli_dev-0.99.1/tests/helpers/monorepo/test_workspace.py +52 -0
  38. cecli_dev-0.99.1/tests/mcp/__init__.py +0 -0
  39. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/tools/test_show_context.py +20 -0
  40. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.dockerignore +0 -0
  41. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.flake8 +0 -0
  42. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.gitattributes +0 -0
  43. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/ISSUE_TEMPLATE/issue.yml +0 -0
  44. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/workflows/check_pypi_version.yml +0 -0
  45. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/workflows/docker-build-test.yml +0 -0
  46. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/workflows/docker-release.yml +0 -0
  47. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/workflows/issues.yml +0 -0
  48. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/workflows/pages.yml +0 -0
  49. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/workflows/pre-commit.yml +0 -0
  50. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/workflows/release.yml +0 -0
  51. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.github/workflows/windows_check_pypi_version.yml +0 -0
  52. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.gitignore +0 -0
  53. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/.pre-commit-config.yaml +0 -0
  54. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/CHANGELOG.md +0 -0
  55. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/CNAME +0 -0
  56. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/CONTRIBUTING.md +0 -0
  57. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/HISTORY.md +0 -0
  58. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/LICENSE.txt +0 -0
  59. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/MANIFEST.in +0 -0
  60. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/Dockerfile +0 -0
  61. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/README.md +0 -0
  62. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/__init__.py +0 -0
  63. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/benchmark.py +0 -0
  64. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/benchmark_classic.py +0 -0
  65. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/clone-exercism.sh +0 -0
  66. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/cpp-test.sh +0 -0
  67. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/docker.sh +0 -0
  68. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/docker_build.sh +0 -0
  69. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/install-docker-ubuntu.sh +0 -0
  70. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/npm-test.sh +0 -0
  71. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/over_time.py +0 -0
  72. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/plot.sh +0 -0
  73. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/plots.py +0 -0
  74. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/problem_stats.py +0 -0
  75. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/prompts.py +0 -0
  76. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/refactor_tools.py +0 -0
  77. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/rsync.sh +0 -0
  78. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/rungrid.py +0 -0
  79. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/swe-bench-lite.txt +0 -0
  80. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/swe-bench.txt +0 -0
  81. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/swe_bench.py +0 -0
  82. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/test_benchmark.py +0 -0
  83. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/variations.1.sh +0 -0
  84. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/variations.2.sh +0 -0
  85. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/variations.3.sh +0 -0
  86. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/benchmark/variations.4.sh +0 -0
  87. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/__main__.py +0 -0
  88. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/args_formatter.py +0 -0
  89. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/change_tracker.py +0 -0
  90. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/__init__.py +0 -0
  91. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/architect_coder.py +0 -0
  92. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/ask_coder.py +0 -0
  93. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/chat_chunks.py +0 -0
  94. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/context_coder.py +0 -0
  95. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/copypaste_coder.py +0 -0
  96. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/editblock_coder.py +0 -0
  97. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/editblock_fenced_coder.py +0 -0
  98. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/editblock_func_coder.py +0 -0
  99. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/editor_diff_fenced_coder.py +0 -0
  100. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/editor_editblock_coder.py +0 -0
  101. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/editor_whole_coder.py +0 -0
  102. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/hashline_coder.py +0 -0
  103. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/help_coder.py +0 -0
  104. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/patch_coder.py +0 -0
  105. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/search_replace.py +0 -0
  106. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/shell.py +0 -0
  107. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/single_wholefile_func_coder.py +0 -0
  108. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/udiff_coder.py +0 -0
  109. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/udiff_simple.py +0 -0
  110. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/wholefile_coder.py +0 -0
  111. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/coders/wholefile_func_coder.py +0 -0
  112. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/add.py +0 -0
  113. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/agent.py +0 -0
  114. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/agent_model.py +0 -0
  115. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/architect.py +0 -0
  116. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/ask.py +0 -0
  117. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/chat_mode.py +0 -0
  118. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/clear.py +0 -0
  119. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/code.py +0 -0
  120. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/command_prefix.py +0 -0
  121. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/commit.py +0 -0
  122. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/compact.py +0 -0
  123. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/context.py +0 -0
  124. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/context_blocks.py +0 -0
  125. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/context_management.py +0 -0
  126. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/copy.py +0 -0
  127. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/copy_context.py +0 -0
  128. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/core.py +0 -0
  129. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/diff.py +0 -0
  130. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/drop.py +0 -0
  131. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/editor.py +0 -0
  132. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/editor_model.py +0 -0
  133. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/exit.py +0 -0
  134. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/git.py +0 -0
  135. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/hashline.py +0 -0
  136. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/help.py +0 -0
  137. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/history_search.py +0 -0
  138. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/hooks.py +0 -0
  139. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/lint.py +0 -0
  140. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/list_sessions.py +0 -0
  141. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/load.py +0 -0
  142. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/load_hook.py +0 -0
  143. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/load_mcp.py +0 -0
  144. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/load_session.py +0 -0
  145. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/load_skill.py +0 -0
  146. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/ls.py +0 -0
  147. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/map.py +0 -0
  148. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/map_refresh.py +0 -0
  149. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/model.py +0 -0
  150. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/models.py +0 -0
  151. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/multiline_mode.py +0 -0
  152. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/paste.py +0 -0
  153. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/quit.py +0 -0
  154. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/read_only.py +0 -0
  155. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/read_only_stub.py +0 -0
  156. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/reasoning_effort.py +0 -0
  157. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/remove_hook.py +0 -0
  158. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/remove_mcp.py +0 -0
  159. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/remove_skill.py +0 -0
  160. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/report.py +0 -0
  161. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/reset.py +0 -0
  162. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/rules.py +0 -0
  163. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/run.py +0 -0
  164. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/save.py +0 -0
  165. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/save_session.py +0 -0
  166. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/settings.py +0 -0
  167. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/terminal_data/linux.keytab +0 -0
  168. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/terminal_setup.py +0 -0
  169. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/test.py +0 -0
  170. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/think_tokens.py +0 -0
  171. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/tokens.py +0 -0
  172. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/undo.py +0 -0
  173. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/utils/__init__.py +0 -0
  174. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/utils/base_command.py +0 -0
  175. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/utils/helpers.py +0 -0
  176. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/utils/registry.py +0 -0
  177. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/utils/save_load_manager.py +0 -0
  178. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/voice.py +0 -0
  179. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/weak_model.py +0 -0
  180. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/commands/web.py +0 -0
  181. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/deprecated_args.py +0 -0
  182. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/diffs.py +0 -0
  183. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/dump.py +0 -0
  184. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/editor.py +0 -0
  185. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/exceptions.py +0 -0
  186. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/format_settings.py +0 -0
  187. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/help.py +0 -0
  188. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/help_pats.py +0 -0
  189. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/__init__.py +0 -0
  190. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/command_parser.py +0 -0
  191. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/conversation/__init__.py +0 -0
  192. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/conversation/base_message.py +0 -0
  193. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/conversation/files.py +0 -0
  194. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/conversation/integration.py +0 -0
  195. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/conversation/manager.py +0 -0
  196. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/conversation/service.py +0 -0
  197. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/conversation/tags.py +0 -0
  198. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/conversation/utils.py +0 -0
  199. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/copypaste.py +0 -0
  200. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/coroutines.py +0 -0
  201. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/file_searcher.py +0 -0
  202. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/hashline.py +0 -0
  203. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/hashpos/__init__.py +0 -0
  204. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/hashpos/hashpos.py +0 -0
  205. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/model_providers.py +0 -0
  206. {cecli_dev-0.98.2/cecli/prompts → cecli_dev-0.99.1/cecli/helpers/monorepo}/__init__.py +0 -0
  207. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/nested.py +0 -0
  208. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/plugin_manager.py +0 -0
  209. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/profiler.py +0 -0
  210. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/requests.py +0 -0
  211. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/responses.py +0 -0
  212. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/similarity.py +0 -0
  213. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/helpers/skills.py +0 -0
  214. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/history.py +0 -0
  215. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/hooks/__init__.py +0 -0
  216. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/hooks/base.py +0 -0
  217. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/hooks/integration.py +0 -0
  218. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/hooks/manager.py +0 -0
  219. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/hooks/registry.py +0 -0
  220. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/hooks/types.py +0 -0
  221. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/interruptible_input.py +0 -0
  222. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/io.py +0 -0
  223. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/linter.py +0 -0
  224. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/llm.py +0 -0
  225. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/mcp/__init__.py +0 -0
  226. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/mcp/manager.py +0 -0
  227. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/mcp/oauth.py +0 -0
  228. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/mcp/server.py +0 -0
  229. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/mcp/utils.py +0 -0
  230. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/mdstream.py +0 -0
  231. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/models.py +0 -0
  232. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/onboarding.py +0 -0
  233. {cecli_dev-0.98.2/cecli/prompts/utils → cecli_dev-0.99.1/cecli/prompts}/__init__.py +0 -0
  234. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/agent.yml +0 -0
  235. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/architect.yml +0 -0
  236. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/ask.yml +0 -0
  237. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/base.yml +0 -0
  238. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/context.yml +0 -0
  239. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/copypaste.yml +0 -0
  240. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/editblock.yml +0 -0
  241. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/editblock_fenced.yml +0 -0
  242. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/editblock_func.yml +0 -0
  243. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/editor_diff_fenced.yml +0 -0
  244. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/editor_editblock.yml +0 -0
  245. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/editor_whole.yml +0 -0
  246. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/hashline.yml +0 -0
  247. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/help.yml +0 -0
  248. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/patch.yml +0 -0
  249. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/single_wholefile_func.yml +0 -0
  250. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/udiff.yml +0 -0
  251. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/udiff_simple.yml +0 -0
  252. {cecli_dev-0.98.2/scripts → cecli_dev-0.99.1/cecli/prompts/utils}/__init__.py +0 -0
  253. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/utils/registry.py +0 -0
  254. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/utils/system.py +0 -0
  255. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/wholefile.yml +0 -0
  256. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/prompts/wholefile_func.yml +0 -0
  257. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/README.md +0 -0
  258. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  259. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  260. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  261. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/clojure-tags.scm +0 -0
  262. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  263. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  264. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  265. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  266. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  267. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  268. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  269. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  270. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  271. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  272. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  273. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  274. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  275. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/matlab-tags.scm +0 -0
  276. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/ocaml-tags.scm +0 -0
  277. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +0 -0
  278. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  279. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  280. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  281. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  282. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  283. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  284. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  285. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  286. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  287. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  288. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/README.md +0 -0
  289. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/c-tags.scm +0 -0
  290. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  291. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  292. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/dart-tags.scm +0 -0
  293. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  294. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  295. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/elm-tags.scm +0 -0
  296. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/fortran-tags.scm +0 -0
  297. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/go-tags.scm +0 -0
  298. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/haskell-tags.scm +0 -0
  299. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  300. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/java-tags.scm +0 -0
  301. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  302. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/julia-tags.scm +0 -0
  303. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  304. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/matlab-tags.scm +0 -0
  305. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  306. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/ocaml_interface-tags.scm +0 -0
  307. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/php-tags.scm +0 -0
  308. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/python-tags.scm +0 -0
  309. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/ql-tags.scm +0 -0
  310. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  311. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/rust-tags.scm +0 -0
  312. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/scala-tags.scm +0 -0
  313. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  314. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/queries/tree-sitter-languages/zig-tags.scm +0 -0
  315. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/reasoning_tags.py +0 -0
  316. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/repomap.py +0 -0
  317. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/report.py +0 -0
  318. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/resources/__init__.py +0 -0
  319. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/resources/model-metadata.json +0 -0
  320. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/resources/model-settings.yml +0 -0
  321. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/resources/providers.json +0 -0
  322. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/run_cmd.py +0 -0
  323. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/scrape.py +0 -0
  324. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/sendchat.py +0 -0
  325. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/sessions.py +0 -0
  326. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/special.py +0 -0
  327. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/__init__.py +0 -0
  328. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/context_manager.py +0 -0
  329. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/git_branch.py +0 -0
  330. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/git_diff.py +0 -0
  331. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/git_log.py +0 -0
  332. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/git_remote.py +0 -0
  333. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/git_show.py +0 -0
  334. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/git_status.py +0 -0
  335. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/grep.py +0 -0
  336. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/list_changes.py +0 -0
  337. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/load_skill.py +0 -0
  338. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/ls.py +0 -0
  339. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/remove_skill.py +0 -0
  340. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/thinking.py +0 -0
  341. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/undo_change.py +0 -0
  342. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/update_todo_list.py +0 -0
  343. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/utils/helpers.py +0 -0
  344. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/utils/output.py +0 -0
  345. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/utils/registry.py +0 -0
  346. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/view_files_matching.py +0 -0
  347. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tools/view_files_with_symbol.py +0 -0
  348. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/__init__.py +0 -0
  349. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/io.py +0 -0
  350. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/styles.tcss +0 -0
  351. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/widgets/__init__.py +0 -0
  352. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/widgets/completion_bar.py +0 -0
  353. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/widgets/file_list.py +0 -0
  354. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/widgets/footer.py +0 -0
  355. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/widgets/input_area.py +0 -0
  356. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/widgets/input_container.py +0 -0
  357. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/widgets/key_hints.py +0 -0
  358. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/widgets/output.py +0 -0
  359. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/widgets/status_bar.py +0 -0
  360. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/tui/worker.py +0 -0
  361. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/urls.py +0 -0
  362. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/utils.py +0 -0
  363. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/versioncheck.py +0 -0
  364. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/voice.py +0 -0
  365. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/waiting.py +0 -0
  366. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/watch.py +0 -0
  367. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/watch_prompts.py +0 -0
  368. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/Gemfile +0 -0
  369. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/blame.md +0 -0
  370. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/get-started.md +0 -0
  371. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/help-tip.md +0 -0
  372. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/help.md +0 -0
  373. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/install.md +0 -0
  374. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/keys.md +0 -0
  375. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/model-warnings.md +0 -0
  376. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/multi-line.md +0 -0
  377. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/python-m-aider.md +0 -0
  378. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/recording.css +0 -0
  379. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/recording.md +0 -0
  380. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_includes/works-best.md +0 -0
  381. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/_features.scss +0 -0
  382. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/_footer.scss +0 -0
  383. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/_hero.scss +0 -0
  384. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/_info.scss +0 -0
  385. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/_layout.scss +0 -0
  386. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/_reset.scss +0 -0
  387. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/_testimonials.scss +0 -0
  388. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/_typography.scss +0 -0
  389. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/_variables.scss +0 -0
  390. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/custom/custom.scss +0 -0
  391. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/_sass/global-overrides.scss +0 -0
  392. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/adv-model-settings.md +0 -0
  393. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/agent-mode.md +0 -0
  394. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/aider_conf.md +0 -0
  395. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/api-keys.md +0 -0
  396. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/custom-commands.md +0 -0
  397. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/custom-system-prompts.md +0 -0
  398. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/dotenv.md +0 -0
  399. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/editor.md +0 -0
  400. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/hooks.md +0 -0
  401. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/mcp.md +0 -0
  402. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/model-aliases.md +0 -0
  403. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/options.md +0 -0
  404. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/reasoning.md +0 -0
  405. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/security.md +0 -0
  406. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/skills.md +0 -0
  407. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config/tui.md +0 -0
  408. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/config.md +0 -0
  409. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/faq.md +0 -0
  410. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/git.md +0 -0
  411. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/index.md +0 -0
  412. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/install/docker.md +0 -0
  413. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/install/optional.md +0 -0
  414. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/install.md +0 -0
  415. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/languages.md +0 -0
  416. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/legal/contributor-agreement.md +0 -0
  417. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/legal/privacy.md +0 -0
  418. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/anthropic.md +0 -0
  419. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/azure.md +0 -0
  420. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/bedrock.md +0 -0
  421. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/cohere.md +0 -0
  422. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/deepseek.md +0 -0
  423. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/gemini.md +0 -0
  424. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/github.md +0 -0
  425. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/groq.md +0 -0
  426. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/lm-studio.md +0 -0
  427. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/ollama.md +0 -0
  428. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/openai-compat.md +0 -0
  429. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/openai.md +0 -0
  430. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/openrouter.md +0 -0
  431. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/other.md +0 -0
  432. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/vertex.md +0 -0
  433. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/warnings.md +0 -0
  434. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms/xai.md +0 -0
  435. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/llms.md +0 -0
  436. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/more/analytics.md +0 -0
  437. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/more/edit-formats.md +0 -0
  438. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/more/infinite-output.md +0 -0
  439. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/more-info.md +0 -0
  440. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/repomap.md +0 -0
  441. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/scripting.md +0 -0
  442. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/troubleshooting/cecli-not-found.md +0 -0
  443. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/troubleshooting/edit-errors.md +0 -0
  444. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/troubleshooting/imports.md +0 -0
  445. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/troubleshooting/models-and-keys.md +0 -0
  446. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/troubleshooting/support.md +0 -0
  447. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/troubleshooting/token-limits.md +0 -0
  448. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/troubleshooting/warnings.md +0 -0
  449. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/troubleshooting.md +0 -0
  450. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/commands.md +0 -0
  451. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/conventions.md +0 -0
  452. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/copypaste.md +0 -0
  453. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/images-urls.md +0 -0
  454. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/lint-test.md +0 -0
  455. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/modes.md +0 -0
  456. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/not-code.md +0 -0
  457. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/notifications.md +0 -0
  458. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/sessions.md +0 -0
  459. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/tips.md +0 -0
  460. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/voice.md +0 -0
  461. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage/watch.md +0 -0
  462. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/docs/usage.md +0 -0
  463. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli/website/share/index.md +0 -0
  464. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli_dev.egg-info/dependency_links.txt +0 -0
  465. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli_dev.egg-info/entry_points.txt +0 -0
  466. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli_dev.egg-info/requires.txt +0 -0
  467. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/cecli_dev.egg-info/top_level.txt +0 -0
  468. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/docker/Dockerfile +0 -0
  469. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/docker/Dockerfile.local.nvidia.cuda.ubuntu +0 -0
  470. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/pyproject.toml +0 -0
  471. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/requirements/common-constraints.txt +0 -0
  472. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/requirements/requirements-dev.in +0 -0
  473. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/requirements/requirements-dev.txt +0 -0
  474. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/requirements/requirements-help.in +0 -0
  475. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/requirements/requirements-help.txt +0 -0
  476. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/requirements/requirements-playwright.in +0 -0
  477. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/requirements/requirements-playwright.txt +0 -0
  478. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/requirements/requirements.in +0 -0
  479. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/requirements/tree-sitter.in +0 -0
  480. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/requirements.txt +0 -0
  481. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/30k-image.py +0 -0
  482. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/Dockerfile.jekyll +0 -0
  483. {cecli_dev-0.98.2/tests → cecli_dev-0.99.1/scripts}/__init__.py +0 -0
  484. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/blame.py +0 -0
  485. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/clean_metadata.py +0 -0
  486. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/cost_analyzer.py +0 -0
  487. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/dl_icons.py +0 -0
  488. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/filter-chat-mode.js +0 -0
  489. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/generate_providers.py +0 -0
  490. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/get_contributor_list.js +0 -0
  491. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/get_hashline.py +0 -0
  492. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/history_prompts.py +0 -0
  493. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/homepage.py +0 -0
  494. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/issues.py +0 -0
  495. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/jekyll_build.sh +0 -0
  496. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/jekyll_run.sh +0 -0
  497. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/logo_svg.py +0 -0
  498. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/pip-compile.sh +0 -0
  499. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/recording_audio.py +0 -0
  500. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/redact-cast.py +0 -0
  501. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/rename_to_cecli.py +0 -0
  502. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/tmux_record.sh +0 -0
  503. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/tsl_pack_langs.py +0 -0
  504. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/update-blame.sh +0 -0
  505. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/update-docs.sh +0 -0
  506. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/update-history.py +0 -0
  507. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/versionbump.py +0 -0
  508. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/scripts/yank-old-versions.py +0 -0
  509. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/setup.cfg +0 -0
  510. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/shim.pyproject.toml +0 -0
  511. {cecli_dev-0.98.2/tests/basic → cecli_dev-0.99.1/tests}/__init__.py +0 -0
  512. {cecli_dev-0.98.2/tests/hooks → cecli_dev-0.99.1/tests/basic}/__init__.py +0 -0
  513. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_aws_credentials.py +0 -0
  514. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_background_commands.py +0 -0
  515. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_coder.py +0 -0
  516. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_commands.py +0 -0
  517. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_custom_commands.py +0 -0
  518. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_deprecated.py +0 -0
  519. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_editblock.py +0 -0
  520. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_editor.py +0 -0
  521. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_exceptions.py +0 -0
  522. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_find_or_blocks.py +0 -0
  523. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_hashline.py +0 -0
  524. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_history.py +0 -0
  525. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_linter.py +0 -0
  526. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_main.py +0 -0
  527. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_model_info_manager.py +0 -0
  528. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_model_provider_manager.py +0 -0
  529. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_models.py +0 -0
  530. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_onboarding.py +0 -0
  531. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_plugin_manager.py +0 -0
  532. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_prompts.py +0 -0
  533. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_reasoning.py +0 -0
  534. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_repo.py +0 -0
  535. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_repomap.py +0 -0
  536. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_run_cmd.py +0 -0
  537. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_sanity_check_repo.py +0 -0
  538. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_scripting.py +0 -0
  539. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_sendchat.py +0 -0
  540. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_sessions.py +0 -0
  541. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_skills.py +0 -0
  542. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_special.py +0 -0
  543. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_ssl_verification.py +0 -0
  544. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_udiff.py +0 -0
  545. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_urls.py +0 -0
  546. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_voice.py +0 -0
  547. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_watch.py +0 -0
  548. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/basic/test_wholefile.py +0 -0
  549. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/conftest.py +0 -0
  550. {cecli_dev-0.98.2/tests → cecli_dev-0.99.1/tests/conversations}/test_conversation_integration.py +0 -0
  551. {cecli_dev-0.98.2/tests → cecli_dev-0.99.1/tests/conversations}/test_conversation_system.py +0 -0
  552. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/chat-history-search-replace-gold.txt +0 -0
  553. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/chat-history.md +0 -0
  554. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/arduino/test.ino +0 -0
  555. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/c/test.c +0 -0
  556. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/chatito/test.chatito +0 -0
  557. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/clojure/test.clj +0 -0
  558. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/commonlisp/test.lisp +0 -0
  559. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/cpp/test.cpp +0 -0
  560. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/csharp/test.cs +0 -0
  561. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/d/test.d +0 -0
  562. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/dart/test.dart +0 -0
  563. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/elisp/test.el +0 -0
  564. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/elixir/test.ex +0 -0
  565. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/elm/test.elm +0 -0
  566. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/gleam/test.gleam +0 -0
  567. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/go/test.go +0 -0
  568. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/haskell/test.hs +0 -0
  569. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/hcl/test.tf +0 -0
  570. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/java/test.java +0 -0
  571. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/javascript/test.js +0 -0
  572. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/kotlin/test.kt +0 -0
  573. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/lua/test.lua +0 -0
  574. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/matlab/test.m +0 -0
  575. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/ocaml/test.ml +0 -0
  576. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/ocaml_interface/test.mli +0 -0
  577. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/php/test.php +0 -0
  578. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/pony/test.pony +0 -0
  579. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/properties/test.properties +0 -0
  580. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/python/test.py +0 -0
  581. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/ql/test.ql +0 -0
  582. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/r/test.r +0 -0
  583. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/racket/test.rkt +0 -0
  584. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/ruby/test.rb +0 -0
  585. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/rust/test.rs +0 -0
  586. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/scala/test.scala +0 -0
  587. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/solidity/test.sol +0 -0
  588. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/swift/test.swift +0 -0
  589. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/tsx/test.tsx +0 -0
  590. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/typescript/test.ts +0 -0
  591. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/udev/test.rules +0 -0
  592. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/languages/zig/test.zig +0 -0
  593. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/sample-code-base/sample.js +0 -0
  594. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/sample-code-base/sample.py +0 -0
  595. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/sample-code-base-repo-map.txt +0 -0
  596. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/watch.js +0 -0
  597. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/watch.lisp +0 -0
  598. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/watch.py +0 -0
  599. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/fixtures/watch_question.js +0 -0
  600. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/help/test_help.py +0 -0
  601. {cecli_dev-0.98.2/tests/mcp → cecli_dev-0.99.1/tests/hooks}/__init__.py +0 -0
  602. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/hooks/test_base.py +0 -0
  603. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/hooks/test_manager.py +0 -0
  604. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/hooks/test_registry.py +0 -0
  605. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/mcp/test_manager.py +0 -0
  606. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/scrape/test_playwright_disable.py +0 -0
  607. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/scrape/test_scrape.py +0 -0
  608. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/tools/test_git_branch.py +0 -0
  609. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/tools/test_git_diff.py +0 -0
  610. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/tools/test_grep.py +0 -0
  611. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/tools/test_insert_block.py +0 -0
  612. {cecli_dev-0.98.2 → cecli_dev-0.99.1}/tests/tools/test_registry.py +0 -0
@@ -56,6 +56,12 @@ jobs:
56
56
  -r requirements/requirements-playwright.in \
57
57
  ".[help,playwright]"
58
58
 
59
+ - name: Configure Git for tests
60
+ run: |
61
+ git config --global user.name "Test User"
62
+ git config --global user.email "test@example.com"
63
+ git config --global init.defaultBranch main
64
+
59
65
  - name: Run tests
60
66
  run: |
61
67
  pytest
@@ -44,6 +44,12 @@ jobs:
44
44
  pip install uv
45
45
  uv pip install --system pytest pytest-asyncio pytest-mock -r requirements/requirements.in -r requirements/requirements-help.in -r requirements/requirements-playwright.in '.[help,playwright]'
46
46
 
47
+ - name: Configure Git for tests
48
+ run: |
49
+ git config --global user.name "Test User"
50
+ git config --global user.email "test@example.com"
51
+ git config --global init.defaultBranch main
52
+
47
53
  - name: Run tests
48
54
  run: |
49
55
  pytest
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cecli-dev
3
- Version: 0.98.2
3
+ Version: 0.99.1
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
@@ -108,6 +108,7 @@ LLMs are a part of our lives from here on out so join us in learning about and c
108
108
  * [Skills](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/skills.md)
109
109
  * [Session Management](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/sessions.md)
110
110
  * [Hooks](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/hooks.md)
111
+ * [Workspaces](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/workspaces.md)
111
112
  * [Custom Commands](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/custom-commands.md)
112
113
  * [Custom System Prompts](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/custom-system-prompts.md)
113
114
  * [Custom Tools](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/agent-mode.md#creating-custom-tools)
@@ -22,6 +22,7 @@ LLMs are a part of our lives from here on out so join us in learning about and c
22
22
  * [Skills](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/skills.md)
23
23
  * [Session Management](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/sessions.md)
24
24
  * [Hooks](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/hooks.md)
25
+ * [Workspaces](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/workspaces.md)
25
26
  * [Custom Commands](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/custom-commands.md)
26
27
  * [Custom System Prompts](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/custom-system-prompts.md)
27
28
  * [Custom Tools](https://github.com/dwash96/cecli/blob/main/cecli/website/docs/config/agent-mode.md#creating-custom-tools)
@@ -1,6 +1,6 @@
1
1
  from packaging import version
2
2
 
3
- __version__ = "0.98.2.dev"
3
+ __version__ = "0.99.1.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.98.2'
22
- __version_tuple__ = version_tuple = (0, 98, 2)
21
+ __version__ = version = '0.99.1'
22
+ __version_tuple__ = version_tuple = (0, 99, 1)
23
23
 
24
- __commit_id__ = commit_id = 'g1fefb15aa'
24
+ __commit_id__ = commit_id = 'g587390916'
@@ -314,6 +314,19 @@ def get_parser(default_config_files, git_root):
314
314
  help="Specify TUI Mode configuration as a JSON string",
315
315
  default=None,
316
316
  )
317
+ #########
318
+ group = parser.add_argument_group("Workspace Settings")
319
+ group.add_argument(
320
+ "--workspaces",
321
+ type=str,
322
+ help="JSON/YAML configuration for workspace initialization",
323
+ )
324
+ group.add_argument(
325
+ "--workspace-name",
326
+ type=str,
327
+ help="Specify the workspace name to activate",
328
+ )
329
+
317
330
  #########
318
331
  group = parser.add_argument_group("Agent Settings")
319
332
  group.add_argument(
@@ -1009,35 +1009,44 @@ I will proceed based on the tool results and updated context.""")
1009
1009
  repetition_warning = None
1010
1010
 
1011
1011
  if repetitive_tools:
1012
+ default_temp = (
1013
+ float(self.get_active_model().use_temperature)
1014
+ if isinstance(self.get_active_model().use_temperature, (int, float, str))
1015
+ else 1
1016
+ )
1017
+ default_fp = 0
1018
+
1012
1019
  if not self.model_kwargs:
1013
1020
  self.model_kwargs = {
1014
- "temperature": (
1015
- 1
1016
- if isinstance(self.get_active_model().use_temperature, bool)
1017
- else float(self.get_active_model().use_temperature)
1018
- ) + 0.1,
1019
- "frequency_penalty": 0.2,
1021
+ "temperature": default_temp + 0.1,
1022
+ "frequency_penalty": default_fp + 0.2,
1020
1023
  "presence_penalty": 0.1,
1021
1024
  }
1022
1025
  else:
1023
- temperature = nested.getter(self.model_kwargs, "temperature")
1024
- freq_penalty = nested.getter(self.model_kwargs, "frequency_penalty")
1025
- if temperature and freq_penalty:
1026
- self.model_kwargs["temperature"] = min(temperature + 0.1, 2)
1027
- self.model_kwargs["frequency_penalty"] = min(freq_penalty + 0.1, 1)
1026
+ temperature = nested.getter(self.model_kwargs, "temperature", default_temp)
1027
+ freq_penalty = nested.getter(self.model_kwargs, "frequency_penalty", default_fp)
1028
+
1029
+ self.model_kwargs["temperature"] = temperature + 0.1
1030
+ self.model_kwargs["frequency_penalty"] = freq_penalty + 0.1
1028
1031
 
1029
1032
  if random.random() < 0.2:
1030
- self.model_kwargs["temperature"] = min(
1031
- (
1032
- 1
1033
- if isinstance(self.get_active_model().use_temperature, bool)
1034
- else float(self.get_active_model().use_temperature)
1035
- ),
1036
- max(temperature - 0.15, 1),
1033
+ self.model_kwargs["temperature"] = max(
1034
+ default_temp,
1035
+ temperature - 0.15,
1036
+ )
1037
+ self.model_kwargs["frequency_penalty"] = max(
1038
+ default_fp,
1039
+ freq_penalty - 0.15,
1037
1040
  )
1038
- self.model_kwargs["frequency_penalty"] = min(0, max(freq_penalty - 0.15, 0))
1039
1041
 
1040
- self.model_kwargs["temperature"] = max(0, min(self.model_kwargs["temperature"], 1))
1042
+ self.model_kwargs["temperature"] = max(
1043
+ 0, min(nested.getter(self.model_kwargs, "temperature", default_temp), 1)
1044
+ )
1045
+
1046
+ self.model_kwargs["frequency_penalty"] = max(
1047
+ 0, min(nested.getter(self.model_kwargs, "frequency_penalty", default_fp), 1)
1048
+ )
1049
+
1041
1050
  # One twentieth of the time, just straight reset the randomness
1042
1051
  if random.random() < 0.05:
1043
1052
  self.model_kwargs = {}
@@ -58,6 +58,7 @@ from cecli.reasoning_tags import (
58
58
  )
59
59
  from cecli.repo import ANY_GIT_ERROR, GitRepo
60
60
  from cecli.repomap import RepoMap
61
+ from cecli.report import update_error_prefix
61
62
  from cecli.run_cmd import run_cmd
62
63
  from cecli.sessions import SessionManager
63
64
  from cecli.tools.utils.output import print_tool_response
@@ -531,6 +532,11 @@ class Coder:
531
532
  has_map_prompt = nested.getter(self, "gpt_prompts.repo_content_prefix")
532
533
 
533
534
  if use_repo_map and self.repo and has_map_prompt:
535
+ repo_root = (
536
+ self.repo.workspace_path
537
+ if (self.repo and getattr(self.repo, "workspace_path", None))
538
+ else self.root
539
+ )
534
540
  self.repo_map = RepoMap(
535
541
  map_tokens,
536
542
  self.map_cache_dir,
@@ -542,7 +548,7 @@ class Coder:
542
548
  map_mul_no_files=map_mul_no_files,
543
549
  refresh=map_refresh,
544
550
  max_code_line_length=map_max_line_length,
545
- repo_root=self.root,
551
+ repo_root=repo_root,
546
552
  use_memory_cache=repomap_in_memory,
547
553
  use_enhanced_map=getattr(self.args, "use_enhanced_map", False),
548
554
  )
@@ -1508,6 +1514,9 @@ class Coder:
1508
1514
  except (SwitchCoderSignal, SystemExit):
1509
1515
  raise
1510
1516
  except Exception as e:
1517
+ traceback_str = traceback.format_exc()
1518
+ update_error_prefix(traceback_str)
1519
+
1511
1520
  if self.verbose or self.args.debug:
1512
1521
  print(e)
1513
1522
 
@@ -3056,7 +3065,7 @@ class Coder:
3056
3065
  self.temperature,
3057
3066
  # This could include any tools, but for now it is just MCP tools
3058
3067
  tools=tools,
3059
- override_kwargs=self.model_kwargs,
3068
+ override_kwargs=self.model_kwargs.copy(),
3060
3069
  )
3061
3070
  self.chat_completion_call_hashes.append(hash_object.hexdigest())
3062
3071
 
@@ -3651,13 +3660,14 @@ class Coder:
3651
3660
  # Continue to get tracked files normally
3652
3661
 
3653
3662
  if self.repo:
3654
- if not self.repo.cecli_ignore_file or not self.repo.cecli_ignore_file.is_file():
3663
+ if hasattr(self.repo, "workspace_path") and self.repo.workspace_path:
3664
+ files = self.repo.get_workspace_files()
3665
+ elif not self.repo.cecli_ignore_file or not self.repo.cecli_ignore_file.is_file():
3655
3666
  files = self.repo.get_tracked_files()
3656
3667
  else:
3657
3668
  files = self.repo.get_non_ignored_files_from_root()
3658
3669
  else:
3659
3670
  files = self.get_inchat_relative_files()
3660
-
3661
3671
  # This is quite slow in large repos
3662
3672
  # files = [fname for fname in files if self.is_file_safe(fname)]
3663
3673
 
@@ -3919,6 +3929,13 @@ class Coder:
3919
3929
  if not self.repo or not self.auto_commits or self.dry_run:
3920
3930
  return
3921
3931
 
3932
+ # Workspace-aware commit logic
3933
+ if hasattr(self.args, "workspace") and self.args.workspace:
3934
+ # We are in a workspace context.
3935
+ # The GitRepo instance (self.repo) should already be pointing to the correct worktree/repo
3936
+ # within the workspace because of the os.chdir in main.py and detection in repo.py.
3937
+ pass
3938
+
3922
3939
  if not context:
3923
3940
  context = self.get_context_from_history(
3924
3941
  ConversationService.get_manager(self).get_messages_dict(MessageTag.CUR)
@@ -79,6 +79,7 @@ from .utils.registry import CommandRegistry
79
79
  from .voice import VoiceCommand
80
80
  from .weak_model import WeakModelCommand
81
81
  from .web import WebCommand
82
+ from .workspace import WorkspaceCommand
82
83
 
83
84
  # Register commands
84
85
  CommandRegistry.register(AddCommand)
@@ -143,6 +144,7 @@ CommandRegistry.register(UndoCommand)
143
144
  CommandRegistry.register(VoiceCommand)
144
145
  CommandRegistry.register(WeakModelCommand)
145
146
  CommandRegistry.register(WebCommand)
147
+ CommandRegistry.register(WorkspaceCommand)
146
148
 
147
149
 
148
150
  __all__ = [
@@ -220,4 +222,5 @@ __all__ = [
220
222
  "VoiceCommand",
221
223
  "WeakModelCommand",
222
224
  "WebCommand",
225
+ "WorkspaceCommand",
223
226
  ]
@@ -0,0 +1,72 @@
1
+ import subprocess
2
+
3
+ from cecli.commands.utils.base_command import BaseCommand
4
+
5
+
6
+ class WorkspaceCommand(BaseCommand):
7
+ NORM_NAME = "workspace"
8
+ DESCRIPTION = "Print information about the current workspace"
9
+
10
+ @classmethod
11
+ async def execute(cls, io, coder, args, **kwargs):
12
+ """Execute the workspace command."""
13
+ if not coder or not coder.repo:
14
+ io.tool_output("No repository or workspace active.")
15
+ return
16
+
17
+ workspace_path = getattr(coder.repo, "workspace_path", None)
18
+ if not workspace_path:
19
+ io.tool_output("Not currently working within a cecli workspace.")
20
+ return
21
+
22
+ import json
23
+
24
+ metadata_path = workspace_path / ".cecli-workspace.json"
25
+ config = {}
26
+ if metadata_path.exists():
27
+ try:
28
+ with open(metadata_path, "r") as f:
29
+ config = json.load(f)
30
+ except Exception:
31
+ pass
32
+
33
+ ws_name = config.get("name", workspace_path.name)
34
+ is_active = config.get("active", False)
35
+
36
+ io.print(f"Current Workspace: {ws_name}{' (Active)' if is_active else ''}")
37
+ io.print(f"Root Directory: {workspace_path}")
38
+ io.print("-" * 40)
39
+ io.print("Projects:")
40
+
41
+ projects = config.get("projects", [])
42
+ for proj in projects:
43
+ proj_name = proj.get("name")
44
+ if not proj_name:
45
+ continue
46
+
47
+ proj_root = workspace_path / proj_name / "main"
48
+ branch_info = "Unknown"
49
+ if proj_root.exists():
50
+ try:
51
+ branch_info = subprocess.check_output(
52
+ ["git", "-C", str(proj_root), "rev-parse", "--abbrev-ref", "HEAD"],
53
+ stderr=subprocess.DEVNULL,
54
+ encoding="utf-8",
55
+ ).strip()
56
+ except Exception:
57
+ branch_info = "Error retrieving branch"
58
+
59
+ repo_url = proj.get("repo", "N/A")
60
+ io.print(f" - {proj_name}:")
61
+ io.print(f" Branch: {branch_info}")
62
+ io.print(f" Remote: {repo_url}")
63
+ io.print(f" Path: {proj_root}")
64
+ io.print("")
65
+
66
+ @classmethod
67
+ def get_help(cls) -> str:
68
+ """Get help text for the workspace command."""
69
+ help_text = super().get_help()
70
+ help_text += "\nUsage:\n"
71
+ help_text += " /workspace # Show details of the active monorepo workspace\n"
72
+ return help_text
@@ -5,11 +5,22 @@ Provides a static BackgroundCommandManager class for running shell commands
5
5
  in the background and capturing their output for injection into chat streams.
6
6
  """
7
7
 
8
+ import codecs
9
+ import os
10
+ import platform
8
11
  import subprocess
9
12
  import threading
10
13
  from collections import deque
11
14
  from typing import Dict, Optional, Tuple
12
15
 
16
+ try:
17
+ import pty
18
+ import termios
19
+
20
+ HAS_PTY = True
21
+ except ImportError:
22
+ HAS_PTY = False
23
+
13
24
 
14
25
  class CircularBuffer:
15
26
  """
@@ -89,14 +100,48 @@ class CircularBuffer:
89
100
  return sum(len(chunk) for chunk in self.buffer)
90
101
 
91
102
 
103
+ class InputBuffer:
104
+ """
105
+ Thread-safe buffer for queuing input to be sent to a process.
106
+ """
107
+
108
+ def __init__(self):
109
+ self.queue = deque()
110
+ self.lock = threading.Lock()
111
+
112
+ def append(self, text: str) -> None:
113
+ """Add text to the input queue."""
114
+ with self.lock:
115
+ self.queue.append(text)
116
+
117
+ def pop_all(self) -> str:
118
+ """Get and clear all queued input."""
119
+ with self.lock:
120
+ result = "".join(self.queue)
121
+ self.queue.clear()
122
+ return result
123
+
124
+ def has_input(self) -> bool:
125
+ """Check if there is queued input."""
126
+ with self.lock:
127
+ return len(self.queue) > 0
128
+
129
+
92
130
  class BackgroundProcess:
93
131
  """
94
132
  Represents a background process with output capture.
95
133
  """
96
134
 
97
135
  def __init__(
98
- self, command: str, process: subprocess.Popen, buffer: CircularBuffer, persist: bool = False
136
+ self,
137
+ command: str,
138
+ process: subprocess.Popen,
139
+ buffer: CircularBuffer,
140
+ persist: bool = False,
141
+ input_buffer: Optional[InputBuffer] = None,
142
+ master_fd: Optional[int] = None,
99
143
  ):
144
+ self.master_fd = master_fd
100
145
  """
101
146
  Initialize background process wrapper.
102
147
 
@@ -116,7 +161,11 @@ class BackgroundProcess:
116
161
  self.start_time = time.time()
117
162
  self.end_time = None
118
163
  self.persist = persist
164
+ self.input_buffer = input_buffer or InputBuffer()
165
+ self.writer_thread = None
166
+ self._stop_event = threading.Event()
119
167
  self._start_output_reader()
168
+ self._start_input_writer()
120
169
 
121
170
  def _start_output_reader(self) -> None:
122
171
  """Start thread to read process output."""
@@ -128,15 +177,25 @@ class BackgroundProcess:
128
177
  # we're in a separate thread and the buffer will capture
129
178
  # output as soon as it's available
130
179
 
131
- # Read stdout
132
- for line in iter(self.process.stdout.readline, ""):
133
- if line:
134
- self.buffer.append(line)
180
+ if self.master_fd is not None:
181
+ while not self._stop_event.is_set():
182
+ try:
183
+ data = os.read(self.master_fd, 4096).decode(errors="replace")
184
+ if not data:
185
+ break
186
+ self.buffer.append(data)
187
+ except (OSError, EOFError):
188
+ break
189
+ else:
190
+ # Read stdout
191
+ for line in iter(self.process.stdout.readline, ""):
192
+ if line:
193
+ self.buffer.append(line)
135
194
 
136
- # Read stderr
137
- for line in iter(self.process.stderr.readline, ""):
138
- if line:
139
- self.buffer.append(line)
195
+ # Read stderr
196
+ for line in iter(self.process.stderr.readline, ""):
197
+ if line:
198
+ self.buffer.append(line)
140
199
 
141
200
  except Exception as e:
142
201
  self.buffer.append(f"\n[Error reading process output: {str(e)}]\n")
@@ -144,6 +203,45 @@ class BackgroundProcess:
144
203
  self.reader_thread = threading.Thread(target=reader, daemon=True)
145
204
  self.reader_thread.start()
146
205
 
206
+ def _start_input_writer(self) -> None:
207
+ """Start thread to write input to process stdin."""
208
+
209
+ def writer():
210
+ try:
211
+ while not self._stop_event.is_set() and self.is_alive():
212
+ if self.input_buffer.has_input():
213
+ text = self.input_buffer.pop_all()
214
+ if text:
215
+ if self.master_fd is not None:
216
+ os.write(self.master_fd, text.encode("latin-1"))
217
+ else:
218
+ try:
219
+ # Try to write to the binary buffer for lossless propagation
220
+ self.process.stdin.buffer.write(text.encode("latin-1"))
221
+ self.process.stdin.buffer.flush()
222
+ except (AttributeError, ValueError):
223
+ # Fallback to text mode if buffer is not available
224
+ self.process.stdin.write(text)
225
+ self.process.stdin.flush()
226
+ import time
227
+
228
+ time.sleep(0.1)
229
+ except (BrokenPipeError, OSError):
230
+ pass
231
+ except Exception as e:
232
+ self.buffer.append(f"\n[Error writing to process input: {str(e)}]\n")
233
+ finally:
234
+ try:
235
+ if self.master_fd is not None:
236
+ os.close(self.master_fd)
237
+ else:
238
+ self.process.stdin.close()
239
+ except Exception:
240
+ pass
241
+
242
+ self.writer_thread = threading.Thread(target=writer, daemon=True)
243
+ self.writer_thread.start()
244
+
147
245
  def get_output(self, clear: bool = False) -> str:
148
246
  """
149
247
  Get current output buffer.
@@ -171,6 +269,11 @@ class BackgroundProcess:
171
269
  """Check if process is running."""
172
270
  return self.process.poll() is None
173
271
 
272
+ def send_input(self, text: str) -> None:
273
+ """Queue input to be sent to the process."""
274
+ if self.input_buffer:
275
+ self.input_buffer.append(text)
276
+
174
277
  def stop(self, timeout: float = 5.0) -> Tuple[bool, str, Optional[int]]:
175
278
  """
176
279
  Stop the process gracefully.
@@ -184,6 +287,9 @@ class BackgroundProcess:
184
287
  import time
185
288
 
186
289
  try:
290
+ # Signal threads to stop
291
+ self._stop_event.set()
292
+
187
293
  # Try SIGTERM first
188
294
  self.process.terminate()
189
295
  self.process.wait(timeout=timeout)
@@ -192,7 +298,6 @@ class BackgroundProcess:
192
298
  output = self.get_output(clear=True)
193
299
  exit_code = self.process.returncode
194
300
  self.end_time = time.time()
195
-
196
301
  return True, output, exit_code
197
302
 
198
303
  except subprocess.TimeoutExpired:
@@ -262,6 +367,8 @@ class BackgroundCommandManager:
262
367
  existing_process: Optional[subprocess.Popen] = None,
263
368
  existing_buffer: Optional[CircularBuffer] = None,
264
369
  persist: bool = False,
370
+ existing_input_buffer: Optional[InputBuffer] = None,
371
+ use_pty: bool = False,
265
372
  ) -> str:
266
373
  """
267
374
  Start a command in background.
@@ -283,7 +390,29 @@ class BackgroundCommandManager:
283
390
  buffer = existing_buffer or CircularBuffer(max_size=max_buffer_size)
284
391
 
285
392
  # Use existing process or start new one
286
- if existing_process:
393
+ master_fd = None
394
+ if use_pty and HAS_PTY and platform.system() != "Windows":
395
+ master_fd, slave_fd = pty.openpty()
396
+
397
+ # Disable echo on the slave PTY
398
+ attr = termios.tcgetattr(slave_fd)
399
+ attr[3] = attr[3] & ~termios.ECHO
400
+ termios.tcsetattr(slave_fd, termios.TCSANOW, attr)
401
+
402
+ process = subprocess.Popen(
403
+ command,
404
+ shell=True,
405
+ stdout=slave_fd,
406
+ stderr=slave_fd,
407
+ stdin=slave_fd,
408
+ cwd=cwd,
409
+ close_fds=True,
410
+ text=True,
411
+ bufsize=1,
412
+ universal_newlines=True,
413
+ )
414
+ os.close(slave_fd)
415
+ elif existing_process:
287
416
  process = existing_process
288
417
  else:
289
418
  process = subprocess.Popen(
@@ -291,15 +420,22 @@ class BackgroundCommandManager:
291
420
  shell=True,
292
421
  stdout=subprocess.PIPE,
293
422
  stderr=subprocess.PIPE,
294
- stdin=subprocess.DEVNULL, # No stdin for background commands
423
+ stdin=subprocess.PIPE,
295
424
  cwd=cwd,
296
- text=True, # Use text mode for easier handling
297
- bufsize=1, # Line buffered
425
+ text=True,
426
+ bufsize=1,
298
427
  universal_newlines=True,
299
428
  )
300
429
 
301
430
  # Create background process wrapper
302
- bg_process = BackgroundProcess(command, process, buffer, persist=persist)
431
+ bg_process = BackgroundProcess(
432
+ command,
433
+ process,
434
+ buffer,
435
+ persist=persist,
436
+ input_buffer=existing_input_buffer,
437
+ master_fd=master_fd,
438
+ )
303
439
 
304
440
  # Generate unique key and store
305
441
  command_key = cls._generate_command_key(command)
@@ -367,6 +503,30 @@ class BackgroundCommandManager:
367
503
  return f"[Error] No background command found with key: {command_key}"
368
504
  return bg_process.get_new_output()
369
505
 
506
+ @classmethod
507
+ def send_command_input(cls, command_key: str, text: str) -> bool:
508
+ """
509
+ Send input to a background command.
510
+
511
+ Args:
512
+ command_key: Command key returned by start_background_command
513
+ text: Text to send to the command's stdin
514
+
515
+ Returns:
516
+ True if input was queued, False if command not found
517
+ """
518
+ with cls._lock:
519
+ bg_process = cls._background_commands.get(command_key)
520
+ if not bg_process:
521
+ return False
522
+ # Decode escape sequences (like \x1b) if present in the string
523
+ try:
524
+ text = codecs.decode(text, "unicode_escape")
525
+ except Exception:
526
+ pass
527
+ bg_process.send_input(text)
528
+ return True
529
+
370
530
  @classmethod
371
531
  def get_all_command_outputs(cls, clear: bool = False) -> Dict[str, str]:
372
532
  """