zard-cli 1.0.0-beta.84 → 1.1.0-alpha.0

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.
Files changed (207) hide show
  1. package/README.md +60 -60
  2. package/commands/add/component-installer.d.ts +2 -0
  3. package/commands/add/component-installer.d.ts.map +1 -1
  4. package/commands/add/component-installer.js +9 -4
  5. package/commands/add/component-installer.js.map +1 -1
  6. package/commands/add/component-selector.d.ts +6 -0
  7. package/commands/add/component-selector.d.ts.map +1 -1
  8. package/commands/add/component-selector.js +9 -27
  9. package/commands/add/component-selector.js.map +1 -1
  10. package/commands/add/dark-mode-setup.d.ts.map +1 -1
  11. package/commands/add/dark-mode-setup.js +2 -11
  12. package/commands/add/dark-mode-setup.js.map +1 -1
  13. package/commands/add/index.d.ts.map +1 -1
  14. package/commands/add/index.js +106 -86
  15. package/commands/add/index.js.map +1 -1
  16. package/commands/add/wizard.d.ts +31 -0
  17. package/commands/add/wizard.d.ts.map +1 -0
  18. package/commands/add/wizard.js +289 -0
  19. package/commands/add/wizard.js.map +1 -0
  20. package/commands/init/config-prompter.d.ts +47 -3
  21. package/commands/init/config-prompter.d.ts.map +1 -1
  22. package/commands/init/config-prompter.js +76 -74
  23. package/commands/init/config-prompter.js.map +1 -1
  24. package/commands/init/dependencies.d.ts +1 -8
  25. package/commands/init/dependencies.d.ts.map +1 -1
  26. package/commands/init/dependencies.js +35 -17
  27. package/commands/init/dependencies.js.map +1 -1
  28. package/commands/init/index.d.ts.map +1 -1
  29. package/commands/init/index.js +129 -81
  30. package/commands/init/index.js.map +1 -1
  31. package/commands/init/project-kind.d.ts +82 -0
  32. package/commands/init/project-kind.d.ts.map +1 -0
  33. package/commands/init/project-kind.js +166 -0
  34. package/commands/init/project-kind.js.map +1 -0
  35. package/commands/init/steps.d.ts +16 -0
  36. package/commands/init/steps.d.ts.map +1 -0
  37. package/commands/init/steps.js +151 -0
  38. package/commands/init/steps.js.map +1 -0
  39. package/commands/init/tailwind-setup.d.ts +9 -2
  40. package/commands/init/tailwind-setup.d.ts.map +1 -1
  41. package/commands/init/tailwind-setup.js +33 -12
  42. package/commands/init/tailwind-setup.js.map +1 -1
  43. package/commands/init/tsconfig-updater.d.ts +8 -1
  44. package/commands/init/tsconfig-updater.d.ts.map +1 -1
  45. package/commands/init/tsconfig-updater.js +30 -11
  46. package/commands/init/tsconfig-updater.js.map +1 -1
  47. package/commands/init/update-angular-config.d.ts.map +1 -1
  48. package/commands/init/update-angular-config.js +28 -50
  49. package/commands/init/update-angular-config.js.map +1 -1
  50. package/commands/init/vite-setup.d.ts +10 -0
  51. package/commands/init/vite-setup.d.ts.map +1 -0
  52. package/commands/init/vite-setup.js +60 -0
  53. package/commands/init/vite-setup.js.map +1 -0
  54. package/commands/init/wizard.d.ts +30 -0
  55. package/commands/init/wizard.d.ts.map +1 -0
  56. package/commands/init/wizard.js +560 -0
  57. package/commands/init/wizard.js.map +1 -0
  58. package/core/registry/registry-data.d.ts.map +1 -1
  59. package/core/registry/registry-data.js +8 -45
  60. package/core/registry/registry-data.js.map +1 -1
  61. package/index.js +5 -3
  62. package/index.js.map +1 -1
  63. package/package.json +58 -61
  64. package/ui/blocks.d.ts +70 -0
  65. package/ui/blocks.d.ts.map +1 -0
  66. package/ui/blocks.js +116 -0
  67. package/ui/blocks.js.map +1 -0
  68. package/ui/brand.d.ts +14 -0
  69. package/ui/brand.d.ts.map +1 -0
  70. package/ui/brand.js +35 -0
  71. package/ui/brand.js.map +1 -0
  72. package/ui/engine/animation/index.d.ts +39 -0
  73. package/ui/engine/animation/index.d.ts.map +1 -0
  74. package/ui/engine/animation/index.js +103 -0
  75. package/ui/engine/animation/index.js.map +1 -0
  76. package/ui/engine/ansi/index.d.ts +52 -0
  77. package/ui/engine/ansi/index.d.ts.map +1 -0
  78. package/ui/engine/ansi/index.js +117 -0
  79. package/ui/engine/ansi/index.js.map +1 -0
  80. package/ui/engine/components/index.d.ts +211 -0
  81. package/ui/engine/components/index.d.ts.map +1 -0
  82. package/ui/engine/components/index.js +109 -0
  83. package/ui/engine/components/index.js.map +1 -0
  84. package/ui/engine/cursor/index.d.ts +17 -0
  85. package/ui/engine/cursor/index.d.ts.map +1 -0
  86. package/ui/engine/cursor/index.js +41 -0
  87. package/ui/engine/cursor/index.js.map +1 -0
  88. package/ui/engine/diff/index.d.ts +27 -0
  89. package/ui/engine/diff/index.d.ts.map +1 -0
  90. package/ui/engine/diff/index.js +57 -0
  91. package/ui/engine/diff/index.js.map +1 -0
  92. package/ui/engine/events/index.d.ts +24 -0
  93. package/ui/engine/events/index.d.ts.map +1 -0
  94. package/ui/engine/events/index.js +60 -0
  95. package/ui/engine/events/index.js.map +1 -0
  96. package/ui/engine/focus/index.d.ts +25 -0
  97. package/ui/engine/focus/index.d.ts.map +1 -0
  98. package/ui/engine/focus/index.js +77 -0
  99. package/ui/engine/focus/index.js.map +1 -0
  100. package/ui/engine/frame/index.d.ts +48 -0
  101. package/ui/engine/frame/index.d.ts.map +1 -0
  102. package/ui/engine/frame/index.js +0 -0
  103. package/ui/engine/frame/index.js.map +1 -0
  104. package/ui/engine/index.d.ts +28 -0
  105. package/ui/engine/index.d.ts.map +1 -0
  106. package/ui/engine/index.js +28 -0
  107. package/ui/engine/index.js.map +1 -0
  108. package/ui/engine/input/index.d.ts +36 -0
  109. package/ui/engine/input/index.d.ts.map +1 -0
  110. package/ui/engine/input/index.js +224 -0
  111. package/ui/engine/input/index.js.map +1 -0
  112. package/ui/engine/layout/index.d.ts +42 -0
  113. package/ui/engine/layout/index.d.ts.map +1 -0
  114. package/ui/engine/layout/index.js +241 -0
  115. package/ui/engine/layout/index.js.map +1 -0
  116. package/ui/engine/renderer/index.d.ts +43 -0
  117. package/ui/engine/renderer/index.d.ts.map +1 -0
  118. package/ui/engine/renderer/index.js +619 -0
  119. package/ui/engine/renderer/index.js.map +1 -0
  120. package/ui/engine/scheduler/index.d.ts +22 -0
  121. package/ui/engine/scheduler/index.d.ts.map +1 -0
  122. package/ui/engine/scheduler/index.js +77 -0
  123. package/ui/engine/scheduler/index.js.map +1 -0
  124. package/ui/engine/screen/index.d.ts +39 -0
  125. package/ui/engine/screen/index.d.ts.map +1 -0
  126. package/ui/engine/screen/index.js +255 -0
  127. package/ui/engine/screen/index.js.map +1 -0
  128. package/ui/engine/terminal/index.d.ts +38 -0
  129. package/ui/engine/terminal/index.d.ts.map +1 -0
  130. package/ui/engine/terminal/index.js +104 -0
  131. package/ui/engine/terminal/index.js.map +1 -0
  132. package/ui/engine/testing/index.d.ts +27 -0
  133. package/ui/engine/testing/index.d.ts.map +1 -0
  134. package/ui/engine/testing/index.js +63 -0
  135. package/ui/engine/testing/index.js.map +1 -0
  136. package/ui/engine/theme/index.d.ts +27 -0
  137. package/ui/engine/theme/index.d.ts.map +1 -0
  138. package/ui/engine/theme/index.js +129 -0
  139. package/ui/engine/theme/index.js.map +1 -0
  140. package/ui/engine/utils/index.d.ts +12 -0
  141. package/ui/engine/utils/index.d.ts.map +1 -0
  142. package/ui/engine/utils/index.js +143 -0
  143. package/ui/engine/utils/index.js.map +1 -0
  144. package/ui/gate.d.ts +19 -0
  145. package/ui/gate.d.ts.map +1 -0
  146. package/ui/gate.js +36 -0
  147. package/ui/gate.js.map +1 -0
  148. package/ui/index.d.ts +18 -0
  149. package/ui/index.d.ts.map +1 -0
  150. package/ui/index.js +18 -0
  151. package/ui/index.js.map +1 -0
  152. package/ui/log-sink.d.ts +24 -0
  153. package/ui/log-sink.d.ts.map +1 -0
  154. package/ui/log-sink.js +35 -0
  155. package/ui/log-sink.js.map +1 -0
  156. package/ui/output.d.ts +14 -0
  157. package/ui/output.d.ts.map +1 -0
  158. package/ui/output.js +28 -0
  159. package/ui/output.js.map +1 -0
  160. package/ui/report.d.ts +30 -0
  161. package/ui/report.d.ts.map +1 -0
  162. package/ui/report.js +45 -0
  163. package/ui/report.js.map +1 -0
  164. package/ui/runner.d.ts +57 -0
  165. package/ui/runner.d.ts.map +1 -0
  166. package/ui/runner.js +119 -0
  167. package/ui/runner.js.map +1 -0
  168. package/ui/style.d.ts +24 -0
  169. package/ui/style.d.ts.map +1 -0
  170. package/ui/style.js +44 -0
  171. package/ui/style.js.map +1 -0
  172. package/ui/testing/fake-tty.d.ts +26 -0
  173. package/ui/testing/fake-tty.d.ts.map +1 -0
  174. package/ui/testing/fake-tty.js +61 -0
  175. package/ui/testing/fake-tty.js.map +1 -0
  176. package/ui/text-input.d.ts +30 -0
  177. package/ui/text-input.d.ts.map +1 -0
  178. package/ui/text-input.js +87 -0
  179. package/ui/text-input.js.map +1 -0
  180. package/ui/theme.d.ts +10 -0
  181. package/ui/theme.d.ts.map +1 -0
  182. package/ui/theme.js +20 -0
  183. package/ui/theme.js.map +1 -0
  184. package/utils/config.d.ts +22 -0
  185. package/utils/config.d.ts.map +1 -1
  186. package/utils/config.js +26 -1
  187. package/utils/config.js.map +1 -1
  188. package/utils/get-project-info.d.ts +29 -0
  189. package/utils/get-project-info.d.ts.map +1 -1
  190. package/utils/get-project-info.js +176 -1
  191. package/utils/get-project-info.js.map +1 -1
  192. package/utils/logger.d.ts +13 -1
  193. package/utils/logger.d.ts.map +1 -1
  194. package/utils/logger.js +95 -15
  195. package/utils/logger.js.map +1 -1
  196. package/utils/package-manager.d.ts +42 -1
  197. package/utils/package-manager.d.ts.map +1 -1
  198. package/utils/package-manager.js +204 -11
  199. package/utils/package-manager.js.map +1 -1
  200. package/utils/registry.d.ts +12 -2
  201. package/utils/registry.d.ts.map +1 -1
  202. package/utils/registry.js +21 -6
  203. package/utils/registry.js.map +1 -1
  204. package/utils/source-file.d.ts +40 -0
  205. package/utils/source-file.d.ts.map +1 -0
  206. package/utils/source-file.js +104 -0
  207. package/utils/source-file.js.map +1 -0
