deel-local-cli 1.20.10 → 1.20.12

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/screen.js CHANGED
@@ -46,13 +46,39 @@ import { spin } from './spinner.js';
46
46
  */
47
47
  export function 상자쓸까({ tui = null } = {}) {
48
48
  if (tui === false) return false; // deel --no-tui
49
- if (!process.stdout.isTTY) return false; // 파이프·기록·CI
49
+
50
+ /*
51
+ * ── 여기까지가 **그릴 데가 아예 없는** 자리다 ──────────────────────────
52
+ *
53
+ * 앞자리가 터미널이 아니면 커서를 위로 올릴 수가 없다. 제어문자가 글에
54
+ * 그대로 섞여 파이프·기록을 망친다. `--tui` 로도 못 넘는다 — bin/deel.js 의
55
+ * 설명도 「**터미널이면** 무조건」 이라고 적어 두고 있다.
56
+ */
57
+ if (!process.stdout.isTTY) return false; // 파이프·기록
50
58
  if (!process.stdin.isTTY) return false; // 입력이 파이프로 들어옴 (검사·데모)
59
+
60
+ /*
61
+ * ── 아래는 「아마 아닐 것」 인 자리다. `--tui` 는 여기를 넘으라고 있다 ──
62
+ *
63
+ * 이 줄이 없었다. `if (tui === true) return true;` 가 아래 세 가지를 **전부
64
+ * 지난 뒤**에 있었고, 그 바로 다음 줄이 무조건 `return true` 였다. 그러니
65
+ * `--tui` 는 어디에도 안 붙어 있었다 — 켜지는 자리에서는 어차피 켜지고,
66
+ * 안 켜지는 자리에서는 줘도 안 켜졌다.
67
+ *
68
+ * 그런데 이 깃발은 `deel --help` 에도 자동완성에도 「입력 상자를 켠다」
69
+ * (completion.js: force the input box on) 라고 적혀 있다. CI 값이 남아 있는
70
+ * 터미널이나 39칸짜리 창에서 `deel --tui` 를 치면 아무 말 없이 줄 화면이
71
+ * 뜬다. 스위치가 있다고 적어 놓고 선이 안 이어져 있던 것이다.
72
+ *
73
+ * 넘게 두는 것이 맞다. 셋 다 「대개 이럴 것」 이라는 짐작이고, 짐작을
74
+ * 사람이 손으로 뒤집겠다고 한 자리다. 좁은 창에서 테두리가 어긋나 보이는
75
+ * 것은 달라고 해서 준 결과이니 놀랄 일이 아니다.
76
+ */
77
+ if (tui === true) return true;
51
78
  if (process.env.TERM === 'dumb') return false;
52
79
  if (process.env.CI) return false;
53
80
  // 너무 좁으면 상자 안에 남는 자리가 없다. 테두리만 남고 글이 안 보인다.
54
81
  if ((process.stdout.columns ?? 0) < 40) return false;
55
- if (tui === true) return true;
56
82
  return true;
57
83
  }
58
84
 
@@ -100,8 +126,25 @@ export class LineScreen {
100
126
  */
101
127
  #안내() { return this.깊이 ? c.gray(' │').repeat(this.깊이) : ''; }
102
128
 
103
- /** 한 줄. 이미 색이 입혀진 글을 받는다. */
104
- 줄(s = '') { this.임시지움(); say(this.깊이 && s ? this.#안내() + s : s); }
129
+ /**
130
+ * 한 줄. 이미 색이 입혀진 글을 받는다.
131
+ *
132
+ * 하위 작업 구간에서는 **빈 줄과 여러 줄에도** 세로줄을 세운다.
133
+ *
134
+ * 처음에는 `this.깊이 && s` 였다. 그래서 빈 줄에는 안 붙었는데, repl.js 는
135
+ * 도구가 뜰 때마다 `say('')` 를 한 번씩 넣는다 — 세로줄이 도구마다 끊겨
136
+ * 점선이 됐다. 여러 줄짜리 글도 첫 줄에만 붙어서, 하위가 뱉은 나머지 줄이
137
+ * 구간 밖으로 삐져나왔다.
138
+ *
139
+ * 「훑는 것만으로 구간이 잡힌다」 가 이 줄을 그리는 이유다. 끊겨 있으면
140
+ * 그 이유가 사라진다.
141
+ */
142
+ 줄(s = '') {
143
+ this.임시지움();
144
+ if (!this.깊이) return say(s);
145
+ const 안내 = this.#안내();
146
+ say(String(s).split('\n').map((l) => 안내 + l).join('\n'));
147
+ }
105
148
 
106
149
  /** 줄바꿈 없이 이어 붙인다 — 스트리밍으로 오는 답. */
107
150
  붙임(s) { this.임시지움(); process.stdout.write(s); }
@@ -167,6 +210,19 @@ export class LineScreen {
167
210
  * 오히려 그때그때 상태를 알 수 있어 낫다.
168
211
  */
169
212
  입력자리(session) {
213
+ /*
214
+ * 곧 지워질 글부터 걷는다.
215
+ *
216
+ * 이 줄이 없었다. 상자화면 쪽 같은 이름 메서드는 임시지움() 을 먼저
217
+ * 부르는데 여기만 안 불렀다 — 그런데 아래 say('') 는 이 화면의 줄() 이
218
+ * 아니라 ansi.js 의 say 라, 임시글을 걷는 문이 통째로 안 열렸다.
219
+ *
220
+ * 기다림() 은 `\r` 로 커서만 앞으로 보내 놓는다. 그 상태에서 say('') 가
221
+ * 줄바꿈을 내면 커서만 아래로 내려가고 **「생각 중…」 은 화면에 그대로
222
+ * 남는다.** 그 아래 상태줄이 붙으므로, 끝난 일의 문구가 입력칸 위에
223
+ * 붙박인 것처럼 보인다.
224
+ */
225
+ this.임시지움();
170
226
  say('');
171
227
  say(statusLine(session));
172
228
  const w = contextWarning(session);
package/src/ui/working.js CHANGED
@@ -119,7 +119,10 @@ export function 갈래고르기(도구이름) {
119
119
  */
120
120
  export function 문구고르기(갈래, 회차 = 0) {
121
121
  const 목록 = 문구[갈래] ?? 문구.기본;
122
- const i = ((Math.trunc(회차) % 목록.length) + 목록.length) % 목록.length;
122
+ // `|| 0` 은 NaN 막이다. 바로 옆에서 같이 불리는 motion.js 의 그림고르기 는
123
+ // 이걸 하고 있었는데 여기만 안 했다 — 둘이 같은 값을 받는 자리라, 한쪽만
124
+ // undefined 를 돌려주면 그림은 도는데 문구 자리만 빈다.
125
+ const i = (((Math.trunc(회차) || 0) % 목록.length) + 목록.length) % 목록.length;
123
126
  return 목록[i];
124
127
  }
125
128