deel-local-cli 1.4.3 → 1.5.2

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/src/ui/status.js CHANGED
@@ -408,7 +408,15 @@ function 급머리말(session) {
408
408
  }));
409
409
  }
410
410
 
411
- export function headerLines(session, found) {
411
+ /**
412
+ * 켤 때 한 번 보여 주는 머리말.
413
+ *
414
+ * @param {boolean} 상자쓰나 입력 상자를 쓰는 화면인가. Shift+Tab · Alt+Enter ·
415
+ * 줄 끝 백틱은 전부 상자 안에서만 도는 것이라(repl.js 의 `if (상자쓰나)`),
416
+ * 줄 화면(`--no-tui`·파이프·CI)에서 이 줄들을 그대로 찍으면 **되지도 않는
417
+ * 조작법을 알려 주는 셈**이 된다. 안 되는 것을 알려 주는 안내는 없느니만 못하다.
418
+ */
419
+ export function headerLines(session, found, 상자쓰나 = true) {
412
420
  const conn = session.conn;
413
421
  const 능력 = [
414
422
  conn.streaming ? c.green(말('head.streaming')) : c.gray(말('head.noStreaming')),
@@ -463,8 +471,11 @@ export function headerLines(session, found) {
463
471
  // 켤 때 한 번은 사람 말로 알려 준다. 상태줄의 `⏵⏵ 자동 승인` 이 무슨
464
472
  // 뜻인지 여기서 한 번 읽고 나면 그 다음부터는 글자만 봐도 안다.
465
473
  `${c.gray(자리(말('head.approve')))}${승인표시(session.mode)} ${c.gray('— ' + 승인고르기(session.mode).한줄)}`,
466
- `${빈자리}${c.gray(말('head.shiftTab'))}${c.gray(말('head.shiftTabHint'))}${c.gray(말('head.tabHint'))}`,
467
474
  ];
475
+ if (상자쓰나) {
476
+ lines.push(`${빈자리}${c.gray(말('head.shiftTab'))}${c.gray(말('head.shiftTabHint'))}${c.gray(말('head.tabHint'))}`);
477
+ lines.push(`${빈자리}${c.gray(말('head.newlineHint'))}`);
478
+ }
468
479
  if (found.skills.length || found.commands.length) {
469
480
  lines.push(`${c.gray(자리(말('head.thisPC')))}${c.white(말('head.skills', { n: found.skills.length }))}${c.gray(' · ')}${c.white(말('head.commands', { n: found.commands.length }))}${c.gray(' · ')}${c.white(말('head.plugins', { n: found.plugins.length }))}`);
470
481
  }
package/src/ui/wrap.js CHANGED
@@ -4,6 +4,39 @@
4
4
  // 여기로 옮긴다 — 입력 상자가 긴 입력을 접을 때 같은 것이 필요하다.
5
5
  import { width } from './ansi.js';
6
6
 
7
+ /*
8
+ * i 자리에서 **눈에 보이는 한 덩이**를 통째로 떼어 온다.
9
+ *
10
+ * 글자를 s[i] 로 한 칸씩 읽으면 UTF-16 코드 단위로 잘린다. 😀 같은 글자는
11
+ * 두 칸을 차지하므로 하필 그 사이에서 줄이 접히면 반쪽짜리 서로게이트가
12
+ * 양쪽 줄에 하나씩 남는다 — 접어쓰기("a😀", 2) 가 ["a\ud83d","\ude00"] 를
13
+ * 내놨다. 화면에는 물음표 두 개로 찍히고, 폭 계산도 그때부터 어긋난다.
14
+ *
15
+ * 그래서 코드 포인트로 읽고, 뒤에 붙는 것들(살색 조절·변형 선택자·결합
16
+ * 부호·ZWJ 로 이어붙인 다음 글자)까지 한 덩이로 본다. 완전한 문자소 분할은
17
+ * 아니지만 — 그건 표가 있어야 한다 — 실제로 깨지던 자리는 이걸로 다 막힌다.
18
+ */
19
+ function 한덩이(s, i) {
20
+ let 끝 = i + String.fromCodePoint(s.codePointAt(i)).length;
21
+ for (;;) {
22
+ if (끝 >= s.length) return s.slice(i, 끝);
23
+ const cp = s.codePointAt(끝);
24
+ // ZWJ 는 다음 글자까지 끌고 온다 (👨‍👩‍👧 같은 이어붙인 그림글자)
25
+ if (cp === 0x200d) {
26
+ const 다음 = 끝 + 1;
27
+ if (다음 >= s.length) return s.slice(i, 끝);
28
+ 끝 = 다음 + String.fromCodePoint(s.codePointAt(다음)).length;
29
+ continue;
30
+ }
31
+ const 딸린것 = (cp >= 0xfe00 && cp <= 0xfe0f) // 변형 선택자
32
+ || (cp >= 0x1f3fb && cp <= 0x1f3ff) // 살색 조절
33
+ || (cp >= 0x0300 && cp <= 0x036f) // 결합 부호
34
+ || cp === 0x20e3; // 키캡
35
+ if (!딸린것) return s.slice(i, 끝);
36
+ 끝 += String.fromCodePoint(cp).length;
37
+ }
38
+ }
39
+
7
40
  /**
8
41
  * 색을 유지하면서 폭에 맞춰 접는다.
9
42
  *
@@ -14,6 +47,17 @@ import { width } from './ansi.js';
14
47
  */
15
48
  export function 접어쓰기(글, 폭) {
16
49
  const s = String(글 ?? '');
50
+ /*
51
+ * 줄바꿈(\n)이 있으면 그 자리에서 반드시 갈라진다.
52
+ *
53
+ * 안 가르고 그냥 폭만 재면, \n 도 그저 글자 하나로 세여서(너비는
54
+ * width() 가 정하는 대로) 다음 글자와 한 '줄'에 같이 담긴다. 입력 상자를
55
+ * 그리는 쪽(inputbox.js 의 그리기())은 여기서 나온 배열 길이를 그대로
56
+ * "화면에 몇 줄 찍었나" 로 믿고 커서를 되짚어 올라가므로, \n 이 숨어
57
+ * 있으면 터미널이 실제로 그린 줄 수와 어긋나 화면이 깨진다. 문단마다
58
+ * 따로 접어서 이 배열이 실제 화면 줄 수와 늘 같게 만든다.
59
+ */
60
+ if (s.includes('\n')) return s.split('\n').flatMap((줄) => 접어쓰기(줄, 폭));
17
61
  if (폭 < 2) return [s];
18
62
  if (width(s) <= 폭) return [s];
19
63
 
@@ -32,6 +76,7 @@ export function 접어쓰기(글, 폭) {
32
76
  let 지금 = '';
33
77
  let w = 0;
34
78
  let 색 = ''; // 지금 켜져 있는 SGR
79
+
35
80
  for (let i = 0; i < s.length;) {
36
81
  // 색 코드는 통째로 옮긴다. 폭에는 안 센다.
37
82
  if (s[i] === '\x1b') {
@@ -43,7 +88,7 @@ export function 접어쓰기(글, 폭) {
43
88
  continue;
44
89
  }
45
90
  }
46
- const ch = s[i];
91
+ const ch = 한덩이(s, i);
47
92
  const cw = width(ch);
48
93
  // 첫 줄은 원래 폭, 접힌 줄부터는 들여쓴 만큼 좁아진다.
49
94
  const 한도 = 줄들.length === 0 ? 폭 : 이어폭 + 들여.length;
@@ -54,7 +99,7 @@ export function 접어쓰기(글, 폭) {
54
99
  }
55
100
  지금 += ch;
56
101
  w += cw;
57
- i += 1;
102
+ i += ch.length;
58
103
  }
59
104
  if (지금.trim() !== '' || 줄들.length === 0) 줄들.push(지금 + (색 ? '\x1b[0m' : ''));
60
105
  return 줄들;