@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 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.2.tgz
23
+ npm install -g ./patze-code-cli-0.10.3.tgz
24
24
  patze --version
25
25
  ```
26
26
 
27
- Registry (when published):
27
+ Registry:
28
28
 
29
29
  ```bash
30
30
  npm install -g @patze/code-cli@beta
31
- # or pinned: @patze/code-cli@0.10.2
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.2)
119
+ ## Command status (0.10.3)
83
120
 
84
121
  ### Interactive (`patze` shell)
85
122
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.10.2
1
+ 0.10.4
@@ -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;AAE9C,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkChD"}
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("Patze Code — local terminal coding agent (internal beta)");
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)");
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,OAAO,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACxE,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
+ {"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 declare function renderInteractiveHeader(cwd: string, permissionMode?: PermissionMode): string[];
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;AAUlE,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,MAAM,EAAE,CAkB9F;AAED,eAAO,MAAM,kBAAkB,YAAO,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 { formatCliVersionLine } from "../../version.js";
8
- import { formatSessionPermissionLine } from "./permissions-command.js";
9
- export function renderInteractiveHeader(cwd, permissionMode) {
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 permission = permissionMode
16
- ? formatSessionPermissionLine(permissionMode)
17
- : `${getPermissionModeDef("read-only").label} (read-only)`;
18
- return [
19
- formatCliVersionLine(),
20
- `${"workspace".padEnd(14)} ${workspace}`,
21
- `${"auth".padEnd(14)} ${authReady ? "ready" : "incomplete"}`,
22
- `${"permission".padEnd(14)} ${permission}`,
23
- `${"safety".padEnd(14)} ${approval.mode} · ${sandbox.mode}`,
24
- `${"hint".padEnd(14)} Type a task or /help`,
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,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAA;AAEtE,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAE,cAA+B;IAClF,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,UAAU,GAAG,cAAc;QAC/B,CAAC,CAAC,2BAA2B,CAAC,cAAc,CAAC;QAC7C,CAAC,CAAC,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC,KAAK,cAAc,CAAA;IAE5D,OAAO;QACL,oBAAoB,EAAE;QACtB,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE;QACxC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,EAAE;QAC5D,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE;QAC1C,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,EAAE;QAC3D,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,uBAAuB;KAC5C,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA"}
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;AAWtD,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,CAwHjC"}
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 rl = createInterface({
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
- rl.prompt();
97
- await new Promise((resolvePromise) => {
98
- rl.on("line", (rawLine) => {
99
- void (async () => {
100
- const shouldExit = await processLine(rawLine);
101
- if (shouldExit) {
102
- rl.close();
103
- resolvePromise();
104
- return;
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,CAUrE"}
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(`Did you mean: ${suggestions.map((item) => `/${item.name}`).join(", ")}?`);
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,iBAAiB,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACvF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;IAC1C,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAE,SAAiB;IACnD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAChD,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC7C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,CAAA;QACV,CAAC;QACD,KAAK,IAAI,CAAC,CAAA;QACV,MAAM,GAAG,KAAK,GAAG,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,CAAA;AACnB,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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patze/code-cli",
3
- "version": "0.10.2",
3
+ "version": "0.10.4",
4
4
  "description": "Patze Code — local terminal coding agent client for PatzeAgents",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",