@@ -0,0 +1,104 @@
1
+ /**
2
+ * terminal — ÚNICA fronteira de I/O de baixo nível (ADR-0007). Ninguém mais
3
+ * toca process.stdout/stdin. Detecta capacidades e faz raw mode/alt-screen.
4
+ * (Fatia vertical / PoC: implementação real mínima.)
5
+ */
6
+ import { csi } from '../ansi/index.js';
7
+ function detectColor(out, force) {
8
+ if (force)
9
+ return force;
10
+ const env = process.env;
11
+ if (env['NO_COLOR'] !== undefined)
12
+ return 'none';
13
+ if (!out.isTTY)
14
+ return 'none';
15
+ const ct = (env['COLORTERM'] ?? '').toLowerCase();
16
+ if (ct.includes('truecolor') || ct.includes('24bit'))
17
+ return 'truecolor';
18
+ const term = (env['TERM'] ?? '').toLowerCase();
19
+ if (term.includes('256'))
20
+ return 'ansi256';
21
+ return 'ansi16';
22
+ }
23
+ export function createTerminal(options = {}) {
24
+ const out = options.stdout ?? process.stdout;
25
+ const inp = options.stdin ?? process.stdin;
26
+ const caps = {
27
+ colors: detectColor(out, options.forceColor),
28
+ unicode: (process.env['TERM'] ?? '') !== 'dumb',
29
+ mouse: Boolean(out.isTTY),
30
+ synchronizedOutput: Boolean(out.isTTY),
31
+ isTTY: Boolean(out.isTTY),
32
+ };
33
+ let rawOn = false;
34
+ let altOn = false;
35
+ return {
36
+ caps,
37
+ size() {
38
+ return { cols: out.columns ?? 80, rows: out.rows ?? 24 };
39
+ },
40
+ write(bytes) {
41
+ out.write(bytes);
42
+ },
43
+ writeError(bytes) {
44
+ process.stderr.write(bytes);
45
+ },
46
+ enterRawMode() {
47
+ if (inp.isTTY && !rawOn) {
48
+ inp.setRawMode(true);
49
+ inp.resume();
50
+ rawOn = true;
51
+ }
52
+ },
53
+ exitRawMode() {
54
+ if (inp.isTTY && rawOn) {
55
+ inp.setRawMode(false);
56
+ // O `resume()` de enterRawMode segura uma referência viva no event
57
+ // loop. Sem devolver o stdin ao estado pausado, o processo continua
58
+ // rodando depois que o wizard termina: a tela cai, o resumo aparece e
59
+ // o shell nunca volta — parece que o enter final não fez nada.
60
+ inp.pause();
61
+ rawOn = false;
62
+ }
63
+ },
64
+ enterAltScreen() {
65
+ if (!altOn) {
66
+ out.write(csi('?1049h'));
67
+ altOn = true;
68
+ }
69
+ },
70
+ exitAltScreen() {
71
+ if (altOn) {
72
+ out.write(csi('?1049l'));
73
+ altOn = false;
74
+ }
75
+ },
76
+ showCursor(visible) {
77
+ out.write(csi(visible ? '?25h' : '?25l'));
78
+ },
79
+ enableMouse(enabled) {
80
+ out.write(csi(enabled ? '?1000;1006h' : '?1000;1006l'));
81
+ },
82
+ onResize(cb) {
83
+ const handler = () => cb({ cols: out.columns ?? 80, rows: out.rows ?? 24 });
84
+ out.on('resize', handler);
85
+ return { dispose: () => out.off('resize', handler) };
86
+ },
87
+ onData(cb) {
88
+ inp.on('data', cb);
89
+ return { dispose: () => inp.off('data', cb) };
90
+ },
91
+ restore() {
92
+ // O reset de atributos vem primeiro, e antes de sair do alt-screen: o
93
+ // último frame quase sempre termina no meio de uma cor, e sem zerar o SGR
94
+ // esse atributo continua valendo no buffer principal — o shell do usuário
95
+ // fica escrevendo colorido depois que a CLI já saiu.
96
+ out.write('\x1b[0m');
97
+ this.showCursor(true);
98
+ this.enableMouse(false);
99
+ this.exitAltScreen();
100
+ this.exitRawMode();
101
+ },
102
+ };
103
+ }
104
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/terminal/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * testing — utilitários para teste/PoC. Um Terminal em memória que captura
3
+ * writes de forma determinística (sem TTY) para snapshots e asserções de bytes.
4
+ */
5
+ import type { ColorLevel } from '../ansi/index.js';
6
+ import type { Size } from '../frame/index.js';
7
+ import type { Terminal } from '../terminal/index.js';
8
+ export interface MockTerminal extends Terminal {
9
+ /** Todos os chunks escritos, na ordem. */
10
+ readonly writes: readonly string[];
11
+ /** Último chunk escrito (o patch do frame). */
12
+ readonly lastWrite: string;
13
+ /** Concatenação de tudo. */
14
+ output(): string;
15
+ reset(): void;
16
+ /** Injeta bytes no stdin simulado (dispara onData). */
17
+ feed(bytes: string | Buffer): void;
18
+ /** Simula um SIGWINCH com novo tamanho. */
19
+ emitResize(size: Size): void;
20
+ }
21
+ export interface MockTerminalOptions {
22
+ readonly size?: Size;
23
+ readonly colors?: ColorLevel;
24
+ readonly synchronizedOutput?: boolean;
25
+ }
26
+ export declare function createMockTerminal(options?: MockTerminalOptions): MockTerminal;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/engine/testing/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAwB,MAAM,sBAAsB,CAAC;AAE3E,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4BAA4B;IAC5B,MAAM,IAAI,MAAM,CAAC;IACjB,KAAK,IAAI,IAAI,CAAC;IACd,uDAAuD;IACvD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,2CAA2C;IAC3C,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAwDlF"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * testing — utilitários para teste/PoC. Um Terminal em memória que captura
3
+ * writes de forma determinística (sem TTY) para snapshots e asserções de bytes.
4
+ */
5
+ export function createMockTerminal(options = {}) {
6
+ let size = options.size ?? { cols: 80, rows: 24 };
7
+ const writes = [];
8
+ const dataCbs = new Set();
9
+ const resizeCbs = new Set();
10
+ const caps = {
11
+ colors: options.colors ?? 'truecolor',
12
+ unicode: true,
13
+ mouse: true,
14
+ synchronizedOutput: options.synchronizedOutput ?? true,
15
+ isTTY: true,
16
+ };
17
+ return {
18
+ caps,
19
+ writes,
20
+ get lastWrite() {
21
+ return writes[writes.length - 1] ?? '';
22
+ },
23
+ output() {
24
+ return writes.join('');
25
+ },
26
+ reset() {
27
+ writes.length = 0;
28
+ },
29
+ feed(bytes) {
30
+ const buf = typeof bytes === 'string' ? Buffer.from(bytes, 'utf8') : bytes;
31
+ for (const cb of [...dataCbs])
32
+ cb(buf);
33
+ },
34
+ emitResize(next) {
35
+ size = next;
36
+ for (const cb of [...resizeCbs])
37
+ cb(next);
38
+ },
39
+ size() {
40
+ return size;
41
+ },
42
+ write(bytes) {
43
+ writes.push(bytes);
44
+ },
45
+ writeError() { },
46
+ enterRawMode() { },
47
+ exitRawMode() { },
48
+ enterAltScreen() { },
49
+ exitAltScreen() { },
50
+ showCursor() { },
51
+ enableMouse() { },
52
+ onResize(cb) {
53
+ resizeCbs.add(cb);
54
+ return { dispose: () => resizeCbs.delete(cb) };
55
+ },
56
+ onData(cb) {
57
+ dataCbs.add(cb);
58
+ return { dispose: () => dataCbs.delete(cb) };
59
+ },
60
+ restore() { },
61
+ };
62
+ }
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/testing/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0BH,MAAM,UAAU,kBAAkB,CAAC,UAA+B,EAAE;IAClE,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAClD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC/C,MAAM,IAAI,GAAyB;QACjC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,WAAW;QACrC,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI;QACX,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,IAAI;QACtD,KAAK,EAAE,IAAI;KACZ,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,MAAM;QACN,IAAI,SAAS;YACX,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC;QACD,MAAM;YACJ,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,KAAK;YACH,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,KAAK;YACR,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3E,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC;gBAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,UAAU,CAAC,IAAI;YACb,IAAI,GAAG,IAAI,CAAC;YACZ,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC;gBAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,UAAU,KAAI,CAAC;QACf,YAAY,KAAI,CAAC;QACjB,WAAW,KAAI,CAAC;QAChB,cAAc,KAAI,CAAC;QACnB,aAAa,KAAI,CAAC;QAClB,UAAU,KAAI,CAAC;QACf,WAAW,KAAI,CAAC;QAChB,QAAQ,CAAC,EAAE;YACT,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACjD,CAAC;QACD,MAAM,CAAC,EAAE;YACP,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,KAAI,CAAC;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * theme — tokens semânticos de cor e resolução/downsampling para a
3
+ * capacidade do terminal. Temas são imutáveis; `extend` cria derivados.
4
+ * (Fatia vertical / PoC: implementação real.)
5
+ */
6
+ import type { AnsiColor, ColorLevel } from '../ansi/index.js';
7
+ import type { ColorRef } from '../frame/index.js';
8
+ export type Color = string;
9
+ export interface ThemeTokens {
10
+ primary: Color;
11
+ secondary: Color;
12
+ success: Color;
13
+ warning: Color;
14
+ danger: Color;
15
+ muted: Color;
16
+ foreground: Color;
17
+ background: Color;
18
+ border: Color;
19
+ }
20
+ export interface Theme {
21
+ readonly tokens: ThemeTokens;
22
+ resolve(ref: ColorRef | undefined, level: ColorLevel): AnsiColor;
23
+ extend(partial: Partial<ThemeTokens>): Theme;
24
+ }
25
+ export declare function createTheme(tokens?: Partial<ThemeTokens>): Theme;
26
+ export declare const defaultTheme: Theme;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/engine/theme/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAE3B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,KAAK,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,KAAK,CAAC;IAClB,UAAU,EAAE,KAAK,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IACjE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;CAC9C;AA0HD,wBAAgB,WAAW,CAAC,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,KAAK,CAEpE;AAED,eAAO,MAAM,YAAY,EAAE,KAAiC,CAAC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * theme — tokens semânticos de cor e resolução/downsampling para a
3
+ * capacidade do terminal. Temas são imutáveis; `extend` cria derivados.
4
+ * (Fatia vertical / PoC: implementação real.)
5
+ */
6
+ const DEFAULT_TOKENS = {
7
+ primary: '#7c93ff',
8
+ secondary: '#a78bfa',
9
+ success: '#4ade80',
10
+ warning: '#fbbf24',
11
+ danger: '#f87171',
12
+ muted: '#8b93a7',
13
+ foreground: '#e6e9f0',
14
+ background: '#0b0d12',
15
+ border: '#2b3040',
16
+ };
17
+ const NAMED = {
18
+ black: [0, 0, 0],
19
+ red: [205, 49, 49],
20
+ green: [13, 188, 121],
21
+ yellow: [229, 229, 16],
22
+ blue: [36, 114, 200],
23
+ magenta: [188, 63, 188],
24
+ cyan: [17, 168, 205],
25
+ white: [229, 229, 229],
26
+ };
27
+ function parseColor(c) {
28
+ const s = c.trim().toLowerCase();
29
+ const named = NAMED[s];
30
+ if (named)
31
+ return named;
32
+ const hex = s.startsWith('#') ? s.slice(1) : null;
33
+ if (hex && (hex.length === 3 || hex.length === 6)) {
34
+ const full = hex.length === 3
35
+ ? hex
36
+ .split('')
37
+ .map(ch => ch + ch)
38
+ .join('')
39
+ : hex;
40
+ const r = parseInt(full.slice(0, 2), 16);
41
+ const g = parseInt(full.slice(2, 4), 16);
42
+ const b = parseInt(full.slice(4, 6), 16);
43
+ if ([r, g, b].every(n => !Number.isNaN(n)))
44
+ return [r, g, b];
45
+ }
46
+ const m = s.match(/rgb\(\s*(\d+)[ ,]+(\d+)[ ,]+(\d+)\s*\)/);
47
+ if (m)
48
+ return [Number(m[1]), Number(m[2]), Number(m[3])];
49
+ return null;
50
+ }
51
+ // RGB → índice do cubo 6x6x6 + rampa de cinza do ANSI-256.
52
+ function toAnsi256(r, g, b) {
53
+ if (r === g && g === b) {
54
+ if (r < 8)
55
+ return 16;
56
+ if (r > 248)
57
+ return 231;
58
+ return Math.round(((r - 8) / 247) * 24) + 232;
59
+ }
60
+ const q = (v) => (v < 48 ? 0 : v < 115 ? 1 : Math.round((v - 35) / 40));
61
+ return 16 + 36 * q(r) + 6 * q(g) + q(b);
62
+ }
63
+ const ANSI16 = [
64
+ [0, 0, 0],
65
+ [205, 49, 49],
66
+ [13, 188, 121],
67
+ [229, 229, 16],
68
+ [36, 114, 200],
69
+ [188, 63, 188],
70
+ [17, 168, 205],
71
+ [229, 229, 229],
72
+ [102, 102, 102],
73
+ [241, 76, 76],
74
+ [35, 209, 139],
75
+ [245, 245, 67],
76
+ [59, 142, 234],
77
+ [214, 112, 214],
78
+ [41, 184, 219],
79
+ [255, 255, 255],
80
+ ];
81
+ function toAnsi16(r, g, b) {
82
+ let best = 0;
83
+ let bestD = Infinity;
84
+ for (let i = 0; i < ANSI16.length; i++) {
85
+ const c = ANSI16[i];
86
+ const d = (r - c[0]) ** 2 + (g - c[1]) ** 2 + (b - c[2]) ** 2;
87
+ if (d < bestD) {
88
+ bestD = d;
89
+ best = i;
90
+ }
91
+ }
92
+ return best;
93
+ }
94
+ function makeTheme(tokens) {
95
+ const cache = new Map();
96
+ const resolve = (ref, level) => {
97
+ if (ref === undefined || level === 'none')
98
+ return { kind: 'default' };
99
+ const key = ref + '@' + level;
100
+ const hit = cache.get(key);
101
+ if (hit)
102
+ return hit;
103
+ const raw = tokens[ref] ?? ref;
104
+ const rgb = parseColor(raw);
105
+ let out;
106
+ if (!rgb)
107
+ out = { kind: 'default' };
108
+ else if (level === 'truecolor')
109
+ out = { kind: 'rgb', r: rgb[0], g: rgb[1], b: rgb[2] };
110
+ else if (level === 'ansi256')
111
+ out = { kind: 'ansi256', index: toAnsi256(rgb[0], rgb[1], rgb[2]) };
112
+ else
113
+ out = { kind: 'ansi16', index: toAnsi16(rgb[0], rgb[1], rgb[2]) };
114
+ cache.set(key, out);
115
+ return out;
116
+ };
117
+ return {
118
+ tokens,
119
+ resolve,
120
+ extend(partial) {
121
+ return makeTheme({ ...tokens, ...partial });
122
+ },
123
+ };
124
+ }
125
+ export function createTheme(tokens = {}) {
126
+ return makeTheme({ ...DEFAULT_TOKENS, ...tokens });
127
+ }
128
+ export const defaultTheme = makeTheme(DEFAULT_TOKENS);
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/theme/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * utils — helpers puros de string/Unicode. Sem I/O, sem dependências.
3
+ * (Fatia vertical / PoC: implementação real, suficiente para ASCII + wide + emoji.)
4
+ */
5
+ export declare function graphemes(text: string): string[];
6
+ export declare function charWidth(grapheme: string): 0 | 1 | 2;
7
+ export declare function stringWidth(text: string): number;
8
+ export declare function wrapText(text: string, width: number): string[];
9
+ export declare function truncate(text: string, width: number, ellipsis?: string): string;
10
+ export declare function sliceByWidth(text: string, start: number, end: number): string;
11
+ export declare function stripAnsi(text: string): string;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/engine/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOhD;AAqCD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAOrD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsC9D;AAOD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAa5E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAU7E;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * utils — helpers puros de string/Unicode. Sem I/O, sem dependências.
3
+ * (Fatia vertical / PoC: implementação real, suficiente para ASCII + wide + emoji.)
4
+ */
5
+ const SEG = typeof Intl.Segmenter === 'function'
6
+ ? new Intl.Segmenter('en', { granularity: 'grapheme' })
7
+ : null;
8
+ export function graphemes(text) {
9
+ if (SEG) {
10
+ const out = [];
11
+ for (const s of SEG.segment(text))
12
+ out.push(s.segment);
13
+ return out;
14
+ }
15
+ return Array.from(text);
16
+ }
17
+ /** true se o code point ocupa 2 colunas (East Asian Wide/Fullwidth, emoji). */
18
+ function isWide(cp) {
19
+ return ((cp >= 0x1100 && cp <= 0x115f) || // Hangul Jamo
20
+ cp === 0x2329 ||
21
+ cp === 0x232a ||
22
+ (cp >= 0x2e80 && cp <= 0x303e) || // CJK radicals, Kangxi
23
+ (cp >= 0x3041 && cp <= 0x33ff) || // Hiragana … CJK symbols
24
+ (cp >= 0x3400 && cp <= 0x4dbf) || // CJK Ext A
25
+ (cp >= 0x4e00 && cp <= 0x9fff) || // CJK Unified
26
+ (cp >= 0xa000 && cp <= 0xa4cf) || // Yi
27
+ (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul Syllables
28
+ (cp >= 0xf900 && cp <= 0xfaff) || // CJK Compat
29
+ (cp >= 0xfe10 && cp <= 0xfe19) ||
30
+ (cp >= 0xfe30 && cp <= 0xfe6f) ||
31
+ (cp >= 0xff00 && cp <= 0xff60) || // Fullwidth forms
32
+ (cp >= 0xffe0 && cp <= 0xffe6) ||
33
+ (cp >= 0x1f300 && cp <= 0x1faff) || // emoji & símbolos
34
+ (cp >= 0x20000 && cp <= 0x3fffd) // CJK Ext B+
35
+ );
36
+ }
37
+ /** true se combinante / largura zero. */
38
+ function isZeroWidth(cp) {
39
+ return ((cp >= 0x0300 && cp <= 0x036f) ||
40
+ (cp >= 0x1ab0 && cp <= 0x1aff) ||
41
+ (cp >= 0x1dc0 && cp <= 0x1dff) ||
42
+ (cp >= 0x200b && cp <= 0x200f) ||
43
+ (cp >= 0x20d0 && cp <= 0x20ff) ||
44
+ (cp >= 0xfe20 && cp <= 0xfe2f) ||
45
+ cp === 0xfeff);
46
+ }
47
+ export function charWidth(grapheme) {
48
+ const cp = grapheme.codePointAt(0);
49
+ if (cp === undefined)
50
+ return 0;
51
+ if (cp < 0x20 || (cp >= 0x7f && cp <= 0x9f))
52
+ return 0; // controle
53
+ if (isZeroWidth(cp))
54
+ return 0;
55
+ if (isWide(cp))
56
+ return 2;
57
+ return 1;
58
+ }
59
+ export function stringWidth(text) {
60
+ let w = 0;
61
+ for (const g of graphemes(stripAnsi(text)))
62
+ w += charWidth(g);
63
+ return w;
64
+ }
65
+ export function wrapText(text, width) {
66
+ if (width <= 0)
67
+ return [text];
68
+ const out = [];
69
+ for (const rawLine of text.split('\n')) {
70
+ let line = '';
71
+ let lineW = 0;
72
+ for (const word of splitWords(rawLine)) {
73
+ const ww = stringWidth(word);
74
+ if (lineW + ww > width && lineW > 0) {
75
+ out.push(line);
76
+ line = '';
77
+ lineW = 0;
78
+ }
79
+ if (ww > width) {
80
+ // palavra maior que a largura: quebra dura por grapheme
81
+ if (line) {
82
+ out.push(line);
83
+ line = '';
84
+ lineW = 0;
85
+ }
86
+ for (const g of graphemes(word)) {
87
+ const gw = charWidth(g);
88
+ if (lineW + gw > width) {
89
+ out.push(line);
90
+ line = '';
91
+ lineW = 0;
92
+ }
93
+ line += g;
94
+ lineW += gw;
95
+ }
96
+ }
97
+ else {
98
+ line += word;
99
+ lineW += ww;
100
+ }
101
+ }
102
+ out.push(line);
103
+ }
104
+ return out.length ? out : [''];
105
+ }
106
+ function splitWords(line) {
107
+ // mantém os espaços agregados à palavra seguinte para preservar recuos simples
108
+ return line.length ? (line.match(/\s*\S+\s*|\s+/g) ?? [line]) : [''];
109
+ }
110
+ export function truncate(text, width, ellipsis = '…') {
111
+ if (stringWidth(text) <= width)
112
+ return text;
113
+ const ew = stringWidth(ellipsis);
114
+ const budget = Math.max(0, width - ew);
115
+ let out = '';
116
+ let w = 0;
117
+ for (const g of graphemes(text)) {
118
+ const gw = charWidth(g);
119
+ if (w + gw > budget)
120
+ break;
121
+ out += g;
122
+ w += gw;
123
+ }
124
+ return out + ellipsis;
125
+ }
126
+ export function sliceByWidth(text, start, end) {
127
+ let out = '';
128
+ let col = 0;
129
+ for (const g of graphemes(text)) {
130
+ const gw = charWidth(g);
131
+ if (col >= start && col + gw <= end)
132
+ out += g;
133
+ col += gw;
134
+ if (col >= end)
135
+ break;
136
+ }
137
+ return out;
138
+ }
139
+ const ANSI_RE = /\x1b\[[0-9;?]*[ -/]*[@-~]/g;
140
+ export function stripAnsi(text) {
141
+ return text.replace(ANSI_RE, '');
142
+ }
143
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/utils/index.ts"],"names":[],"mappings":"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"}
package/ui/gate.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Gate — deixa um fluxo async esperar por uma resposta do teclado.
3
+ *
4
+ * Wizards lineares (escolher → resolver → confirmar → instalar) ficam muito
5
+ * mais legíveis escritos como uma função async do que como uma máquina de
6
+ * estados no `onKey`. O gate é a peça que falta: o fluxo aguarda `wait()`, o
7
+ * handler de teclado chama `settle()` quando o usuário decide.
8
+ */
9
+ export interface Gate<T> {
10
+ wait(): Promise<T>;
11
+ /** Entrega a resposta. Chamadas seguintes são ignoradas. */
12
+ settle(value: T): void;
13
+ /** Interrompe quem espera, propagando o erro. */
14
+ fail(error: unknown): void;
15
+ /** true enquanto alguém aguarda uma resposta. */
16
+ readonly pending: boolean;
17
+ }
18
+ export declare function createGate<T>(): Gate<T>;
19
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/ui/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,4DAA4D;IAC5D,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACvB,iDAAiD;IACjD,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CA2BvC"}
package/ui/gate.js ADDED
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Gate — deixa um fluxo async esperar por uma resposta do teclado.
3
+ *
4
+ * Wizards lineares (escolher → resolver → confirmar → instalar) ficam muito
5
+ * mais legíveis escritos como uma função async do que como uma máquina de
6
+ * estados no `onKey`. O gate é a peça que falta: o fluxo aguarda `wait()`, o
7
+ * handler de teclado chama `settle()` quando o usuário decide.
8
+ */
9
+ export function createGate() {
10
+ let resolveFn = null;
11
+ let rejectFn = null;
12
+ return {
13
+ wait() {
14
+ return new Promise((resolve, reject) => {
15
+ resolveFn = resolve;
16
+ rejectFn = reject;
17
+ });
18
+ },
19
+ settle(value) {
20
+ const resolve = resolveFn;
21
+ resolveFn = null;
22
+ rejectFn = null;
23
+ resolve?.(value);
24
+ },
25
+ fail(error) {
26
+ const reject = rejectFn;
27
+ resolveFn = null;
28
+ rejectFn = null;
29
+ reject?.(error);
30
+ },
31
+ get pending() {
32
+ return resolveFn !== null;
33
+ },
34
+ };
35
+ }
36
+ //# sourceMappingURL=gate.js.map
package/ui/gate.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/ui/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,UAAU,UAAU;IACxB,IAAI,SAAS,GAAgC,IAAI,CAAC;IAClD,IAAI,QAAQ,GAAsC,IAAI,CAAC;IAEvD,OAAO;QACL,IAAI;YACF,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACxC,SAAS,GAAG,OAAO,CAAC;gBACpB,QAAQ,GAAG,MAAM,CAAC;YACpB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,KAAK;YACV,MAAM,OAAO,GAAG,SAAS,CAAC;YAC1B,SAAS,GAAG,IAAI,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,KAAK;YACR,MAAM,MAAM,GAAG,QAAQ,CAAC;YACxB,SAAS,GAAG,IAAI,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,OAAO;YACT,OAAO,SAAS,KAAK,IAAI,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
package/ui/index.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Superfície pública da UI da CLI.
3
+ *
4
+ * Os comandos importam daqui — nunca de `./engine` diretamente — para que a
5
+ * troca ou atualização da engine fique contida nesta camada.
6
+ */
7
+ export * from './engine/index.js';
8
+ export * from './blocks.js';
9
+ export * from './brand.js';
10
+ export * from './gate.js';
11
+ export * from './log-sink.js';
12
+ export * from './output.js';
13
+ export * from './report.js';
14
+ export * from './runner.js';
15
+ export * from './style.js';
16
+ export * from './text-input.js';
17
+ export * from './theme.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}