@meistrari/remy-cli 1.25.0-rc.6 → 1.25.0-rc.7
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.
- package/README.md +12 -5
- package/dist/remy.js +26 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -66,7 +66,7 @@ The new-session request and conversation composers share path completion and att
|
|
|
66
66
|
|
|
67
67
|
### Resume or follow up
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
Terminal follow-ups default to **Steer**, targeting the work currently in progress. Press `Ctrl+Enter` to queue a message as **Next**, which waits for current work to finish. Plain `Enter` continues to send as Steer. Failed submissions retain their mode, attachments, settings, and idempotency key when retried with `Ctrl+R`. Remy can replay sessions containing queued-message dispatch, withdrawal, and failure events. Messages withdrawn or failed before reaching Remy show an activity notice; an active submission ends as cancelled or failed instead of waiting for a turn that never started.
|
|
70
70
|
|
|
71
71
|
Use Up/Down to select a session in the dashboard, Left/Right to load the adjacent page, and `Enter` to open it. Remy loads the complete retained conversation before showing the session view, then streams new activity as it arrives. Press `s` to search the loaded page by session ID, title, or number; `Enter` keeps the search active and `Esc` clears it. Press `f` to filter sessions by lifecycle status or `a` to filter by author. Both pickers use checkboxes: Up/Down or `j`/`k` moves, `Space` toggles, Right/`l` checks, Left/`h` clears, `G` and `gg` jump to the last and first option, and `Enter` applies every checked value. An empty picker means all values. Press `s` inside either picker to fuzzy-search its options; `Enter` keeps the matching list and `Esc` cancels the search. Press `Esc` outside search to discard staged checkbox changes. Filters apply to the complete remote result set and reset pagination to its first page. After the dashboard list or repository-review list has focus, Vim keys work too: `j`/`k` move, `h`/`l` go to the previous/next dashboard page (or clear/mark a repository), `G` goes to the last row, and `gg` goes to the first row. Press `Shift+L` in the dashboard to start a logout confirmation. In any message composer, plain `Enter` and `Shift+Enter` submit; `Option+Enter` on macOS (`Alt+Enter` elsewhere) inserts a newline. `Ctrl+J` also inserts a newline for terminals that do not report the Option/Alt modifier. `Cmd+Left`/`Cmd+Right` move to the start or end of the current line, as do `Home`/`End`, which many macOS terminals send for those keys; `Ctrl+D` deletes the character after the cursor. In the session view, `Ctrl+C` first clears a non-empty draft; press it again with an empty composer to exit. The conversation header keeps the numbered session title on its first line and repository, pull request, work state, elapsed time, connection state, and the agent's current `Harness · Model · Effort` on its second line. The header also keeps the last provider-reported context observation across reconnects, such as `Context 50% left · 62,000 used`; when the provider does not report a context window, it shows only used tokens. This is an observation, not a live occupancy guarantee or billing total.
|
|
72
72
|
|
|
@@ -94,7 +94,7 @@ Terminal previews show up to 50 content blocks and 8,000 characters per block, w
|
|
|
94
94
|
|
|
95
95
|
Command and attachment feedback share progress, success, failure, and attention indicators. Failed stop requests show the reason and `esc` retry; failed complete/cancel requests restore the message prompt and show the retry command. Logout shows a confirmation with `y` to confirm and `Esc` to cancel.
|
|
96
96
|
|
|
97
|
-
**Change the model or effort:** enter `/model` or `/reasoning` (`/effort` is an alias) to pick a new model or reasoning effort for your next message. The model list contains only the session's harness (a Claude session offers Claude models, a Codex session Codex models), in the same order and with the same labels as the new-session wizard. Arrows move, `Enter` stages the pick, and `Esc` closes the picker without changing what is already staged. Nothing is sent until you send a message: the change travels with it and stays the session's setting afterward.
|
|
97
|
+
**Change the model or effort:** enter `/model` or `/reasoning` (`/effort` is an alias) to pick a new model or reasoning effort for your next message. The model list contains only the session's harness (a Claude session offers Claude models, a Codex session Codex models), in the same order and with the same labels as the new-session wizard. Arrows move, `Enter` stages the pick, and `Esc` closes the picker without changing what is already staged. Nothing is sent until you send a message: the change travels with it and stays the session's setting afterward. With Steer, a change sent while Remy is working switches the running turn from its next model request; with Next, it waits for the queued message’s turn. The header shows the staged change as `→ Sonnet 5.5 · High (next message)`, then `(switching…)` until the runtime applies it. The timeline then records `Switched to Sonnet 5.5 · High` right after your message, or `Switched to Sonnet 5.5 · High (from next turn)` when the running turn could not switch; its details (`Ctrl+O`) then show the provider's reason when one was given. Picking the current value removes it from the staged change.
|
|
98
98
|
|
|
99
99
|
Enter `/compact` to admit a durable main-thread context compaction control without sending a human message. Remy reports request admission immediately and shows the eventual completed, no-op, failed, or unknown provider result in retained activity. Compaction waits for a safe point and does not interrupt active work or jump ahead of an earlier Next message. While admission is pending, you can keep editing or open other commands; repeated `/compact` invocations do not send another request.
|
|
100
100
|
|
|
@@ -105,6 +105,7 @@ Drag to select visible text in any Remy view; Remy copies it to the local clipbo
|
|
|
105
105
|
| `Esc` | Interrupt the active turn; the session stays open. |
|
|
106
106
|
| `/complete` | Complete an open session after its active turn stops. |
|
|
107
107
|
| `/cancel` | Cancel the current session, including an active turn. |
|
|
108
|
+
| `Ctrl+Enter` | Queue the message for a new turn after current work. |
|
|
108
109
|
| `/compact` | Admit a main-thread context compaction request without sending a message; the provider result appears in retained activity. |
|
|
109
110
|
| `/model` | Pick a model of the session's harness for your next message. |
|
|
110
111
|
| `/effort` | Pick a reasoning effort for your next message. |
|
|
@@ -162,7 +163,13 @@ To submit a follow-up immediately, add one quoted positional `prompt`:
|
|
|
162
163
|
remy --session <session-id> "Add regression coverage for that fix"
|
|
163
164
|
```
|
|
164
165
|
|
|
165
|
-
Remy sends the prompt as **Steer**, then opens the conversation.
|
|
166
|
+
Remy sends the prompt as **Steer**, then opens the conversation. Add `--queue` to send it as **Next**, waiting for current work to finish:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
remy --session <session-id> --queue "Run the checks after you finish"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
`--queue` requires a prompt and also works with `--no-tui` or `--json`. Omitting the prompt only attaches. An explicitly empty prompt is rejected. Use `--` before a prompt beginning with `--` to treat it as text.
|
|
166
173
|
|
|
167
174
|
To change the model or reasoning effort, pass `--model <name>`, `--reasoning-effort <low|medium|high|xhigh>`, or both with the prompt:
|
|
168
175
|
|
|
@@ -170,7 +177,7 @@ To change the model or reasoning effort, pass `--model <name>`, `--reasoning-eff
|
|
|
170
177
|
remy --session <session-id> --model claude-sonnet-5-5 --reasoning-effort high "Finish the migration"
|
|
171
178
|
```
|
|
172
179
|
|
|
173
|
-
The change travels with that message and stays the session's setting for later messages.
|
|
180
|
+
The change travels with that message and stays the session's setting for later messages. With Steer, a running turn switches from its next model request; with `--queue`, the change applies when the queued message starts its turn. Either flag without a prompt is rejected, because settings only change with a message. The session keeps its harness, so `--model` must name one of that harness's models; Remy checks this against the session before sending and names the harness's models when it does not match. Omit both flags to keep the current settings.
|
|
174
181
|
|
|
175
182
|
### Automate a session
|
|
176
183
|
|
|
@@ -247,7 +254,7 @@ remy update
|
|
|
247
254
|
remy --version | -v
|
|
248
255
|
remy dashboard
|
|
249
256
|
remy new [--repository <owner/name> ... --installation <id> --model <name> --reasoning-effort <low|medium|high|xhigh> --attach <path> ... --mcp <offering-id> ... --no-tui --json] <prompt>
|
|
250
|
-
remy --session <session-id> [--model <name> --reasoning-effort <low|medium|high|xhigh> --no-tui --json] [prompt]
|
|
257
|
+
remy --session <session-id> [--queue --model <name> --reasoning-effort <low|medium|high|xhigh> --no-tui --json] [prompt]
|
|
251
258
|
remy session open <session-id>
|
|
252
259
|
remy session mcps list <session-id> [--json] | add <session-id> <offering-id> | enable|disable <session-id> <attachment-id>
|
|
253
260
|
remy session workspace changes <session-id> [--json]
|
package/dist/remy.js
CHANGED
|
@@ -34592,7 +34592,7 @@ function formatSessionJson({
|
|
|
34592
34592
|
`;
|
|
34593
34593
|
}
|
|
34594
34594
|
// src/version.ts
|
|
34595
|
-
var remyCliVersion = "1.25.0-rc.
|
|
34595
|
+
var remyCliVersion = "1.25.0-rc.7";
|
|
34596
34596
|
|
|
34597
34597
|
// src/self-update.ts
|
|
34598
34598
|
import { spawn } from "child_process";
|
|
@@ -40456,6 +40456,7 @@ function createSessionAdmissions() {
|
|
|
40456
40456
|
try {
|
|
40457
40457
|
const result = await send({
|
|
40458
40458
|
text: attempt.text,
|
|
40459
|
+
mode: attempt.mode,
|
|
40459
40460
|
attachments: structuredClone(attempt.attachments),
|
|
40460
40461
|
idempotencyKey: attempt.idempotencyKey,
|
|
40461
40462
|
...attempt.agent ? { agent: structuredClone(attempt.agent) } : {}
|
|
@@ -43659,6 +43660,7 @@ ${segment.excerpt}`).join(`
|
|
|
43659
43660
|
parent: root,
|
|
43660
43661
|
tag: composerTag,
|
|
43661
43662
|
topDividerLabel: turnDividerLabel,
|
|
43663
|
+
placeholder: "Message Remy\u2026 Enter sends \xB7 Ctrl+Enter queues",
|
|
43662
43664
|
onSubmit: () => {
|
|
43663
43665
|
submitComposer();
|
|
43664
43666
|
},
|
|
@@ -43942,6 +43944,11 @@ ${segment.excerpt}`).join(`
|
|
|
43942
43944
|
}
|
|
43943
43945
|
if (composerPaths.handleKey(key))
|
|
43944
43946
|
return;
|
|
43947
|
+
if ((key.name === "return" || key.name === "enter") && key.ctrl) {
|
|
43948
|
+
key.preventDefault();
|
|
43949
|
+
submitComposer("next");
|
|
43950
|
+
return;
|
|
43951
|
+
}
|
|
43945
43952
|
if ((key.name === "up" || key.name === "down") && composerAtVisualEdge(key.name)) {
|
|
43946
43953
|
key.preventDefault();
|
|
43947
43954
|
navigatePromptHistory(key.name);
|
|
@@ -44020,7 +44027,7 @@ ${segment.excerpt}`).join(`
|
|
|
44020
44027
|
});
|
|
44021
44028
|
};
|
|
44022
44029
|
}
|
|
44023
|
-
async function submitComposer() {
|
|
44030
|
+
async function submitComposer(mode = "steer") {
|
|
44024
44031
|
if (attachmentPreparationOwner)
|
|
44025
44032
|
return;
|
|
44026
44033
|
if (pendingPastedImageWrites > 0) {
|
|
@@ -44107,6 +44114,7 @@ ${segment.excerpt}`).join(`
|
|
|
44107
44114
|
id: crypto.randomUUID(),
|
|
44108
44115
|
idempotencyKey: crypto.randomUUID(),
|
|
44109
44116
|
text: submittedText,
|
|
44117
|
+
mode,
|
|
44110
44118
|
attachments: [...composerDraft.attachments],
|
|
44111
44119
|
...composerDraft.agent ? { agent: composerDraft.agent } : {},
|
|
44112
44120
|
status: "admitting"
|
|
@@ -44227,6 +44235,7 @@ ${segment.excerpt}`).join(`
|
|
|
44227
44235
|
id: failed.id,
|
|
44228
44236
|
idempotencyKey: failed.idempotencyKey,
|
|
44229
44237
|
text: failed.text,
|
|
44238
|
+
mode: failed.mode,
|
|
44230
44239
|
attachments: failed.attachments,
|
|
44231
44240
|
...failed.agent ? { agent: failed.agent } : {},
|
|
44232
44241
|
status: "admitting"
|
|
@@ -44870,7 +44879,7 @@ function renderSubmittedTimeline({ state, admittedSubmissions }) {
|
|
|
44870
44879
|
const attachments = renderAttachmentSummary(submission.attachments);
|
|
44871
44880
|
const header = new StyledText11([
|
|
44872
44881
|
renderRoleLabel({ label: "You", role: "human" }),
|
|
44873
|
-
dim7(fg12(PALETTE.dimText)(" (CLI)"))
|
|
44882
|
+
dim7(fg12(PALETTE.dimText)(submission.mode === "next" ? " (CLI \xB7 Next)" : " (CLI)"))
|
|
44874
44883
|
]);
|
|
44875
44884
|
return joinStyled([
|
|
44876
44885
|
header,
|
|
@@ -46605,7 +46614,7 @@ async function attachSession({
|
|
|
46605
46614
|
sessionId,
|
|
46606
46615
|
text: followUp.prompt,
|
|
46607
46616
|
fileIds: [],
|
|
46608
|
-
mode:
|
|
46617
|
+
mode: followUp.mode,
|
|
46609
46618
|
idempotencyKey: randomUUID6(),
|
|
46610
46619
|
...followUp.agent === undefined ? {} : { agent: followUp.agent }
|
|
46611
46620
|
}
|
|
@@ -46761,7 +46770,7 @@ async function runAttachedSession({
|
|
|
46761
46770
|
text: submission.text,
|
|
46762
46771
|
fileIds: submission.attachments.map((attachment) => attachment.fileId),
|
|
46763
46772
|
idempotencyKey: submission.idempotencyKey,
|
|
46764
|
-
mode:
|
|
46773
|
+
mode: submission.mode,
|
|
46765
46774
|
...submission.agent === undefined ? {} : { agent: submission.agent }
|
|
46766
46775
|
}
|
|
46767
46776
|
});
|
|
@@ -47184,13 +47193,14 @@ Options:
|
|
|
47184
47193
|
Attach to an existing remote session. An interactive terminal opens the session view; --no-tui streams output instead.
|
|
47185
47194
|
|
|
47186
47195
|
Arguments:
|
|
47187
|
-
prompt Submit a follow-up
|
|
47196
|
+
prompt Submit a follow-up before attaching (Steer by default)
|
|
47188
47197
|
|
|
47189
47198
|
With a prompt, JSON output waits for that message's turn result. Use -- before a prompt beginning with --.
|
|
47190
47199
|
--model and --reasoning-effort require a prompt: the change travels with it and stays the session's setting.
|
|
47191
|
-
|
|
47200
|
+
With --queue, the message and settings wait for a new turn after current work. Otherwise, a running turn switches from its next model request.
|
|
47192
47201
|
|
|
47193
47202
|
Options:
|
|
47203
|
+
--queue Queue the prompt after current work (requires a prompt)
|
|
47194
47204
|
--model <name> Switch to another model of the session's harness
|
|
47195
47205
|
--reasoning-effort <low|medium|high|xhigh> Switch agent reasoning effort
|
|
47196
47206
|
--no-tui Do not open the interactive terminal view
|
|
@@ -47235,7 +47245,7 @@ Usage:
|
|
|
47235
47245
|
Commands:
|
|
47236
47246
|
remy Open interactive dashboard
|
|
47237
47247
|
remy dashboard Open interactive dashboard
|
|
47238
|
-
remy --session <session-id> [--model <name> --reasoning-effort <low|medium|high|xhigh> --no-tui --json] [prompt]
|
|
47248
|
+
remy --session <session-id> [--queue --model <name> --reasoning-effort <low|medium|high|xhigh> --no-tui --json] [prompt]
|
|
47239
47249
|
Attach to a session, optionally submitting a follow-up
|
|
47240
47250
|
remy session mcps list <session-id> [--json] Inspect attached MCPs
|
|
47241
47251
|
remy session mcps add <session-id> <offering-id>
|
|
@@ -47281,6 +47291,7 @@ function parseSessionAttach(argv) {
|
|
|
47281
47291
|
let prompt;
|
|
47282
47292
|
let model;
|
|
47283
47293
|
let reasoningEffort;
|
|
47294
|
+
let queue = false;
|
|
47284
47295
|
let positionalOnly = false;
|
|
47285
47296
|
for (let index = 1;index < argv.length; index += 1) {
|
|
47286
47297
|
const token = argv[index];
|
|
@@ -47288,6 +47299,10 @@ function parseSessionAttach(argv) {
|
|
|
47288
47299
|
positionalOnly = true;
|
|
47289
47300
|
continue;
|
|
47290
47301
|
}
|
|
47302
|
+
if (!positionalOnly && token === "--queue") {
|
|
47303
|
+
queue = true;
|
|
47304
|
+
continue;
|
|
47305
|
+
}
|
|
47291
47306
|
if (!positionalOnly && token === "--no-tui") {
|
|
47292
47307
|
noTui = true;
|
|
47293
47308
|
continue;
|
|
@@ -47315,6 +47330,8 @@ function parseSessionAttach(argv) {
|
|
|
47315
47330
|
throw new Error("A follow-up prompt must not be empty.");
|
|
47316
47331
|
prompt = token;
|
|
47317
47332
|
}
|
|
47333
|
+
if (queue && prompt === undefined)
|
|
47334
|
+
throw new Error("--queue requires a follow-up prompt.");
|
|
47318
47335
|
const agent = sessionAgentChange({ model, reasoningEffort });
|
|
47319
47336
|
if (agent && prompt === undefined)
|
|
47320
47337
|
throw new Error("--model and --reasoning-effort change the session with a follow-up message. Pass a prompt too.");
|
|
@@ -47323,7 +47340,7 @@ function parseSessionAttach(argv) {
|
|
|
47323
47340
|
sessionId,
|
|
47324
47341
|
noTui,
|
|
47325
47342
|
json: json3,
|
|
47326
|
-
...prompt === undefined ? {} : { followUp: { prompt, ...agent ? { agent } : {} } }
|
|
47343
|
+
...prompt === undefined ? {} : { followUp: { prompt, mode: queue ? "next" : "steer", ...agent ? { agent } : {} } }
|
|
47327
47344
|
};
|
|
47328
47345
|
}
|
|
47329
47346
|
function parseModelFlag(value) {
|