@pentoshi/clai 2.0.38 → 2.0.43

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.
@@ -2,8 +2,19 @@ import chalk from "chalk";
2
2
  import { homedir } from "node:os";
3
3
  import { box } from "./ansi-box.js";
4
4
  import { renderWordmark } from "./wordmark.js";
5
+ /** Terminal width, clamped to a sensible band. */
6
+ function termWidth() {
7
+ return process.stdout.columns ?? 80;
8
+ }
9
+ /** Truncate a string (ANSI-unaware) to fit within `max` visible chars. */
10
+ function truncate(str, max) {
11
+ if (str.length <= max)
12
+ return str;
13
+ return max > 3 ? str.slice(0, max - 1) + "…" : str.slice(0, max);
14
+ }
5
15
  /** Startup intro: wordmark, tagline, and a session-info card. */
6
16
  export function renderIntroCard(opts) {
17
+ const cols = termWidth();
7
18
  const home = homedir();
8
19
  const workdir = opts.workdir.startsWith(home)
9
20
  ? `~${opts.workdir.slice(home.length)}`
@@ -12,21 +23,49 @@ export function renderIntroCard(opts) {
12
23
  parts.push("");
13
24
  parts.push(renderWordmark("CLAI"));
14
25
  parts.push("");
15
- parts.push(` ${chalk.white("AI-powered terminal assistant · ask & agent modes for shell, files & security workflows")}`);
26
+ // Tagline truncate if terminal is very narrow
27
+ const tagline = "AI-powered terminal assistant · ask & agent modes for shell, files & security workflows";
28
+ parts.push(` ${chalk.white(truncate(tagline, cols - 4))}`);
16
29
  parts.push(` ${chalk.green("Welcome to clai")} ${chalk.green.bold(`v${opts.version}`)}${chalk.green("!")} ${chalk.cyan("/help for commands.")}`);
17
30
  parts.push("");
31
+ // Box — clamp minWidth to terminal width (minus box borders + padding = 8 chars)
32
+ const boxMinWidth = Math.min(58, cols - 8);
33
+ // Also truncate long values so they fit in the box
34
+ const maxVal = Math.max(20, cols - 22); // label is ~14 chars + borders ~8
18
35
  parts.push(box([
19
- `${chalk.dim("↳ workdir:")} ${workdir}`,
20
- `${chalk.dim("↳ model:")} ${chalk.cyan(opts.model)}`,
21
- `${chalk.dim("↳ provider:")} ${chalk.green(opts.provider)}`,
36
+ `${chalk.dim("↳ workdir:")} ${truncate(workdir, maxVal)}`,
37
+ `${chalk.dim("↳ model:")} ${chalk.cyan(truncate(opts.model, maxVal))}`,
38
+ `${chalk.dim("↳ provider:")} ${chalk.green(truncate(opts.provider, maxVal))}`,
22
39
  `${chalk.dim("↳ mode:")} ${chalk.yellow(opts.mode)}`,
23
40
  `${chalk.dim("↳ version:")} ${chalk.white(opts.version)}`,
24
- ], { minWidth: 58 }));
41
+ ], { minWidth: Math.max(20, boxMinWidth) }));
25
42
  parts.push("");
43
+ // Mode + permission badges — stack vertically on narrow terminals
26
44
  const permColor = opts.permissions === "allow-all" ? "#16a34a" : "#475569";
27
- const permBanner = chalk.bgHex(permColor).whiteBright.bold(` ${opts.permissions.toUpperCase()} PERMISSION `);
28
- parts.push(` ${chalk.bgHex("#B45309").whiteBright.bold(` ${opts.mode.toUpperCase()} MODE `)} ${permBanner}`);
29
- parts.push(chalk.dim(" ESC abort │ Ctrl+C clears input @ to attach files │ Ctrl+T thinking │ Ctrl+O tool output │ Ctrl+P plan (q to close)"));
45
+ const modeBadge = chalk.bgHex("#B45309").whiteBright.bold(` ${opts.mode.toUpperCase()} MODE `);
46
+ const permBadge = chalk.bgHex(permColor).whiteBright.bold(` ${opts.permissions.toUpperCase()} `);
47
+ const badgeLine = ` ${modeBadge} ${permBadge}`;
48
+ // " AGENT MODE ALLOW-ALL " is ~30 visible chars; safe for most widths
49
+ // But measure it properly: each badge is mode.len+8 + perm.len+4 + gaps
50
+ const badgeVisLen = opts.mode.length + 8 + opts.permissions.length + 4 + 6;
51
+ if (badgeVisLen > cols) {
52
+ // Stack them vertically
53
+ parts.push(` ${modeBadge}`);
54
+ parts.push(` ${permBadge}`);
55
+ }
56
+ else {
57
+ parts.push(badgeLine);
58
+ }
59
+ // Shortcuts — pick a set that fits the terminal width
60
+ const fullShortcuts = "ESC abort │ Ctrl+C clears input │ @ attach files │ Ctrl+T thinking │ Ctrl+O output │ Ctrl+P plan";
61
+ const shortShortcuts = "ESC abort │ Ctrl+C clear │ @ files │ Ctrl+T think │ Ctrl+O out │ Ctrl+P plan";
62
+ const miniShortcuts = "ESC abort │ Ctrl+C clear │ /help";
63
+ const shortcutsText = cols >= 110
64
+ ? fullShortcuts
65
+ : cols >= 80
66
+ ? shortShortcuts
67
+ : miniShortcuts;
68
+ parts.push(chalk.dim(` ${truncate(shortcutsText, cols - 4)}`));
30
69
  return parts.join("\n");
31
70
  }
32
71
  export function renderIntroSuggestions() {
@@ -1 +1 @@
1
- {"version":3,"file":"intro-card.js","sourceRoot":"","sources":["../../src/ui/intro-card.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"intro-card.js","sourceRoot":"","sources":["../../src/ui/intro-card.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pentoshi/clai",
3
- "version": "2.0.38",
3
+ "version": "2.0.43",
4
4
  "description": "A fast, cross-platform AI CLI assistant with ask and agent modes for shell tasks, file operations, and cybersecurity workflows.",
5
5
  "type": "module",
6
6
  "license": "MIT",