Skip to content

feat(cli): add a non-interrupting /btw command - #1103

Closed
c8dhjp4tyv-bit wants to merge 9038 commits into
CodebuffAI:mainfrom
c8dhjp4tyv-bit:feat/btw-command
Closed

feat(cli): add a non-interrupting /btw command#1103
c8dhjp4tyv-bit wants to merge 9038 commits into
CodebuffAI:mainfrom
c8dhjp4tyv-bit:feat/btw-command

Conversation

@c8dhjp4tyv-bit

Copy link
Copy Markdown

Summary

  • add /btw <additional thought> to send context without interrupting an active turn
  • reuse the existing queue while preserving pending attachments
  • send directly when idle and show usage for an empty note
  • add slash-command metadata and regression tests

Fixes #1052

Validation

  • targeted prompt, command, and router tests: 81 passed
  • full CLI suite: 2,368 passed, 9 skipped
  • full suite still reports 34 existing release-wrapper failures and 32 environment/harness errors
  • CLI typecheck reaches existing missing tar and react-dom/server declarations; no errors point to the changed files
  • git diff --check passed

@codebuff-team

ghost commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Nice work overall — this follows the existing /plan//review command patterns closely, adds a dedicated buildBtwPrompt in prompt-builders.ts, registers the command via defineCommandWithArgs, and includes solid regression coverage in command-args.test.ts and prompt-builders.test.ts. The empty-input usage message and busy-vs-idle branching in command-registry.ts are clean and readable.

One real gap: in the busy path you call capturePendingAttachments() and forward it to params.addToQueue(btwPrompt, pendingAttachments), preserving any attached files. But in the idle path (params.sendMessage({ content: btwPrompt, agentMode: params.agentMode })), pending attachments are never captured or attached at all. If a user has staged an image or text attachment and fires /btw while the CLI is idle, that attachment is silently dropped instead of being sent or queued. Given the PR's own stated goal — 'reuse the existing queue while preserving pending attachments' — this asymmetry looks like an unintentional oversight rather than a deliberate design choice, and it's untested (the idle-path test only checks the sendMessage call args, not attachment state).

Worth a quick fix: capture and pass pending attachments in the idle branch too (mirroring whatever the other direct-send commands do with attachments, if any), and add a test asserting attachments aren't lost when sent immediately. Once that's addressed this looks portable.

@codebuff-team codebuff-team added bot:triaged Classified by the community triage bot pr:needs-work Right idea, not mergeable as written labels Aug 24, 2026

ghost commented Aug 24, 2026

Copy link
Copy Markdown
Author

I traced the idle path through the actual SendMessageFn implementation. The attachment is not dropped: prepareUserMessage() in cli/src/hooks/helpers/send-message.ts does attachments ?? useChatStore.getState().pendingAttachments, then clears the store only after capturing those pending attachments. So an idle /btw direct send intentionally relies on the same fallback used by ordinary direct sends.

I added focused regression coverage in 7df9fb3 to make that handoff explicit: /btw leaves staged attachments untouched in the idle command path so sendMessage can consume them, while the existing busy-path test still verifies the queue captures and clears them itself.

I did not add a second capturePendingAttachments() in the idle command because that would duplicate attachment ownership that already belongs to sendMessage; the new test pins the intended contract instead.

