@patze/code-cli 0.10.2 → 0.10.4
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/CHANGELOG.md +48 -0
- package/README.md +41 -4
- package/VERSION +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/interactive/header.d.ts +5 -1
- package/dist/cli/interactive/header.d.ts.map +1 -1
- package/dist/cli/interactive/header.js +47 -14
- package/dist/cli/interactive/header.js.map +1 -1
- package/dist/cli/interactive/line-editor.d.ts +46 -0
- package/dist/cli/interactive/line-editor.d.ts.map +1 -0
- package/dist/cli/interactive/line-editor.js +277 -0
- package/dist/cli/interactive/line-editor.js.map +1 -0
- package/dist/cli/interactive/shell.d.ts.map +1 -1
- package/dist/cli/interactive/shell.js +13 -21
- package/dist/cli/interactive/shell.js.map +1 -1
- package/dist/cli/interactive/slash-menu.d.ts +31 -0
- package/dist/cli/interactive/slash-menu.d.ts.map +1 -0
- package/dist/cli/interactive/slash-menu.js +117 -0
- package/dist/cli/interactive/slash-menu.js.map +1 -0
- package/dist/cli/interactive/slash-suggest.d.ts.map +1 -1
- package/dist/cli/interactive/slash-suggest.js +5 -1
- package/dist/cli/interactive/slash-suggest.js.map +1 -1
- package/dist/cli/ui/box.d.ts +18 -0
- package/dist/cli/ui/box.d.ts.map +1 -0
- package/dist/cli/ui/box.js +59 -0
- package/dist/cli/ui/box.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,52 @@ All notable changes to `@patze/code-cli` are documented here.
|
|
|
4
4
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
6
|
|
|
7
|
+
## [0.10.4] - 2026-05-29
|
|
8
|
+
|
|
9
|
+
### Changed (live command palette — no behavior change)
|
|
10
|
+
|
|
11
|
+
- Interactive composer uses a raw-mode line editor with a live `/` command palette (filter as you type, ↑↓ navigate, Tab/Enter complete)
|
|
12
|
+
- Commands with required args (e.g. `/goal <task>`) complete to `/name ` and wait for input
|
|
13
|
+
- In-session history via ↑↓ when palette is closed; cursor editing and Ctrl+C clear/exit
|
|
14
|
+
- Removed legacy readline Tab completer (superseded by live menu)
|
|
15
|
+
|
|
16
|
+
### Unchanged
|
|
17
|
+
|
|
18
|
+
- Trust loop, apply/verify gating, permission enforcement, network/backend contracts — identical to 0.10.3
|
|
19
|
+
|
|
20
|
+
## [0.10.3] - 2026-05-29
|
|
21
|
+
|
|
22
|
+
### Changed (interactive UI polish — no behavior change)
|
|
23
|
+
|
|
24
|
+
- Professional bordered startup card for `patze`: title `Patze Code · v<version>`, aligned workspace / auth / permission / safety rows
|
|
25
|
+
- Auth-incomplete warning line with remediation hint (`patze login` / `PATZE_CODE_*`)
|
|
26
|
+
- Command hint + Patze-native tips (inspect → plan → diff → typed apply)
|
|
27
|
+
- Permission row shows readable mode label (no redundant `(read-only)` suffix)
|
|
28
|
+
- `patze --help` header now shows version
|
|
29
|
+
- Width-aware card: truncates long values and degrades to plain rows on narrow terminals; deterministic + ANSI-free under `NO_COLOR`/non-TTY
|
|
30
|
+
|
|
31
|
+
### Changed (composer UX — no behavior change)
|
|
32
|
+
|
|
33
|
+
- Live `/command` palette in the interactive composer: type `/` to see a filtered, scrollable menu (prefix-first), navigate with ↑↓, complete with Tab, run with Enter
|
|
34
|
+
- Commands needing an argument (e.g. `/goal <task>`) complete to `/name ` and wait for input instead of submitting
|
|
35
|
+
- In-session history with ↑↓ when the menu is closed; left/right/Home/End cursor editing; Ctrl+C clears (or exits when empty)
|
|
36
|
+
- `Did you mean` for unknown commands now lists each suggestion with its description
|
|
37
|
+
- Startup hint: `Type / for commands · ↑↓ to navigate · Tab/Enter to select`
|
|
38
|
+
- Composer is TTY-only; piped / scripted input still uses readline and stays deterministic
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- `src/cli/ui/box.ts` — reusable bordered card renderer
|
|
43
|
+
- `src/cli/interactive/slash-menu.ts` — pure live-menu state (filter, selection, render)
|
|
44
|
+
- `src/cli/interactive/line-editor.ts` — raw-mode composer with the live `/` palette
|
|
45
|
+
- `tests/header.test.mjs` — startup snapshot, auth warning, permission label, narrow fallback
|
|
46
|
+
- `tests/slash-menu.test.mjs` — menu filtering, selection wrap, arg detection, render
|
|
47
|
+
- `tests/line-editor.test.mjs` — keypress-driven submit / complete / history / editing
|
|
48
|
+
|
|
49
|
+
### Unchanged
|
|
50
|
+
|
|
51
|
+
- Trust loop, apply/verify gating, permission enforcement, network/backend contracts — identical to 0.10.2
|
|
52
|
+
|
|
7
53
|
## [0.10.2] - 2026-05-27
|
|
8
54
|
|
|
9
55
|
### Added (internal beta rollout)
|
|
@@ -87,6 +133,8 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
87
133
|
|
|
88
134
|
- `patze code inspect`, `patze code plan --preview`, local workspace boundaries
|
|
89
135
|
|
|
136
|
+
[0.10.4]: https://github.com/patzeagent/patzelife-plugin-agentdiscord/compare/patze-code-cli-v0.10.3...patze-code-cli-v0.10.4
|
|
137
|
+
[0.10.3]: https://github.com/patzeagent/patzelife-plugin-agentdiscord/compare/patze-code-cli-v0.10.2...patze-code-cli-v0.10.3
|
|
90
138
|
[0.10.2]: https://github.com/patzeagent/patzelife-plugin-agentdiscord/compare/patze-code-cli-v0.10.1...patze-code-cli-v0.10.2
|
|
91
139
|
[0.10.1]: https://github.com/patzeagent/patzelife-plugin-agentdiscord/compare/patze-code-cli-v0.10.0...patze-code-cli-v0.10.1
|
|
92
140
|
[0.10.0]: https://github.com/patzeagent/patzelife-plugin-agentdiscord/releases/tag/patze-code-cli-v0.10.0
|
package/README.md
CHANGED
|
@@ -20,15 +20,15 @@ cd packages/patze-code-cli
|
|
|
20
20
|
|
|
21
21
|
# Or manual tarball
|
|
22
22
|
npm run build && npm pack
|
|
23
|
-
npm install -g ./patze-code-cli-0.10.
|
|
23
|
+
npm install -g ./patze-code-cli-0.10.3.tgz
|
|
24
24
|
patze --version
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
Registry
|
|
27
|
+
Registry:
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
30
|
npm install -g @patze/code-cli@beta
|
|
31
|
-
# or pinned: @patze/code-cli@0.10.
|
|
31
|
+
# or pinned: @patze/code-cli@0.10.4
|
|
32
32
|
patze --version
|
|
33
33
|
```
|
|
34
34
|
|
|
@@ -56,6 +56,43 @@ patze goal "Review README" --dry-run
|
|
|
56
56
|
patze
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
+
Running `patze` shows a status card and tips:
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
╭─ Patze Code · v0.10.4 ────────────────────────────────────╮
|
|
63
|
+
│ workspace /mnt/d/pat-test │
|
|
64
|
+
│ auth incomplete │
|
|
65
|
+
│ permission Read-only │
|
|
66
|
+
│ safety preview-first · read-only │
|
|
67
|
+
╰───────────────────────────────────────────────────────────╯
|
|
68
|
+
|
|
69
|
+
! auth incomplete — run `patze login` or set PATZE_CODE_* env
|
|
70
|
+
|
|
71
|
+
Type a task, or /help for commands.
|
|
72
|
+
Tips
|
|
73
|
+
• /inspect scans the workspace (read-only)
|
|
74
|
+
• /plan then /diff previews changes before any write
|
|
75
|
+
• /apply needs typed approval — it never auto-applies
|
|
76
|
+
Type / for commands · ↑↓ to navigate · Tab/Enter to select
|
|
77
|
+
|
|
78
|
+
›
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Type `/` to open a live command palette that filters as you type:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
› /p
|
|
85
|
+
/plan Server preview only (no apply)
|
|
86
|
+
❯ /permissions Open permission mode selector
|
|
87
|
+
/help Show slash commands
|
|
88
|
+
…
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Navigate with ↑↓, complete with Tab, run with Enter. Commands that need an
|
|
92
|
+
argument (e.g. `/goal <task>`) complete to `/goal ` and wait for your input.
|
|
93
|
+
When the palette is closed, ↑↓ recalls in-session history. The composer is
|
|
94
|
+
TTY-only; piped / scripted input stays on readline and remains deterministic.
|
|
95
|
+
|
|
59
96
|
Inside `patze`:
|
|
60
97
|
|
|
61
98
|
```text
|
|
@@ -79,7 +116,7 @@ prompt → inspect → plan → diff → permissions → approve → apply → v
|
|
|
79
116
|
|
|
80
117
|
Docs: [`docs/trust-loop.md`](docs/trust-loop.md) · [`docs/safety-model.md`](docs/safety-model.md)
|
|
81
118
|
|
|
82
|
-
## Command status (0.10.
|
|
119
|
+
## Command status (0.10.3)
|
|
83
120
|
|
|
84
121
|
### Interactive (`patze` shell)
|
|
85
122
|
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.10.
|
|
1
|
+
0.10.4
|
package/dist/cli/help.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAG9C,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkChD"}
|
package/dist/cli/help.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { CLI_VERSION } from "../version.js";
|
|
1
2
|
export function printHelp(printer) {
|
|
2
|
-
printer.line(
|
|
3
|
+
printer.line(`Patze Code · v${CLI_VERSION} — local terminal coding agent (internal beta)`);
|
|
3
4
|
printer.line("");
|
|
4
5
|
printer.line("Usage:");
|
|
5
6
|
printer.line(" patze Interactive shell (trust loop)");
|
package/dist/cli/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,OAAO,CAAC,IAAI,CAAC,iBAAiB,WAAW,gDAAgD,CAAC,CAAA;IAC1F,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACtB,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;IAC/E,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;IAC1D,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAA;IAC7D,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAA;IACpF,OAAO,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAA;IAC9F,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAA;IACzE,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;IACtE,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAA;IAC7E,OAAO,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAA;IACpG,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;IAC1D,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;IAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IACvC,OAAO,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAA;IACzF,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAC9C,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAA;IACjF,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;IAC3E,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvB,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;IAC9D,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAA;IACrE,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;IACrD,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;IACxD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC5B,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;IACtE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,OAAO,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;IACvF,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAA;AACtF,CAAC"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { PermissionMode } from "../../runtime/permissions.js";
|
|
2
|
-
export
|
|
2
|
+
export type HeaderOptions = {
|
|
3
|
+
width?: number;
|
|
4
|
+
color?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function renderInteractiveHeader(cwd: string, permissionMode?: PermissionMode, options?: HeaderOptions): string[];
|
|
3
7
|
export declare const INTERACTIVE_PROMPT = "\u203A ";
|
|
4
8
|
//# sourceMappingURL=header.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/header.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/header.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAclE,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAUD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,cAAc,CAAC,EAAE,cAAc,EAC/B,OAAO,GAAE,aAAkB,GAC1B,MAAM,EAAE,CA0CV;AAQD,eAAO,MAAM,kBAAkB,YAAO,CAAA"}
|
|
@@ -4,25 +4,58 @@ import { isAuthConfigured } from "../../backend/auth.js";
|
|
|
4
4
|
import { resolveApproval } from "../../runtime/approvals.js";
|
|
5
5
|
import { resolveSandbox } from "../../runtime/sandbox.js";
|
|
6
6
|
import { guessWorkspaceRoot } from "../../runtime/workspace.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
7
|
+
import { CLI_VERSION } from "../../version.js";
|
|
8
|
+
import { renderCard } from "../ui/box.js";
|
|
9
|
+
const YELLOW = "\x1b[33m";
|
|
10
|
+
const DIM = "\x1b[2m";
|
|
11
|
+
const RESET = "\x1b[0m";
|
|
12
|
+
function detectColor() {
|
|
13
|
+
return Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;
|
|
14
|
+
}
|
|
15
|
+
function detectWidth() {
|
|
16
|
+
return typeof process.stdout.columns === "number" ? process.stdout.columns : 0;
|
|
17
|
+
}
|
|
18
|
+
export function renderInteractiveHeader(cwd, permissionMode, options = {}) {
|
|
19
|
+
const color = options.color ?? detectColor();
|
|
20
|
+
const width = options.width ?? detectWidth();
|
|
10
21
|
const config = loadConfig(cwd);
|
|
11
22
|
const authReady = isAuthConfigured(config);
|
|
12
23
|
const approval = resolveApproval(config.approvalMode);
|
|
13
24
|
const sandbox = resolveSandbox(config.sandboxMode);
|
|
14
25
|
const workspace = guessWorkspaceRoot(cwd);
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
const mode = permissionMode ?? "read-only";
|
|
27
|
+
const permission = getPermissionModeDef(mode).label;
|
|
28
|
+
const card = renderCard({
|
|
29
|
+
title: `Patze Code · v${CLI_VERSION}`,
|
|
30
|
+
rows: [
|
|
31
|
+
{ label: "workspace", value: workspace },
|
|
32
|
+
{ label: "auth", value: authReady ? "ready" : "incomplete" },
|
|
33
|
+
{ label: "permission", value: permission },
|
|
34
|
+
{ label: "safety", value: `${approval.mode} · ${sandbox.mode}` },
|
|
35
|
+
],
|
|
36
|
+
width,
|
|
37
|
+
color,
|
|
38
|
+
minInnerWidth: 40,
|
|
39
|
+
});
|
|
40
|
+
const lines = [...card, ""];
|
|
41
|
+
if (!authReady) {
|
|
42
|
+
const warn = "! auth incomplete — run `patze login` or set PATZE_CODE_* env";
|
|
43
|
+
lines.push(color ? `${YELLOW}${warn}${RESET}` : warn);
|
|
44
|
+
lines.push("");
|
|
45
|
+
}
|
|
46
|
+
lines.push("Type a task, or /help for commands.");
|
|
47
|
+
lines.push(color ? `${DIM}Tips${RESET}` : "Tips");
|
|
48
|
+
for (const tip of HEADER_TIPS) {
|
|
49
|
+
lines.push(` • ${tip}`);
|
|
50
|
+
}
|
|
51
|
+
const shortcuts = "Type / for commands · ↑↓ to navigate · Tab/Enter to select";
|
|
52
|
+
lines.push(color ? `${DIM}${shortcuts}${RESET}` : shortcuts);
|
|
53
|
+
return lines;
|
|
26
54
|
}
|
|
55
|
+
const HEADER_TIPS = [
|
|
56
|
+
"/inspect scans the workspace (read-only)",
|
|
57
|
+
"/plan then /diff previews changes before any write",
|
|
58
|
+
"/apply needs typed approval — it never auto-applies",
|
|
59
|
+
];
|
|
27
60
|
export const INTERACTIVE_PROMPT = "› ";
|
|
28
61
|
//# sourceMappingURL=header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../src/cli/interactive/header.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../src/cli/interactive/header.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type LineEditorOptions = {
|
|
2
|
+
prompt: string;
|
|
3
|
+
color: boolean;
|
|
4
|
+
input?: NodeJS.ReadStream;
|
|
5
|
+
output?: NodeJS.WriteStream;
|
|
6
|
+
};
|
|
7
|
+
export type SubmitResult = {
|
|
8
|
+
type: "line";
|
|
9
|
+
value: string;
|
|
10
|
+
} | {
|
|
11
|
+
type: "eof";
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* A minimal raw-mode line editor with a live slash-command menu.
|
|
15
|
+
* TTY-only; the piped / scripted path keeps using readline elsewhere,
|
|
16
|
+
* so deterministic test output is unaffected. The editor only edits the
|
|
17
|
+
* input buffer and offers command completion — it never executes
|
|
18
|
+
* anything or changes trust-loop behavior.
|
|
19
|
+
*/
|
|
20
|
+
export declare class SlashLineEditor {
|
|
21
|
+
private readonly input;
|
|
22
|
+
private readonly output;
|
|
23
|
+
private readonly prompt;
|
|
24
|
+
private readonly color;
|
|
25
|
+
private readonly history;
|
|
26
|
+
private buffer;
|
|
27
|
+
private cursor;
|
|
28
|
+
private selectedIndex;
|
|
29
|
+
private menuDismissed;
|
|
30
|
+
private historyIndex;
|
|
31
|
+
private stashedBuffer;
|
|
32
|
+
private renderedMenuRows;
|
|
33
|
+
constructor(options: LineEditorOptions);
|
|
34
|
+
readLine(): Promise<SubmitResult>;
|
|
35
|
+
private handleKey;
|
|
36
|
+
private currentMenu;
|
|
37
|
+
private afterEdit;
|
|
38
|
+
private resetBuffer;
|
|
39
|
+
private setBuffer;
|
|
40
|
+
private historyPrev;
|
|
41
|
+
private historyNext;
|
|
42
|
+
private pushHistory;
|
|
43
|
+
private render;
|
|
44
|
+
private commitLine;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=line-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-editor.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/line-editor.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAA;AAU5E;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IAEvC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,gBAAgB,CAAI;gBAEhB,OAAO,EAAE,iBAAiB;IAOhC,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAkDvC,OAAO,CAAC,SAAS;IA2GjB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,MAAM;IA+Bd,OAAO,CAAC,UAAU;CAKnB"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { emitKeypressEvents } from "node:readline";
|
|
2
|
+
import { clampSelection, commandRequiresArg, computeSlashMenuItems, moveSelection, renderSlashMenu, } from "./slash-menu.js";
|
|
3
|
+
/**
|
|
4
|
+
* A minimal raw-mode line editor with a live slash-command menu.
|
|
5
|
+
* TTY-only; the piped / scripted path keeps using readline elsewhere,
|
|
6
|
+
* so deterministic test output is unaffected. The editor only edits the
|
|
7
|
+
* input buffer and offers command completion — it never executes
|
|
8
|
+
* anything or changes trust-loop behavior.
|
|
9
|
+
*/
|
|
10
|
+
export class SlashLineEditor {
|
|
11
|
+
input;
|
|
12
|
+
output;
|
|
13
|
+
prompt;
|
|
14
|
+
color;
|
|
15
|
+
history = [];
|
|
16
|
+
buffer = "";
|
|
17
|
+
cursor = 0;
|
|
18
|
+
selectedIndex = 0;
|
|
19
|
+
menuDismissed = false;
|
|
20
|
+
historyIndex = -1;
|
|
21
|
+
stashedBuffer = "";
|
|
22
|
+
renderedMenuRows = 0;
|
|
23
|
+
constructor(options) {
|
|
24
|
+
this.input = options.input ?? process.stdin;
|
|
25
|
+
this.output = options.output ?? process.stdout;
|
|
26
|
+
this.prompt = options.prompt;
|
|
27
|
+
this.color = options.color;
|
|
28
|
+
}
|
|
29
|
+
async readLine() {
|
|
30
|
+
this.buffer = "";
|
|
31
|
+
this.cursor = 0;
|
|
32
|
+
this.selectedIndex = 0;
|
|
33
|
+
this.menuDismissed = false;
|
|
34
|
+
this.historyIndex = -1;
|
|
35
|
+
this.stashedBuffer = "";
|
|
36
|
+
this.renderedMenuRows = 0;
|
|
37
|
+
emitKeypressEvents(this.input);
|
|
38
|
+
const wasRaw = this.input.isRaw ?? false;
|
|
39
|
+
if (this.input.isTTY) {
|
|
40
|
+
this.input.setRawMode(true);
|
|
41
|
+
}
|
|
42
|
+
this.input.resume();
|
|
43
|
+
return new Promise((resolvePromise) => {
|
|
44
|
+
const finish = (result) => {
|
|
45
|
+
this.input.removeListener("keypress", onKeypress);
|
|
46
|
+
if (this.input.isTTY) {
|
|
47
|
+
this.input.setRawMode(wasRaw);
|
|
48
|
+
}
|
|
49
|
+
this.input.pause();
|
|
50
|
+
resolvePromise(result);
|
|
51
|
+
};
|
|
52
|
+
const onKeypress = (str, key) => {
|
|
53
|
+
const action = this.handleKey(str, key ?? {});
|
|
54
|
+
if (action === "submit") {
|
|
55
|
+
const value = this.buffer;
|
|
56
|
+
this.commitLine();
|
|
57
|
+
if (value.trim()) {
|
|
58
|
+
this.pushHistory(value);
|
|
59
|
+
}
|
|
60
|
+
finish({ type: "line", value });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (action === "eof") {
|
|
64
|
+
this.output.write("\n");
|
|
65
|
+
finish({ type: "eof" });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
this.render();
|
|
69
|
+
};
|
|
70
|
+
this.input.on("keypress", onKeypress);
|
|
71
|
+
this.render();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
handleKey(str, key) {
|
|
75
|
+
const name = key.name ?? "";
|
|
76
|
+
if (key.ctrl && name === "c") {
|
|
77
|
+
if (this.buffer.length === 0) {
|
|
78
|
+
return "eof";
|
|
79
|
+
}
|
|
80
|
+
this.resetBuffer();
|
|
81
|
+
return "none";
|
|
82
|
+
}
|
|
83
|
+
if (key.ctrl && name === "d") {
|
|
84
|
+
if (this.buffer.length === 0) {
|
|
85
|
+
return "eof";
|
|
86
|
+
}
|
|
87
|
+
return "none";
|
|
88
|
+
}
|
|
89
|
+
const menu = this.currentMenu();
|
|
90
|
+
if (name === "return" || name === "enter") {
|
|
91
|
+
if (menu.open && menu.items.length > 0 && this.buffer.startsWith("/")) {
|
|
92
|
+
const command = menu.items[clampSelection(this.selectedIndex, menu.items.length)];
|
|
93
|
+
if (commandRequiresArg(command)) {
|
|
94
|
+
this.setBuffer(`/${command.name} `);
|
|
95
|
+
return "none";
|
|
96
|
+
}
|
|
97
|
+
this.setBuffer(`/${command.name}`);
|
|
98
|
+
return "submit";
|
|
99
|
+
}
|
|
100
|
+
return "submit";
|
|
101
|
+
}
|
|
102
|
+
if (name === "tab") {
|
|
103
|
+
if (menu.open && menu.items.length > 0) {
|
|
104
|
+
const command = menu.items[clampSelection(this.selectedIndex, menu.items.length)];
|
|
105
|
+
this.setBuffer(`/${command.name} `);
|
|
106
|
+
}
|
|
107
|
+
return "none";
|
|
108
|
+
}
|
|
109
|
+
if (name === "escape") {
|
|
110
|
+
if (menu.open) {
|
|
111
|
+
this.menuDismissed = true;
|
|
112
|
+
}
|
|
113
|
+
return "none";
|
|
114
|
+
}
|
|
115
|
+
if (name === "up") {
|
|
116
|
+
if (menu.open && menu.items.length > 0) {
|
|
117
|
+
this.selectedIndex = moveSelection(this.selectedIndex, -1, menu.items.length);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
this.historyPrev();
|
|
121
|
+
}
|
|
122
|
+
return "none";
|
|
123
|
+
}
|
|
124
|
+
if (name === "down") {
|
|
125
|
+
if (menu.open && menu.items.length > 0) {
|
|
126
|
+
this.selectedIndex = moveSelection(this.selectedIndex, 1, menu.items.length);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
this.historyNext();
|
|
130
|
+
}
|
|
131
|
+
return "none";
|
|
132
|
+
}
|
|
133
|
+
if (name === "left") {
|
|
134
|
+
this.cursor = Math.max(0, this.cursor - 1);
|
|
135
|
+
return "none";
|
|
136
|
+
}
|
|
137
|
+
if (name === "right") {
|
|
138
|
+
this.cursor = Math.min(this.buffer.length, this.cursor + 1);
|
|
139
|
+
return "none";
|
|
140
|
+
}
|
|
141
|
+
if (name === "home") {
|
|
142
|
+
this.cursor = 0;
|
|
143
|
+
return "none";
|
|
144
|
+
}
|
|
145
|
+
if (name === "end") {
|
|
146
|
+
this.cursor = this.buffer.length;
|
|
147
|
+
return "none";
|
|
148
|
+
}
|
|
149
|
+
if (name === "backspace") {
|
|
150
|
+
if (this.cursor > 0) {
|
|
151
|
+
this.buffer = this.buffer.slice(0, this.cursor - 1) + this.buffer.slice(this.cursor);
|
|
152
|
+
this.cursor -= 1;
|
|
153
|
+
this.afterEdit();
|
|
154
|
+
}
|
|
155
|
+
return "none";
|
|
156
|
+
}
|
|
157
|
+
if (name === "delete") {
|
|
158
|
+
if (this.cursor < this.buffer.length) {
|
|
159
|
+
this.buffer = this.buffer.slice(0, this.cursor) + this.buffer.slice(this.cursor + 1);
|
|
160
|
+
this.afterEdit();
|
|
161
|
+
}
|
|
162
|
+
return "none";
|
|
163
|
+
}
|
|
164
|
+
if (str && !key.ctrl && !key.meta && isPrintable(str)) {
|
|
165
|
+
this.buffer = this.buffer.slice(0, this.cursor) + str + this.buffer.slice(this.cursor);
|
|
166
|
+
this.cursor += str.length;
|
|
167
|
+
this.afterEdit();
|
|
168
|
+
return "none";
|
|
169
|
+
}
|
|
170
|
+
return "none";
|
|
171
|
+
}
|
|
172
|
+
currentMenu() {
|
|
173
|
+
if (this.menuDismissed) {
|
|
174
|
+
return { open: false, items: [] };
|
|
175
|
+
}
|
|
176
|
+
const menu = computeSlashMenuItems(this.buffer);
|
|
177
|
+
return { open: menu.open, items: menu.items };
|
|
178
|
+
}
|
|
179
|
+
afterEdit() {
|
|
180
|
+
this.menuDismissed = false;
|
|
181
|
+
this.selectedIndex = 0;
|
|
182
|
+
this.historyIndex = -1;
|
|
183
|
+
}
|
|
184
|
+
resetBuffer() {
|
|
185
|
+
this.buffer = "";
|
|
186
|
+
this.cursor = 0;
|
|
187
|
+
this.afterEdit();
|
|
188
|
+
}
|
|
189
|
+
setBuffer(value) {
|
|
190
|
+
this.buffer = value;
|
|
191
|
+
this.cursor = value.length;
|
|
192
|
+
this.menuDismissed = false;
|
|
193
|
+
this.selectedIndex = 0;
|
|
194
|
+
}
|
|
195
|
+
historyPrev() {
|
|
196
|
+
if (!this.history.length) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (this.historyIndex === -1) {
|
|
200
|
+
this.stashedBuffer = this.buffer;
|
|
201
|
+
this.historyIndex = this.history.length - 1;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.historyIndex = Math.max(0, this.historyIndex - 1);
|
|
205
|
+
}
|
|
206
|
+
this.buffer = this.history[this.historyIndex];
|
|
207
|
+
this.cursor = this.buffer.length;
|
|
208
|
+
}
|
|
209
|
+
historyNext() {
|
|
210
|
+
if (this.historyIndex === -1) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (this.historyIndex >= this.history.length - 1) {
|
|
214
|
+
this.historyIndex = -1;
|
|
215
|
+
this.buffer = this.stashedBuffer;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
this.historyIndex += 1;
|
|
219
|
+
this.buffer = this.history[this.historyIndex];
|
|
220
|
+
}
|
|
221
|
+
this.cursor = this.buffer.length;
|
|
222
|
+
}
|
|
223
|
+
pushHistory(value) {
|
|
224
|
+
if (this.history[this.history.length - 1] !== value) {
|
|
225
|
+
this.history.push(value);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
render() {
|
|
229
|
+
const width = this.output.columns && this.output.columns > 0 ? this.output.columns : 80;
|
|
230
|
+
const menu = this.currentMenu();
|
|
231
|
+
const menuLines = menu.open
|
|
232
|
+
? renderSlashMenu(menu.items, {
|
|
233
|
+
selectedIndex: this.selectedIndex,
|
|
234
|
+
color: this.color,
|
|
235
|
+
width,
|
|
236
|
+
})
|
|
237
|
+
: [];
|
|
238
|
+
let out = "\r\x1b[J";
|
|
239
|
+
out += this.prompt + this.buffer;
|
|
240
|
+
for (const line of menuLines) {
|
|
241
|
+
out += `\n${line}`;
|
|
242
|
+
}
|
|
243
|
+
const rows = menuLines.length;
|
|
244
|
+
if (rows > 0) {
|
|
245
|
+
out += `\x1b[${rows}A`;
|
|
246
|
+
}
|
|
247
|
+
out += "\r";
|
|
248
|
+
const col = stringWidth(this.prompt) + this.cursor;
|
|
249
|
+
if (col > 0) {
|
|
250
|
+
out += `\x1b[${col}C`;
|
|
251
|
+
}
|
|
252
|
+
this.output.write(out);
|
|
253
|
+
this.renderedMenuRows = rows;
|
|
254
|
+
}
|
|
255
|
+
commitLine() {
|
|
256
|
+
this.output.write("\r\x1b[J");
|
|
257
|
+
this.output.write(this.prompt + this.buffer + "\n");
|
|
258
|
+
this.renderedMenuRows = 0;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
function isPrintable(str) {
|
|
262
|
+
if (!str) {
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
for (const char of str) {
|
|
266
|
+
const code = char.codePointAt(0) ?? 0;
|
|
267
|
+
if (code < 0x20 || code === 0x7f) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
function stringWidth(text) {
|
|
274
|
+
// Prompt/buffer are plain here; approximate one column per code point.
|
|
275
|
+
return [...text].length;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=line-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-editor.js","sourceRoot":"","sources":["../../../src/cli/interactive/line-editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/shell.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/shell.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAYtD,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAED,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,sBAAsB,CAAC,CA6GjC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createInterface } from "node:readline";
|
|
2
2
|
import { createBufferWriter, createStdoutWriter } from "../ui/text-writer.js";
|
|
3
3
|
import { INTERACTIVE_PROMPT, renderInteractiveHeader } from "./header.js";
|
|
4
|
+
import { SlashLineEditor } from "./line-editor.js";
|
|
4
5
|
import { InteractiveSession } from "./session.js";
|
|
5
6
|
import { parseSlashInput } from "./slash-parse.js";
|
|
6
7
|
import { dispatchAgentPrompt, dispatchSlashCommand, } from "./slash-dispatch.js";
|
|
@@ -87,29 +88,20 @@ export async function runInteractiveShell(options = {}) {
|
|
|
87
88
|
}
|
|
88
89
|
return { exitCode, lines: buffer.lines };
|
|
89
90
|
}
|
|
90
|
-
const
|
|
91
|
-
input: process.stdin,
|
|
92
|
-
output: process.stdout,
|
|
93
|
-
terminal: true,
|
|
91
|
+
const editor = new SlashLineEditor({
|
|
94
92
|
prompt,
|
|
93
|
+
color: Boolean(process.stdout.isTTY) && !process.env.NO_COLOR,
|
|
95
94
|
});
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
rl.prompt();
|
|
107
|
-
})();
|
|
108
|
-
});
|
|
109
|
-
rl.on("close", () => {
|
|
110
|
-
resolvePromise();
|
|
111
|
-
});
|
|
112
|
-
});
|
|
95
|
+
for (;;) {
|
|
96
|
+
const result = await editor.readLine();
|
|
97
|
+
if (result.type === "eof") {
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
const shouldExit = await processLine(result.value);
|
|
101
|
+
if (shouldExit) {
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
113
105
|
return { exitCode, lines: buffer.lines };
|
|
114
106
|
}
|
|
115
107
|
//# sourceMappingURL=shell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/cli/interactive/shell.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/cli/interactive/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type SlashCommandDef } from "./slash-registry.js";
|
|
2
|
+
export type SlashMenuItems = {
|
|
3
|
+
open: boolean;
|
|
4
|
+
query: string;
|
|
5
|
+
items: SlashCommandDef[];
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Compute the live slash-command menu for the current input buffer.
|
|
9
|
+
* The menu opens only while the user is typing the command token
|
|
10
|
+
* (`/` with no space yet) — it never reacts to free-text prompts or
|
|
11
|
+
* argument values, so it cannot affect parsing or trust-loop behavior.
|
|
12
|
+
*/
|
|
13
|
+
export declare function computeSlashMenuItems(input: string): SlashMenuItems;
|
|
14
|
+
/** Move a menu selection by delta with wrap-around. */
|
|
15
|
+
export declare function moveSelection(index: number, delta: number, count: number): number;
|
|
16
|
+
/** Clamp a selection index into the valid range. */
|
|
17
|
+
export declare function clampSelection(index: number, count: number): number;
|
|
18
|
+
/** A command needs a typed argument when its usage shows a required `<...>`. */
|
|
19
|
+
export declare function commandRequiresArg(command: SlashCommandDef): boolean;
|
|
20
|
+
export type SlashMenuRenderOptions = {
|
|
21
|
+
selectedIndex: number;
|
|
22
|
+
color?: boolean;
|
|
23
|
+
width?: number;
|
|
24
|
+
maxRows?: number;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Render the menu as plain lines. Deterministic and ANSI-free when
|
|
28
|
+
* `color` is false (used by tests); color is cosmetic only.
|
|
29
|
+
*/
|
|
30
|
+
export declare function renderSlashMenu(items: SlashCommandDef[], options: SlashMenuRenderOptions): string[];
|
|
31
|
+
//# sourceMappingURL=slash-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slash-menu.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/slash-menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEzF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,eAAe,EAAE,CAAA;CACzB,CAAA;AAMD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CA2BnE;AAED,uDAAuD;AACvD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjF;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAWnE;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEpE;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EAAE,EACxB,OAAO,EAAE,sBAAsB,GAC9B,MAAM,EAAE,CAiCV"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { listDiscoverableSlashCommands } from "./slash-registry.js";
|
|
2
|
+
const CYAN = "\x1b[36m";
|
|
3
|
+
const DIM = "\x1b[2m";
|
|
4
|
+
const RESET = "\x1b[0m";
|
|
5
|
+
/**
|
|
6
|
+
* Compute the live slash-command menu for the current input buffer.
|
|
7
|
+
* The menu opens only while the user is typing the command token
|
|
8
|
+
* (`/` with no space yet) — it never reacts to free-text prompts or
|
|
9
|
+
* argument values, so it cannot affect parsing or trust-loop behavior.
|
|
10
|
+
*/
|
|
11
|
+
export function computeSlashMenuItems(input) {
|
|
12
|
+
if (!input.startsWith("/")) {
|
|
13
|
+
return { open: false, query: "", items: [] };
|
|
14
|
+
}
|
|
15
|
+
const afterSlash = input.slice(1);
|
|
16
|
+
if (afterSlash.includes(" ")) {
|
|
17
|
+
return { open: false, query: "", items: [] };
|
|
18
|
+
}
|
|
19
|
+
const query = afterSlash.toLowerCase();
|
|
20
|
+
const all = listDiscoverableSlashCommands();
|
|
21
|
+
if (!query) {
|
|
22
|
+
return { open: true, query, items: all };
|
|
23
|
+
}
|
|
24
|
+
const prefix = [];
|
|
25
|
+
const contains = [];
|
|
26
|
+
for (const command of all) {
|
|
27
|
+
if (command.name.startsWith(query)) {
|
|
28
|
+
prefix.push(command);
|
|
29
|
+
}
|
|
30
|
+
else if (command.name.includes(query)) {
|
|
31
|
+
contains.push(command);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { open: true, query, items: [...prefix, ...contains] };
|
|
35
|
+
}
|
|
36
|
+
/** Move a menu selection by delta with wrap-around. */
|
|
37
|
+
export function moveSelection(index, delta, count) {
|
|
38
|
+
if (count <= 0) {
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
return ((index + delta) % count + count) % count;
|
|
42
|
+
}
|
|
43
|
+
/** Clamp a selection index into the valid range. */
|
|
44
|
+
export function clampSelection(index, count) {
|
|
45
|
+
if (count <= 0) {
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
if (index < 0) {
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
if (index >= count) {
|
|
52
|
+
return count - 1;
|
|
53
|
+
}
|
|
54
|
+
return index;
|
|
55
|
+
}
|
|
56
|
+
/** A command needs a typed argument when its usage shows a required `<...>`. */
|
|
57
|
+
export function commandRequiresArg(command) {
|
|
58
|
+
return Boolean(command.usage && command.usage.includes("<"));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Render the menu as plain lines. Deterministic and ANSI-free when
|
|
62
|
+
* `color` is false (used by tests); color is cosmetic only.
|
|
63
|
+
*/
|
|
64
|
+
export function renderSlashMenu(items, options) {
|
|
65
|
+
if (!items.length) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
const color = options.color ?? false;
|
|
69
|
+
const maxRows = options.maxRows ?? 8;
|
|
70
|
+
const width = options.width && options.width > 0 ? options.width : 80;
|
|
71
|
+
const selected = clampSelection(options.selectedIndex, items.length);
|
|
72
|
+
const visible = windowItems(items, selected, maxRows);
|
|
73
|
+
const nameWidth = Math.max(...visible.entries.map((entry) => entry.command.name.length));
|
|
74
|
+
const lines = visible.entries.map((entry) => {
|
|
75
|
+
const marker = entry.index === selected ? "❯" : " ";
|
|
76
|
+
const name = `/${entry.command.name.padEnd(nameWidth)}`;
|
|
77
|
+
const raw = `${marker} ${name} ${entry.command.description}`;
|
|
78
|
+
const clipped = clip(raw, width);
|
|
79
|
+
if (!color) {
|
|
80
|
+
return clipped;
|
|
81
|
+
}
|
|
82
|
+
if (entry.index === selected) {
|
|
83
|
+
return `${CYAN}${clipped}${RESET}`;
|
|
84
|
+
}
|
|
85
|
+
return `${DIM}${clipped}${RESET}`;
|
|
86
|
+
});
|
|
87
|
+
if (visible.more > 0) {
|
|
88
|
+
const note = ` … ${visible.more} more`;
|
|
89
|
+
lines.push(color ? `${DIM}${note}${RESET}` : note);
|
|
90
|
+
}
|
|
91
|
+
return lines;
|
|
92
|
+
}
|
|
93
|
+
function windowItems(items, selected, maxRows) {
|
|
94
|
+
if (items.length <= maxRows) {
|
|
95
|
+
return {
|
|
96
|
+
entries: items.map((command, index) => ({ command, index })),
|
|
97
|
+
more: 0,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
let start = Math.max(0, selected - Math.floor(maxRows / 2));
|
|
101
|
+
start = Math.min(start, items.length - maxRows);
|
|
102
|
+
const entries = [];
|
|
103
|
+
for (let index = start; index < start + maxRows; index += 1) {
|
|
104
|
+
entries.push({ command: items[index], index });
|
|
105
|
+
}
|
|
106
|
+
return { entries, more: items.length - (start + maxRows) };
|
|
107
|
+
}
|
|
108
|
+
function clip(text, width) {
|
|
109
|
+
if (text.length <= width) {
|
|
110
|
+
return text;
|
|
111
|
+
}
|
|
112
|
+
if (width <= 1) {
|
|
113
|
+
return "…";
|
|
114
|
+
}
|
|
115
|
+
return `${text.slice(0, width - 1)}…`;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=slash-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slash-menu.js","sourceRoot":"","sources":["../../../src/cli/interactive/slash-menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-suggest.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/slash-suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1E,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,eAAe,EAAE,CAcpF;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"slash-suggest.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/slash-suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1E,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,eAAe,EAAE,CAcpF;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAcrE"}
|
|
@@ -16,7 +16,11 @@ export function formatUnknownSlashMessage(inputName) {
|
|
|
16
16
|
const suggestions = suggestSlashCommands(inputName, 3);
|
|
17
17
|
const lines = [`Unknown command: /${inputName.replace(/^\//, "")}`];
|
|
18
18
|
if (suggestions.length) {
|
|
19
|
-
lines.push(
|
|
19
|
+
lines.push("Did you mean:");
|
|
20
|
+
const width = Math.max(...suggestions.map((item) => item.name.length));
|
|
21
|
+
for (const item of suggestions) {
|
|
22
|
+
lines.push(` /${item.name.padEnd(width)} ${item.description}`);
|
|
23
|
+
}
|
|
20
24
|
}
|
|
21
25
|
lines.push(`Type /help to list commands.`);
|
|
22
26
|
return lines;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-suggest.js","sourceRoot":"","sources":["../../../src/cli/interactive/slash-suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwB,MAAM,qBAAqB,CAAA;AAE1E,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,KAAK,GAAG,CAAC;IAC/D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAChE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO;QACP,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;KACxC,CAAC,CAAC;SACA,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;SAClC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;IAElD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,MAAM,WAAW,GAAG,oBAAoB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,CAAC,qBAAqB,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;IAEnE,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"slash-suggest.js","sourceRoot":"","sources":["../../../src/cli/interactive/slash-suggest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type CardRow = {
|
|
2
|
+
label: string;
|
|
3
|
+
value: string;
|
|
4
|
+
};
|
|
5
|
+
export type CardOptions = {
|
|
6
|
+
title: string;
|
|
7
|
+
rows: CardRow[];
|
|
8
|
+
/** Terminal columns. 0 or undefined sizes the card to its content. */
|
|
9
|
+
width?: number;
|
|
10
|
+
color?: boolean;
|
|
11
|
+
minInnerWidth?: number;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Render an aligned, bordered status card. Falls back to plain key/value
|
|
15
|
+
* lines when the terminal is too narrow to draw a readable box.
|
|
16
|
+
*/
|
|
17
|
+
export declare function renderCard(options: CardOptions): string[];
|
|
18
|
+
//# sourceMappingURL=box.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/box.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,OAAO,GAAG;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAmBD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,EAAE,CA4CzD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Lightweight bordered status card. Deterministic with color disabled
|
|
2
|
+
// (NO_COLOR / non-TTY): pure box-drawing characters, no ANSI escapes.
|
|
3
|
+
const BORDER = {
|
|
4
|
+
topLeft: "╭",
|
|
5
|
+
topRight: "╮",
|
|
6
|
+
bottomLeft: "╰",
|
|
7
|
+
bottomRight: "╯",
|
|
8
|
+
horizontal: "─",
|
|
9
|
+
vertical: "│",
|
|
10
|
+
};
|
|
11
|
+
const DIM = "\x1b[2m";
|
|
12
|
+
const RESET = "\x1b[0m";
|
|
13
|
+
function truncate(text, max) {
|
|
14
|
+
if (max <= 0) {
|
|
15
|
+
return "";
|
|
16
|
+
}
|
|
17
|
+
if (text.length <= max) {
|
|
18
|
+
return text;
|
|
19
|
+
}
|
|
20
|
+
if (max === 1) {
|
|
21
|
+
return "…";
|
|
22
|
+
}
|
|
23
|
+
return `${text.slice(0, max - 1)}…`;
|
|
24
|
+
}
|
|
25
|
+
function dim(text, color) {
|
|
26
|
+
return color ? `${DIM}${text}${RESET}` : text;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Render an aligned, bordered status card. Falls back to plain key/value
|
|
30
|
+
* lines when the terminal is too narrow to draw a readable box.
|
|
31
|
+
*/
|
|
32
|
+
export function renderCard(options) {
|
|
33
|
+
const color = options.color ?? false;
|
|
34
|
+
const labelWidth = Math.max(0, ...options.rows.map((row) => row.label.length));
|
|
35
|
+
const rowTexts = options.rows.map((row) => `${row.label.padEnd(labelWidth)} ${row.value}`);
|
|
36
|
+
const naturalInner = Math.max(options.minInnerWidth ?? 0, options.title.length + 2, ...rowTexts.map((text) => text.length));
|
|
37
|
+
const cap = options.width && options.width > 0 ? options.width - 4 : naturalInner;
|
|
38
|
+
const inner = Math.max(1, Math.min(naturalInner, cap));
|
|
39
|
+
// Too narrow for a useful box: degrade to plain aligned rows.
|
|
40
|
+
if (inner < 12) {
|
|
41
|
+
return [options.title, ...rowTexts];
|
|
42
|
+
}
|
|
43
|
+
const title = truncate(options.title, inner - 2);
|
|
44
|
+
const dashCount = inner - title.length - 1;
|
|
45
|
+
const top = dim(`${BORDER.topLeft}${BORDER.horizontal} ${title} ${BORDER.horizontal.repeat(Math.max(1, dashCount))}${BORDER.topRight}`, color);
|
|
46
|
+
const bottom = dim(`${BORDER.bottomLeft}${BORDER.horizontal.repeat(inner + 2)}${BORDER.bottomRight}`, color);
|
|
47
|
+
const body = options.rows.map((row, index) => {
|
|
48
|
+
const cell = truncate(rowTexts[index], inner).padEnd(inner);
|
|
49
|
+
const label = row.label.padEnd(labelWidth);
|
|
50
|
+
const rendered = color
|
|
51
|
+
? `${dim(label, color)}${cell.slice(label.length)}`
|
|
52
|
+
: cell;
|
|
53
|
+
const left = dim(`${BORDER.vertical} `, color);
|
|
54
|
+
const right = dim(` ${BORDER.vertical}`, color);
|
|
55
|
+
return `${left}${rendered}${right}`;
|
|
56
|
+
});
|
|
57
|
+
return [top, ...body, bottom];
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=box.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box.js","sourceRoot":"","sources":["../../../src/cli/ui/box.ts"],"names":[],"mappings":"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"}
|