cecli-dev 0.98.2__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.2 → cecli_dev-0.99.0}/.github/workflows/ubuntu-tests.yml +6 -0
  2. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.github/workflows/windows-tests.yml +6 -0
  3. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/PKG-INFO +2 -1
  4. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/README.md +1 -0
  5. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/__init__.py +1 -1
  6. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/_version.py +3 -3
  7. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/args.py +13 -0
  8. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/agent_coder.py +3 -1
  9. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/base_coder.py +20 -3
  10. {cecli_dev-0.98.2 → 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.2 → cecli_dev-0.99.0}/cecli/main.py +47 -25
  17. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/repo.py +103 -0
  18. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/app.py +8 -2
  19. cecli_dev-0.99.0/cecli/website/docs/config/workspaces.md +78 -0
  20. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli_dev.egg-info/PKG-INFO +2 -1
  21. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli_dev.egg-info/SOURCES.txt +13 -2
  22. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/pytest.ini +5 -2
  23. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/coders/test_copypaste_coder.py +2 -2
  24. cecli_dev-0.99.0/tests/helpers/monorepo/test_config.py +50 -0
  25. cecli_dev-0.99.0/tests/helpers/monorepo/test_config_active.py +79 -0
  26. cecli_dev-0.99.0/tests/helpers/monorepo/test_repomap_workspace.py +227 -0
  27. cecli_dev-0.99.0/tests/helpers/monorepo/test_workspace.py +52 -0
  28. cecli_dev-0.99.0/tests/mcp/__init__.py +0 -0
  29. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.dockerignore +0 -0
  30. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.flake8 +0 -0
  31. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.gitattributes +0 -0
  32. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.github/ISSUE_TEMPLATE/issue.yml +0 -0
  33. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.github/workflows/check_pypi_version.yml +0 -0
  34. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.github/workflows/docker-build-test.yml +0 -0
  35. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.github/workflows/docker-release.yml +0 -0
  36. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.github/workflows/issues.yml +0 -0
  37. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.github/workflows/pages.yml +0 -0
  38. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.github/workflows/pre-commit.yml +0 -0
  39. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.github/workflows/release.yml +0 -0
  40. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.github/workflows/windows_check_pypi_version.yml +0 -0
  41. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.gitignore +0 -0
  42. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/.pre-commit-config.yaml +0 -0
  43. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/CHANGELOG.md +0 -0
  44. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/CNAME +0 -0
  45. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/CONTRIBUTING.md +0 -0
  46. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/HISTORY.md +0 -0
  47. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/LICENSE.txt +0 -0
  48. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/MANIFEST.in +0 -0
  49. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/Dockerfile +0 -0
  50. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/README.md +0 -0
  51. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/__init__.py +0 -0
  52. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/benchmark.py +0 -0
  53. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/benchmark_classic.py +0 -0
  54. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/clone-exercism.sh +0 -0
  55. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/cpp-test.sh +0 -0
  56. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/docker.sh +0 -0
  57. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/docker_build.sh +0 -0
  58. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/install-docker-ubuntu.sh +0 -0
  59. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/npm-test.sh +0 -0
  60. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/over_time.py +0 -0
  61. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/plot.sh +0 -0
  62. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/plots.py +0 -0
  63. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/problem_stats.py +0 -0
  64. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/prompts.py +0 -0
  65. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/refactor_tools.py +0 -0
  66. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/rsync.sh +0 -0
  67. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/rungrid.py +0 -0
  68. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/swe-bench-lite.txt +0 -0
  69. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/swe-bench.txt +0 -0
  70. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/swe_bench.py +0 -0
  71. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/test_benchmark.py +0 -0
  72. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/variations.1.sh +0 -0
  73. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/variations.2.sh +0 -0
  74. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/variations.3.sh +0 -0
  75. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/benchmark/variations.4.sh +0 -0
  76. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/__main__.py +0 -0
  77. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/args_formatter.py +0 -0
  78. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/change_tracker.py +0 -0
  79. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/__init__.py +0 -0
  80. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/architect_coder.py +0 -0
  81. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/ask_coder.py +0 -0
  82. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/chat_chunks.py +0 -0
  83. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/context_coder.py +0 -0
  84. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/copypaste_coder.py +0 -0
  85. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/editblock_coder.py +0 -0
  86. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/editblock_fenced_coder.py +0 -0
  87. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/editblock_func_coder.py +0 -0
  88. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/editor_diff_fenced_coder.py +0 -0
  89. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/editor_editblock_coder.py +0 -0
  90. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/editor_whole_coder.py +0 -0
  91. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/hashline_coder.py +0 -0
  92. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/help_coder.py +0 -0
  93. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/patch_coder.py +0 -0
  94. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/search_replace.py +0 -0
  95. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/shell.py +0 -0
  96. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/single_wholefile_func_coder.py +0 -0
  97. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/udiff_coder.py +0 -0
  98. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/udiff_simple.py +0 -0
  99. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/wholefile_coder.py +0 -0
  100. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/coders/wholefile_func_coder.py +0 -0
  101. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/add.py +0 -0
  102. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/agent.py +0 -0
  103. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/agent_model.py +0 -0
  104. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/architect.py +0 -0
  105. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/ask.py +0 -0
  106. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/chat_mode.py +0 -0
  107. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/clear.py +0 -0
  108. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/code.py +0 -0
  109. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/command_prefix.py +0 -0
  110. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/commit.py +0 -0
  111. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/compact.py +0 -0
  112. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/context.py +0 -0
  113. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/context_blocks.py +0 -0
  114. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/context_management.py +0 -0
  115. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/copy.py +0 -0
  116. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/copy_context.py +0 -0
  117. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/core.py +0 -0
  118. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/diff.py +0 -0
  119. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/drop.py +0 -0
  120. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/editor.py +0 -0
  121. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/editor_model.py +0 -0
  122. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/exit.py +0 -0
  123. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/git.py +0 -0
  124. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/hashline.py +0 -0
  125. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/help.py +0 -0
  126. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/history_search.py +0 -0
  127. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/hooks.py +0 -0
  128. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/lint.py +0 -0
  129. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/list_sessions.py +0 -0
  130. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/load.py +0 -0
  131. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/load_hook.py +0 -0
  132. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/load_mcp.py +0 -0
  133. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/load_session.py +0 -0
  134. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/load_skill.py +0 -0
  135. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/ls.py +0 -0
  136. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/map.py +0 -0
  137. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/map_refresh.py +0 -0
  138. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/model.py +0 -0
  139. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/models.py +0 -0
  140. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/multiline_mode.py +0 -0
  141. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/paste.py +0 -0
  142. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/quit.py +0 -0
  143. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/read_only.py +0 -0
  144. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/read_only_stub.py +0 -0
  145. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/reasoning_effort.py +0 -0
  146. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/remove_hook.py +0 -0
  147. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/remove_mcp.py +0 -0
  148. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/remove_skill.py +0 -0
  149. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/report.py +0 -0
  150. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/reset.py +0 -0
  151. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/rules.py +0 -0
  152. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/run.py +0 -0
  153. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/save.py +0 -0
  154. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/save_session.py +0 -0
  155. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/settings.py +0 -0
  156. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/terminal_data/linux.keytab +0 -0
  157. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/terminal_setup.py +0 -0
  158. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/test.py +0 -0
  159. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/think_tokens.py +0 -0
  160. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/tokens.py +0 -0
  161. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/undo.py +0 -0
  162. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/utils/__init__.py +0 -0
  163. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/utils/base_command.py +0 -0
  164. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/utils/helpers.py +0 -0
  165. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/utils/registry.py +0 -0
  166. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/utils/save_load_manager.py +0 -0
  167. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/voice.py +0 -0
  168. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/weak_model.py +0 -0
  169. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/commands/web.py +0 -0
  170. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/deprecated_args.py +0 -0
  171. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/diffs.py +0 -0
  172. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/dump.py +0 -0
  173. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/editor.py +0 -0
  174. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/exceptions.py +0 -0
  175. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/format_settings.py +0 -0
  176. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/help.py +0 -0
  177. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/help_pats.py +0 -0
  178. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/__init__.py +0 -0
  179. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/background_commands.py +0 -0
  180. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/command_parser.py +0 -0
  181. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/conversation/__init__.py +0 -0
  182. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/conversation/base_message.py +0 -0
  183. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/conversation/files.py +0 -0
  184. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/conversation/integration.py +0 -0
  185. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/conversation/manager.py +0 -0
  186. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/conversation/service.py +0 -0
  187. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/conversation/tags.py +0 -0
  188. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/conversation/utils.py +0 -0
  189. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/copypaste.py +0 -0
  190. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/coroutines.py +0 -0
  191. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/file_searcher.py +0 -0
  192. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/hashline.py +0 -0
  193. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/hashpos/__init__.py +0 -0
  194. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/hashpos/hashpos.py +0 -0
  195. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/model_providers.py +0 -0
  196. {cecli_dev-0.98.2/cecli/prompts → cecli_dev-0.99.0/cecli/helpers/monorepo}/__init__.py +0 -0
  197. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/nested.py +0 -0
  198. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/plugin_manager.py +0 -0
  199. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/profiler.py +0 -0
  200. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/requests.py +0 -0
  201. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/responses.py +0 -0
  202. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/similarity.py +0 -0
  203. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/helpers/skills.py +0 -0
  204. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/history.py +0 -0
  205. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/hooks/__init__.py +0 -0
  206. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/hooks/base.py +0 -0
  207. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/hooks/integration.py +0 -0
  208. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/hooks/manager.py +0 -0
  209. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/hooks/registry.py +0 -0
  210. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/hooks/types.py +0 -0
  211. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/interruptible_input.py +0 -0
  212. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/io.py +0 -0
  213. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/linter.py +0 -0
  214. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/llm.py +0 -0
  215. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/mcp/__init__.py +0 -0
  216. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/mcp/manager.py +0 -0
  217. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/mcp/oauth.py +0 -0
  218. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/mcp/server.py +0 -0
  219. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/mcp/utils.py +0 -0
  220. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/mdstream.py +0 -0
  221. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/models.py +0 -0
  222. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/onboarding.py +0 -0
  223. {cecli_dev-0.98.2/cecli/prompts/utils → cecli_dev-0.99.0/cecli/prompts}/__init__.py +0 -0
  224. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/agent.yml +0 -0
  225. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/architect.yml +0 -0
  226. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/ask.yml +0 -0
  227. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/base.yml +0 -0
  228. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/context.yml +0 -0
  229. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/copypaste.yml +0 -0
  230. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/editblock.yml +0 -0
  231. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/editblock_fenced.yml +0 -0
  232. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/editblock_func.yml +0 -0
  233. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/editor_diff_fenced.yml +0 -0
  234. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/editor_editblock.yml +0 -0
  235. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/editor_whole.yml +0 -0
  236. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/hashline.yml +0 -0
  237. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/help.yml +0 -0
  238. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/patch.yml +0 -0
  239. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/single_wholefile_func.yml +0 -0
  240. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/udiff.yml +0 -0
  241. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/udiff_simple.yml +0 -0
  242. {cecli_dev-0.98.2/scripts → cecli_dev-0.99.0/cecli/prompts/utils}/__init__.py +0 -0
  243. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/utils/registry.py +0 -0
  244. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/utils/system.py +0 -0
  245. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/wholefile.yml +0 -0
  246. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/prompts/wholefile_func.yml +0 -0
  247. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/README.md +0 -0
  248. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/arduino-tags.scm +0 -0
  249. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/c-tags.scm +0 -0
  250. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/chatito-tags.scm +0 -0
  251. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/clojure-tags.scm +0 -0
  252. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/commonlisp-tags.scm +0 -0
  253. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/cpp-tags.scm +0 -0
  254. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/csharp-tags.scm +0 -0
  255. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/d-tags.scm +0 -0
  256. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/dart-tags.scm +0 -0
  257. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/elisp-tags.scm +0 -0
  258. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/elixir-tags.scm +0 -0
  259. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/elm-tags.scm +0 -0
  260. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/gleam-tags.scm +0 -0
  261. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/go-tags.scm +0 -0
  262. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/java-tags.scm +0 -0
  263. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/javascript-tags.scm +0 -0
  264. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/lua-tags.scm +0 -0
  265. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/matlab-tags.scm +0 -0
  266. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/ocaml-tags.scm +0 -0
  267. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +0 -0
  268. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/pony-tags.scm +0 -0
  269. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/properties-tags.scm +0 -0
  270. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/python-tags.scm +0 -0
  271. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/r-tags.scm +0 -0
  272. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/racket-tags.scm +0 -0
  273. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/ruby-tags.scm +0 -0
  274. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/rust-tags.scm +0 -0
  275. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/solidity-tags.scm +0 -0
  276. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/swift-tags.scm +0 -0
  277. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-language-pack/udev-tags.scm +0 -0
  278. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/README.md +0 -0
  279. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/c-tags.scm +0 -0
  280. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
  281. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/cpp-tags.scm +0 -0
  282. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/dart-tags.scm +0 -0
  283. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/elisp-tags.scm +0 -0
  284. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/elixir-tags.scm +0 -0
  285. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/elm-tags.scm +0 -0
  286. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/fortran-tags.scm +0 -0
  287. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/go-tags.scm +0 -0
  288. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/haskell-tags.scm +0 -0
  289. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/hcl-tags.scm +0 -0
  290. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/java-tags.scm +0 -0
  291. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/javascript-tags.scm +0 -0
  292. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/julia-tags.scm +0 -0
  293. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
  294. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/matlab-tags.scm +0 -0
  295. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
  296. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/ocaml_interface-tags.scm +0 -0
  297. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/php-tags.scm +0 -0
  298. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/python-tags.scm +0 -0
  299. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/ql-tags.scm +0 -0
  300. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/ruby-tags.scm +0 -0
  301. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/rust-tags.scm +0 -0
  302. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/scala-tags.scm +0 -0
  303. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/typescript-tags.scm +0 -0
  304. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/queries/tree-sitter-languages/zig-tags.scm +0 -0
  305. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/reasoning_tags.py +0 -0
  306. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/repomap.py +0 -0
  307. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/report.py +0 -0
  308. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/resources/__init__.py +0 -0
  309. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/resources/model-metadata.json +0 -0
  310. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/resources/model-settings.yml +0 -0
  311. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/resources/providers.json +0 -0
  312. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/run_cmd.py +0 -0
  313. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/scrape.py +0 -0
  314. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/sendchat.py +0 -0
  315. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/sessions.py +0 -0
  316. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/special.py +0 -0
  317. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/__init__.py +0 -0
  318. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/command.py +0 -0
  319. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/command_interactive.py +0 -0
  320. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/context_manager.py +0 -0
  321. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/delete_text.py +0 -0
  322. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/finished.py +0 -0
  323. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/git_branch.py +0 -0
  324. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/git_diff.py +0 -0
  325. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/git_log.py +0 -0
  326. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/git_remote.py +0 -0
  327. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/git_show.py +0 -0
  328. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/git_status.py +0 -0
  329. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/grep.py +0 -0
  330. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/insert_text.py +0 -0
  331. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/list_changes.py +0 -0
  332. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/load_skill.py +0 -0
  333. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/ls.py +0 -0
  334. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/remove_skill.py +0 -0
  335. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/replace_text.py +0 -0
  336. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/show_context.py +0 -0
  337. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/thinking.py +0 -0
  338. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/undo_change.py +0 -0
  339. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/update_todo_list.py +0 -0
  340. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/utils/base_tool.py +0 -0
  341. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/utils/helpers.py +0 -0
  342. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/utils/output.py +0 -0
  343. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/utils/registry.py +0 -0
  344. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/view_files_matching.py +0 -0
  345. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tools/view_files_with_symbol.py +0 -0
  346. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/__init__.py +0 -0
  347. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/io.py +0 -0
  348. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/styles.tcss +0 -0
  349. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/widgets/__init__.py +0 -0
  350. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/widgets/completion_bar.py +0 -0
  351. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/widgets/file_list.py +0 -0
  352. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/widgets/footer.py +0 -0
  353. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/widgets/input_area.py +0 -0
  354. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/widgets/input_container.py +0 -0
  355. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/widgets/key_hints.py +0 -0
  356. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/widgets/output.py +0 -0
  357. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/widgets/status_bar.py +0 -0
  358. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/tui/worker.py +0 -0
  359. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/urls.py +0 -0
  360. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/utils.py +0 -0
  361. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/versioncheck.py +0 -0
  362. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/voice.py +0 -0
  363. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/waiting.py +0 -0
  364. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/watch.py +0 -0
  365. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/watch_prompts.py +0 -0
  366. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/Gemfile +0 -0
  367. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/blame.md +0 -0
  368. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/get-started.md +0 -0
  369. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/help-tip.md +0 -0
  370. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/help.md +0 -0
  371. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/install.md +0 -0
  372. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/keys.md +0 -0
  373. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/model-warnings.md +0 -0
  374. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/multi-line.md +0 -0
  375. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/python-m-aider.md +0 -0
  376. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/recording.css +0 -0
  377. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/recording.md +0 -0
  378. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_includes/works-best.md +0 -0
  379. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/_features.scss +0 -0
  380. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/_footer.scss +0 -0
  381. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/_hero.scss +0 -0
  382. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/_info.scss +0 -0
  383. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/_layout.scss +0 -0
  384. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/_reset.scss +0 -0
  385. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/_testimonials.scss +0 -0
  386. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/_typography.scss +0 -0
  387. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/_variables.scss +0 -0
  388. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/custom/custom.scss +0 -0
  389. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/_sass/global-overrides.scss +0 -0
  390. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/adv-model-settings.md +0 -0
  391. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/agent-mode.md +0 -0
  392. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/aider_conf.md +0 -0
  393. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/api-keys.md +0 -0
  394. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/custom-commands.md +0 -0
  395. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/custom-system-prompts.md +0 -0
  396. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/dotenv.md +0 -0
  397. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/editor.md +0 -0
  398. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/hooks.md +0 -0
  399. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/mcp.md +0 -0
  400. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/model-aliases.md +0 -0
  401. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/options.md +0 -0
  402. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/reasoning.md +0 -0
  403. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/security.md +0 -0
  404. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/skills.md +0 -0
  405. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config/tui.md +0 -0
  406. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/config.md +0 -0
  407. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/faq.md +0 -0
  408. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/git.md +0 -0
  409. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/index.md +0 -0
  410. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/install/docker.md +0 -0
  411. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/install/optional.md +0 -0
  412. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/install.md +0 -0
  413. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/languages.md +0 -0
  414. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/legal/contributor-agreement.md +0 -0
  415. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/legal/privacy.md +0 -0
  416. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/anthropic.md +0 -0
  417. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/azure.md +0 -0
  418. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/bedrock.md +0 -0
  419. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/cohere.md +0 -0
  420. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/deepseek.md +0 -0
  421. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/gemini.md +0 -0
  422. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/github.md +0 -0
  423. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/groq.md +0 -0
  424. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/lm-studio.md +0 -0
  425. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/ollama.md +0 -0
  426. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/openai-compat.md +0 -0
  427. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/openai.md +0 -0
  428. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/openrouter.md +0 -0
  429. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/other.md +0 -0
  430. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/vertex.md +0 -0
  431. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/warnings.md +0 -0
  432. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms/xai.md +0 -0
  433. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/llms.md +0 -0
  434. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/more/analytics.md +0 -0
  435. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/more/edit-formats.md +0 -0
  436. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/more/infinite-output.md +0 -0
  437. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/more-info.md +0 -0
  438. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/repomap.md +0 -0
  439. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/scripting.md +0 -0
  440. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/cecli-not-found.md +0 -0
  441. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/edit-errors.md +0 -0
  442. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/imports.md +0 -0
  443. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/models-and-keys.md +0 -0
  444. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/support.md +0 -0
  445. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/token-limits.md +0 -0
  446. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting/warnings.md +0 -0
  447. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/troubleshooting.md +0 -0
  448. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/commands.md +0 -0
  449. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/conventions.md +0 -0
  450. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/copypaste.md +0 -0
  451. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/images-urls.md +0 -0
  452. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/lint-test.md +0 -0
  453. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/modes.md +0 -0
  454. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/not-code.md +0 -0
  455. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/notifications.md +0 -0
  456. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/sessions.md +0 -0
  457. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/tips.md +0 -0
  458. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/voice.md +0 -0
  459. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage/watch.md +0 -0
  460. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/docs/usage.md +0 -0
  461. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli/website/share/index.md +0 -0
  462. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli_dev.egg-info/dependency_links.txt +0 -0
  463. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli_dev.egg-info/entry_points.txt +0 -0
  464. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli_dev.egg-info/requires.txt +0 -0
  465. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/cecli_dev.egg-info/top_level.txt +0 -0
  466. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/docker/Dockerfile +0 -0
  467. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/docker/Dockerfile.local.nvidia.cuda.ubuntu +0 -0
  468. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/pyproject.toml +0 -0
  469. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/requirements/common-constraints.txt +0 -0
  470. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/requirements/requirements-dev.in +0 -0
  471. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/requirements/requirements-dev.txt +0 -0
  472. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/requirements/requirements-help.in +0 -0
  473. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/requirements/requirements-help.txt +0 -0
  474. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/requirements/requirements-playwright.in +0 -0
  475. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/requirements/requirements-playwright.txt +0 -0
  476. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/requirements/requirements.in +0 -0
  477. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/requirements/tree-sitter.in +0 -0
  478. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/requirements.txt +0 -0
  479. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/30k-image.py +0 -0
  480. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/Dockerfile.jekyll +0 -0
  481. {cecli_dev-0.98.2/tests → cecli_dev-0.99.0/scripts}/__init__.py +0 -0
  482. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/blame.py +0 -0
  483. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/clean_metadata.py +0 -0
  484. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/cost_analyzer.py +0 -0
  485. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/dl_icons.py +0 -0
  486. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/filter-chat-mode.js +0 -0
  487. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/generate_providers.py +0 -0
  488. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/get_contributor_list.js +0 -0
  489. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/get_hashline.py +0 -0
  490. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/history_prompts.py +0 -0
  491. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/homepage.py +0 -0
  492. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/issues.py +0 -0
  493. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/jekyll_build.sh +0 -0
  494. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/jekyll_run.sh +0 -0
  495. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/logo_svg.py +0 -0
  496. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/pip-compile.sh +0 -0
  497. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/recording_audio.py +0 -0
  498. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/redact-cast.py +0 -0
  499. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/rename_to_cecli.py +0 -0
  500. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/tmux_record.sh +0 -0
  501. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/tsl_pack_langs.py +0 -0
  502. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/update-blame.sh +0 -0
  503. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/update-docs.sh +0 -0
  504. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/update-history.py +0 -0
  505. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/versionbump.py +0 -0
  506. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/scripts/yank-old-versions.py +0 -0
  507. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/setup.cfg +0 -0
  508. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/shim.pyproject.toml +0 -0
  509. {cecli_dev-0.98.2/tests/basic → cecli_dev-0.99.0/tests}/__init__.py +0 -0
  510. {cecli_dev-0.98.2/tests/hooks → cecli_dev-0.99.0/tests/basic}/__init__.py +0 -0
  511. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_aws_credentials.py +0 -0
  512. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_background_commands.py +0 -0
  513. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_coder.py +0 -0
  514. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_commands.py +0 -0
  515. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_custom_commands.py +0 -0
  516. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_deprecated.py +0 -0
  517. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_editblock.py +0 -0
  518. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_editor.py +0 -0
  519. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_exceptions.py +0 -0
  520. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_find_or_blocks.py +0 -0
  521. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_hashline.py +0 -0
  522. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_history.py +0 -0
  523. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_io.py +0 -0
  524. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_linter.py +0 -0
  525. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_main.py +0 -0
  526. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_model_info_manager.py +0 -0
  527. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_model_provider_manager.py +0 -0
  528. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_models.py +0 -0
  529. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_onboarding.py +0 -0
  530. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_plugin_manager.py +0 -0
  531. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_prompts.py +0 -0
  532. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_reasoning.py +0 -0
  533. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_repo.py +0 -0
  534. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_repomap.py +0 -0
  535. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_run_cmd.py +0 -0
  536. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_sanity_check_repo.py +0 -0
  537. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_scripting.py +0 -0
  538. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_sendchat.py +0 -0
  539. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_sessions.py +0 -0
  540. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_skills.py +0 -0
  541. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_special.py +0 -0
  542. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_ssl_verification.py +0 -0
  543. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_udiff.py +0 -0
  544. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_urls.py +0 -0
  545. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_voice.py +0 -0
  546. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_watch.py +0 -0
  547. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/basic/test_wholefile.py +0 -0
  548. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/conftest.py +0 -0
  549. {cecli_dev-0.98.2/tests → cecli_dev-0.99.0/tests/conversations}/test_conversation_integration.py +0 -0
  550. {cecli_dev-0.98.2/tests → cecli_dev-0.99.0/tests/conversations}/test_conversation_system.py +0 -0
  551. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/chat-history-search-replace-gold.txt +0 -0
  552. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/chat-history.md +0 -0
  553. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/arduino/test.ino +0 -0
  554. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/c/test.c +0 -0
  555. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/chatito/test.chatito +0 -0
  556. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/clojure/test.clj +0 -0
  557. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/commonlisp/test.lisp +0 -0
  558. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/cpp/test.cpp +0 -0
  559. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/csharp/test.cs +0 -0
  560. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/d/test.d +0 -0
  561. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/dart/test.dart +0 -0
  562. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/elisp/test.el +0 -0
  563. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/elixir/test.ex +0 -0
  564. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/elm/test.elm +0 -0
  565. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/gleam/test.gleam +0 -0
  566. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/go/test.go +0 -0
  567. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/haskell/test.hs +0 -0
  568. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/hcl/test.tf +0 -0
  569. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/java/test.java +0 -0
  570. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/javascript/test.js +0 -0
  571. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/kotlin/test.kt +0 -0
  572. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/lua/test.lua +0 -0
  573. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/matlab/test.m +0 -0
  574. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/ocaml/test.ml +0 -0
  575. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/ocaml_interface/test.mli +0 -0
  576. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/php/test.php +0 -0
  577. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/pony/test.pony +0 -0
  578. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/properties/test.properties +0 -0
  579. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/python/test.py +0 -0
  580. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/ql/test.ql +0 -0
  581. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/r/test.r +0 -0
  582. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/racket/test.rkt +0 -0
  583. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/ruby/test.rb +0 -0
  584. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/rust/test.rs +0 -0
  585. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/scala/test.scala +0 -0
  586. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/solidity/test.sol +0 -0
  587. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/swift/test.swift +0 -0
  588. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/tsx/test.tsx +0 -0
  589. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/typescript/test.ts +0 -0
  590. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/udev/test.rules +0 -0
  591. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/languages/zig/test.zig +0 -0
  592. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/sample-code-base/sample.js +0 -0
  593. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/sample-code-base/sample.py +0 -0
  594. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/sample-code-base-repo-map.txt +0 -0
  595. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/watch.js +0 -0
  596. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/watch.lisp +0 -0
  597. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/watch.py +0 -0
  598. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/fixtures/watch_question.js +0 -0
  599. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/help/test_help.py +0 -0
  600. {cecli_dev-0.98.2/tests/mcp → cecli_dev-0.99.0/tests/hooks}/__init__.py +0 -0
  601. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/hooks/test_base.py +0 -0
  602. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/hooks/test_manager.py +0 -0
  603. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/hooks/test_registry.py +0 -0
  604. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/mcp/test_manager.py +0 -0
  605. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/scrape/test_playwright_disable.py +0 -0
  606. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/scrape/test_scrape.py +0 -0
  607. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/tools/test_git_branch.py +0 -0
  608. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/tools/test_git_diff.py +0 -0
  609. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/tools/test_grep.py +0 -0
  610. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/tools/test_insert_block.py +0 -0
  611. {cecli_dev-0.98.2 → cecli_dev-0.99.0}/tests/tools/test_registry.py +0 -0
  612. {cecli_dev-0.98.2 → 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.2
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.2.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.2'
22
- __version_tuple__ = version_tuple = (0, 98, 2)
21
+ __version__ = version = '0.99.0'
22
+ __version_tuple__ = version_tuple = (0, 99, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g1fefb15aa'
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(
@@ -1037,7 +1037,9 @@ I will proceed based on the tool results and updated context.""")
1037
1037
  )
1038
1038
  self.model_kwargs["frequency_penalty"] = min(0, max(freq_penalty - 0.15, 0))
1039
1039
 
1040
- 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
+ )
1041
1043
  # One twentieth of the time, just straight reset the randomness
1042
1044
  if random.random() < 0.05:
1043
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,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
 
@@ -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
@@ -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
+ )
@@ -542,36 +542,56 @@ async def main_async(argv=None, input=None, output=None, force_git_root=None, re
542
542
  else:
543
543
  git_root = get_git_root()
544
544
  conf_fname = handle_core_files(Path(".cecli.conf.yml"))
545
- default_config_files = []
546
- try:
547
- default_config_files += [conf_fname.resolve()]
548
- except OSError:
549
- pass
545
+ default_config_files = [
546
+ str(Path.home() / ".cecli.conf.yml"),
547
+ str(Path(".cecli.conf.yml")),
548
+ ]
550
549
  if git_root:
551
- git_conf = Path(git_root) / conf_fname
552
- if git_conf not in default_config_files:
553
- default_config_files.append(git_conf)
554
- default_config_files.append(Path.home() / conf_fname)
555
- default_config_files = list(map(str, default_config_files))
556
- parser = get_parser(default_config_files, git_root)
557
- try:
558
- args, unknown = parser.parse_known_args(argv)
559
- except AttributeError as e:
560
- if all(word in str(e) for word in ["bool", "object", "has", "no", "attribute", "strip"]):
561
- if check_config_files_for_yes(default_config_files):
562
- return await graceful_exit(None, 1)
563
- raise e
564
- if args.verbose:
565
- print("Config files search order, if no --config:")
566
- for file in default_config_files:
567
- exists = "(exists)" if Path(file).exists() else ""
568
- print(f" - {file} {exists}")
569
- default_config_files.reverse()
550
+ default_config_files.append(str(Path(git_root) / ".cecli.conf.yml"))
570
551
  parser = get_parser(default_config_files, git_root)
571
552
  args, unknown = parser.parse_known_args(argv)
553
+
554
+ # Load dotenv files and re-parse args before workspace logic
555
+ # to allow environment variables to be used in workspace config
572
556
  loaded_dotenvs = load_dotenv_files(git_root, args.env_file, args.encoding)
573
557
  args, unknown = parser.parse_known_args(argv)
558
+
559
+ uses_workspace = False
560
+ if args.workspaces or args.workspace_name:
561
+ from cecli.helpers.monorepo.config import (
562
+ find_active_workspace_name,
563
+ load_workspace_config,
564
+ )
565
+ from cecli.helpers.monorepo.workspace import WorkspaceManager
566
+
567
+ # Interpolate environment variables in the workspaces argument
568
+ if args.workspaces:
569
+ args.workspaces = interpolate_env_vars(args.workspaces)
570
+
571
+ ws_config_arg = convert_yaml_to_json_string(args.workspaces) if args.workspaces else None
572
+ ws_name = args.workspace_name or find_active_workspace_name(ws_config_arg)
573
+ if ws_name:
574
+ config = load_workspace_config(ws_config_arg, name=ws_name)
575
+ workspace_manager = WorkspaceManager(ws_name, config)
576
+
577
+ if not workspace_manager.exists():
578
+ workspace_manager.initialize()
579
+
580
+ os.chdir(workspace_manager.get_working_directory())
581
+ git_root = get_git_root()
582
+ uses_workspace = True
583
+
584
+ if git_root:
585
+ git_conf = Path(git_root) / conf_fname
586
+ if git_conf not in default_config_files:
587
+ default_config_files.append(str(git_conf))
588
+
589
+ if uses_workspace:
590
+ parser = get_parser(default_config_files, git_root)
591
+ args, unknown = parser.parse_known_args(argv)
592
+
574
593
  set_args_error_data(args)
594
+
575
595
  if len(unknown):
576
596
  print("Unknown Args: ", unknown)
577
597
 
@@ -589,6 +609,8 @@ async def main_async(argv=None, input=None, output=None, force_git_root=None, re
589
609
  args.retries = convert_yaml_to_json_string(args.retries)
590
610
  if hasattr(args, "hooks") and args.hooks is not None:
591
611
  args.hooks = convert_yaml_to_json_string(args.hooks)
612
+ if hasattr(args, "workspaces") and args.workspaces is not None:
613
+ args.hooks = convert_yaml_to_json_string(args.workspaces)
592
614
 
593
615
  # Interpolate environment variables in all string arguments
594
616
  for key, value in vars(args).items():
@@ -1152,7 +1174,7 @@ async def main_async(argv=None, input=None, output=None, force_git_root=None, re
1152
1174
  pre_init_io.tool_output()
1153
1175
  except KeyboardInterrupt:
1154
1176
  return await graceful_exit(coder, 1)
1155
- if args.git and not suppress_pre_init:
1177
+ if args.git and not (suppress_pre_init or args.workspaces or args.workspace_name):
1156
1178
  git_root = await setup_git(git_root, pre_init_io)
1157
1179
  if args.gitignore:
1158
1180
  await check_gitignore(git_root, pre_init_io)