bloom-cli 0.1.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 (336) hide show
  1. bloom_cli-0.1.0/.github/CODEOWNERS +7 -0
  2. bloom_cli-0.1.0/.github/DISCUSSION_TEMPLATE/ideas.yml +46 -0
  3. bloom_cli-0.1.0/.github/ISSUE_TEMPLATE/bug-report.yml +58 -0
  4. bloom_cli-0.1.0/.github/ISSUE_TEMPLATE/config.yml +11 -0
  5. bloom_cli-0.1.0/.github/workflows/build-and-upload.yml +162 -0
  6. bloom_cli-0.1.0/.github/workflows/ci.yml +132 -0
  7. bloom_cli-0.1.0/.github/workflows/issue-labeler.yml +62 -0
  8. bloom_cli-0.1.0/.github/workflows/release.yml +61 -0
  9. bloom_cli-0.1.0/.gitignore +203 -0
  10. bloom_cli-0.1.0/.pre-commit-config.yaml +34 -0
  11. bloom_cli-0.1.0/.python-version +1 -0
  12. bloom_cli-0.1.0/.typos.toml +7 -0
  13. bloom_cli-0.1.0/.vscode/extensions.json +3 -0
  14. bloom_cli-0.1.0/.vscode/launch.json +85 -0
  15. bloom_cli-0.1.0/.vscode/settings.json +26 -0
  16. bloom_cli-0.1.0/AGENTS.md +135 -0
  17. bloom_cli-0.1.0/CHANGELOG.md +319 -0
  18. bloom_cli-0.1.0/CONTRIBUTING.md +169 -0
  19. bloom_cli-0.1.0/LICENSE +202 -0
  20. bloom_cli-0.1.0/PKG-INFO +146 -0
  21. bloom_cli-0.1.0/README.md +99 -0
  22. bloom_cli-0.1.0/action.yml +60 -0
  23. bloom_cli-0.1.0/bloom/__init__.py +6 -0
  24. bloom_cli-0.1.0/bloom/acp/__init__.py +0 -0
  25. bloom_cli-0.1.0/bloom/acp/acp_agent_loop.py +559 -0
  26. bloom_cli-0.1.0/bloom/acp/entrypoint.py +81 -0
  27. bloom_cli-0.1.0/bloom/acp/tools/__init__.py +0 -0
  28. bloom_cli-0.1.0/bloom/acp/tools/base.py +100 -0
  29. bloom_cli-0.1.0/bloom/acp/tools/builtins/bash.py +134 -0
  30. bloom_cli-0.1.0/bloom/acp/tools/builtins/read_file.py +56 -0
  31. bloom_cli-0.1.0/bloom/acp/tools/builtins/search_replace.py +129 -0
  32. bloom_cli-0.1.0/bloom/acp/tools/builtins/todo.py +65 -0
  33. bloom_cli-0.1.0/bloom/acp/tools/builtins/write_file.py +98 -0
  34. bloom_cli-0.1.0/bloom/acp/tools/session_update.py +118 -0
  35. bloom_cli-0.1.0/bloom/acp/utils.py +113 -0
  36. bloom_cli-0.1.0/bloom/cli/__init__.py +0 -0
  37. bloom_cli-0.1.0/bloom/cli/autocompletion/__init__.py +0 -0
  38. bloom_cli-0.1.0/bloom/cli/autocompletion/base.py +22 -0
  39. bloom_cli-0.1.0/bloom/cli/autocompletion/path_completion.py +177 -0
  40. bloom_cli-0.1.0/bloom/cli/autocompletion/slash_command.py +99 -0
  41. bloom_cli-0.1.0/bloom/cli/cli.py +190 -0
  42. bloom_cli-0.1.0/bloom/cli/clipboard.py +92 -0
  43. bloom_cli-0.1.0/bloom/cli/commands.py +103 -0
  44. bloom_cli-0.1.0/bloom/cli/entrypoint.py +166 -0
  45. bloom_cli-0.1.0/bloom/cli/history_manager.py +91 -0
  46. bloom_cli-0.1.0/bloom/cli/terminal_setup.py +323 -0
  47. bloom_cli-0.1.0/bloom/cli/textual_ui/__init__.py +0 -0
  48. bloom_cli-0.1.0/bloom/cli/textual_ui/ansi_markdown.py +58 -0
  49. bloom_cli-0.1.0/bloom/cli/textual_ui/app.py +1328 -0
  50. bloom_cli-0.1.0/bloom/cli/textual_ui/app.tcss +982 -0
  51. bloom_cli-0.1.0/bloom/cli/textual_ui/external_editor.py +32 -0
  52. bloom_cli-0.1.0/bloom/cli/textual_ui/handlers/__init__.py +5 -0
  53. bloom_cli-0.1.0/bloom/cli/textual_ui/handlers/event_handler.py +147 -0
  54. bloom_cli-0.1.0/bloom/cli/textual_ui/terminal_theme.py +266 -0
  55. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/__init__.py +0 -0
  56. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/approval_app.py +192 -0
  57. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/banner/banner.py +92 -0
  58. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/banner/bee.py +278 -0
  59. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/braille_renderer.py +58 -0
  60. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/chat_input/__init__.py +7 -0
  61. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/chat_input/body.py +214 -0
  62. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/chat_input/completion_manager.py +58 -0
  63. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/chat_input/completion_popup.py +43 -0
  64. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/chat_input/container.py +195 -0
  65. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/chat_input/text_area.py +365 -0
  66. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/compact.py +41 -0
  67. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/config_app.py +204 -0
  68. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/context_progress.py +30 -0
  69. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/load_more.py +43 -0
  70. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/loading.py +201 -0
  71. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/messages.py +277 -0
  72. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/no_markup_static.py +11 -0
  73. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/path_display.py +28 -0
  74. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/question_app.py +496 -0
  75. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/spinner.py +194 -0
  76. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/status_message.py +76 -0
  77. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/tool_widgets.py +371 -0
  78. bloom_cli-0.1.0/bloom/cli/textual_ui/widgets/tools.py +201 -0
  79. bloom_cli-0.1.0/bloom/cli/textual_ui/windowing/__init__.py +29 -0
  80. bloom_cli-0.1.0/bloom/cli/textual_ui/windowing/history.py +105 -0
  81. bloom_cli-0.1.0/bloom/cli/textual_ui/windowing/history_windowing.py +71 -0
  82. bloom_cli-0.1.0/bloom/cli/textual_ui/windowing/state.py +105 -0
  83. bloom_cli-0.1.0/bloom/cli/update_notifier/__init__.py +47 -0
  84. bloom_cli-0.1.0/bloom/cli/update_notifier/adapters/filesystem_update_cache_repository.py +59 -0
  85. bloom_cli-0.1.0/bloom/cli/update_notifier/adapters/github_update_gateway.py +101 -0
  86. bloom_cli-0.1.0/bloom/cli/update_notifier/adapters/pypi_update_gateway.py +107 -0
  87. bloom_cli-0.1.0/bloom/cli/update_notifier/ports/update_cache_repository.py +16 -0
  88. bloom_cli-0.1.0/bloom/cli/update_notifier/ports/update_gateway.py +53 -0
  89. bloom_cli-0.1.0/bloom/cli/update_notifier/update.py +139 -0
  90. bloom_cli-0.1.0/bloom/cli/update_notifier/whats_new.py +49 -0
  91. bloom_cli-0.1.0/bloom/core/__init__.py +5 -0
  92. bloom_cli-0.1.0/bloom/core/agent_loop.py +961 -0
  93. bloom_cli-0.1.0/bloom/core/agents/__init__.py +31 -0
  94. bloom_cli-0.1.0/bloom/core/agents/manager.py +165 -0
  95. bloom_cli-0.1.0/bloom/core/agents/models.py +139 -0
  96. bloom_cli-0.1.0/bloom/core/auth/__init__.py +6 -0
  97. bloom_cli-0.1.0/bloom/core/auth/crypto.py +137 -0
  98. bloom_cli-0.1.0/bloom/core/auth/github.py +178 -0
  99. bloom_cli-0.1.0/bloom/core/autocompletion/__init__.py +0 -0
  100. bloom_cli-0.1.0/bloom/core/autocompletion/completers.py +257 -0
  101. bloom_cli-0.1.0/bloom/core/autocompletion/file_indexer/__init__.py +10 -0
  102. bloom_cli-0.1.0/bloom/core/autocompletion/file_indexer/ignore_rules.py +156 -0
  103. bloom_cli-0.1.0/bloom/core/autocompletion/file_indexer/indexer.py +179 -0
  104. bloom_cli-0.1.0/bloom/core/autocompletion/file_indexer/store.py +169 -0
  105. bloom_cli-0.1.0/bloom/core/autocompletion/file_indexer/watcher.py +71 -0
  106. bloom_cli-0.1.0/bloom/core/autocompletion/fuzzy.py +189 -0
  107. bloom_cli-0.1.0/bloom/core/autocompletion/path_prompt.py +108 -0
  108. bloom_cli-0.1.0/bloom/core/autocompletion/path_prompt_adapter.py +149 -0
  109. bloom_cli-0.1.0/bloom/core/config.py +588 -0
  110. bloom_cli-0.1.0/bloom/core/llm/__init__.py +0 -0
  111. bloom_cli-0.1.0/bloom/core/llm/backend/__init__.py +0 -0
  112. bloom_cli-0.1.0/bloom/core/llm/backend/factory.py +6 -0
  113. bloom_cli-0.1.0/bloom/core/llm/backend/generic.py +447 -0
  114. bloom_cli-0.1.0/bloom/core/llm/exceptions.py +195 -0
  115. bloom_cli-0.1.0/bloom/core/llm/format.py +183 -0
  116. bloom_cli-0.1.0/bloom/core/llm/model_discovery.py +103 -0
  117. bloom_cli-0.1.0/bloom/core/llm/types.py +120 -0
  118. bloom_cli-0.1.0/bloom/core/middleware.py +220 -0
  119. bloom_cli-0.1.0/bloom/core/output_formatters.py +85 -0
  120. bloom_cli-0.1.0/bloom/core/paths/__init__.py +0 -0
  121. bloom_cli-0.1.0/bloom/core/paths/config_paths.py +66 -0
  122. bloom_cli-0.1.0/bloom/core/paths/global_paths.py +40 -0
  123. bloom_cli-0.1.0/bloom/core/programmatic.py +51 -0
  124. bloom_cli-0.1.0/bloom/core/prompts/__init__.py +31 -0
  125. bloom_cli-0.1.0/bloom/core/prompts/cli.md +46 -0
  126. bloom_cli-0.1.0/bloom/core/prompts/compact.md +48 -0
  127. bloom_cli-0.1.0/bloom/core/prompts/dangerous_directory.md +5 -0
  128. bloom_cli-0.1.0/bloom/core/prompts/project_context.md +8 -0
  129. bloom_cli-0.1.0/bloom/core/prompts/tests.md +1 -0
  130. bloom_cli-0.1.0/bloom/core/session/session_loader.py +157 -0
  131. bloom_cli-0.1.0/bloom/core/session/session_logger.py +318 -0
  132. bloom_cli-0.1.0/bloom/core/session/session_migration.py +41 -0
  133. bloom_cli-0.1.0/bloom/core/skills/__init__.py +7 -0
  134. bloom_cli-0.1.0/bloom/core/skills/manager.py +133 -0
  135. bloom_cli-0.1.0/bloom/core/skills/models.py +92 -0
  136. bloom_cli-0.1.0/bloom/core/skills/parser.py +39 -0
  137. bloom_cli-0.1.0/bloom/core/system_prompt.py +470 -0
  138. bloom_cli-0.1.0/bloom/core/tools/base.py +336 -0
  139. bloom_cli-0.1.0/bloom/core/tools/builtins/ask_user_question.py +134 -0
  140. bloom_cli-0.1.0/bloom/core/tools/builtins/bash.py +357 -0
  141. bloom_cli-0.1.0/bloom/core/tools/builtins/grep.py +310 -0
  142. bloom_cli-0.1.0/bloom/core/tools/builtins/prompts/__init__.py +0 -0
  143. bloom_cli-0.1.0/bloom/core/tools/builtins/prompts/ask_user_question.md +84 -0
  144. bloom_cli-0.1.0/bloom/core/tools/builtins/prompts/bash.md +73 -0
  145. bloom_cli-0.1.0/bloom/core/tools/builtins/prompts/grep.md +4 -0
  146. bloom_cli-0.1.0/bloom/core/tools/builtins/prompts/read_file.md +13 -0
  147. bloom_cli-0.1.0/bloom/core/tools/builtins/prompts/search_replace.md +43 -0
  148. bloom_cli-0.1.0/bloom/core/tools/builtins/prompts/task.md +24 -0
  149. bloom_cli-0.1.0/bloom/core/tools/builtins/prompts/todo.md +199 -0
  150. bloom_cli-0.1.0/bloom/core/tools/builtins/prompts/write_file.md +42 -0
  151. bloom_cli-0.1.0/bloom/core/tools/builtins/read_file.py +222 -0
  152. bloom_cli-0.1.0/bloom/core/tools/builtins/search_replace.py +456 -0
  153. bloom_cli-0.1.0/bloom/core/tools/builtins/task.py +154 -0
  154. bloom_cli-0.1.0/bloom/core/tools/builtins/todo.py +134 -0
  155. bloom_cli-0.1.0/bloom/core/tools/builtins/write_file.py +160 -0
  156. bloom_cli-0.1.0/bloom/core/tools/manager.py +341 -0
  157. bloom_cli-0.1.0/bloom/core/tools/mcp.py +358 -0
  158. bloom_cli-0.1.0/bloom/core/tools/ui.py +68 -0
  159. bloom_cli-0.1.0/bloom/core/trusted_folders.py +83 -0
  160. bloom_cli-0.1.0/bloom/core/types.py +396 -0
  161. bloom_cli-0.1.0/bloom/core/utils.py +350 -0
  162. bloom_cli-0.1.0/bloom/setup/onboarding/__init__.py +53 -0
  163. bloom_cli-0.1.0/bloom/setup/onboarding/base.py +14 -0
  164. bloom_cli-0.1.0/bloom/setup/onboarding/onboarding.tcss +230 -0
  165. bloom_cli-0.1.0/bloom/setup/onboarding/screens/__init__.py +7 -0
  166. bloom_cli-0.1.0/bloom/setup/onboarding/screens/api_key.py +170 -0
  167. bloom_cli-0.1.0/bloom/setup/onboarding/screens/theme_selection.py +164 -0
  168. bloom_cli-0.1.0/bloom/setup/onboarding/screens/welcome.py +136 -0
  169. bloom_cli-0.1.0/bloom/setup/trusted_folders/trust_folder_dialog.py +180 -0
  170. bloom_cli-0.1.0/bloom/setup/trusted_folders/trust_folder_dialog.tcss +83 -0
  171. bloom_cli-0.1.0/bloom/whats_new.md +7 -0
  172. bloom_cli-0.1.0/bloom-acp.spec +60 -0
  173. bloom_cli-0.1.0/distribution/zed/LICENSE +1 -0
  174. bloom_cli-0.1.0/distribution/zed/extension.toml +35 -0
  175. bloom_cli-0.1.0/distribution/zed/icons/bloom.svg +12 -0
  176. bloom_cli-0.1.0/docs/README.md +7 -0
  177. bloom_cli-0.1.0/docs/acp-setup.md +58 -0
  178. bloom_cli-0.1.0/flake.lock +133 -0
  179. bloom_cli-0.1.0/flake.nix +149 -0
  180. bloom_cli-0.1.0/pyproject.toml +168 -0
  181. bloom_cli-0.1.0/scripts/README.md +20 -0
  182. bloom_cli-0.1.0/scripts/bump_version.py +212 -0
  183. bloom_cli-0.1.0/scripts/install.sh +112 -0
  184. bloom_cli-0.1.0/scripts/prepare_release.py +284 -0
  185. bloom_cli-0.1.0/tests/__init__.py +5 -0
  186. bloom_cli-0.1.0/tests/acp/conftest.py +42 -0
  187. bloom_cli-0.1.0/tests/acp/test_acp.py +953 -0
  188. bloom_cli-0.1.0/tests/acp/test_agent_thought.py +154 -0
  189. bloom_cli-0.1.0/tests/acp/test_bash.py +495 -0
  190. bloom_cli-0.1.0/tests/acp/test_compact_session_updates.py +80 -0
  191. bloom_cli-0.1.0/tests/acp/test_content.py +147 -0
  192. bloom_cli-0.1.0/tests/acp/test_initialize.py +65 -0
  193. bloom_cli-0.1.0/tests/acp/test_multi_session.py +110 -0
  194. bloom_cli-0.1.0/tests/acp/test_new_session.py +116 -0
  195. bloom_cli-0.1.0/tests/acp/test_read_file.py +247 -0
  196. bloom_cli-0.1.0/tests/acp/test_search_replace.py +354 -0
  197. bloom_cli-0.1.0/tests/acp/test_set_mode.py +178 -0
  198. bloom_cli-0.1.0/tests/acp/test_set_model.py +306 -0
  199. bloom_cli-0.1.0/tests/acp/test_write_file.py +277 -0
  200. bloom_cli-0.1.0/tests/autocompletion/test_file_indexer.py +231 -0
  201. bloom_cli-0.1.0/tests/autocompletion/test_fuzzy.py +96 -0
  202. bloom_cli-0.1.0/tests/autocompletion/test_path_completer_fuzzy.py +122 -0
  203. bloom_cli-0.1.0/tests/autocompletion/test_path_completer_recursive.py +69 -0
  204. bloom_cli-0.1.0/tests/autocompletion/test_path_completion_controller.py +258 -0
  205. bloom_cli-0.1.0/tests/autocompletion/test_path_prompt_transformer.py +142 -0
  206. bloom_cli-0.1.0/tests/autocompletion/test_slash_command_controller.py +235 -0
  207. bloom_cli-0.1.0/tests/autocompletion/test_ui_chat_autocompletion.py +297 -0
  208. bloom_cli-0.1.0/tests/backend/__init__.py +0 -0
  209. bloom_cli-0.1.0/tests/backend/data/__init__.py +6 -0
  210. bloom_cli-0.1.0/tests/backend/data/fireworks.py +153 -0
  211. bloom_cli-0.1.0/tests/backend/test_backend.py +349 -0
  212. bloom_cli-0.1.0/tests/cli/test_braille_renderer.py +114 -0
  213. bloom_cli-0.1.0/tests/cli/test_clipboard.py +205 -0
  214. bloom_cli-0.1.0/tests/cli/test_copy_shortcuts.py +59 -0
  215. bloom_cli-0.1.0/tests/cli/test_external_editor.py +72 -0
  216. bloom_cli-0.1.0/tests/cli/test_no_markup_static.py +19 -0
  217. bloom_cli-0.1.0/tests/cli/test_question_app.py +513 -0
  218. bloom_cli-0.1.0/tests/cli/test_spinner.py +16 -0
  219. bloom_cli-0.1.0/tests/cli/test_ui_clipboard_notifications.py +40 -0
  220. bloom_cli-0.1.0/tests/cli/test_ui_session_incremental_renderer.py +160 -0
  221. bloom_cli-0.1.0/tests/cli/test_ui_session_resume.py +187 -0
  222. bloom_cli-0.1.0/tests/conftest.py +170 -0
  223. bloom_cli-0.1.0/tests/core/test_agents.py +80 -0
  224. bloom_cli-0.1.0/tests/core/test_auth_crypto.py +46 -0
  225. bloom_cli-0.1.0/tests/core/test_auth_github.py +286 -0
  226. bloom_cli-0.1.0/tests/core/test_config_load_dotenv.py +81 -0
  227. bloom_cli-0.1.0/tests/core/test_config_resolution.py +53 -0
  228. bloom_cli-0.1.0/tests/core/test_trusted_folders.py +205 -0
  229. bloom_cli-0.1.0/tests/mock/__init__.py +0 -0
  230. bloom_cli-0.1.0/tests/mock/mock_backend_factory.py +16 -0
  231. bloom_cli-0.1.0/tests/mock/mock_entrypoint.py +57 -0
  232. bloom_cli-0.1.0/tests/mock/utils.py +60 -0
  233. bloom_cli-0.1.0/tests/onboarding/test_run_onboarding.py +60 -0
  234. bloom_cli-0.1.0/tests/onboarding/test_ui_onboarding.py +70 -0
  235. bloom_cli-0.1.0/tests/session/test_session_loader.py +637 -0
  236. bloom_cli-0.1.0/tests/session/test_session_logger.py +703 -0
  237. bloom_cli-0.1.0/tests/session/test_session_migration.py +177 -0
  238. bloom_cli-0.1.0/tests/skills/conftest.py +62 -0
  239. bloom_cli-0.1.0/tests/skills/test_manager.py +440 -0
  240. bloom_cli-0.1.0/tests/skills/test_models.py +195 -0
  241. bloom_cli-0.1.0/tests/skills/test_parser.py +115 -0
  242. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +136 -0
  243. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +176 -0
  244. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +201 -0
  245. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +205 -0
  246. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +201 -0
  247. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +201 -0
  248. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +201 -0
  249. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +200 -0
  250. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +200 -0
  251. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +137 -0
  252. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +137 -0
  253. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +137 -0
  254. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +137 -0
  255. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +137 -0
  256. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +137 -0
  257. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +136 -0
  258. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +139 -0
  259. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +137 -0
  260. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +139 -0
  261. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +136 -0
  262. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +136 -0
  263. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +136 -0
  264. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +136 -0
  265. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +136 -0
  266. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +140 -0
  267. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +136 -0
  268. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +140 -0
  269. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +139 -0
  270. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +203 -0
  271. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +203 -0
  272. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +203 -0
  273. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +203 -0
  274. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +204 -0
  275. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +202 -0
  276. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +104 -0
  277. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +104 -0
  278. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +104 -0
  279. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +94 -0
  280. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +94 -0
  281. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +94 -0
  282. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +95 -0
  283. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +95 -0
  284. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +94 -0
  285. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +94 -0
  286. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +94 -0
  287. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +202 -0
  288. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +202 -0
  289. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +202 -0
  290. bloom_cli-0.1.0/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +202 -0
  291. bloom_cli-0.1.0/tests/snapshots/base_snapshot_test_app.py +54 -0
  292. bloom_cli-0.1.0/tests/snapshots/snap_compare.py +20 -0
  293. bloom_cli-0.1.0/tests/snapshots/test_ui_snapshot_ask_user_question.py +80 -0
  294. bloom_cli-0.1.0/tests/snapshots/test_ui_snapshot_basic_conversation.py +33 -0
  295. bloom_cli-0.1.0/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +38 -0
  296. bloom_cli-0.1.0/tests/snapshots/test_ui_snapshot_modes.py +84 -0
  297. bloom_cli-0.1.0/tests/snapshots/test_ui_snapshot_question_app.py +365 -0
  298. bloom_cli-0.1.0/tests/snapshots/test_ui_snapshot_reasoning_content.py +146 -0
  299. bloom_cli-0.1.0/tests/snapshots/test_ui_snapshot_release_update_notification.py +45 -0
  300. bloom_cli-0.1.0/tests/snapshots/test_ui_snapshot_session_resume.py +47 -0
  301. bloom_cli-0.1.0/tests/snapshots/test_ui_snapshot_whats_new.py +126 -0
  302. bloom_cli-0.1.0/tests/stubs/fake_backend.py +139 -0
  303. bloom_cli-0.1.0/tests/stubs/fake_client.py +134 -0
  304. bloom_cli-0.1.0/tests/stubs/fake_tool.py +35 -0
  305. bloom_cli-0.1.0/tests/test_agent_auto_compact.py +54 -0
  306. bloom_cli-0.1.0/tests/test_agent_backend.py +72 -0
  307. bloom_cli-0.1.0/tests/test_agent_observer_streaming.py +590 -0
  308. bloom_cli-0.1.0/tests/test_agent_stats.py +701 -0
  309. bloom_cli-0.1.0/tests/test_agent_tool_call.py +496 -0
  310. bloom_cli-0.1.0/tests/test_agents.py +618 -0
  311. bloom_cli-0.1.0/tests/test_cli_programmatic_preload.py +136 -0
  312. bloom_cli-0.1.0/tests/test_history_manager.py +101 -0
  313. bloom_cli-0.1.0/tests/test_message_id.py +162 -0
  314. bloom_cli-0.1.0/tests/test_middleware.py +137 -0
  315. bloom_cli-0.1.0/tests/test_system_prompt.py +44 -0
  316. bloom_cli-0.1.0/tests/test_tagged_text.py +107 -0
  317. bloom_cli-0.1.0/tests/test_ui_external_editor.py +69 -0
  318. bloom_cli-0.1.0/tests/test_ui_input_history.py +119 -0
  319. bloom_cli-0.1.0/tests/tools/test_ask_user_question.py +188 -0
  320. bloom_cli-0.1.0/tests/tools/test_bash.py +91 -0
  321. bloom_cli-0.1.0/tests/tools/test_grep.py +358 -0
  322. bloom_cli-0.1.0/tests/tools/test_invoke_context.py +106 -0
  323. bloom_cli-0.1.0/tests/tools/test_manager_get_tool_config.py +414 -0
  324. bloom_cli-0.1.0/tests/tools/test_mcp.py +308 -0
  325. bloom_cli-0.1.0/tests/tools/test_task.py +168 -0
  326. bloom_cli-0.1.0/tests/tools/test_ui_bash_execution.py +120 -0
  327. bloom_cli-0.1.0/tests/update_notifier/adapters/fake_update_cache_repository.py +17 -0
  328. bloom_cli-0.1.0/tests/update_notifier/adapters/fake_update_gateway.py +22 -0
  329. bloom_cli-0.1.0/tests/update_notifier/test_do_update.py +74 -0
  330. bloom_cli-0.1.0/tests/update_notifier/test_filesystem_update_cache_repository.py +119 -0
  331. bloom_cli-0.1.0/tests/update_notifier/test_github_update_gateway.py +245 -0
  332. bloom_cli-0.1.0/tests/update_notifier/test_pypi_update_gateway.py +146 -0
  333. bloom_cli-0.1.0/tests/update_notifier/test_ui_update_notification.py +389 -0
  334. bloom_cli-0.1.0/tests/update_notifier/test_update_use_case.py +302 -0
  335. bloom_cli-0.1.0/tests/update_notifier/test_whats_new.py +161 -0
  336. bloom_cli-0.1.0/uv.lock +1900 -0
