FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

TUI Experience · Issue #48 · cecli-dev/cecli · GitHub

Repository navigation

TUI Experience #48

Closed
Closed

Description

Issue Chat for TUI Delivery Initiatives

Activity

  1. Netzvamp commented on Oct 22, 2025

    I don't think this is necessary. The other coders are prettier, but in some of them you can't use normal terminal scroll or it's a pain to copy code from the terminal. And many use aider in very small terminals in vscode/pycharm, where every line is valuable and shouldn't be wasted with a fancy border around the code or something like that. There is no need for elements that wast space in the terminal, sometimes less is more. I like the distraction free aider UI as it is.

    There are far more needed features:

    • Save a session into a file and restore it, to get all context and messages:
      It's a pain to restart aider, when the chat context matters for future steps. I know, you could tell aider to store a plan into a file, but that feels unnecessary and you may loose nuances.
    • Write into Files that are not added to git:
      Sometimes i generate a temporary plan/design into a markdown file and i don't like to add this temp file into the repo, but i have to so that aider can write into it.

    But thank you for your afford to keep our favorite coder alive 👍

  2. xRebellion commented on Oct 23, 2025

    I also personally think aider's UI is fine as it is right now. I've ran around here and there trying out TUI coding agents, but Aider's simplicity is honestly what makes me keep coming back to it.

  3. dwash96 commented on Oct 23, 2025

    CollaboratorAuthor

    Yeah this is fair. I see a world where the TUI mode is just like the GUI mode, definitely optional but that's probably me just really liking Gemini cli's interface. I do see how session support for basic resumability and what y'all are describing for a plan -> apply workflow are more helpful though. Thank you for the feedback

  4. avneeshs1 commented on Oct 27, 2025

    @dwash96, is there a config setting to turn off the new TUI experience? In the integrated VSCode terminal, the new UI is not behaving nicely (no prompt in architect mode, formatting all over the place).

    aider/coders/architect_coder.py:17: RuntimeWarning: coroutine 'InputOutput.confirm_ask' was never awaited
      if not self.auto_accept_architect and not self.io.confirm_ask("Edit the files?"):
    RuntimeWarning: Enable tracemalloc to get the object allocation traceback
    

    I will debug more and file bugs but I was wondering if there is a feature flag that allows me to turn this off for now. Ty!

  5. added a commit that references this issue on Oct 29, 2025
  6. avneeshs1 commented on Oct 29, 2025

    @dwash96 thanks for the commit. Unfortunately, I am still having problems (and a few more):

    1. Now, I get a prompt to agree to the changes. And, when confirmed, aider makes the edits. However, it looks like something is still working in the async loop because the code crashes with this:
    architect multi> `last_error` should be displayed in red.                                                                                                                           
    Aider v0.88.2
    Main model: gpt-5 with architect edit format, reasoning high
    Editor model: gpt-5 with editor-diff edit format
    Weak model: gpt-5-nano
    Git repo: ../macro/.git/worktrees/macro-PMSAX-72.ds with 676 files
    Repo-map: using 4096 tokens, files refresh
    MCP servers configured: dagster-docs-mcp
    Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text
    ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    Change required
    Make the status pane that displays last_error render its text in red.
    Where to change
    In com/cat/utils/scripts/overrides.py inside build_view(), find the status pane initialization:
    - Current:
      status_md = pn.pane.Markdown(model.last_error, width=600)
    - Update:
      Add a styles dict setting the color to red:
      status_md = pn.pane.Markdown(model.last_error, width=600, styles={"color": "red"})
    Why
    This ensures whatever string is assigned to last_error is rendered in red consistently. The existing watcher that updates status_md.object will continue to work and the style 
    persists across updates.
    Optional (if you want red only for errors)
    If later you decide to color only when it’s an error (and use a neutral color for info messages), change the watcher to also set styles conditionally based on e.new (e.g., if 
    "failed", "error" in message), but that’s not required for this request.
    
    Tokens: 110k sent, 202 received. Cost: $0.14 message, $0.16 session.
    Edit the files? (Y)es/(N)o [Yes]: y                                                                                                                                                 
    [10/29/25 17:23:38] INFO     Processing request of type ListToolsRequest                                                                                               server.py:674
    com/cat/utils/scripts/overrides.py
    ````python
    <<<<<<< SEARCH
        status_md = pn.pane.Markdown(model.last_error, width=600)
    =======
        status_md = pn.pane.Markdown(model.last_error, width=600, styles={"color": "red"})
    >>>>>>> REPLACE
    
    Tokens: 108k sent, 61 received. Cost: $0.14 message, $0.29 session.
    Applied edit to com/cat/utils/scripts/overrides.py
    Commit c3bd4a5 style: render last_error status text in red in status pane
    You can use /undo to undo and discard each aider commit.
    Aider v0.88.2
    Main model: gpt-5 with architect edit format, reasoning high
    Editor model: gpt-5 with editor-diff edit format
    Weak model: gpt-5-nano
    Git repo: ../macro/.git/worktrees/macro-PMSAX-72.ds with 676 files
    Repo-map: using 4096 tokens, files refresh
    MCP servers configured: dagster-docs-mcp
    Restored previous conversation history.
    Multiline mode: Enabled. Enter inserts newline, Alt-Enter submits text
    ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    I see the change is in place: last_error is rendered in red via styles={"color": "red"}.
    If you want more than fixed red, confirm and I’ll guide you to:
    - Conditional coloring: red for errors, green for success, neutral/grey otherwise.
      - Replace the current watcher with a handler that updates both object and styles based on the message content (e.g., contains "error"/"failed" → red; "inserted"/"transform 
    applied" → green; empty → grey).
      - Initialize status_md with the same style function so it’s correct on load.
    - Optional: auto-clear non-error messages after a short delay.
      - In the same handler, if the message is a success/info, schedule a pn.state.add_periodic_callback to clear model.last_error after N seconds (and stop the callback).
    Say “yes” if you want this, and I’ll provide precise steps.
    
    Edit the files? (Y)es/(N)o [Yes]:                                                                                                                                                   
    ERROR:asyncio:an error occurred during closing of asynchronous generator <async_generator object stdio_client at 0xffff73d5d000>
    asyncgen: <async_generator object stdio_client at 0xffff73d5d000>
      + Exception Group Traceback (most recent call last):
      |   File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 781, in __aexit__
      |     raise BaseExceptionGroup(
      | BaseExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
      +-+---------------- 1 ----------------
        | Traceback (most recent call last):
        |   File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/mcp/client/stdio/__init__.py", line 189, in stdio_client
        |     yield read_stream, write_stream
        | GeneratorExit
        +------------------------------------
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/mcp/client/stdio/__init__.py", line 183, in stdio_client
        anyio.create_task_group() as tg,
        ^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 787, in __aexit__
        if self.cancel_scope.__exit__(type(exc), exc, exc.__traceback__):
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/avneesh.saxena/.local/share/uv/tools/aider-ce/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 459, in __exit__
        raise RuntimeError(
    RuntimeError: Attempted to exit cancel scope in a different task than it was entered in
    
    # Uncaught AssertionError in application.py line 651
    
    Aider version: 0.88.2
    Python version: 3.12.10
    Platform: Linux-6.1.147-172.266.amzn2023.aarch64-aarch64-with-glibc2.34
    Python implementation: CPython
    Virtual environment: Yes
    OS: Linux 6.1.147-172.266.amzn2023.aarch64 (64bit)
    Git version: git version 2.50.1
    
    An uncaught exception occurred:
    
    Traceback (most recent call last):
      File "aider-ce", line 10, in <module>
        sys.exit(main())
                 ^^^^^^
      File "main.py", line 474, in main
        return asyncio.run(main_async(argv, input, output, force_git_root, return_coder))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "runners.py", line 195, in run
        return runner.run(main)
               ^^^^^^^^^^^^^^^^
      File "runners.py", line 118, in run
        return self._loop.run_until_complete(task)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "base_events.py", line 691, in run_until_complete
        return future.result()
               ^^^^^^^^^^^^^^^
      File "main.py", line 1212, in main_async
        await coder.run()
      File "base_coder.py", line 1065, in run
        return await self._run_patched(with_message, preproc)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "base_coder.py", line 1132, in _run_patched
        await processing_task
      File "base_coder.py", line 1172, in _processing_logic
        await self.run_one(user_message, preproc)
      File "base_coder.py", line 1228, in run_one
        async for _ in self.send_message(message):
      File "base_coder.py", line 1994, in send_message
        if await self.reply_completed():
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "architect_coder.py", line 17, in reply_completed
        if not self.auto_accept_architect and not await self.io.confirm_ask("Edit the files?"):
                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "io.py", line 84, in wrapper
        return await func(self, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "io.py", line 1022, in confirm_ask
        return await asyncio.create_task(self._confirm_ask(*args, **kwargs))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "io.py", line 1128, in _confirm_ask
        res = await prompt_task
              ^^^^^^^^^^^^^^^^^
      File "prompt.py", line 1252, in prompt_async
        return await self.app.run_async(
               ^^^^^^^^^^^^^^^^^^^^^^^^^
      File "application.py", line 651, in run_async
        assert not self._is_running, "Application is already running."
               ^^^^^^^^^^^^^^^^^^^^
    AssertionError: Application is already running.
    
    
    Please consider reporting this bug to help improve aider!
    
    1. /test does not seem to work anymore. The tests run and the lines of output are added to the chat but the LLM is not invoked. In classic aider, test errors would invoke the LLM automatically. Even manually requesting doesn't work.
  7. ErichBSchulz commented on Oct 30, 2025

    my 2c, for what it's worth. My preference is to retain the very clean CLI that aider has currently. I use terminator to manage multiple windows and sub window and often have aider running in different aiders running in different projects (the big plus of terminator over tmux etc is I can alter the text size of each window which is great for having automated tests and log following etc)... so for this reason i'm happy for a simple linear workflow within aider...

    I'm curious about the detail of what is proposed but I've notice lots of regressions in CE with loss of formatting etc that it would be great to resolve

  8. Wheest commented on Oct 30, 2025

    @dwash96, is there a config setting to turn off the new TUI experience? In the integrated VSCode terminal, the new UI is not behaving nicely (no prompt in architect mode, formatting all over the place).

    aider/coders/architect_coder.py:17: RuntimeWarning: coroutine 'InputOutput.confirm_ask' was never awaited
      if not self.auto_accept_architect and not self.io.confirm_ask("Edit the files?"):
    RuntimeWarning: Enable tracemalloc to get the object allocation traceback
    

    I will debug more and file bugs but I was wondering if there is a feature flag that allows me to turn this off for now. Ty!

    Somewhat similar warning, I started up a new session on HEAD, and got:

    ```
    You can skip this check with --no-gitignore
    /Users/pez/Library/Python/3.12/lib/python/site-packages/aider/main.py:194: RuntimeWarning: coroutine 'InputOutput.confirm_ask' was never awaited
    if not io.confirm_ask(f"Add {', '.join(patterns_to_add)} to .gitignore (recommended)?"):
    RuntimeWarning: Enable tracemalloc to get the object allocation traceback

  9. codeofdusk commented on Nov 1, 2025

    I'm totally blind and use a screen reader. Simplicity (disabling pretty, fancy_input, etc.) is key here – please, at least for accessibility's sake, make any fancy terminal UIs optional.

  10. added 2 commits that reference this issue on Nov 2, 2025
  11. dwash96 commented on Nov 3, 2025

    CollaboratorAuthor

    A few of these concerns should be alleviated with 0.88.5, added fixes for the /test command

    As for formatting, the current interface is not what I have in mind at all for a TUI experience. The current interface is a compromise that allows the system to work with asynchronicity at all which is necessary to have wholly separate (as opposed to alternating) input and output buffers. Separating the input and output buffers allow for multiple styles of interface (a linear mode like you all are suggesting here, what it is now, and a full TUI mode for the competitive aesthetic that I'm interested in) to coexist and even more interesting things like remotely managing aider's process IO with an embedded web server which they do very clunk-ily in aider-desk by connecting to the stdin/stdout of a shell

    @codeofdusk
    Out of curiosity, how does a screen reader read a terminal for streaming programs? Are you simply disabling streaming? I'm kind of capped out of working on this this weekend, but I can add a "linear_output" mode next week that will emulate strict alternation between an input stage and output stage if that would work with the set up you use

  12. codeofdusk commented on Nov 3, 2025

    Out of curiosity, how does a screen reader read a terminal for streaming programs?

    On Windows, the terminal sends accessibility events that notify the attached screen reader that the text buffer changed, then the screen reader takes a diff and reads "new" text with some heuristics (to filter out things like typed characters, which are handled differently). Stock aider works well (I haven't yet used CE), as long as pretty and fancy-input are set to false.

  13. added a commit that references this issue on Nov 3, 2025
  14. dwash96 commented on Nov 3, 2025

    CollaboratorAuthor

    Gotcha, I added a --linear-output flag (so a linear-output configuration file setting) in 0.88.5, so if you do make the switch, definitely let me know if that works for you

  15. dwash96 commented on Nov 4, 2025

    CollaboratorAuthor

    @Netzvamp

    You will be happy to know, I'm adding session commands (/save-session, /load-session, /list-sessions) in 0.88.6

  16. avneeshs1 commented on Nov 14, 2025

    Gotcha, I added a --linear-output flag (so a linear-output configuration file setting) in 0.88.5, so if you do make the switch, definitely let me know if that works for you

    @dwash96 I love the --linear-output flag. The rich output was messing up /test pytest outputs. Ty!

  17. dwash96 commented on Dec 13, 2025

    CollaboratorAuthor

    Big shout out to @1broseidon for getting us much further along the path to an industry level TUI:

    The work is on-going but very nice to see it chugging along

  18. dwash96 commented on Dec 15, 2025

    CollaboratorAuthor

    Stunning success, v0.90.0 finishes this, everything else is maintenance

  19. codeofdusk commented on Jan 5, 2026

    Gotcha, I added a --linear-output flag (so a linear-output configuration file setting) in 0.88.5, so if you do make the switch, definitely let me know if that works for you

    @dwash96 giving this a try. linear-output definitely helps, but the output is a little noisy ("processing..." after every command). How do I get an aider-like UI without extraneous output? My .aider.conf.yml:

    auto-commits: false
    gitignore: false
    fancy-input: false
    pretty: false
    model: gpt-5.2
    editor-model: gemini-3-pro-preview
    weak-model: gpt-4.1
    reasoning-effort: high
    timeout: 3600
    linear-output: true
  20. dwash96 commented on Jan 9, 2026

    CollaboratorAuthor

    Gotcha, I added a --linear-output flag (so a linear-output configuration file setting) in 0.88.5, so if you do make the switch, definitely let me know if that works for you

    @dwash96 giving this a try. linear-output definitely helps, but the output is a little noisy ("processing..." after every command). How do I get an aider-like UI without extraneous output? My .aider.conf.yml:

    auto-commits: false
    gitignore: false
    fancy-input: false
    pretty: false
    model: gpt-5.2
    editor-model: gemini-3-pro-preview
    weak-model: gpt-4.1
    reasoning-effort: high
    timeout: 3600
    linear-output: true

    Sorry, I just saw this one, I added:
    d8b231f

    To not show the "Processing" and "Finished" messages when pretty is false

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions


      Back | FazBrowse Home | New Git URL