cecli-dev 0.98.1__tar.gz → 0.99.0__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.1 → cecli_dev-0.99.0}/.github/workflows/ubuntu-tests.yml +6 -0
  2. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.github/workflows/windows-tests.yml +6 -0
  3. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/PKG-INFO +2 -1
  4. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/README.md +1 -0
  5. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/__init__.py +1 -1
  6. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/_version.py +3 -3
  7. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/args.py +13 -0
  8. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/agent_coder.py +8 -16
  9. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/base_coder.py +27 -9
  10. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/__init__.py +3 -0
  11. cecli_dev-0.99.0/cecli/commands/workspace.py +72 -0
  12. cecli_dev-0.99.0/cecli/helpers/monorepo/config.py +149 -0
  13. cecli_dev-0.99.0/cecli/helpers/monorepo/project.py +89 -0
  14. cecli_dev-0.99.0/cecli/helpers/monorepo/workspace.py +36 -0
  15. cecli_dev-0.99.0/cecli/helpers/monorepo/worktree.py +21 -0
  16. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/plugin_manager.py +4 -0
  17. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/requests.py +18 -4
  18. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/main.py +47 -25
  19. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/models.py +2 -2
  20. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/repo.py +103 -0
  21. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/finished.py +1 -0
  22. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/show_context.py +4 -0
  23. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/update_todo_list.py +14 -0
  24. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/utils/base_tool.py +5 -0
  25. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/utils/registry.py +43 -19
  26. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/app.py +8 -2
  27. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/agent-mode.md +6 -6
  28. cecli_dev-0.99.0/cecli/website/docs/config/workspaces.md +78 -0
  29. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli_dev.egg-info/PKG-INFO +2 -1
  30. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli_dev.egg-info/SOURCES.txt +13 -2
  31. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/pytest.ini +5 -2
  32. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_repomap.py +1 -1
  33. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/coders/test_copypaste_coder.py +2 -2
  34. cecli_dev-0.99.0/tests/helpers/monorepo/test_config.py +50 -0
  35. cecli_dev-0.99.0/tests/helpers/monorepo/test_config_active.py +79 -0
  36. cecli_dev-0.99.0/tests/helpers/monorepo/test_repomap_workspace.py +227 -0
  37. cecli_dev-0.99.0/tests/helpers/monorepo/test_workspace.py +52 -0
  38. cecli_dev-0.99.0/tests/mcp/__init__.py +0 -0
  39. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/tools/test_registry.py +6 -6
  40. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.dockerignore +0 -0
  41. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.flake8 +0 -0
  42. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.gitattributes +0 -0
  43. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.github/ISSUE_TEMPLATE/issue.yml +0 -0
  44. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.github/workflows/check_pypi_version.yml +0 -0
  45. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.github/workflows/docker-build-test.yml +0 -0
  46. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.github/workflows/docker-release.yml +0 -0
  47. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.github/workflows/issues.yml +0 -0
  48. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.github/workflows/pages.yml +0 -0
  49. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.github/workflows/pre-commit.yml +0 -0
  50. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.github/workflows/release.yml +0 -0
  51. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.github/workflows/windows_check_pypi_version.yml +0 -0
  52. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.gitignore +0 -0
  53. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/.pre-commit-config.yaml +0 -0
  54. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/CHANGELOG.md +0 -0
  55. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/CNAME +0 -0
  56. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/CONTRIBUTING.md +0 -0
  57. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/HISTORY.md +0 -0
  58. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/LICENSE.txt +0 -0
  59. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/MANIFEST.in +0 -0
  60. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/Dockerfile +0 -0
  61. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/README.md +0 -0
  62. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/__init__.py +0 -0
  63. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/benchmark.py +0 -0
  64. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/benchmark_classic.py +0 -0
  65. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/clone-exercism.sh +0 -0
  66. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/cpp-test.sh +0 -0
  67. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/docker.sh +0 -0
  68. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/docker_build.sh +0 -0
  69. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/install-docker-ubuntu.sh +0 -0
  70. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/npm-test.sh +0 -0
  71. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/over_time.py +0 -0
  72. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/plot.sh +0 -0
  73. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/plots.py +0 -0
  74. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/problem_stats.py +0 -0
  75. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/prompts.py +0 -0
  76. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/refactor_tools.py +0 -0
  77. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/rsync.sh +0 -0
  78. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/rungrid.py +0 -0
  79. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/swe-bench-lite.txt +0 -0
  80. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/swe-bench.txt +0 -0
  81. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/swe_bench.py +0 -0
  82. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/test_benchmark.py +0 -0
  83. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/variations.1.sh +0 -0
  84. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/variations.2.sh +0 -0
  85. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/variations.3.sh +0 -0
  86. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/benchmark/variations.4.sh +0 -0
  87. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/__main__.py +0 -0
  88. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/args_formatter.py +0 -0
  89. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/change_tracker.py +0 -0
  90. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/__init__.py +0 -0
  91. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/architect_coder.py +0 -0
  92. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/ask_coder.py +0 -0
  93. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/chat_chunks.py +0 -0
  94. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/context_coder.py +0 -0
  95. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/copypaste_coder.py +0 -0
  96. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/editblock_coder.py +0 -0
  97. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/editblock_fenced_coder.py +0 -0
  98. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/editblock_func_coder.py +0 -0
  99. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/editor_diff_fenced_coder.py +0 -0
  100. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/editor_editblock_coder.py +0 -0
  101. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/editor_whole_coder.py +0 -0
  102. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/hashline_coder.py +0 -0
  103. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/help_coder.py +0 -0
  104. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/patch_coder.py +0 -0
  105. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/search_replace.py +0 -0
  106. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/shell.py +0 -0
  107. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/single_wholefile_func_coder.py +0 -0
  108. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/udiff_coder.py +0 -0
  109. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/udiff_simple.py +0 -0
  110. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/wholefile_coder.py +0 -0
  111. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/coders/wholefile_func_coder.py +0 -0
  112. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/add.py +0 -0
  113. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/agent.py +0 -0
  114. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/agent_model.py +0 -0
  115. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/architect.py +0 -0
  116. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/ask.py +0 -0
  117. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/chat_mode.py +0 -0
  118. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/clear.py +0 -0
  119. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/code.py +0 -0
  120. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/command_prefix.py +0 -0
  121. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/commit.py +0 -0
  122. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/compact.py +0 -0
  123. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/context.py +0 -0
  124. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/context_blocks.py +0 -0
  125. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/context_management.py +0 -0
  126. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/copy.py +0 -0
  127. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/copy_context.py +0 -0
  128. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/core.py +0 -0
  129. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/diff.py +0 -0
  130. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/drop.py +0 -0
  131. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/editor.py +0 -0
  132. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/editor_model.py +0 -0
  133. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/exit.py +0 -0
  134. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/git.py +0 -0
  135. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/hashline.py +0 -0
  136. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/help.py +0 -0
  137. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/history_search.py +0 -0
  138. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/hooks.py +0 -0
  139. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/lint.py +0 -0
  140. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/list_sessions.py +0 -0
  141. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/load.py +0 -0
  142. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/load_hook.py +0 -0
  143. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/load_mcp.py +0 -0
  144. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/load_session.py +0 -0
  145. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/load_skill.py +0 -0
  146. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/ls.py +0 -0
  147. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/map.py +0 -0
  148. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/map_refresh.py +0 -0
  149. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/model.py +0 -0
  150. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/models.py +0 -0
  151. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/multiline_mode.py +0 -0
  152. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/paste.py +0 -0
  153. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/quit.py +0 -0
  154. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/read_only.py +0 -0
  155. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/read_only_stub.py +0 -0
  156. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/reasoning_effort.py +0 -0
  157. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/remove_hook.py +0 -0
  158. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/remove_mcp.py +0 -0
  159. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/remove_skill.py +0 -0
  160. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/report.py +0 -0
  161. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/reset.py +0 -0
  162. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/rules.py +0 -0
  163. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/run.py +0 -0
  164. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/save.py +0 -0
  165. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/save_session.py +0 -0
  166. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/settings.py +0 -0
  167. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/terminal_data/linux.keytab +0 -0
  168. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/terminal_setup.py +0 -0
  169. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/test.py +0 -0
  170. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/think_tokens.py +0 -0
  171. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/tokens.py +0 -0
  172. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/undo.py +0 -0
  173. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/utils/__init__.py +0 -0
  174. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/utils/base_command.py +0 -0
  175. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/utils/helpers.py +0 -0
  176. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/utils/registry.py +0 -0
  177. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/utils/save_load_manager.py +0 -0
  178. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/voice.py +0 -0
  179. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/weak_model.py +0 -0
  180. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/commands/web.py +0 -0
  181. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/deprecated_args.py +0 -0
  182. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/diffs.py +0 -0
  183. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/dump.py +0 -0
  184. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/editor.py +0 -0
  185. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/exceptions.py +0 -0
  186. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/format_settings.py +0 -0
  187. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/help.py +0 -0
  188. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/help_pats.py +0 -0
  189. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/__init__.py +0 -0
  190. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/background_commands.py +0 -0
  191. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/command_parser.py +0 -0
  192. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/conversation/__init__.py +0 -0
  193. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/conversation/base_message.py +0 -0
  194. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/conversation/files.py +0 -0
  195. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/conversation/integration.py +0 -0
  196. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/conversation/manager.py +0 -0
  197. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/conversation/service.py +0 -0
  198. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/conversation/tags.py +0 -0
  199. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/conversation/utils.py +0 -0
  200. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/copypaste.py +0 -0
  201. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/coroutines.py +0 -0
  202. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/file_searcher.py +0 -0
  203. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/hashline.py +0 -0
  204. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/hashpos/__init__.py +0 -0
  205. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/hashpos/hashpos.py +0 -0
  206. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/model_providers.py +0 -0
  207. {cecli_dev-0.98.1/cecli/prompts → cecli_dev-0.99.0/cecli/helpers/monorepo}/__init__.py +0 -0
  208. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/nested.py +0 -0
  209. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/profiler.py +0 -0
  210. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/responses.py +0 -0
  211. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/similarity.py +0 -0
  212. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/helpers/skills.py +0 -0
  213. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/history.py +0 -0
  214. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/hooks/__init__.py +0 -0
  215. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/hooks/base.py +0 -0
  216. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/hooks/integration.py +0 -0
  217. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/hooks/manager.py +0 -0
  218. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/hooks/registry.py +0 -0
  219. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/hooks/types.py +0 -0
  220. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/interruptible_input.py +0 -0
  221. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/io.py +0 -0
  222. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/linter.py +0 -0
  223. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/llm.py +0 -0
  224. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/mcp/__init__.py +0 -0
  225. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/mcp/manager.py +0 -0
  226. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/mcp/oauth.py +0 -0
  227. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/mcp/server.py +0 -0
  228. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/mcp/utils.py +0 -0
  229. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/mdstream.py +0 -0
  230. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/onboarding.py +0 -0
  231. {cecli_dev-0.98.1/cecli/prompts/utils → cecli_dev-0.99.0/cecli/prompts}/__init__.py +0 -0
  232. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/agent.yml +0 -0
  233. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/architect.yml +0 -0
  234. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/ask.yml +0 -0
  235. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/base.yml +0 -0
  236. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/context.yml +0 -0
  237. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/copypaste.yml +0 -0
  238. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/editblock.yml +0 -0
  239. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/editblock_fenced.yml +0 -0
  240. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/editblock_func.yml +0 -0
  241. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/editor_diff_fenced.yml +0 -0
  242. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/editor_editblock.yml +0 -0
  243. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/editor_whole.yml +0 -0
  244. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/hashline.yml +0 -0
  245. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/help.yml +0 -0
  246. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/patch.yml +0 -0
  247. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/single_wholefile_func.yml +0 -0
  248. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/udiff.yml +0 -0
  249. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/udiff_simple.yml +0 -0
  250. {cecli_dev-0.98.1/scripts → cecli_dev-0.99.0/cecli/prompts/utils}/__init__.py +0 -0
  251. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/utils/registry.py +0 -0
  252. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/utils/system.py +0 -0
  253. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/wholefile.yml +0 -0
  254. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/prompts/wholefile_func.yml +0 -0
  255. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/README.md +0 -0
  256. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  257. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  258. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  259. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/clojure-tags.scm +0 -0
  260. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  261. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  262. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  263. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  264. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  265. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  266. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  267. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  268. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  269. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  270. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  271. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  272. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  273. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/matlab-tags.scm +0 -0
  274. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/ocaml-tags.scm +0 -0
  275. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +0 -0
  276. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  277. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  278. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  279. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  280. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  281. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  282. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  283. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  284. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  285. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  286. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/README.md +0 -0
  287. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/c-tags.scm +0 -0
  288. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  289. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  290. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/dart-tags.scm +0 -0
  291. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  292. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  293. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/elm-tags.scm +0 -0
  294. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/fortran-tags.scm +0 -0
  295. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/go-tags.scm +0 -0
  296. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/haskell-tags.scm +0 -0
  297. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  298. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/java-tags.scm +0 -0
  299. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  300. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/julia-tags.scm +0 -0
  301. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  302. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/matlab-tags.scm +0 -0
  303. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  304. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/ocaml_interface-tags.scm +0 -0
  305. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/php-tags.scm +0 -0
  306. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/python-tags.scm +0 -0
  307. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/ql-tags.scm +0 -0
  308. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  309. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/rust-tags.scm +0 -0
  310. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/scala-tags.scm +0 -0
  311. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  312. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/zig-tags.scm +0 -0
  313. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/reasoning_tags.py +0 -0
  314. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/repomap.py +0 -0
  315. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/report.py +0 -0
  316. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/resources/__init__.py +0 -0
  317. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/resources/model-metadata.json +0 -0
  318. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/resources/model-settings.yml +0 -0
  319. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/resources/providers.json +0 -0
  320. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/run_cmd.py +0 -0
  321. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/scrape.py +0 -0
  322. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/sendchat.py +0 -0
  323. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/sessions.py +0 -0
  324. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/special.py +0 -0
  325. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/__init__.py +0 -0
  326. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/command.py +0 -0
  327. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/command_interactive.py +0 -0
  328. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/context_manager.py +0 -0
  329. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/delete_text.py +0 -0
  330. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/git_branch.py +0 -0
  331. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/git_diff.py +0 -0
  332. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/git_log.py +0 -0
  333. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/git_remote.py +0 -0
  334. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/git_show.py +0 -0
  335. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/git_status.py +0 -0
  336. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/grep.py +0 -0
  337. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/insert_text.py +0 -0
  338. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/list_changes.py +0 -0
  339. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/load_skill.py +0 -0
  340. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/ls.py +0 -0
  341. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/remove_skill.py +0 -0
  342. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/replace_text.py +0 -0
  343. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/thinking.py +0 -0
  344. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/undo_change.py +0 -0
  345. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/utils/helpers.py +0 -0
  346. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/utils/output.py +0 -0
  347. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/view_files_matching.py +0 -0
  348. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tools/view_files_with_symbol.py +0 -0
  349. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/__init__.py +0 -0
  350. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/io.py +0 -0
  351. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/styles.tcss +0 -0
  352. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/widgets/__init__.py +0 -0
  353. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/widgets/completion_bar.py +0 -0
  354. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/widgets/file_list.py +0 -0
  355. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/widgets/footer.py +0 -0
  356. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/widgets/input_area.py +0 -0
  357. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/widgets/input_container.py +0 -0
  358. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/widgets/key_hints.py +0 -0
  359. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/widgets/output.py +0 -0
  360. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/widgets/status_bar.py +0 -0
  361. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/tui/worker.py +0 -0
  362. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/urls.py +0 -0
  363. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/utils.py +0 -0
  364. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/versioncheck.py +0 -0
  365. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/voice.py +0 -0
  366. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/waiting.py +0 -0
  367. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/watch.py +0 -0
  368. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/watch_prompts.py +0 -0
  369. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/Gemfile +0 -0
  370. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/blame.md +0 -0
  371. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/get-started.md +0 -0
  372. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/help-tip.md +0 -0
  373. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/help.md +0 -0
  374. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/install.md +0 -0
  375. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/keys.md +0 -0
  376. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/model-warnings.md +0 -0
  377. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/multi-line.md +0 -0
  378. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/python-m-aider.md +0 -0
  379. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/recording.css +0 -0
  380. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/recording.md +0 -0
  381. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_includes/works-best.md +0 -0
  382. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/_features.scss +0 -0
  383. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/_footer.scss +0 -0
  384. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/_hero.scss +0 -0
  385. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/_info.scss +0 -0
  386. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/_layout.scss +0 -0
  387. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/_reset.scss +0 -0
  388. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/_testimonials.scss +0 -0
  389. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/_typography.scss +0 -0
  390. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/_variables.scss +0 -0
  391. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/custom/custom.scss +0 -0
  392. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/_sass/global-overrides.scss +0 -0
  393. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/adv-model-settings.md +0 -0
  394. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/aider_conf.md +0 -0
  395. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/api-keys.md +0 -0
  396. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/custom-commands.md +0 -0
  397. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/custom-system-prompts.md +0 -0
  398. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/dotenv.md +0 -0
  399. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/editor.md +0 -0
  400. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/hooks.md +0 -0
  401. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/mcp.md +0 -0
  402. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/model-aliases.md +0 -0
  403. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/options.md +0 -0
  404. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/reasoning.md +0 -0
  405. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/security.md +0 -0
  406. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/skills.md +0 -0
  407. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config/tui.md +0 -0
  408. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/config.md +0 -0
  409. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/faq.md +0 -0
  410. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/git.md +0 -0
  411. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/index.md +0 -0
  412. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/install/docker.md +0 -0
  413. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/install/optional.md +0 -0
  414. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/install.md +0 -0
  415. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/languages.md +0 -0
  416. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/legal/contributor-agreement.md +0 -0
  417. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/legal/privacy.md +0 -0
  418. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/anthropic.md +0 -0
  419. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/azure.md +0 -0
  420. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/bedrock.md +0 -0
  421. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/cohere.md +0 -0
  422. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/deepseek.md +0 -0
  423. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/gemini.md +0 -0
  424. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/github.md +0 -0
  425. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/groq.md +0 -0
  426. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/lm-studio.md +0 -0
  427. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/ollama.md +0 -0
  428. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/openai-compat.md +0 -0
  429. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/openai.md +0 -0
  430. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/openrouter.md +0 -0
  431. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/other.md +0 -0
  432. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/vertex.md +0 -0
  433. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/warnings.md +0 -0
  434. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms/xai.md +0 -0
  435. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/llms.md +0 -0
  436. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/more/analytics.md +0 -0
  437. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/more/edit-formats.md +0 -0
  438. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/more/infinite-output.md +0 -0
  439. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/more-info.md +0 -0
  440. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/repomap.md +0 -0
  441. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/scripting.md +0 -0
  442. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/cecli-not-found.md +0 -0
  443. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/edit-errors.md +0 -0
  444. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/imports.md +0 -0
  445. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/models-and-keys.md +0 -0
  446. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/support.md +0 -0
  447. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/token-limits.md +0 -0
  448. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/warnings.md +0 -0
  449. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting.md +0 -0
  450. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/commands.md +0 -0
  451. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/conventions.md +0 -0
  452. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/copypaste.md +0 -0
  453. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/images-urls.md +0 -0
  454. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/lint-test.md +0 -0
  455. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/modes.md +0 -0
  456. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/not-code.md +0 -0
  457. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/notifications.md +0 -0
  458. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/sessions.md +0 -0
  459. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/tips.md +0 -0
  460. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/voice.md +0 -0
  461. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage/watch.md +0 -0
  462. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/docs/usage.md +0 -0
  463. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli/website/share/index.md +0 -0
  464. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli_dev.egg-info/dependency_links.txt +0 -0
  465. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli_dev.egg-info/entry_points.txt +0 -0
  466. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli_dev.egg-info/requires.txt +0 -0
  467. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/cecli_dev.egg-info/top_level.txt +0 -0
  468. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/docker/Dockerfile +0 -0
  469. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/docker/Dockerfile.local.nvidia.cuda.ubuntu +0 -0
  470. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/pyproject.toml +0 -0
  471. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/requirements/common-constraints.txt +0 -0
  472. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/requirements/requirements-dev.in +0 -0
  473. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/requirements/requirements-dev.txt +0 -0
  474. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/requirements/requirements-help.in +0 -0
  475. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/requirements/requirements-help.txt +0 -0
  476. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/requirements/requirements-playwright.in +0 -0
  477. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/requirements/requirements-playwright.txt +0 -0
  478. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/requirements/requirements.in +0 -0
  479. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/requirements/tree-sitter.in +0 -0
  480. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/requirements.txt +0 -0
  481. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/30k-image.py +0 -0
  482. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/Dockerfile.jekyll +0 -0
  483. {cecli_dev-0.98.1/tests → cecli_dev-0.99.0/scripts}/__init__.py +0 -0
  484. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/blame.py +0 -0
  485. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/clean_metadata.py +0 -0
  486. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/cost_analyzer.py +0 -0
  487. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/dl_icons.py +0 -0
  488. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/filter-chat-mode.js +0 -0
  489. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/generate_providers.py +0 -0
  490. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/get_contributor_list.js +0 -0
  491. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/get_hashline.py +0 -0
  492. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/history_prompts.py +0 -0
  493. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/homepage.py +0 -0
  494. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/issues.py +0 -0
  495. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/jekyll_build.sh +0 -0
  496. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/jekyll_run.sh +0 -0
  497. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/logo_svg.py +0 -0
  498. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/pip-compile.sh +0 -0
  499. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/recording_audio.py +0 -0
  500. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/redact-cast.py +0 -0
  501. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/rename_to_cecli.py +0 -0
  502. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/tmux_record.sh +0 -0
  503. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/tsl_pack_langs.py +0 -0
  504. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/update-blame.sh +0 -0
  505. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/update-docs.sh +0 -0
  506. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/update-history.py +0 -0
  507. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/versionbump.py +0 -0
  508. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/scripts/yank-old-versions.py +0 -0
  509. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/setup.cfg +0 -0
  510. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/shim.pyproject.toml +0 -0
  511. {cecli_dev-0.98.1/tests/basic → cecli_dev-0.99.0/tests}/__init__.py +0 -0
  512. {cecli_dev-0.98.1/tests/hooks → cecli_dev-0.99.0/tests/basic}/__init__.py +0 -0
  513. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_aws_credentials.py +0 -0
  514. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_background_commands.py +0 -0
  515. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_coder.py +0 -0
  516. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_commands.py +0 -0
  517. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_custom_commands.py +0 -0
  518. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_deprecated.py +0 -0
  519. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_editblock.py +0 -0
  520. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_editor.py +0 -0
  521. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_exceptions.py +0 -0
  522. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_find_or_blocks.py +0 -0
  523. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_hashline.py +0 -0
  524. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_history.py +0 -0
  525. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_io.py +0 -0
  526. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_linter.py +0 -0
  527. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_main.py +0 -0
  528. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_model_info_manager.py +0 -0
  529. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_model_provider_manager.py +0 -0
  530. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_models.py +0 -0
  531. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_onboarding.py +0 -0
  532. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_plugin_manager.py +0 -0
  533. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_prompts.py +0 -0
  534. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_reasoning.py +0 -0
  535. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_repo.py +0 -0
  536. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_run_cmd.py +0 -0
  537. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_sanity_check_repo.py +0 -0
  538. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_scripting.py +0 -0
  539. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_sendchat.py +0 -0
  540. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_sessions.py +0 -0
  541. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_skills.py +0 -0
  542. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_special.py +0 -0
  543. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_ssl_verification.py +0 -0
  544. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_udiff.py +0 -0
  545. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_urls.py +0 -0
  546. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_voice.py +0 -0
  547. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_watch.py +0 -0
  548. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/basic/test_wholefile.py +0 -0
  549. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/conftest.py +0 -0
  550. {cecli_dev-0.98.1/tests → cecli_dev-0.99.0/tests/conversations}/test_conversation_integration.py +0 -0
  551. {cecli_dev-0.98.1/tests → cecli_dev-0.99.0/tests/conversations}/test_conversation_system.py +0 -0
  552. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/chat-history-search-replace-gold.txt +0 -0
  553. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/chat-history.md +0 -0
  554. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/arduino/test.ino +0 -0
  555. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/c/test.c +0 -0
  556. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/chatito/test.chatito +0 -0
  557. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/clojure/test.clj +0 -0
  558. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/commonlisp/test.lisp +0 -0
  559. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/cpp/test.cpp +0 -0
  560. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/csharp/test.cs +0 -0
  561. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/d/test.d +0 -0
  562. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/dart/test.dart +0 -0
  563. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/elisp/test.el +0 -0
  564. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/elixir/test.ex +0 -0
  565. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/elm/test.elm +0 -0
  566. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/gleam/test.gleam +0 -0
  567. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/go/test.go +0 -0
  568. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/haskell/test.hs +0 -0
  569. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/hcl/test.tf +0 -0
  570. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/java/test.java +0 -0
  571. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/javascript/test.js +0 -0
  572. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/kotlin/test.kt +0 -0
  573. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/lua/test.lua +0 -0
  574. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/matlab/test.m +0 -0
  575. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/ocaml/test.ml +0 -0
  576. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/ocaml_interface/test.mli +0 -0
  577. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/php/test.php +0 -0
  578. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/pony/test.pony +0 -0
  579. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/properties/test.properties +0 -0
  580. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/python/test.py +0 -0
  581. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/ql/test.ql +0 -0
  582. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/r/test.r +0 -0
  583. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/racket/test.rkt +0 -0
  584. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/ruby/test.rb +0 -0
  585. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/rust/test.rs +0 -0
  586. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/scala/test.scala +0 -0
  587. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/solidity/test.sol +0 -0
  588. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/swift/test.swift +0 -0
  589. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/tsx/test.tsx +0 -0
  590. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/typescript/test.ts +0 -0
  591. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/udev/test.rules +0 -0
  592. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/languages/zig/test.zig +0 -0
  593. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/sample-code-base/sample.js +0 -0
  594. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/sample-code-base/sample.py +0 -0
  595. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/sample-code-base-repo-map.txt +0 -0
  596. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/watch.js +0 -0
  597. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/watch.lisp +0 -0
  598. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/watch.py +0 -0
  599. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/fixtures/watch_question.js +0 -0
  600. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/help/test_help.py +0 -0
  601. {cecli_dev-0.98.1/tests/mcp → cecli_dev-0.99.0/tests/hooks}/__init__.py +0 -0
  602. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/hooks/test_base.py +0 -0
  603. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/hooks/test_manager.py +0 -0
  604. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/hooks/test_registry.py +0 -0
  605. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/mcp/test_manager.py +0 -0
  606. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/scrape/test_playwright_disable.py +0 -0
  607. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/scrape/test_scrape.py +0 -0
  608. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/tools/test_git_branch.py +0 -0
  609. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/tools/test_git_diff.py +0 -0
  610. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/tools/test_grep.py +0 -0
  611. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/tools/test_insert_block.py +0 -0
  612. {cecli_dev-0.98.1 → cecli_dev-0.99.0}/tests/tools/test_show_context.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.1