@@ -0,0 +1,7 @@
1
+ # CODEOWNERS
2
+
3
+ # Default owners for everything in the repo
4
+ * @Ilm-Alan
5
+
6
+ # Owners for specific directories
7
+ # Not needed for now, can be filled later
@@ -0,0 +1,46 @@
1
+ title: "[Feature Request]: "
2
+ labels: []
3
+ body:
4
+ - type: markdown
5
+ attributes:
6
+ value: >
7
+ Feature requests work best when they focus on the problem first. Tell us
8
+ what you're trying to achieve and why existing APIs aren't enough.
9
+
10
+ - type: dropdown
11
+ id: component
12
+ attributes:
13
+ label: Component
14
+ description: Which part of Bloom would this feature apply to?
15
+ options:
16
+ - CLI
17
+ - ACP
18
+ - Both
19
+ - Other
20
+ validations:
21
+ required: true
22
+
23
+ - type: textarea
24
+ id: problem
25
+ attributes:
26
+ label: Problem statement
27
+ description: >
28
+ What use case is blocked? Provide a clear and concise description of the problem.
29
+ placeholder: "I want to be able to use the agent to write a blog post about the benefits of using Bloom"
30
+ validations:
31
+ required: true
32
+
33
+ - type: textarea
34
+ id: proposal
35
+ attributes:
36
+ label: Proposed solution
37
+ description: >
38
+ Sketch the feature you'd like to see. Code snippets welcome.
39
+ validations:
40
+ required: true
41
+
42
+ - type: textarea
43
+ id: extra
44
+ attributes:
45
+ label: Additional context
46
+ description: Links, screenshots, related issues, etc.
@@ -0,0 +1,58 @@
1
+ name: Bug Report
2
+ description: Tell us about a defect in Bloom
3
+ title: "bug: "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: >
9
+ Thanks for filing a detailed bug. Fill out every section so we can
10
+ reproduce the issue quickly
11
+
12
+ - type: dropdown
13
+ id: component
14
+ attributes:
15
+ label: Component
16
+ description: Which part of Bloom is affected?
17
+ options:
18
+ - CLI
19
+ - ACP
20
+ - Both
21
+ - Other
22
+ validations:
23
+ required: true
24
+
25
+ - type: textarea
26
+ id: summary
27
+ attributes:
28
+ label: Summary
29
+ description: What went wrong? Keep it short but specific.
30
+ validations:
31
+ required: true
32
+
33
+ - type: textarea
34
+ id: repro
35
+ attributes:
36
+ label: Reproduction steps
37
+ description: >
38
+ Commands, code, or payloads that trigger the bug. Include any relevant
39
+ input files or snippets (redact secrets).
40
+ validations:
41
+ required: true
42
+
43
+ - type: input
44
+ id: versions
45
+ attributes:
46
+ label: Versions / environment
47
+ description: >
48
+ Include Bloom version, uv or pip version and OS.
49
+ placeholder: "bloom-cli 1.2.0, uv 0.9.0 on macOS 15.7"
50
+ validations:
51
+ required: true
52
+
53
+ - type: textarea
54
+ id: logs
55
+ attributes:
56
+ label: Logs & screenshots
57
+ description: Paste relevant stack traces, JSON snippets, or console output.
58
+ render: shell
@@ -0,0 +1,11 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Feature request
4
+ url: https://github.com/Ilm-Alan/bloom/discussions/new?category=ideas
5
+ about: Suggest a new feature or improvement via GitHub Discussions
6
+ - name: Ask a question
7
+ url: https://discord.com/channels/1144547040454508606/1447989080720670915
8
+ about: Join Mistral AI Discord server for support and discussions
9
+ - name: Read the docs
10
+ url: https://github.com/Ilm-Alan/bloom#readme
11
+ about: Read the Bloom documentation for more information
@@ -0,0 +1,162 @@
1
+ name: Build and upload
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+
10
+ jobs:
11
+ configure:
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ contents: read
15
+ outputs:
16
+ matrix: ${{ steps.set-matrix.outputs.matrix }}
17
+ steps:
18
+ - name: Set matrix
19
+ id: set-matrix
20
+ run: |
21
+ if [[ "${{ github.repository }}" == "Ilm-Alan/bloom" ]]; then
22
+ matrix='{
23
+ "include": [
24
+ {"runner": "ubuntu-22.04", "os": "linux", "arch": "x86_64"},
25
+ {"runner": "ubuntu-22.04-arm", "os": "linux", "arch": "aarch64"},
26
+ {"runner": "macos-15-intel", "os": "darwin", "arch": "x86_64"},
27
+ {"runner": "macos-14", "os": "darwin", "arch": "aarch64"},
28
+ {"runner": "windows-2022", "os": "windows", "arch": "x86_64"},
29
+ {"runner": "windows-11-arm", "os": "windows", "arch": "aarch64"}
30
+ ]
31
+ }'
32
+ else # skip ARM Linux/Windows (runners not available on non public repos)
33
+ matrix='{
34
+ "include": [
35
+ {"runner": "ubuntu-22.04", "os": "linux", "arch": "x86_64"},
36
+ {"runner": "macos-15-intel", "os": "darwin", "arch": "x86_64"},
37
+ {"runner": "macos-14", "os": "darwin", "arch": "aarch64"},
38
+ {"runner": "windows-2022", "os": "windows", "arch": "x86_64"}
39
+ ]
40
+ }'
41
+ fi
42
+ echo "matrix=$(echo $matrix | jq -c .)" >> $GITHUB_OUTPUT
43
+
44
+ build-and-upload:
45
+ needs: configure
46
+ name: ${{ matrix.os }}-${{ matrix.arch }}
47
+ permissions:
48
+ contents: read
49
+ strategy:
50
+ matrix: ${{ fromJSON(needs.configure.outputs.matrix) }}
51
+ runs-on: ${{ matrix.runner }}
52
+
53
+ steps:
54
+ - name: echo
55
+ run: echo github.repository=${{ github.repository }}
56
+
57
+ - name: Checkout repository
58
+ uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
59
+
60
+ - name: Install uv with caching
61
+ uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
62
+ with:
63
+ version: "latest"
64
+ enable-cache: true
65
+ cache-dependency-glob: "uv.lock"
66
+
67
+ - name: Set up Python
68
+ uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
69
+ with:
70
+ python-version: "3.12"
71
+
72
+ - name: Sync dependencies
73
+ run: uv sync --no-dev --group build
74
+
75
+ - name: Build with PyInstaller
76
+ run: uv run --no-dev --group build pyinstaller bloom-acp.spec
77
+
78
+ - name: Get package version with uv (Unix)
79
+ id: get_version_unix
80
+ if: ${{ matrix.os != 'windows' }}
81
+ run: python -c "import subprocess; version = subprocess.check_output(['uv', 'version']).decode().split()[1]; print(f'version={version}')" >> $GITHUB_OUTPUT
82
+
83
+ - name: Get package version with uv (Windows)
84
+ id: get_version_windows
85
+ if: ${{ matrix.os == 'windows' }}
86
+ shell: pwsh
87
+ run: python -c "import subprocess; version = subprocess.check_output(['uv', 'version']).decode().split()[1]; print(f'version={version}')" >> $env:GITHUB_OUTPUT
88
+
89
+ - name: Upload binary as artifact (Unix)
90
+ uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
91
+ if: ${{ matrix.os != 'windows' }}
92
+ with:
93
+ name: bloom-acp-${{ matrix.os }}-${{ matrix.arch }}-${{ steps.get_version_unix.outputs.version }}
94
+ path: dist/bloom-acp
95
+
96
+ - name: Upload binary as artifact (Windows)
97
+ uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
98
+ if: ${{ matrix.os == 'windows' }}
99
+ with:
100
+ name: bloom-acp-${{ matrix.os }}-${{ matrix.arch }}-${{ steps.get_version_windows.outputs.version }}
101
+ path: dist/bloom-acp.exe
102
+
103
+ attach-to-release:
104
+ needs: build-and-upload
105
+ runs-on: ubuntu-latest
106
+ if: github.event_name == 'release'
107
+ permissions:
108
+ contents: write
109
+ steps:
110
+ - name: Download all artifacts
111
+ uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
112
+ with:
113
+ path: artifacts
114
+
115
+ - name: Zip artifacts
116
+ run: |
117
+ mkdir release-assets
118
+ for dir in artifacts/*; do
119
+ name=$(basename "$dir")
120
+ if [ -f "$dir/bloom-acp" ]; then
121
+ chmod +x "$dir/bloom-acp"
122
+ zip -j "release-assets/${name}.zip" "$dir/bloom-acp"
123
+ elif [ -f "$dir/bloom-acp.exe" ]; then
124
+ zip -j "release-assets/${name}.zip" "$dir/bloom-acp.exe"
125
+ fi
126
+ done
127
+
128
+ - name: Attach binaries to release
129
+ uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2
130
+ with:
131
+ files: release-assets/*.zip
132
+ env:
133
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
134
+
135
+ nix-build:
136
+ needs: configure
137
+ name: "Nix: ${{ matrix.os }}-${{ matrix.arch }}"
138
+ permissions:
139
+ contents: read
140
+ strategy:
141
+ matrix: ${{ fromJSON(needs.configure.outputs.matrix) }}
142
+ runs-on: ${{ matrix.runner }}
143
+ steps:
144
+ - name: Checkout repository
145
+ if: matrix.os != 'windows'
146
+ uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
147
+
148
+ - name: Install Nix
149
+ if: matrix.os != 'windows'
150
+ uses: cachix/install-nix-action@4e002c8ec80594ecd40e759629461e26c8abed15 # v31
151
+
152
+ - name: Build with Nix
153
+ if: matrix.os != 'windows'
154
+ shell: bash
155
+ run: |
156
+ nix build .#
157
+
158
+ - name: Nix Smoke Test
159
+ if: matrix.os != 'windows'
160
+ shell: bash
161
+ run: |
162
+ nix run .# -- --version
@@ -0,0 +1,132 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ env:
10
+ PYTHON_VERSION: "3.12"
11
+
12
+ jobs:
13
+ pre-commit:
14
+ name: Pre-commit
15
+ runs-on: ubuntu-latest
16
+ permissions:
17
+ contents: read
18
+
19
+ steps:
20
+ - name: Checkout repository
21
+ uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
22
+
23
+ - name: Install uv with caching
24
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7
25
+ with:
26
+ version: "latest"
27
+ enable-cache: true
28
+ cache-dependency-glob: "uv.lock"
29
+
30
+ - name: Set up Python
31
+ uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
32
+ with:
33
+ python-version: ${{ env.PYTHON_VERSION }}
34
+
35
+ - name: Sync dependencies
36
+ run: uv sync --all-extras
37
+
38
+ - name: Install pip (required by pre-commit)
39
+ run: uv pip install pip
40
+
41
+ - name: Add virtual environment to PATH
42
+ run: echo "$(pwd)/.venv/bin" >> $GITHUB_PATH
43
+
44
+ - name: Cache pre-commit
45
+ uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
46
+ with:
47
+ path: ~/.cache/pre-commit
48
+ key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
49
+
50
+ - name: Run pre-commit
51
+ run: uv run pre-commit run --all-files --show-diff-on-failure
52
+
53
+ tests:
54
+ name: Tests
55
+ runs-on: ubuntu-latest
56
+ permissions:
57
+ contents: read
58
+
59
+ steps:
60
+ - name: Checkout repository
61
+ uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
62
+
63
+ - name: Install uv with caching
64
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7
65
+ with:
66
+ version: "latest"
67
+ enable-cache: true
68
+ cache-dependency-glob: "uv.lock"
69
+
70
+ - name: Set up Python
71
+ uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
72
+ with:
73
+ python-version: ${{ env.PYTHON_VERSION }}
74
+
75
+ - name: Sync dependencies
76
+ run: uv sync --all-extras
77
+
78
+ - name: Verify CLI can start
79
+ run: |
80
+ uv run bloom --help
81
+ uv run bloom-acp --help
82
+
83
+ - name: Install ripgrep
84
+ run: sudo apt-get update && sudo apt-get install -y ripgrep
85
+
86
+ - name: Run tests
87
+ run: uv run pytest --ignore tests/snapshots
88
+
89
+ snapshot-tests:
90
+ name: Snapshot Tests
91
+ runs-on: ubuntu-latest
92
+ permissions:
93
+ contents: read
94
+
95
+ steps:
96
+ - name: Checkout repository
97
+ uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
98
+
99
+ - name: Install uv with caching
100
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7
101
+ with:
102
+ version: "latest"
103
+ enable-cache: true
104
+ cache-dependency-glob: "uv.lock"
105
+
106
+ - name: Set up Python
107
+ uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
108
+ with:
109
+ python-version: ${{ env.PYTHON_VERSION }}
110
+
111
+ - name: Sync dependencies
112
+ run: uv sync --all-extras
113
+
114
+ - name: Run snapshot tests
115
+ id: snapshot-tests
116
+ run: uv run pytest tests/snapshots
117
+ continue-on-error: true
118
+
119
+ - name: Upload snapshot report
120
+ if: steps.snapshot-tests.outcome == 'failure'
121
+ uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
122
+ with:
123
+ name: snapshot-report
124
+ path: snapshot_report.html
125
+ if-no-files-found: warn
126
+ retention-days: 3
127
+
128
+ - name: Fail job if snapshot tests failed
129
+ if: steps.snapshot-tests.outcome == 'failure'
130
+ run: |
131
+ echo "Snapshot tests failed, failing job."
132
+ exit 1
@@ -0,0 +1,62 @@
1
+ name: Issue Labeler
2
+
3
+ on:
4
+ issues:
5
+ types: [opened]
6
+
7
+ jobs:
8
+ label-component:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: read
12
+ issues: write
13
+ steps:
14
+ - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
15
+
16
+ - name: Parse bug report form
17
+ id: parse-bug
18
+ uses: stefanbuck/github-issue-parser@25f1485edffc1fee3ea68eb9f59a72e58720ffc4 # v3
19
+ with:
20
+ template-path: .github/ISSUE_TEMPLATE/bug-report.yml
21
+ continue-on-error: true
22
+
23
+ - name: Parse feature request form
24
+ id: parse-feature
25
+ uses: stefanbuck/github-issue-parser@25f1485edffc1fee3ea68eb9f59a72e58720ffc4 # v3
26
+ with:
27
+ template-path: .github/ISSUE_TEMPLATE/feature-request.yml
28
+ continue-on-error: true
29
+
30
+ - name: Apply component label
31
+ uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7
32
+ with:
33
+ script: |
34
+ // Get component from either bug report or feature request
35
+ const bugComponent = '${{ steps.parse-bug.outputs.issueparser_component }}';
36
+ const featureComponent = '${{ steps.parse-feature.outputs.issueparser_component }}';
37
+ const component = bugComponent || featureComponent;
38
+
39
+ if (!component) {
40
+ console.log('No component field found, skipping labeling');
41
+ return;
42
+ }
43
+
44
+ const labels = [];
45
+
46
+ if (component === 'CLI') {
47
+ labels.push('CLI');
48
+ } else if (component === 'ACP') {
49
+ labels.push('ACP');
50
+ } else if (component === 'Both') {
51
+ labels.push('CLI', 'ACP');
52
+ }
53
+
54
+ if (labels.length > 0) {
55
+ await github.rest.issues.addLabels({
56
+ owner: context.repo.owner,
57
+ repo: context.repo.repo,
58
+ issue_number: context.issue.number,
59
+ labels: labels
60
+ });
61
+ console.log(`Added labels: ${labels.join(', ')}`);
62
+ }
@@ -0,0 +1,61 @@
1
+ name: Release to Pipy and Zed's store
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ release-pypy:
10
+ name: Release to Pypi
11
+ runs-on: ubuntu-latest
12
+ environment:
13
+ name: pypi
14
+ url: https://pypi.org/p/bloom-cli
15
+ permissions:
16
+ id-token: write
17
+ contents: read
18
+
19
+ steps:
20
+ - name: Checkout code
21
+ uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
22
+
23
+ - name: Set up Python
24
+ uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
25
+ with:
26
+ python-version: "3.12"
27
+
28
+ - name: Install uv
29
+ uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
30
+
31
+ - name: Install dependencies
32
+ run: uv sync --locked --dev
33
+
34
+ - name: Build package
35
+ run: uv build
36
+
37
+ - name: Upload artifacts
38
+ uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
39
+ with:
40
+ name: dist
41
+ path: dist/
42
+
43
+ - name: Publish distribution to PyPI
44
+ if: github.repository == 'Ilm-Alan/bloom'
45
+ uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
46
+
47
+ release-zed-extension:
48
+ name: Release Zed Extension
49
+ runs-on: ubuntu-latest
50
+ if: github.repository == 'Ilm-Alan/bloom'
51
+ permissions:
52
+ contents: read
53
+ environment:
54
+ name: zed
55
+ steps:
56
+ - uses: huacnlee/zed-extension-action@8cd592a0d24e1e41157740f1a529aeabddc88a1b # v2
57
+ with:
58
+ extension-name: bloom-cli
59
+ push-to: mistralai/zed-extensions
60
+ env:
61
+ COMMITTER_TOKEN: ${{ secrets.ZED_EXTENSION_GITHUB_TOKEN }}