codebuff public sync bot added 23 commits August 24, 2026 22:14
Source: CodebuffAI/freebuff-private@241f8bfa8a8a97867900b2f71754638efa2cbe86
Source: CodebuffAI/freebuff-private@cfc7760af31f29f1acc7153a7e9fcb48d35f730b
Source: CodebuffAI/freebuff-private@6965ea40dbf54a44c932ca4df63b0dd6377bfec5
Source: CodebuffAI/freebuff-private@ecf4fa2e98fcefcec1a96cbd596b5b16bccd97e3
Source: CodebuffAI/freebuff-private@ce96ca2455d9c6a027d6e41048e8f2520f78754f
Source: CodebuffAI/freebuff-private@890653e2610c57c22298d532cae0129efb26f862
Source: CodebuffAI/freebuff-private@d60d93125f90cdca18e1fc97819b91997081a97f
Source: CodebuffAI/freebuff-private@70ba2a57ab1e48c9f799107675dfb6029dc6d54f
Source: CodebuffAI/freebuff-private@9c2be6595fa98153b9ec0474caed5ec3a58ec116
Source: CodebuffAI/freebuff-private@c1db5271ba86e1c89c3c9fc0c6e6a2a857d3b5dd
Source: CodebuffAI/freebuff-private@2846f67777f75ee23da1e3a3047176d66953d906
Source: CodebuffAI/freebuff-private@f5329a11c8431d6f5c98581c2bfc67fb2d1829ba
Source: CodebuffAI/freebuff-private@e319a9e3de31d8c4cd1d0a9285dfd5360eebb7a1
Source: CodebuffAI/freebuff-private@9cbbba39efda2071b8325bf2779b39170e35348c
Source: CodebuffAI/freebuff-private@8470da01520ea7c273efb6eca943fd37fb265189
Source: CodebuffAI/freebuff-private@884e8a41dd02bb5c0be09d8da8e465c994a6c6a4
Source: CodebuffAI/freebuff-private@b550c712e828f5211de07c5699a643fe0fa8f22e
Source: CodebuffAI/freebuff-private@ddfa6c89a27176e4e1afef0bd597077698e3d9e3
Source: CodebuffAI/freebuff-private@9b8fb92689a45c3d52b65f6d4177bb8b0e4a29db
Source: CodebuffAI/freebuff-private@e20dcb5811c89bc349a283c8fb8b474f03857eaa
Source: CodebuffAI/freebuff-private@1a9bb08ef45331c94cfa616a7e5f91dbc3375e7b
Source: CodebuffAI/freebuff-private@2204d7f013215d4a9746f87ccadb88422bdbf0ce
Source: CodebuffAI/freebuff-private@d85f7624f6df913150afd97028ce8034caf9401c
codebuff public sync bot and others added 23 commits August 30, 2026 10:30
Source: CodebuffAI/freebuff-private@bb7cd6f516db0f13b8a4805f6ffe45d58e108465
Source: CodebuffAI/freebuff-private@b377dd73a9a3c03ddf1d2ac30aa31041ef41c26e
Source: CodebuffAI/freebuff-private@ebefe1ed757533292b4020b6242e2e7ce3a3e7e8
Source: CodebuffAI/freebuff-private@6681195eefb64fbce00fd6c3174ea1b9c07bb101
Source: CodebuffAI/freebuff-private@3652cdfb84c76cbfd6eaf0285588958c2e9e863d
Source: CodebuffAI/freebuff-private@4c569a6b8a413f2a7ed24ccc46e1bd6d18f4def9
Source: CodebuffAI/freebuff-private@97525b97891db562584728271a39c5ffa4f88a83
Source: CodebuffAI/freebuff-private@968cf83760c8f77a39a5aedaedc04d5f7fe2c98b
Source: CodebuffAI/freebuff-private@976b89df4e302612e31320d886053088882265fa
Source: CodebuffAI/freebuff-private@d7dc76f31a8a09229134d88ad4c4e209f052808b
Source: CodebuffAI/freebuff-private@f9c01eea0ce77cd368249f7c5d74ec024a7baf91
Source: CodebuffAI/freebuff-private@3e9ad036c6f9b7f71c2127403a89ce605c53c004
Source: CodebuffAI/freebuff-private@a98e28b9a11c0e821d5171d4fed11136ddfda460
Source: CodebuffAI/freebuff-private@5de60102491d5f19108aec59ab7a0bb41f3de60a
Source: CodebuffAI/freebuff-private@ade37e50551c2230d76dffc3fd29ca7ad02bdbfc
Source: CodebuffAI/freebuff-private@2d04668b529a04c2a90806272993d5f67a1afa1f
Source: CodebuffAI/freebuff-private@2f358ebf68b79b05acb81f18ee42ef4295edee17
Source: CodebuffAI/freebuff-private@e411009a76fbd9f689550bd51bc3b938209ec6f8
Source: CodebuffAI/freebuff-private@70a710b1d0941b7bd3a742dbc8e18f276b602850
@victorxheng

ghost commented Aug 31, 2026

Copy link
Copy Markdown

Apologies — this PR was auto-closed by GitHub when we force-pushed a history rewrite of this repository (repository maintenance; every commit SHA changed). That was not a judgment on this PR, and GitHub does not allow us to reopen it because the commits it was based on no longer exist in the new history.

If you'd like to continue with this change: rebase your branch onto the new main (or recreate it from a fresh clone) and open a new PR — feel free to link back to this one for context, and we'll pick up the review there.

Sorry for the churn, and thanks for contributing.

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

Labels

bot:triaged Classified by the community triage bot pr:needs-work Right idea, not mergeable as written

Projects

None yet

Development

Successfully merging this pull request may close these issues.

add a /btw command

3 participants