deel-local-cli 1.1.0 → 1.1.1
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/README.md +86 -2
- package/package.json +2 -2
- package/src/agent/route.js +55 -3
- package/src/backend/http.js +41 -4
- package/src/commands.js +105 -3
- package/src/preview/serve.js +326 -0
- package/src/repl.js +127 -17
- package/src/skills/builtin//352/262/200/354/202/254-/353/250/274/354/240/200/SKILL.md +64 -0
- package/src/skills/builtin//352/271/212/354/235/264/354/236/210/352/262/214-/353/247/214/353/223/244/352/270/260/SKILL.md +78 -0
- package/src/skills/builtin//353/201/235/352/271/214/354/247/200-/355/225/230/352/270/260/SKILL.md +65 -0
- package/src/skills/builtin//354/212/244/354/212/244/353/241/234-/352/262/200/355/206/240/SKILL.md +74 -0
- package/src/skills/builtin//354/260/224/353/237/254/353/263/264/352/270/260/SKILL.md +59 -0
- package/src/skills/builtin//354/260/250/352/267/274/354/260/250/352/267/274-/353/224/224/353/262/204/352/271/205/SKILL.md +73 -0
- package/src/skills/builtin//354/275/224/353/223/234-/354/244/204/354/235/264/352/270/260/SKILL.md +66 -0
- package/src/skills/discover.js +17 -2
- package/src/ui/inputbox.js +5 -2
- package/src/ui/motion.js +212 -0
package/src/ui/motion.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 일하는 중에 도는 작은 그림.
|
|
3
|
+
*
|
|
4
|
+
* ── 왜 넣나 ─────────────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* working.js 에 적어 둔 이유가 그대로 여기에도 해당한다. 로컬 모델은 한 걸음에
|
|
7
|
+
* 수십 초가 걸리고, 그 동안 화면이 조용하면 사람은 멈춘 줄 알고 Ctrl+C 를 누른다.
|
|
8
|
+
*
|
|
9
|
+
* 그런데 이유가 하나 더 있다. **몇 분을 기다리는 화면은 보고 있을 만해야 한다.**
|
|
10
|
+
* 점 하나가 도는 것과 지금 무슨 일을 하는지가 그림으로 보이는 것은 다르다.
|
|
11
|
+
* 파일을 읽는 중이면 훑는 줄이 내려가고, 코드를 짜는 중이면 자판을 두드린다.
|
|
12
|
+
* 재미로 넣은 것이 맞고, 그 재미가 기다리는 시간을 견디게 한다.
|
|
13
|
+
*
|
|
14
|
+
* ── 왜 점자인가 ─────────────────────────────────────────────────────────
|
|
15
|
+
*
|
|
16
|
+
* 상자 안에 들어가야 하므로 폭이 정확해야 한다. 이모지는 터미널마다 한 칸이
|
|
17
|
+
* 되기도 두 칸이 되기도 해서 테두리가 어긋난다. ● ○ ▪ 같은 기호도 동아시아
|
|
18
|
+
* 로캘에서는 두 칸으로 잡히는 것들이 섞여 있다(East Asian Ambiguous).
|
|
19
|
+
*
|
|
20
|
+
* 점자(U+2800~)는 어디서나 **한 칸**이다. 이 저장소가 이미 점자 돌림표를 쓰는
|
|
21
|
+
* 이유가 그것이고, 같은 이유로 여기서도 점자만 쓴다.
|
|
22
|
+
*
|
|
23
|
+
* 그리고 점자 한 칸은 **가로 2 · 세로 4 점**이다. 세 칸을 붙이면 6×4 격자가
|
|
24
|
+
* 생긴다. 작지만 자판을 두드리는 노트북이 들어간다.
|
|
25
|
+
*
|
|
26
|
+
* ── 어떻게 그리나 ───────────────────────────────────────────────────────
|
|
27
|
+
*
|
|
28
|
+
* 그림을 점자 코드로 직접 적으면 나중에 아무도 못 고친다. 그래서 눈에 보이는
|
|
29
|
+
* 대로 '#' 과 '.' 으로 적고, 켜질 때 한 번 점자로 바꾼다.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
// 점 번호와 자리. 점자는 이렇게 번호가 매겨져 있다 —
|
|
33
|
+
// 1 4
|
|
34
|
+
// 2 5
|
|
35
|
+
// 3 6
|
|
36
|
+
// 7 8
|
|
37
|
+
// 아래 표는 [행][열] → 그 점의 비트값이다.
|
|
38
|
+
const 비트 = [
|
|
39
|
+
[0x01, 0x08],
|
|
40
|
+
[0x02, 0x10],
|
|
41
|
+
[0x04, 0x20],
|
|
42
|
+
[0x40, 0x80],
|
|
43
|
+
];
|
|
44
|
+
|
|
45
|
+
export const 칸수 = 3; // 점자 세 칸
|
|
46
|
+
export const 가로 = 칸수 * 2; // 점 6개
|
|
47
|
+
export const 세로 = 4; // 점 4줄
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 6×4 그림 한 장을 점자 세 글자로. 격자를 벗어난 자리는 꺼진 것으로 본다.
|
|
51
|
+
*
|
|
52
|
+
* @param {string[]} 그림 '#'(켜짐)과 그 밖(꺼짐)으로 그린 4줄
|
|
53
|
+
*/
|
|
54
|
+
export function 점자로(그림) {
|
|
55
|
+
let out = '';
|
|
56
|
+
for (let 칸 = 0; 칸 < 칸수; 칸++) {
|
|
57
|
+
let v = 0;
|
|
58
|
+
for (let r = 0; r < 세로; r++) {
|
|
59
|
+
for (let cc = 0; cc < 2; cc++) {
|
|
60
|
+
if (그림[r]?.[칸 * 2 + cc] === '#') v |= 비트[r][cc];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
out += String.fromCharCode(0x2800 + v);
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
* 갈래별 그림.
|
|
70
|
+
*
|
|
71
|
+
* 한 장이 90ms(inputbox 의 돌림주기)이므로, 장수가 곧 한 바퀴 시간이다.
|
|
72
|
+
* 자판 두드리기는 빨라야 자판 같고, 오래 기다리는 표시는 느려야 조급해 보이지 않는다.
|
|
73
|
+
* 그래서 장수를 갈래마다 다르게 뒀다 — 같은 수로 맞추면 하나는 반드시 어색해진다.
|
|
74
|
+
*/
|
|
75
|
+
export const 그림들 = {
|
|
76
|
+
// 생각 — 부풀었다 줄어드는 덩어리. 무엇을 하는지 모를 때의 '머리 굴리는 중'.
|
|
77
|
+
생각: [
|
|
78
|
+
['......', '..##..', '..##..', '......'],
|
|
79
|
+
['..##..', '.####.', '.####.', '..##..'],
|
|
80
|
+
['.####.', '######', '######', '.####.'],
|
|
81
|
+
['..##..', '.####.', '.####.', '..##..'],
|
|
82
|
+
],
|
|
83
|
+
|
|
84
|
+
// 읽기 — 훑는 줄이 위에서 아래로 내려간다. 스캐너처럼 보이는 것이 목적이다.
|
|
85
|
+
읽기: [
|
|
86
|
+
['######', '......', '......', '......'],
|
|
87
|
+
['......', '######', '......', '......'],
|
|
88
|
+
['......', '......', '######', '......'],
|
|
89
|
+
['......', '......', '......', '######'],
|
|
90
|
+
],
|
|
91
|
+
|
|
92
|
+
/*
|
|
93
|
+
* 쓰기 — 노트북이 자판을 두드린다.
|
|
94
|
+
*
|
|
95
|
+
* .####. 화면 위
|
|
96
|
+
* .#..#. 화면 안 (글이 한 칸씩 찬다)
|
|
97
|
+
* ###### 받침
|
|
98
|
+
* ..#... 눌린 자판이 옮겨 다닌다
|
|
99
|
+
*/
|
|
100
|
+
쓰기: [
|
|
101
|
+
['.####.', '.#..#.', '######', '#.....'],
|
|
102
|
+
['.####.', '.##.#.', '######', '..#...'],
|
|
103
|
+
['.####.', '.####.', '######', '....#.'],
|
|
104
|
+
['.####.', '.#..#.', '######', '..#...'],
|
|
105
|
+
],
|
|
106
|
+
|
|
107
|
+
// 명령 — 프롬프트 뒤로 결과가 한 줄씩 쌓인다.
|
|
108
|
+
명령: [
|
|
109
|
+
['##....', '......', '......', '......'],
|
|
110
|
+
['##.#..', '......', '......', '......'],
|
|
111
|
+
['##.#..', '###...', '......', '......'],
|
|
112
|
+
['##.#..', '###...', '#####.', '......'],
|
|
113
|
+
['##.#..', '###...', '#####.', '##....'],
|
|
114
|
+
],
|
|
115
|
+
|
|
116
|
+
// 답 — 글이 왼쪽 위부터 차오른다. 답을 받아쓰는 중이라는 뜻.
|
|
117
|
+
답: [
|
|
118
|
+
['##....', '......', '......', '......'],
|
|
119
|
+
['####..', '##....', '......', '......'],
|
|
120
|
+
['######', '####..', '##....', '......'],
|
|
121
|
+
['######', '######', '####..', '##....'],
|
|
122
|
+
],
|
|
123
|
+
|
|
124
|
+
// 웹 — 신호 막대가 왼쪽부터 차오른다. 점 하나짜리로 그렸더니 옆 갈래들에
|
|
125
|
+
// 비해 너무 흐렸다. 두 칸짜리 막대로 키웠다.
|
|
126
|
+
웹: [
|
|
127
|
+
['......', '......', '......', '######'],
|
|
128
|
+
['......', '......', '##....', '######'],
|
|
129
|
+
['......', '##....', '####..', '######'],
|
|
130
|
+
['##....', '####..', '######', '######'],
|
|
131
|
+
['......', '##....', '####..', '######'],
|
|
132
|
+
],
|
|
133
|
+
|
|
134
|
+
// 하위 — 셋이 나란히 내려간다. 여럿이 동시에 도는 중이라는 뜻.
|
|
135
|
+
하위: [
|
|
136
|
+
['#.#.#.', '......', '......', '......'],
|
|
137
|
+
['......', '#.#.#.', '......', '......'],
|
|
138
|
+
['......', '......', '#.#.#.', '......'],
|
|
139
|
+
['......', '......', '......', '#.#.#.'],
|
|
140
|
+
],
|
|
141
|
+
|
|
142
|
+
// 접기 — 위에서부터 눌려 한 줄로 모인다.
|
|
143
|
+
접기: [
|
|
144
|
+
['######', '######', '######', '######'],
|
|
145
|
+
['......', '######', '######', '######'],
|
|
146
|
+
['......', '......', '######', '######'],
|
|
147
|
+
['......', '......', '......', '######'],
|
|
148
|
+
],
|
|
149
|
+
|
|
150
|
+
// 기본 — 무슨 일인지 아직 모를 때. 한쪽으로 지나가는 덩어리.
|
|
151
|
+
// 점 하나로 그렸더니 옆 갈래들 옆에서 꺼진 것처럼 보였다. 두 칸으로 키웠다.
|
|
152
|
+
기본: [
|
|
153
|
+
['......', '##....', '##....', '......'],
|
|
154
|
+
['......', '.##...', '.##...', '......'],
|
|
155
|
+
['......', '..##..', '..##..', '......'],
|
|
156
|
+
['......', '...##.', '...##.', '......'],
|
|
157
|
+
['......', '....##', '....##', '......'],
|
|
158
|
+
],
|
|
159
|
+
|
|
160
|
+
/*
|
|
161
|
+
* 느긋 — 오래 걸릴 때. 왕복한다.
|
|
162
|
+
*
|
|
163
|
+
* 한쪽으로만 지나가는 것과 왔다 갔다 하는 것은 느낌이 다르다. 앞의 것은
|
|
164
|
+
* '진행 중' 으로 읽히고, 뒤의 것은 '기다리는 중' 으로 읽힌다. 45초가 넘은
|
|
165
|
+
* 자리에서 진행 중인 척하면 곧 끝날 것처럼 보여서 오히려 답답해진다.
|
|
166
|
+
* 열 장이라 한 바퀴가 0.9초 — 다른 것들보다 느긋하다.
|
|
167
|
+
*/
|
|
168
|
+
느긋: [
|
|
169
|
+
['......', '##....', '##....', '......'],
|
|
170
|
+
['......', '.##...', '.##...', '......'],
|
|
171
|
+
['......', '..##..', '..##..', '......'],
|
|
172
|
+
['......', '...##.', '...##.', '......'],
|
|
173
|
+
['......', '....##', '....##', '......'],
|
|
174
|
+
['......', '...##.', '...##.', '......'],
|
|
175
|
+
['......', '..##..', '..##..', '......'],
|
|
176
|
+
['......', '.##...', '.##...', '......'],
|
|
177
|
+
],
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
// 켜질 때 한 번만 바꾼다. 90ms 마다 다시 만들 이유가 없다.
|
|
181
|
+
export const 틀 = Object.fromEntries(
|
|
182
|
+
Object.entries(그림들).map(([갈래, 장들]) => [갈래, 장들.map(점자로)]),
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
/*
|
|
186
|
+
* 그림을 끄고 싶을 때.
|
|
187
|
+
*
|
|
188
|
+
* 점자가 안 나오는 터미널·화면 읽기 프로그램·화면을 그대로 캡처해 붙여야 하는
|
|
189
|
+
* 자리가 있다. 그럴 때 DEEL_NO_MOTION=1 이면 예전처럼 한 칸짜리 돌림표만 돈다.
|
|
190
|
+
* 아예 못 끄게 해 두면 그런 사람은 도구를 못 쓴다.
|
|
191
|
+
*/
|
|
192
|
+
export const 끔 = () => !!process.env.DEEL_NO_MOTION;
|
|
193
|
+
|
|
194
|
+
// 못 끄는 자리에서 쓸 한 칸짜리. working.js 의 돌림틀과 같은 것이다.
|
|
195
|
+
const 한칸 = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* 지금 그릴 그림 한 장.
|
|
199
|
+
*
|
|
200
|
+
* 틱을 받는다. 시각을 안에서 읽으면 검사가 '한 장 뒤' 를 재려고 진짜로
|
|
201
|
+
* 기다려야 한다 — working.js 의 문구고르기와 같은 이유다.
|
|
202
|
+
*
|
|
203
|
+
* @param {string} 갈래 working.js 의 갈래 이름
|
|
204
|
+
* @param {number} 틱 90ms 마다 하나씩 오르는 수
|
|
205
|
+
* @returns {string} 점자 세 글자 (끈 상태면 한 글자)
|
|
206
|
+
*/
|
|
207
|
+
export function 그림고르기(갈래, 틱 = 0) {
|
|
208
|
+
const n = Math.trunc(틱) || 0;
|
|
209
|
+
if (끔()) return 한칸[((n % 한칸.length) + 한칸.length) % 한칸.length];
|
|
210
|
+
const 장들 = 틀[갈래] ?? 틀.기본;
|
|
211
|
+
return 장들[((n % 장들.length) + 장들.length) % 장들.length];
|
|
212
|
+
}
|