@patze/code-cli 0.10.3 → 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 +23 -4
- package/README.md +17 -5
- package/VERSION +1 -1
- package/dist/cli/interactive/header.js +1 -1
- 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 -23
- 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/package.json +1 -1
- package/dist/cli/interactive/completer.d.ts +0 -8
- package/dist/cli/interactive/completer.d.ts.map +0 -1
- package/dist/cli/interactive/completer.js +0 -20
- package/dist/cli/interactive/completer.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,19 @@ 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
|
+
|
|
7
20
|
## [0.10.3] - 2026-05-29
|
|
8
21
|
|
|
9
22
|
### Changed (interactive UI polish — no behavior change)
|
|
@@ -17,16 +30,21 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
17
30
|
|
|
18
31
|
### Changed (composer UX — no behavior change)
|
|
19
32
|
|
|
20
|
-
-
|
|
21
|
-
-
|
|
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)
|
|
22
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
|
|
23
39
|
|
|
24
40
|
### Added
|
|
25
41
|
|
|
26
42
|
- `src/cli/ui/box.ts` — reusable bordered card renderer
|
|
27
|
-
- `src/cli/interactive/
|
|
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
|
|
28
45
|
- `tests/header.test.mjs` — startup snapshot, auth warning, permission label, narrow fallback
|
|
29
|
-
- `tests/
|
|
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
|
|
30
48
|
|
|
31
49
|
### Unchanged
|
|
32
50
|
|
|
@@ -115,6 +133,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
115
133
|
|
|
116
134
|
- `patze code inspect`, `patze code plan --preview`, local workspace boundaries
|
|
117
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
|
|
118
137
|
[0.10.3]: https://github.com/patzeagent/patzelife-plugin-agentdiscord/compare/patze-code-cli-v0.10.2...patze-code-cli-v0.10.3
|
|
119
138
|
[0.10.2]: https://github.com/patzeagent/patzelife-plugin-agentdiscord/compare/patze-code-cli-v0.10.1...patze-code-cli-v0.10.2
|
|
120
139
|
[0.10.1]: https://github.com/patzeagent/patzelife-plugin-agentdiscord/compare/patze-code-cli-v0.10.0...patze-code-cli-v0.10.1
|
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ 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
|
|
|
@@ -59,7 +59,7 @@ patze
|
|
|
59
59
|
Running `patze` shows a status card and tips:
|
|
60
60
|
|
|
61
61
|
```text
|
|
62
|
-
╭─ Patze Code · v0.10.
|
|
62
|
+
╭─ Patze Code · v0.10.4 ────────────────────────────────────╮
|
|
63
63
|
│ workspace /mnt/d/pat-test │
|
|
64
64
|
│ auth incomplete │
|
|
65
65
|
│ permission Read-only │
|
|
@@ -73,13 +73,25 @@ Tips
|
|
|
73
73
|
• /inspect scans the workspace (read-only)
|
|
74
74
|
• /plan then /diff previews changes before any write
|
|
75
75
|
• /apply needs typed approval — it never auto-applies
|
|
76
|
-
|
|
76
|
+
Type / for commands · ↑↓ to navigate · Tab/Enter to select
|
|
77
77
|
|
|
78
78
|
›
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
|
|
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.
|
|
83
95
|
|
|
84
96
|
Inside `patze`:
|
|
85
97
|
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.10.
|
|
1
|
+
0.10.4
|
|
@@ -48,7 +48,7 @@ export function renderInteractiveHeader(cwd, permissionMode, options = {}) {
|
|
|
48
48
|
for (const tip of HEADER_TIPS) {
|
|
49
49
|
lines.push(` • ${tip}`);
|
|
50
50
|
}
|
|
51
|
-
const shortcuts = "
|
|
51
|
+
const shortcuts = "Type / for commands · ↑↓ to navigate · Tab/Enter to select";
|
|
52
52
|
lines.push(color ? `${DIM}${shortcuts}${RESET}` : shortcuts);
|
|
53
53
|
return lines;
|
|
54
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../src/cli/interactive/header.ts"],"names":[],"mappings":"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
|
|
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,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,MAAM,GAAG,UAAU,CAAA;AACzB,MAAM,GAAG,GAAG,SAAS,CAAA;AACrB,MAAM,KAAK,GAAG,SAAS,CAAA;AAOvB,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAA;AAC/D,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,GAAW,EACX,cAA+B,EAC/B,UAAyB,EAAE;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,EAAE,CAAA;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,EAAE,CAAA;IAE5C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;IAC9B,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACrD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAClD,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACzC,MAAM,IAAI,GAAG,cAAc,IAAI,WAAW,CAAA;IAC1C,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAA;IAEnD,MAAM,IAAI,GAAG,UAAU,CAAC;QACtB,KAAK,EAAE,iBAAiB,WAAW,EAAE;QACrC,IAAI,EAAE;YACJ,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE;YACxC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,EAAE;YAC5D,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE;YAC1C,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE;SACjE;QACD,KAAK;QACL,KAAK;QACL,aAAa,EAAE,EAAE;KAClB,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAAA;IAE3B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,+DAA+D,CAAA;QAC5E,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACrD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACjD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IACjD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;IAC1B,CAAC;IACD,MAAM,SAAS,GAAG,4DAA4D,CAAA;IAC9E,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAE5D,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,WAAW,GAAsB;IACrC,0CAA0C;IAC1C,oDAAoD;IACpD,qDAAqD;CACtD,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA"}
|
|
@@ -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;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,
|
|
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,7 +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 {
|
|
4
|
+
import { SlashLineEditor } from "./line-editor.js";
|
|
5
5
|
import { InteractiveSession } from "./session.js";
|
|
6
6
|
import { parseSlashInput } from "./slash-parse.js";
|
|
7
7
|
import { dispatchAgentPrompt, dispatchSlashCommand, } from "./slash-dispatch.js";
|
|
@@ -88,30 +88,20 @@ export async function runInteractiveShell(options = {}) {
|
|
|
88
88
|
}
|
|
89
89
|
return { exitCode, lines: buffer.lines };
|
|
90
90
|
}
|
|
91
|
-
const
|
|
92
|
-
input: process.stdin,
|
|
93
|
-
output: process.stdout,
|
|
94
|
-
terminal: true,
|
|
91
|
+
const editor = new SlashLineEditor({
|
|
95
92
|
prompt,
|
|
96
|
-
|
|
97
|
-
});
|
|
98
|
-
rl.prompt();
|
|
99
|
-
await new Promise((resolvePromise) => {
|
|
100
|
-
rl.on("line", (rawLine) => {
|
|
101
|
-
void (async () => {
|
|
102
|
-
const shouldExit = await processLine(rawLine);
|
|
103
|
-
if (shouldExit) {
|
|
104
|
-
rl.close();
|
|
105
|
-
resolvePromise();
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
rl.prompt();
|
|
109
|
-
})();
|
|
110
|
-
});
|
|
111
|
-
rl.on("close", () => {
|
|
112
|
-
resolvePromise();
|
|
113
|
-
});
|
|
93
|
+
color: Boolean(process.stdout.isTTY) && !process.env.NO_COLOR,
|
|
114
94
|
});
|
|
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
|
+
}
|
|
115
105
|
return { exitCode, lines: buffer.lines };
|
|
116
106
|
}
|
|
117
107
|
//# sourceMappingURL=shell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/cli/interactive/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAG/C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,EAAE,
|
|
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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"}
|
package/package.json
CHANGED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export type CompleterResult = [string[], string];
|
|
2
|
-
/**
|
|
3
|
-
* readline completer for the interactive composer. Completes `/command`
|
|
4
|
-
* tokens only; never touches free-text prompts or argument values, so it
|
|
5
|
-
* cannot change parsing or trust-loop behavior. Active on TTY only.
|
|
6
|
-
*/
|
|
7
|
-
export declare function completeSlashInput(line: string): CompleterResult;
|
|
8
|
-
//# sourceMappingURL=completer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"completer.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/completer.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;AAEhD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAehE"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { listDiscoverableSlashCommands } from "./slash-registry.js";
|
|
2
|
-
/**
|
|
3
|
-
* readline completer for the interactive composer. Completes `/command`
|
|
4
|
-
* tokens only; never touches free-text prompts or argument values, so it
|
|
5
|
-
* cannot change parsing or trust-loop behavior. Active on TTY only.
|
|
6
|
-
*/
|
|
7
|
-
export function completeSlashInput(line) {
|
|
8
|
-
// Not a slash command, or already past the command token → no completion.
|
|
9
|
-
if (!line.startsWith("/") || line.includes(" ")) {
|
|
10
|
-
return [[], line];
|
|
11
|
-
}
|
|
12
|
-
const needle = line.slice(1).toLowerCase();
|
|
13
|
-
const names = listDiscoverableSlashCommands().map((command) => `/${command.name}`);
|
|
14
|
-
if (!needle) {
|
|
15
|
-
return [names, line];
|
|
16
|
-
}
|
|
17
|
-
const hits = names.filter((name) => name.slice(1).startsWith(needle));
|
|
18
|
-
return [hits, line];
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=completer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"completer.js","sourceRoot":"","sources":["../../../src/cli/interactive/completer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAA;AAInE;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,0EAA0E;IAC1E,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAC1C,MAAM,KAAK,GAAG,6BAA6B,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAElF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACtB,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;IACrE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACrB,CAAC"}
|