3
+ Version: 0.99.0
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.0.dev"
3
+ __version__ = "0.99.0.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.1'
22
- __version_tuple__ = version_tuple = (0, 98, 1)
21
+ __version__ = version = '0.99.0'
22
+ __version_tuple__ = version_tuple = (0, 99, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g05e9595a9'
24
+ __commit_id__ = commit_id = 'g12b89af88'
@@ -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(
@@ -43,6 +43,7 @@ class AgentCoder(Coder):
43
43
  def __init__(self, *args, **kwargs):
44
44
  self.recently_removed = {}
45
45
  self.tool_usage_history = []
46
+ self.loaded_custom_tools = []
46
47
  self.tool_usage_retries = 20
47
48
  self.last_round_tools = []
48
49
  self.tool_call_vectors = []
@@ -90,6 +91,7 @@ class AgentCoder(Coder):
90
91
  self.agent_config = self._get_agent_config()
91
92
  self._setup_agent()
92
93
  ToolRegistry.build_registry(agent_config=self.agent_config)
94
+ self.loaded_custom_tools = ToolRegistry.loaded_custom_tools
93
95
  super().__init__(*args, **kwargs)
94
96
 
95
97
  def _setup_agent(self):
@@ -196,6 +198,9 @@ class AgentCoder(Coder):
196
198
 
197
199
  def show_announcements(self):
198
200
  super().show_announcements()
201
+ if self.loaded_custom_tools:
202
+ self.io.tool_output(f"Loaded custom tools: {', '.join(self.loaded_custom_tools)}")
203
+
199
204
  skills = self.skills_manager.find_skills()
200
205
  if skills:
201
206
  skills_list = []
@@ -295,21 +300,6 @@ class AgentCoder(Coder):
295
300
  tasks.append(result)
296
301
  else:
297
302
  tasks.append(asyncio.to_thread(lambda: result))
298
- elif self.mcp_tools:
299
- for server_name, server_tools in self.mcp_tools:
300
- if any(
301
- t.get("function", {}).get("name") == norm_tool_name
302
- for t in server_tools
303
- ):
304
- server = self.mcp_manager.get_server(server_name)
305
- if server:
306
- for params in parsed_args_list:
307
- tasks.append(
308
- self._execute_mcp_tool(server, norm_tool_name, params)
309
- )
310
- break
311
- else:
312
- all_results_content.append(f"Error: Unknown tool name '{tool_name}'")
313
303
  else:
314
304
  all_results_content.append(f"Error: Unknown tool name '{tool_name}'")
315
305
  if tasks:
@@ -1047,7 +1037,9 @@ I will proceed based on the tool results and updated context.""")
1047
1037
  )
1048
1038
  self.model_kwargs["frequency_penalty"] = min(0, max(freq_penalty - 0.15, 0))
1049
1039
 
1050
- self.model_kwargs["temperature"] = max(0, min(self.model_kwargs["temperature"], 1))
1040
+ self.model_kwargs["temperature"] = max(
1041
+ 0, min(nested.getter(self.model_kwargs, "temperature", 1), 1)
1042
+ )
1051
1043
  # One twentieth of the time, just straight reset the randomness
1052
1044
  if random.random() < 0.05:
1053
1045
  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,9 +548,9 @@ 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
- use_enhanced_map=False if not self.args or self.args.use_enhanced_map else True,
553
+ use_enhanced_map=getattr(self.args, "use_enhanced_map", False),
548
554
  )
549
555
 
550
556
  self.summarizer = summarizer or ChatSummary(
@@ -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
 
@@ -3221,12 +3230,13 @@ class Coder:
3221
3230
  try:
3222
3231
  func = chunk.choices[0].delta.function_call
3223
3232
  # dump(func)
3224
- for k, v in func.items():
3225
- self.tool_reflection = True
3226
- self.io.update_spinner_suffix(v)
3233
+ if func:
3234
+ for k, v in func.items():
3235
+ self.tool_reflection = True
3236
+ self.io.update_spinner_suffix(v)
3227
3237
 
3228
- received_content = True
3229
- self.token_profiler.on_token()
3238
+ received_content = True
3239
+ self.token_profiler.on_token()
3230
3240
  except AttributeError:
3231
3241
  pass
3232
3242
 
@@ -3650,13 +3660,14 @@ class Coder:
3650
3660
  # Continue to get tracked files normally
3651
3661
 
3652
3662
  if self.repo:
3653
- 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():
3654
3666
  files = self.repo.get_tracked_files()
3655
3667
  else:
3656
3668
  files = self.repo.get_non_ignored_files_from_root()
3657
3669
  else:
3658
3670
  files = self.get_inchat_relative_files()
3659
-
3660
3671
  # This is quite slow in large repos
3661
3672
  # files = [fname for fname in files if self.is_file_safe(fname)]
3662
3673
 
@@ -3918,6 +3929,13 @@ class Coder:
3918
3929
  if not self.repo or not self.auto_commits or self.dry_run:
3919
3930
  return
3920
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
+
3921
3939
  if not context:
3922
3940
  context = self.get_context_from_history(
3923
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
@@ -0,0 +1,149 @@
1
+ import json
2
+ from pathlib import Path
3
+ from typing import Any, Dict, Optional
4
+
5
+ import yaml
6
+
7
+
8
+ def resolve_workspace_config(config_arg: Optional[str] = None) -> Optional[Any]:
9
+ """
10
+ Common logic to resolve workspace configuration from hierarchy:
11
+ 1. config_arg (JSON string)
12
+ 2. Local .cecli.workspaces.yml/yaml
13
+ 3. Global ~/.cecli/workspaces.yml/yaml
14
+ 4. Fallback to .cecli.conf.yml
15
+ """
16
+ workspace_conf = None
17
+
18
+ # 1. Try config_arg (JSON string from main.py)
19
+ if config_arg:
20
+ try:
21
+ loaded = json.loads(config_arg)
22
+ if isinstance(loaded, dict):
23
+ workspace_conf = loaded.get("workspaces") or loaded.get("workspace") or loaded
24
+ elif isinstance(loaded, list):
25
+ workspace_conf = loaded
26
+ except json.JSONDecodeError:
27
+ try:
28
+ loaded = yaml.safe_load(config_arg)
29
+ if isinstance(loaded, dict):
30
+ workspace_conf = loaded.get("workspaces") or loaded.get("workspace") or loaded
31
+ elif isinstance(loaded, list):
32
+ workspace_conf = loaded
33
+ except yaml.YAMLError:
34
+ pass
35
+
36
+ # 2. Look for local .cecli.workspaces.yml/yaml
37
+ if not workspace_conf:
38
+ for local_name in [".cecli.workspaces.yml", ".cecli.workspaces.yaml"]:
39
+ local_path = Path(local_name)
40
+ if local_path.exists():
41
+ try:
42
+ with open(local_path, "r") as f:
43
+ loaded = yaml.safe_load(f)
44
+ if loaded:
45
+ workspace_conf = (
46
+ loaded.get("workspaces") or loaded.get("workspace") or loaded
47
+ )
48
+ if workspace_conf:
49
+ break
50
+ except Exception:
51
+ pass
52
+
53
+ # 3. Look for global ~/.cecli/workspaces.yml/yaml
54
+ if not workspace_conf:
55
+ for global_name in ["workspaces.yml", "workspaces.yaml"]:
56
+ global_path = Path.home() / ".cecli" / global_name
57
+ if global_path.exists():
58
+ try:
59
+ with open(global_path, "r") as f:
60
+ loaded = yaml.safe_load(f)
61
+ if loaded:
62
+ workspace_conf = (
63
+ loaded.get("workspaces") or loaded.get("workspace") or loaded
64
+ )
65
+ if workspace_conf:
66
+ break
67
+ except Exception:
68
+ pass
69
+
70
+ return workspace_conf
71
+
72
+
73
+ def load_workspace_config(
74
+ config_arg: Optional[str] = None, name: Optional[str] = None
75
+ ) -> Dict[str, Any]:
76
+ """
77
+ Load workspace configuration from hierarchy.
78
+ If name is provided, select that specific workspace from a list.
79
+ """
80
+ workspace_conf = resolve_workspace_config(config_arg)
81
+
82
+ config = {}
83
+ # Handle list of workspaces or single dict
84
+ if isinstance(workspace_conf, list):
85
+ if name:
86
+ selected_ws = next((ws for ws in workspace_conf if ws.get("name") == name), None)
87
+ if not selected_ws:
88
+ raise ValueError(f"Workspace '{name}' not found in configuration")
89
+ config = selected_ws
90
+ else:
91
+ active_workspaces = [ws for ws in workspace_conf if ws.get("active")]
92
+ if len(active_workspaces) > 1:
93
+ active_names = [ws.get("name", "unknown") for ws in active_workspaces]
94
+ raise ValueError(f"Multiple workspaces marked as active: {', '.join(active_names)}")
95
+
96
+ active_ws = active_workspaces[0] if active_workspaces else None
97
+
98
+ # If no workspace is explicitly marked active, but there is only one, use it
99
+ if not active_ws and len(workspace_conf) == 1:
100
+ active_ws = workspace_conf[0]
101
+ config = active_ws if active_ws else {}
102
+ elif isinstance(workspace_conf, dict):
103
+ config = workspace_conf
104
+
105
+ validate_config(config)
106
+ return config
107
+
108
+
109
+ def validate_config(config: Dict[str, Any]) -> None:
110
+ """
111
+ Minimal validation of required fields.
112
+ """
113
+ if not config:
114
+ return
115
+
116
+ if "name" not in config:
117
+ raise ValueError("Workspace configuration must include a 'name'")
118
+
119
+ if "projects" not in config:
120
+ config["projects"] = []
121
+
122
+ project_names = set()
123
+ for project in config["projects"]:
124
+ if "name" not in project or "repo" not in project:
125
+ raise ValueError("Each project must have a 'name' and 'repo' URL")
126
+ if project["name"] in project_names:
127
+ raise ValueError(f"Duplicate project name: {project['name']}")
128
+ project_names.add(project["name"])
129
+
130
+
131
+ def find_active_workspace_name(config_arg: Optional[str] = None) -> Optional[str]:
132
+ """
133
+ Find the name of the active workspace from the config without resolving it fully.
134
+ Used in main.py to automatically activate a workspace.
135
+ """
136
+ workspace_conf = resolve_workspace_config(config_arg)
137
+
138
+ if isinstance(workspace_conf, list):
139
+ active_ws = next((ws for ws in workspace_conf if ws.get("active")), None)
140
+ if active_ws:
141
+ return active_ws.get("name")
142
+ # If there's only one workspace, it's considered active
143
+ if len(workspace_conf) == 1:
144
+ return workspace_conf[0].get("name")
145
+ elif isinstance(workspace_conf, dict):
146
+ # If it's a single dict, it's considered active by default
147
+ return workspace_conf.get("name")
148
+
149
+ return None
@@ -0,0 +1,89 @@
1
+ import subprocess
2
+ from pathlib import Path
3
+ from typing import Any, Dict
4
+
5
+ from cecli.helpers.monorepo.worktree import WorktreeManager
6
+
7
+
8
+ class Project:
9
+ def __init__(self, workspace_path: Path, config: Dict[str, Any]):
10
+ self.workspace_path = workspace_path
11
+ self.config = config
12
+ self.name = config["name"]
13
+ self.repo_url = config["repo"]
14
+ self.base_path = workspace_path / self.name
15
+ self.main_path = self.base_path / "main"
16
+
17
+ def initialize(self) -> None:
18
+ """Clone the repository and setup worktrees."""
19
+ if not self.main_path.exists():
20
+ self.main_path.mkdir(parents=True, exist_ok=True)
21
+
22
+ target_branch = self.config.get("branch")
23
+ use_current = self.config.get("use_current_branch", True)
24
+
25
+ clone_cmd = ["git", "clone", "--depth", "1"]
26
+ if target_branch and not use_current:
27
+ clone_cmd += ["--branch", target_branch]
28
+
29
+ clone_cmd += [self.repo_url, str(self.main_path)]
30
+
31
+ subprocess.run(clone_cmd, check=True)
32
+
33
+ # Ensure correct branch is checked out
34
+ target_branch = self.config.get("branch")
35
+ use_current = self.config.get("use_current_branch", True)
36
+
37
+ if target_branch and not use_current:
38
+ try:
39
+ # Check current branch
40
+ current_branch = subprocess.check_output(
41
+ ["git", "-C", str(self.main_path), "rev-parse", "--abbrev-ref", "HEAD"],
42
+ encoding="utf-8",
43
+ ).strip()
44
+
45
+ if current_branch != target_branch:
46
+ # Try to checkout directly
47
+ res = subprocess.run(
48
+ ["git", "-C", str(self.main_path), "checkout", target_branch],
49
+ check=False,
50
+ capture_output=True,
51
+ )
52
+
53
+ if res.returncode != 0:
54
+ # If checkout fails, check if it exists on origin
55
+ subprocess.run(
56
+ ["git", "-C", str(self.main_path), "fetch", "origin", target_branch],
57
+ check=False,
58
+ )
59
+
60
+ # Try checking out the remote branch
61
+ res = subprocess.run(
62
+ [
63
+ "git",
64
+ "-C",
65
+ str(self.main_path),
66
+ "checkout",
67
+ "-b",
68
+ target_branch,
69
+ f"origin/{target_branch}",
70
+ ],
71
+ check=False,
72
+ capture_output=True,
73
+ )
74
+
75
+ if res.returncode != 0:
76
+ # If it still fails, it doesn't exist on origin, so create it locally
77
+ subprocess.run(
78
+ ["git", "-C", str(self.main_path), "checkout", "-b", target_branch],
79
+ check=True,
80
+ )
81
+ except Exception:
82
+ # Fallback for unexpected errors
83
+ pass
84
+ # Handle worktrees
85
+ worktrees_config = self.config.get("worktrees", [])
86
+ if worktrees_config:
87
+ wt_manager = WorktreeManager(self.main_path)
88
+ for wt_cfg in worktrees_config:
89
+ wt_manager.create(wt_cfg["name"], wt_cfg["branch"])
@@ -0,0 +1,36 @@
1
+ import os
2
+ from pathlib import Path
3
+ from typing import Any, Dict
4
+
5
+ from cecli.helpers.monorepo.project import Project
6
+
7
+
8
+ class WorkspaceManager:
9
+ def __init__(self, workspace_name: str, config: Dict[str, Any]):
10
+ self.name = workspace_name
11
+ self.config = config
12
+ self.path = Path(os.path.expanduser(f"~/.cecli/workspaces/{workspace_name}"))
13
+
14
+ def exists(self) -> bool:
15
+ """Check if workspace directory exists"""
16
+ return self.path.exists()
17
+
18
+ def initialize(self) -> None:
19
+ """Create workspace structure and clone repositories"""
20
+ self.path.mkdir(parents=True, exist_ok=True)
21
+
22
+ projects_config = self.config.get("projects", [])
23
+ for proj_cfg in projects_config:
24
+ project = Project(self.path, proj_cfg)
25
+ project.initialize()
26
+
27
+ # Write metadata
28
+ import json
29
+
30
+ metadata_path = self.path / ".cecli-workspace.json"
31
+ with open(metadata_path, "w") as f:
32
+ json.dump(self.config, f, indent=2)
33
+
34
+ def get_working_directory(self) -> Path:
35
+ """Return workspace root path for cd"""
36
+ return self.path
@@ -0,0 +1,21 @@
1
+ import subprocess
2
+ from pathlib import Path
3
+
4
+
5
+ class WorktreeManager:
6
+ def __init__(self, main_repo_path: Path):
7
+ self.main_repo_path = main_repo_path
8
+ self.worktrees_dir = main_repo_path.parent / "worktrees"
9
+
10
+ def create(self, name: str, branch: str) -> None:
11
+ """Create a git worktree."""
12
+ wt_path = self.worktrees_dir / name
13
+ if wt_path.exists():
14
+ return
15
+
16
+ self.worktrees_dir.mkdir(parents=True, exist_ok=True)
17
+
18
+ subprocess.run(
19
+ ["git", "-C", str(self.main_repo_path), "worktree", "add", str(wt_path), branch],
20
+ check=True,
21
+ )
@@ -37,6 +37,8 @@ def normalize_filename(filename: str) -> str:
37
37
  :param filename: Original filename
38
38
  :return: Normalized module name
39
39
  """
40
+ if not filename:
41
+ return ""
40
42
  # Remove extension
41
43
  name = Path(filename).stem
42
44
 
@@ -58,6 +60,8 @@ def load_module(source, module_name=None, reload=False):
58
60
  :param module_name: name of module to register in sys.modules
59
61
  :return: loaded module
60
62
  """
63
+ if not source:
64
+ return None
61
65
  # Convert to absolute path for cache key
62
66
  source_path = Path(source).resolve()
63
67