webbee 0.3.1__tar.gz → 0.3.2__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 (75) hide show
  1. {webbee-0.3.1 → webbee-0.3.2}/CHANGELOG.md +6 -0
  2. {webbee-0.3.1 → webbee-0.3.2}/PKG-INFO +1 -1
  3. {webbee-0.3.1 → webbee-0.3.2}/pyproject.toml +1 -1
  4. webbee-0.3.2/src/webbee/__init__.py +1 -0
  5. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/render.py +7 -5
  6. {webbee-0.3.1 → webbee-0.3.2}/tests/test_render.py +45 -0
  7. webbee-0.3.1/src/webbee/__init__.py +0 -1
  8. {webbee-0.3.1 → webbee-0.3.2}/.github/workflows/publish.yml +0 -0
  9. {webbee-0.3.1 → webbee-0.3.2}/.gitignore +0 -0
  10. {webbee-0.3.1 → webbee-0.3.2}/LICENSE +0 -0
  11. {webbee-0.3.1 → webbee-0.3.2}/README.md +0 -0
  12. {webbee-0.3.1 → webbee-0.3.2}/install.sh +0 -0
  13. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/account.py +0 -0
  14. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/banner_art.py +0 -0
  15. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/checkpoints.py +0 -0
  16. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/cli.py +0 -0
  17. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/clipboard.py +0 -0
  18. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/commands.py +0 -0
  19. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/config.py +0 -0
  20. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/details.py +0 -0
  21. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/events.py +0 -0
  22. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/frames.py +0 -0
  23. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/__init__.py +0 -0
  24. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/chunker.py +0 -0
  25. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/embed.py +0 -0
  26. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/graph.py +0 -0
  27. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/indexer.py +0 -0
  28. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/models.py +0 -0
  29. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/query.py +0 -0
  30. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/service.py +0 -0
  31. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/store.py +0 -0
  32. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/vectors.py +0 -0
  33. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/intel/watch.py +0 -0
  34. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/output_pane.py +0 -0
  35. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/repl.py +0 -0
  36. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/repo.py +0 -0
  37. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/session.py +0 -0
  38. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/sessions.py +0 -0
  39. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/stream.py +0 -0
  40. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/tools.py +0 -0
  41. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/tui.py +0 -0
  42. {webbee-0.3.1 → webbee-0.3.2}/src/webbee/update.py +0 -0
  43. {webbee-0.3.1 → webbee-0.3.2}/tests/__init__.py +0 -0
  44. {webbee-0.3.1 → webbee-0.3.2}/tests/test_account.py +0 -0
  45. {webbee-0.3.1 → webbee-0.3.2}/tests/test_checkpoints.py +0 -0
  46. {webbee-0.3.1 → webbee-0.3.2}/tests/test_cli.py +0 -0
  47. {webbee-0.3.1 → webbee-0.3.2}/tests/test_clipboard.py +0 -0
  48. {webbee-0.3.1 → webbee-0.3.2}/tests/test_commands.py +0 -0
  49. {webbee-0.3.1 → webbee-0.3.2}/tests/test_config.py +0 -0
  50. {webbee-0.3.1 → webbee-0.3.2}/tests/test_cpc_contract_stable.py +0 -0
  51. {webbee-0.3.1 → webbee-0.3.2}/tests/test_details.py +0 -0
  52. {webbee-0.3.1 → webbee-0.3.2}/tests/test_events.py +0 -0
  53. {webbee-0.3.1 → webbee-0.3.2}/tests/test_freeze_fix.py +0 -0
  54. {webbee-0.3.1 → webbee-0.3.2}/tests/test_intel_chunker.py +0 -0
  55. {webbee-0.3.1 → webbee-0.3.2}/tests/test_intel_embed.py +0 -0
  56. {webbee-0.3.1 → webbee-0.3.2}/tests/test_intel_graph.py +0 -0
  57. {webbee-0.3.1 → webbee-0.3.2}/tests/test_intel_indexer.py +0 -0
  58. {webbee-0.3.1 → webbee-0.3.2}/tests/test_intel_no_numpy.py +0 -0
  59. {webbee-0.3.1 → webbee-0.3.2}/tests/test_intel_query.py +0 -0
  60. {webbee-0.3.1 → webbee-0.3.2}/tests/test_intel_service.py +0 -0
  61. {webbee-0.3.1 → webbee-0.3.2}/tests/test_intel_store.py +0 -0
  62. {webbee-0.3.1 → webbee-0.3.2}/tests/test_intel_vectors.py +0 -0
  63. {webbee-0.3.1 → webbee-0.3.2}/tests/test_intel_watch.py +0 -0
  64. {webbee-0.3.1 → webbee-0.3.2}/tests/test_marathon.py +0 -0
  65. {webbee-0.3.1 → webbee-0.3.2}/tests/test_packaging.py +0 -0
  66. {webbee-0.3.1 → webbee-0.3.2}/tests/test_repl.py +0 -0
  67. {webbee-0.3.1 → webbee-0.3.2}/tests/test_repo.py +0 -0
  68. {webbee-0.3.1 → webbee-0.3.2}/tests/test_session.py +0 -0
  69. {webbee-0.3.1 → webbee-0.3.2}/tests/test_sessions.py +0 -0
  70. {webbee-0.3.1 → webbee-0.3.2}/tests/test_stream.py +0 -0
  71. {webbee-0.3.1 → webbee-0.3.2}/tests/test_tools.py +0 -0
  72. {webbee-0.3.1 → webbee-0.3.2}/tests/test_tui.py +0 -0
  73. {webbee-0.3.1 → webbee-0.3.2}/tests/test_tui_hardening.py +0 -0
  74. {webbee-0.3.1 → webbee-0.3.2}/tests/test_update.py +0 -0
  75. {webbee-0.3.1 → webbee-0.3.2}/tests/test_version.py +0 -0
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.2
4
+
5
+ - Wrapped lines keep their left gutter: a long note / progress / thinking /
6
+ echoed-message line used to continue flush against the screen edge; every
7
+ visual line now aligns to the same 2-column transcript gutter.
8
+
3
9
  ## 0.3.1
4
10
 
5
11
  - Auto-checkpointing no longer disables itself after a single transient
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webbee
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Webbee 🐝 — the Imperal Cloud coding agent in your terminal
5
5
  Project-URL: Homepage, https://imperal.io
6
6
  Project-URL: Documentation, https://docs.imperal.io
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "webbee"
3
- version = "0.3.1"
3
+ version = "0.3.2"
4
4
  description = "Webbee 🐝 — the Imperal Cloud coding agent in your terminal"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -0,0 +1 @@
1
+ __version__ = "0.3.2"
@@ -189,15 +189,17 @@ class RichSink:
189
189
  self._nudge()
190
190
 
191
191
  def note(self, message: str) -> None:
192
- self.console.print(Text(" " + message, style=_BEE))
192
+ # _pad (not a " " prefix) so a wrapped line keeps the gutter — a bare
193
+ # prefix indents only the first visual line and continuations hug the
194
+ # screen edge.
195
+ self.console.print(_pad(Text(message, style=_BEE)))
193
196
  self._nudge()
194
197
 
195
198
  def user_echo(self, text: str) -> None:
196
199
  """Commit the just-sent user message as its own clearly-readable line
197
200
  with a background bar (NOT boxed like the live input) so it stands out
198
201
  as 'what I sent' in the scrollback."""
199
- self.console.print(Text.assemble(
200
- (" ", ""), (" ❯ " + text + " ", "bold white on grey30")))
202
+ self.console.print(_pad(Text(" ❯ " + text + " ", style="bold white on grey30")))
201
203
  self._nudge()
202
204
 
203
205
  def clear(self) -> None:
@@ -334,14 +336,14 @@ class RichSink:
334
336
 
335
337
  def progress(self, text: str) -> None:
336
338
  if text:
337
- self.console.print(Text(" " + text, style="dim italic"))
339
+ self.console.print(_pad(Text(text, style="dim italic")))
338
340
  self._nudge()
339
341
 
340
342
  def thinking(self, text: str) -> None:
341
343
  # System-driven reasoning as a distinct 💭 block — visually apart from the
342
344
  # dim `progress` line (which stays reserved for status like low-balance).
343
345
  if text:
344
- self.console.print(Text(" 💭 " + text, style="italic medium_purple3"))
346
+ self.console.print(_pad(Text("💭 " + text, style="italic medium_purple3")))
345
347
  self._nudge()
346
348
 
347
349
  def plan_blocked(self, tool: str) -> None:
@@ -295,3 +295,48 @@ def test_plan_blocked_prints_english_hint():
295
295
  assert "notes.delete_note" in out
296
296
  assert "shift+tab" in out.lower()
297
297
  assert not NO_CYRILLIC.search(out)
298
+
299
+
300
+ # ---- hanging indent on wrapped chrome lines (0.3.2) ------------------------
301
+ # A long one-line note/progress/thinking/user-echo used to wrap flush against
302
+ # the left screen edge (the 2-space gutter lived only in the first line's
303
+ # prefix string). Every visual line must start at the same 2-col gutter.
304
+
305
+ def _narrow_sink(width=40):
306
+ return RichSink(console=Console(record=True, width=width, force_terminal=False),
307
+ live_enabled=False, input_fn=lambda p: "", clock=lambda: 0.0)
308
+
309
+
310
+ def _assert_gutter(out: str):
311
+ lines = [ln for ln in out.splitlines() if ln.strip()]
312
+ assert lines, "nothing rendered"
313
+ for ln in lines:
314
+ assert ln.startswith(" "), f"line lost the gutter: {ln!r}"
315
+
316
+
317
+ def test_note_wraps_with_gutter():
318
+ s = _narrow_sink()
319
+ s.note("Right now we need to move the Matomo extension onto the new "
320
+ "backend path cleanly and rerun the whole test suite afterwards")
321
+ _assert_gutter(s.console.export_text())
322
+
323
+
324
+ def test_progress_wraps_with_gutter():
325
+ s = _narrow_sink()
326
+ s.progress("switching every old analytics call over to the new prefix "
327
+ "without touching any business logic at all")
328
+ _assert_gutter(s.console.export_text())
329
+
330
+
331
+ def test_thinking_wraps_with_gutter():
332
+ s = _narrow_sink()
333
+ s.thinking("bulk replace failed on repeated lines so a scripted targeted "
334
+ "replacement across the tree is faster and safer here")
335
+ _assert_gutter(s.console.export_text())
336
+
337
+
338
+ def test_user_echo_wraps_with_gutter():
339
+ s = _narrow_sink()
340
+ s.user_echo("please migrate the whole extension to the new backend path "
341
+ "and make sure nothing regresses while you are at it")
342
+ _assert_gutter(s.console.export_text())
@@ -1 +0,0 @@
1
- __version__ = "0.3.1"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes