gnosys 5.9.1 → 5.9.3

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 (173) hide show
  1. package/dist/cli.js +311 -143
  2. package/dist/cli.js.map +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/archive.d.ts.map +1 -1
  5. package/dist/lib/archive.js.map +1 -1
  6. package/dist/lib/bootstrap.d.ts.map +1 -1
  7. package/dist/lib/chat/index.d.ts.map +1 -1
  8. package/dist/lib/chat/index.js +5 -0
  9. package/dist/lib/chat/index.js.map +1 -1
  10. package/dist/lib/cleanup.d.ts +52 -0
  11. package/dist/lib/cleanup.d.ts.map +1 -0
  12. package/dist/lib/cleanup.js +168 -0
  13. package/dist/lib/cleanup.js.map +1 -0
  14. package/dist/lib/config.d.ts +7 -0
  15. package/dist/lib/config.d.ts.map +1 -1
  16. package/dist/lib/config.js +7 -1
  17. package/dist/lib/config.js.map +1 -1
  18. package/dist/lib/dashboard.d.ts.map +1 -1
  19. package/dist/lib/dashboard.js.map +1 -1
  20. package/dist/lib/db.d.ts +0 -13
  21. package/dist/lib/db.d.ts.map +1 -1
  22. package/dist/lib/db.js +0 -31
  23. package/dist/lib/db.js.map +1 -1
  24. package/dist/lib/dbSearch.d.ts.map +1 -1
  25. package/dist/lib/dbSearch.js +0 -1
  26. package/dist/lib/dbSearch.js.map +1 -1
  27. package/dist/lib/dream.d.ts.map +1 -1
  28. package/dist/lib/dream.js +1 -1
  29. package/dist/lib/dream.js.map +1 -1
  30. package/dist/lib/export.d.ts.map +1 -1
  31. package/dist/lib/federated.d.ts.map +1 -1
  32. package/dist/lib/federated.js +23 -65
  33. package/dist/lib/federated.js.map +1 -1
  34. package/dist/lib/hybridSearch.d.ts.map +1 -1
  35. package/dist/lib/hybridSearch.js.map +1 -1
  36. package/dist/lib/import.d.ts.map +1 -1
  37. package/dist/lib/import.js +2 -1
  38. package/dist/lib/import.js.map +1 -1
  39. package/dist/lib/lensing.d.ts +0 -9
  40. package/dist/lib/lensing.d.ts.map +1 -1
  41. package/dist/lib/lensing.js +0 -15
  42. package/dist/lib/lensing.js.map +1 -1
  43. package/dist/lib/maintenance.d.ts.map +1 -1
  44. package/dist/lib/maintenance.js +0 -39
  45. package/dist/lib/maintenance.js.map +1 -1
  46. package/dist/lib/migrate.js.map +1 -1
  47. package/dist/lib/paths.d.ts +8 -2
  48. package/dist/lib/paths.d.ts.map +1 -1
  49. package/dist/lib/paths.js +15 -4
  50. package/dist/lib/paths.js.map +1 -1
  51. package/dist/lib/portfolio.d.ts.map +1 -1
  52. package/dist/lib/portfolio.js +0 -23
  53. package/dist/lib/portfolio.js.map +1 -1
  54. package/dist/lib/projectIdentity.d.ts +9 -5
  55. package/dist/lib/projectIdentity.d.ts.map +1 -1
  56. package/dist/lib/projectIdentity.js +19 -22
  57. package/dist/lib/projectIdentity.js.map +1 -1
  58. package/dist/lib/remoteWizard.d.ts.map +1 -1
  59. package/dist/lib/remoteWizard.js +112 -52
  60. package/dist/lib/remoteWizard.js.map +1 -1
  61. package/dist/lib/rulesGen.d.ts +1 -4
  62. package/dist/lib/rulesGen.d.ts.map +1 -1
  63. package/dist/lib/rulesGen.js +2 -10
  64. package/dist/lib/rulesGen.js.map +1 -1
  65. package/dist/lib/search.d.ts.map +1 -1
  66. package/dist/lib/setup/coldStart.d.ts +71 -0
  67. package/dist/lib/setup/coldStart.d.ts.map +1 -0
  68. package/dist/lib/setup/coldStart.js +122 -0
  69. package/dist/lib/setup/coldStart.js.map +1 -0
  70. package/dist/lib/setup/configSetRender.d.ts +26 -0
  71. package/dist/lib/setup/configSetRender.d.ts.map +1 -0
  72. package/dist/lib/setup/configSetRender.js +103 -0
  73. package/dist/lib/setup/configSetRender.js.map +1 -0
  74. package/dist/lib/setup/dreamRender.d.ts +44 -0
  75. package/dist/lib/setup/dreamRender.d.ts.map +1 -0
  76. package/dist/lib/setup/dreamRender.js +55 -0
  77. package/dist/lib/setup/dreamRender.js.map +1 -0
  78. package/dist/lib/setup/modelsRender.d.ts +25 -0
  79. package/dist/lib/setup/modelsRender.d.ts.map +1 -0
  80. package/dist/lib/setup/modelsRender.js +33 -0
  81. package/dist/lib/setup/modelsRender.js.map +1 -0
  82. package/dist/lib/setup/remoteRender.d.ts +43 -0
  83. package/dist/lib/setup/remoteRender.d.ts.map +1 -0
  84. package/dist/lib/setup/remoteRender.js +65 -0
  85. package/dist/lib/setup/remoteRender.js.map +1 -0
  86. package/dist/lib/setup/routingRender.d.ts +44 -0
  87. package/dist/lib/setup/routingRender.d.ts.map +1 -0
  88. package/dist/lib/setup/routingRender.js +97 -0
  89. package/dist/lib/setup/routingRender.js.map +1 -0
  90. package/dist/lib/setup/sections/ides.d.ts +8 -0
  91. package/dist/lib/setup/sections/ides.d.ts.map +1 -1
  92. package/dist/lib/setup/sections/ides.js +49 -27
  93. package/dist/lib/setup/sections/ides.js.map +1 -1
  94. package/dist/lib/setup/sections/preferences.d.ts +8 -0
  95. package/dist/lib/setup/sections/preferences.d.ts.map +1 -1
  96. package/dist/lib/setup/sections/preferences.js +40 -19
  97. package/dist/lib/setup/sections/preferences.js.map +1 -1
  98. package/dist/lib/setup/sections/routing.d.ts +0 -1
  99. package/dist/lib/setup/sections/routing.d.ts.map +1 -1
  100. package/dist/lib/setup/sections/routing.js +49 -29
  101. package/dist/lib/setup/sections/routing.js.map +1 -1
  102. package/dist/lib/setup/summary.d.ts +33 -19
  103. package/dist/lib/setup/summary.d.ts.map +1 -1
  104. package/dist/lib/setup/summary.js +135 -105
  105. package/dist/lib/setup/summary.js.map +1 -1
  106. package/dist/lib/setup/syncProjectsRender.d.ts +56 -0
  107. package/dist/lib/setup/syncProjectsRender.d.ts.map +1 -0
  108. package/dist/lib/setup/syncProjectsRender.js +168 -0
  109. package/dist/lib/setup/syncProjectsRender.js.map +1 -0
  110. package/dist/lib/setup/ui/diff.d.ts +19 -0
  111. package/dist/lib/setup/ui/diff.d.ts.map +1 -0
  112. package/dist/lib/setup/ui/diff.js +34 -0
  113. package/dist/lib/setup/ui/diff.js.map +1 -0
  114. package/dist/lib/setup/ui/footer.d.ts +11 -0
  115. package/dist/lib/setup/ui/footer.d.ts.map +1 -0
  116. package/dist/lib/setup/ui/footer.js +21 -0
  117. package/dist/lib/setup/ui/footer.js.map +1 -0
  118. package/dist/lib/setup/ui/header.d.ts +24 -0
  119. package/dist/lib/setup/ui/header.d.ts.map +1 -0
  120. package/dist/lib/setup/ui/header.js +49 -0
  121. package/dist/lib/setup/ui/header.js.map +1 -0
  122. package/dist/lib/setup/ui/index.d.ts +26 -0
  123. package/dist/lib/setup/ui/index.d.ts.map +1 -0
  124. package/dist/lib/setup/ui/index.js +18 -0
  125. package/dist/lib/setup/ui/index.js.map +1 -0
  126. package/dist/lib/setup/ui/menu.d.ts +27 -0
  127. package/dist/lib/setup/ui/menu.d.ts.map +1 -0
  128. package/dist/lib/setup/ui/menu.js +75 -0
  129. package/dist/lib/setup/ui/menu.js.map +1 -0
  130. package/dist/lib/setup/ui/panel.d.ts +23 -0
  131. package/dist/lib/setup/ui/panel.d.ts.map +1 -0
  132. package/dist/lib/setup/ui/panel.js +53 -0
  133. package/dist/lib/setup/ui/panel.js.map +1 -0
  134. package/dist/lib/setup/ui/prompt.d.ts +27 -0
  135. package/dist/lib/setup/ui/prompt.d.ts.map +1 -0
  136. package/dist/lib/setup/ui/prompt.js +38 -0
  137. package/dist/lib/setup/ui/prompt.js.map +1 -0
  138. package/dist/lib/setup/ui/safePrompt.d.ts +24 -0
  139. package/dist/lib/setup/ui/safePrompt.d.ts.map +1 -0
  140. package/dist/lib/setup/ui/safePrompt.js +71 -0
  141. package/dist/lib/setup/ui/safePrompt.js.map +1 -0
  142. package/dist/lib/setup/ui/spinner.d.ts +28 -0
  143. package/dist/lib/setup/ui/spinner.d.ts.map +1 -0
  144. package/dist/lib/setup/ui/spinner.js +87 -0
  145. package/dist/lib/setup/ui/spinner.js.map +1 -0
  146. package/dist/lib/setup/ui/status.d.ts +21 -0
  147. package/dist/lib/setup/ui/status.d.ts.map +1 -0
  148. package/dist/lib/setup/ui/status.js +49 -0
  149. package/dist/lib/setup/ui/status.js.map +1 -0
  150. package/dist/lib/setup/ui/title.d.ts +14 -0
  151. package/dist/lib/setup/ui/title.d.ts.map +1 -0
  152. package/dist/lib/setup/ui/title.js +24 -0
  153. package/dist/lib/setup/ui/title.js.map +1 -0
  154. package/dist/lib/setup/ui/tokens.d.ts +66 -0
  155. package/dist/lib/setup/ui/tokens.d.ts.map +1 -0
  156. package/dist/lib/setup/ui/tokens.js +87 -0
  157. package/dist/lib/setup/ui/tokens.js.map +1 -0
  158. package/dist/lib/setup.d.ts +7 -0
  159. package/dist/lib/setup.d.ts.map +1 -1
  160. package/dist/lib/setup.js +204 -230
  161. package/dist/lib/setup.js.map +1 -1
  162. package/dist/lib/store.d.ts +0 -4
  163. package/dist/lib/store.d.ts.map +1 -1
  164. package/dist/lib/store.js +0 -6
  165. package/dist/lib/store.js.map +1 -1
  166. package/dist/lib/tags.d.ts +0 -2
  167. package/dist/lib/tags.d.ts.map +1 -1
  168. package/dist/lib/tags.js +0 -10
  169. package/dist/lib/tags.js.map +1 -1
  170. package/dist/lib/trace.d.ts.map +1 -1
  171. package/dist/lib/webIngest.d.ts.map +1 -1
  172. package/dist/lib/webIngest.js.map +1 -1
  173. package/package.json +1 -1
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Menu atom — the single numbered-menu format the redesign uses.
3
+ *
4
+ * 3-col number gutter, lowercase labels by convention, right-aligned
5
+ * meta column, optional `◂ tag` (recommended | current | detected) to
6
+ * the right of meta.
7
+ */
8
+ import { c, color, glyph, width } from "./tokens.js";
9
+ import { stripAnsi } from "./header.js";
10
+ /**
11
+ * Render a numbered menu as a single string (no trailing newline).
12
+ * Caller follows with one blank line then a Prompt/Footer.
13
+ */
14
+ export function Menu(items) {
15
+ const W = width();
16
+ // Column layout:
17
+ // col 1: " " indent (content lives at col 2 per the spec)
18
+ // col 2-4: 3-char gutter for number, right-aligned
19
+ // col 5: " "
20
+ // col 6+: label
21
+ // meta is right-aligned within W-2
22
+ // tag (◂ ...) follows meta, right-aligned at the very right
23
+ const indent = " "; // menu items at col 4 — 4-space indent (1 base + 3)
24
+ const lines = [];
25
+ for (const it of items) {
26
+ // Numbers are always text-dim per design §3 (numbered-menu spec).
27
+ const labelColor = it.dim ? c.textDim : c.text;
28
+ const metaColor = it.dim ? c.textDim : c.textMid;
29
+ const tagColor = c.accentHi;
30
+ const num = color(c.textDim, it.n.padStart(2, " "));
31
+ const label = color(labelColor, it.label);
32
+ const meta = it.meta ? color(metaColor, it.meta) : "";
33
+ const tag = it.tag ? color(tagColor, `${glyph.tag} ${it.tag}`) : "";
34
+ // Build the inner content then right-pad meta + tag.
35
+ const leftSide = `${indent}${num} ${label}`;
36
+ const leftBare = stripAnsi(leftSide);
37
+ // Reserve room: leftBare | gap | meta | gap | tag, ending at col W-1.
38
+ const tagBare = it.tag ? `${glyph.tag} ${it.tag}` : "";
39
+ const metaBare = it.meta ?? "";
40
+ const tagWidth = tagBare.length;
41
+ const metaWidth = metaBare.length;
42
+ // tag occupies the rightmost slot if present; meta column ends before
43
+ // the tag with a one-space gap. If no tag, meta ends at col W-1.
44
+ const rightEnd = W - 1;
45
+ let line;
46
+ if (it.tag && it.meta) {
47
+ const tagStart = rightEnd - tagWidth;
48
+ const metaEnd = tagStart - 1; // one space between meta and tag
49
+ const metaStart = metaEnd - metaWidth;
50
+ const gap1 = " ".repeat(Math.max(1, metaStart - leftBare.length));
51
+ const gap2 = " ";
52
+ line = `${leftSide}${gap1}${meta}${gap2}${tag}`;
53
+ }
54
+ else if (it.tag) {
55
+ const tagStart = rightEnd - tagWidth;
56
+ const gap = " ".repeat(Math.max(1, tagStart - leftBare.length));
57
+ line = `${leftSide}${gap}${tag}`;
58
+ }
59
+ else if (it.meta) {
60
+ const metaStart = rightEnd - metaWidth;
61
+ const gap = " ".repeat(Math.max(1, metaStart - leftBare.length));
62
+ line = `${leftSide}${gap}${meta}`;
63
+ }
64
+ else {
65
+ line = leftSide;
66
+ }
67
+ lines.push(line);
68
+ }
69
+ return lines.join("\n");
70
+ }
71
+ /** Convenience: print menu + trailing blank line. */
72
+ export function printMenu(items) {
73
+ process.stdout.write(`${Menu(items)}\n\n`);
74
+ }
75
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../../src/lib/setup/ui/menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Panel atom — rounded `╭─╮ │ ╰─╯` box in `accent-dim`.
3
+ *
4
+ * Used ONLY for summary views (settings overview, completion screen).
5
+ * Flow screens use Header + Title + content + Prompt — no box. The
6
+ * design handoff is strict about this.
7
+ */
8
+ export interface PanelOptions {
9
+ /** Right-side glyph on a row (e.g. `✓` to mark "edited this session"). */
10
+ trailing?: Record<number, string>;
11
+ }
12
+ /**
13
+ * Render a panel. Each row is a string (already formatted/colored). The
14
+ * panel wraps each row in `│ … │` with `accent-dim` border. The title
15
+ * sits in the top border: `╭─ title ────╮`.
16
+ *
17
+ * Width is fixed to the lesser of W or 68 cols of inner content (matches
18
+ * the spec mockup) so summary panels never spill on wider terminals.
19
+ */
20
+ export declare function Panel(title: string, rows: string[], opts?: PanelOptions): string;
21
+ /** Convenience: print panel + trailing blank line. */
22
+ export declare function printPanel(title: string, rows: string[], opts?: PanelOptions): void;
23
+ //# sourceMappingURL=panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../../../src/lib/setup/ui/panel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,MAAM,CAkCpF;AAED,sDAAsD;AACtD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,IAAI,CAEvF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Panel atom — rounded `╭─╮ │ ╰─╯` box in `accent-dim`.
3
+ *
4
+ * Used ONLY for summary views (settings overview, completion screen).
5
+ * Flow screens use Header + Title + content + Prompt — no box. The
6
+ * design handoff is strict about this.
7
+ */
8
+ import { c, color, glyph, width } from "./tokens.js";
9
+ import { stripAnsi } from "./header.js";
10
+ /**
11
+ * Render a panel. Each row is a string (already formatted/colored). The
12
+ * panel wraps each row in `│ … │` with `accent-dim` border. The title
13
+ * sits in the top border: `╭─ title ────╮`.
14
+ *
15
+ * Width is fixed to the lesser of W or 68 cols of inner content (matches
16
+ * the spec mockup) so summary panels never spill on wider terminals.
17
+ */
18
+ export function Panel(title, rows, opts = {}) {
19
+ const W = width();
20
+ const indent = " ";
21
+ // Inner content width: target 66 chars inner (between `│ ` and ` │`),
22
+ // clamp by terminal width.
23
+ const innerW = Math.min(66, Math.max(40, W - 4));
24
+ const border = c.accentDim;
25
+ // Top border: `╭─ title ──────╮`
26
+ const titleStyled = color(c.textHi, title);
27
+ const topHead = `${color(border, `${glyph.boxTL}${glyph.boxH} `)}${titleStyled} `;
28
+ const topHeadBare = stripAnsi(topHead);
29
+ const topPadLen = Math.max(1, innerW + 2 - topHeadBare.length);
30
+ const top = `${indent}${topHead}${color(border, `${glyph.boxH.repeat(topPadLen)}${glyph.boxTR}`)}`;
31
+ // Each row: `│ <content> │` — pad content to innerW.
32
+ const left = color(border, `${glyph.boxV} `);
33
+ const right = color(border, ` ${glyph.boxV}`);
34
+ const middle = [];
35
+ rows.forEach((rowStyled, idx) => {
36
+ const bare = stripAnsi(rowStyled);
37
+ const trail = opts.trailing?.[idx] ?? "";
38
+ const trailBare = stripAnsi(trail);
39
+ // Reserve room for the optional trailing glyph (e.g. ✓), right-aligned.
40
+ const usable = innerW - bare.length - (trailBare ? trailBare.length + 1 : 0);
41
+ const padContent = " ".repeat(Math.max(0, usable));
42
+ const trailingPart = trail ? ` ${trail}` : "";
43
+ middle.push(`${indent}${left}${rowStyled}${padContent}${trailingPart}${right}`);
44
+ });
45
+ // Bottom border: `╰──────────────╯`
46
+ const bottom = `${indent}${color(border, `${glyph.boxBL}${glyph.boxH.repeat(innerW + 2)}${glyph.boxBR}`)}`;
47
+ return [top, ...middle, bottom].join("\n");
48
+ }
49
+ /** Convenience: print panel + trailing blank line. */
50
+ export function printPanel(title, rows, opts = {}) {
51
+ process.stdout.write(`${Panel(title, rows, opts)}\n\n`);
52
+ }
53
+ //# sourceMappingURL=panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../../../src/lib/setup/ui/panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Prompt atom — single helper that wraps every readline question call.
3
+ *
4
+ * Catches `AbortError` from readline's signal/SIGINT path, prints a clean
5
+ * cancellation message in `text-dim`, closes the readline, and exits with
6
+ * code 130 (standard SIGINT exit). This is the *only* place SIGINT cleanup
7
+ * should live — every other site routes through here.
8
+ */
9
+ import type { Interface as ReadlineInterface } from "readline/promises";
10
+ export interface PromptOptions {
11
+ /** Right-aligned dim hint (`1–8 · pick q · quit`). */
12
+ hint?: string;
13
+ /** Lead-in text shown after the prompt glyph (`press enter to begin`). */
14
+ lead?: string;
15
+ /** What to print on cancel. Default: `cancelled · no changes written`. */
16
+ cancelMessage?: string;
17
+ /** Skip the actual `process.exit(130)`. Used by some integration tests. */
18
+ skipExitOnCancel?: boolean;
19
+ }
20
+ /**
21
+ * Render the prompt line and await user input. On `AbortError`, prints the
22
+ * cancellation message and exits 130 (unless `skipExitOnCancel`).
23
+ *
24
+ * @returns The user's input, trimmed. Returns the empty string on Enter.
25
+ */
26
+ export declare function Prompt(rl: ReadlineInterface, opts?: PromptOptions): Promise<string>;
27
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../src/lib/setup/ui/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAKxE,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAC1B,EAAE,EAAE,iBAAiB,EACrB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Prompt atom — single helper that wraps every readline question call.
3
+ *
4
+ * Catches `AbortError` from readline's signal/SIGINT path, prints a clean
5
+ * cancellation message in `text-dim`, closes the readline, and exits with
6
+ * code 130 (standard SIGINT exit). This is the *only* place SIGINT cleanup
7
+ * should live — every other site routes through here.
8
+ */
9
+ import { c, color, glyph, width } from "./tokens.js";
10
+ import { stripAnsi } from "./header.js";
11
+ import { safeQuestion } from "./safePrompt.js";
12
+ /**
13
+ * Render the prompt line and await user input. On `AbortError`, prints the
14
+ * cancellation message and exits 130 (unless `skipExitOnCancel`).
15
+ *
16
+ * @returns The user's input, trimmed. Returns the empty string on Enter.
17
+ */
18
+ export async function Prompt(rl, opts = {}) {
19
+ const W = width();
20
+ const indent = " ";
21
+ const glyphPart = color(c.accent, glyph.prompt);
22
+ const lead = opts.lead ? ` ${color(c.text, opts.lead)}` : "";
23
+ const head = `${indent}${glyphPart}${lead} `;
24
+ // If a hint is present, print it right-aligned ABOVE the prompt line.
25
+ // This matches the design's "hint on the line above the cursor".
26
+ if (opts.hint) {
27
+ const hint = color(c.textDim, opts.hint);
28
+ const hintBare = stripAnsi(hint);
29
+ const pad = " ".repeat(Math.max(1, W - 1 - hintBare.length));
30
+ process.stdout.write(`${pad}${hint}\n`);
31
+ }
32
+ const raw = await safeQuestion(rl, head, {
33
+ cancelMessage: opts.cancelMessage,
34
+ skipExitOnCancel: opts.skipExitOnCancel,
35
+ });
36
+ return raw.trim();
37
+ }
38
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../src/lib/setup/ui/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAa/C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,EAAqB,EACrB,OAAsB,EAAE;IAExB,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;IAClB,MAAM,MAAM,GAAG,GAAG,CAAC;IACnB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,CAAC;IAE7C,sEAAsE;IACtE,iEAAiE;IACjE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE;QACvC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KACxC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * safeQuestion — a thin migration shim that gives every existing
3
+ * `rl.question(...)` call site clean Ctrl+C handling without forcing
4
+ * a rewrite to the full Prompt() atom.
5
+ *
6
+ * Behavior:
7
+ * - On normal input, returns the raw string (caller decides about trim).
8
+ * - On SIGINT (Ctrl+C), prints `cancelled · no changes written` in
9
+ * `text-dim`, closes the readline, exits 130.
10
+ *
11
+ * The SIGINT handler is installed lazily on the first call and remembered
12
+ * via a module-level flag so the same readline can be questioned many
13
+ * times without leaking listeners.
14
+ *
15
+ * v5.9.3 Phase B uses this everywhere the old helpers wrap `rl.question`.
16
+ * New screens compose Prompt() from `index.js` instead.
17
+ */
18
+ import type { Interface as ReadlineInterface } from "readline/promises";
19
+ export interface SafeQuestionOptions {
20
+ cancelMessage?: string;
21
+ skipExitOnCancel?: boolean;
22
+ }
23
+ export declare function safeQuestion(rl: ReadlineInterface, prompt: string, opts?: SafeQuestionOptions): Promise<string>;
24
+ //# sourceMappingURL=safePrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safePrompt.d.ts","sourceRoot":"","sources":["../../../../src/lib/setup/ui/safePrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGxE,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAkCD,wBAAsB,YAAY,CAChC,EAAE,EAAE,iBAAiB,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAyBjB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * safeQuestion — a thin migration shim that gives every existing
3
+ * `rl.question(...)` call site clean Ctrl+C handling without forcing
4
+ * a rewrite to the full Prompt() atom.
5
+ *
6
+ * Behavior:
7
+ * - On normal input, returns the raw string (caller decides about trim).
8
+ * - On SIGINT (Ctrl+C), prints `cancelled · no changes written` in
9
+ * `text-dim`, closes the readline, exits 130.
10
+ *
11
+ * The SIGINT handler is installed lazily on the first call and remembered
12
+ * via a module-level flag so the same readline can be questioned many
13
+ * times without leaking listeners.
14
+ *
15
+ * v5.9.3 Phase B uses this everywhere the old helpers wrap `rl.question`.
16
+ * New screens compose Prompt() from `index.js` instead.
17
+ */
18
+ import { c, color } from "./tokens.js";
19
+ /**
20
+ * Track which readline interfaces we've already wired SIGINT cleanup
21
+ * to. We use a WeakSet so a closed/GC'd interface drops out automatically.
22
+ */
23
+ const sigintWired = new WeakSet();
24
+ function wireSigint(rl, cancelMessage, skipExit) {
25
+ if (sigintWired.has(rl))
26
+ return;
27
+ sigintWired.add(rl);
28
+ const handler = () => {
29
+ process.stdout.write(`\n ${color(c.textDim, cancelMessage)}\n`);
30
+ try {
31
+ rl.close();
32
+ }
33
+ catch {
34
+ // already closed — fine
35
+ }
36
+ if (!skipExit) {
37
+ process.exit(130);
38
+ }
39
+ };
40
+ // `rl.on('SIGINT', …)` fires when the user hits Ctrl+C with readline
41
+ // listening — Node's readline already emits SIGINT before bubbling to
42
+ // process. This is the load-bearing wire.
43
+ rl.on("SIGINT", handler);
44
+ }
45
+ export async function safeQuestion(rl, prompt, opts = {}) {
46
+ const message = opts.cancelMessage ?? "cancelled · no changes written";
47
+ wireSigint(rl, message, opts.skipExitOnCancel ?? false);
48
+ try {
49
+ return await rl.question(prompt);
50
+ }
51
+ catch (err) {
52
+ // Defensive: still catch AbortError for callers that pass their own
53
+ // AbortSignal through (e.g. test harness).
54
+ const isAbort = err instanceof Error &&
55
+ (err.name === "AbortError" || /aborted|signal/i.test(err.message ?? ""));
56
+ if (!isAbort)
57
+ throw err;
58
+ process.stdout.write(`\n ${color(c.textDim, message)}\n`);
59
+ try {
60
+ rl.close();
61
+ }
62
+ catch {
63
+ // Already closed — fine.
64
+ }
65
+ if (!opts.skipExitOnCancel) {
66
+ process.exit(130);
67
+ }
68
+ throw err;
69
+ }
70
+ }
71
+ //# sourceMappingURL=safePrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safePrompt.js","sourceRoot":"","sources":["../../../../src/lib/setup/ui/safePrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAOvC;;;GAGG;AACH,MAAM,WAAW,GAAG,IAAI,OAAO,EAAqB,CAAC;AAErD,SAAS,UAAU,CACjB,EAAqB,EACrB,aAAqB,EACrB,QAAiB;IAEjB,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO;IAChC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEpB,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,qEAAqE;IACrE,sEAAsE;IACtE,0CAA0C;IAC1C,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAqB,EACrB,MAAc,EACd,OAA4B,EAAE;IAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,IAAI,gCAAgC,CAAC;IACvE,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC,CAAC;IAExD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,oEAAoE;QACpE,2CAA2C;QAC3C,MAAM,OAAO,GACX,GAAG,YAAY,KAAK;YACpB,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO;YAAE,MAAM,GAAG,CAAC;QAExB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Spinner atom — animated `◌ ◐ ◑ ◒ ◓` for any operation > 200 ms.
3
+ *
4
+ * Same line is rewritten in place via `\r` (carriage return). On `ok` /
5
+ * `fail` / `update`, the spinner stops cleanly and replaces the line with
6
+ * a final Status-style line. No newlines are emitted until resolution.
7
+ */
8
+ export interface SpinnerHandle {
9
+ /** Replace the spinner with a `✓ text · meta` line and stop. */
10
+ ok(text: string, meta?: string): void;
11
+ /** Replace the spinner with a `✗ text · meta` line and stop. */
12
+ fail(text: string, meta?: string): void;
13
+ /** Update the in-progress label (spinner keeps animating). */
14
+ update(label: string): void;
15
+ /** Stop without printing a final line (for callers that handle output). */
16
+ stop(): void;
17
+ }
18
+ /**
19
+ * Start an animated spinner. Returns a handle. The spinner immediately
20
+ * writes its first frame. Caller MUST eventually call one of `ok`/`fail`/
21
+ * `stop` to release the line.
22
+ *
23
+ * When stdout isn't a TTY (CI, test capture), the spinner falls back to a
24
+ * single static `◌ label` line and the `ok/fail` calls print final lines
25
+ * directly — no `\r` redraw.
26
+ */
27
+ export declare function Spinner(label: string): SpinnerHandle;
28
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../../src/lib/setup/ui/spinner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,gEAAgE;IAChE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,8DAA8D;IAC9D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2EAA2E;IAC3E,IAAI,IAAI,IAAI,CAAC;CACd;AAKD;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAgEpD"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Spinner atom — animated `◌ ◐ ◑ ◒ ◓` for any operation > 200 ms.
3
+ *
4
+ * Same line is rewritten in place via `\r` (carriage return). On `ok` /
5
+ * `fail` / `update`, the spinner stops cleanly and replaces the line with
6
+ * a final Status-style line. No newlines are emitted until resolution.
7
+ */
8
+ import { c, color, glyph } from "./tokens.js";
9
+ import { Status } from "./status.js";
10
+ const FRAMES = [glyph.spin0, glyph.spin1, glyph.spin2, glyph.spin3, glyph.spin4];
11
+ const FRAME_MS = 125; // ~8 fps
12
+ /**
13
+ * Start an animated spinner. Returns a handle. The spinner immediately
14
+ * writes its first frame. Caller MUST eventually call one of `ok`/`fail`/
15
+ * `stop` to release the line.
16
+ *
17
+ * When stdout isn't a TTY (CI, test capture), the spinner falls back to a
18
+ * single static `◌ label` line and the `ok/fail` calls print final lines
19
+ * directly — no `\r` redraw.
20
+ */
21
+ export function Spinner(label) {
22
+ let currentLabel = label;
23
+ const isTTY = process.stdout.isTTY;
24
+ let frame = 0;
25
+ let timer = null;
26
+ let stopped = false;
27
+ function draw() {
28
+ if (stopped)
29
+ return;
30
+ if (!isTTY) {
31
+ // Non-TTY: print one static line only, do NOT animate.
32
+ return;
33
+ }
34
+ const g = color(c.accent, FRAMES[frame % FRAMES.length]);
35
+ const txt = color(c.text, currentLabel);
36
+ process.stdout.write(`\r ${g} ${txt}`);
37
+ }
38
+ function clearLine() {
39
+ if (isTTY) {
40
+ // Move to start of line, clear to end.
41
+ process.stdout.write("\r\x1b[2K");
42
+ }
43
+ }
44
+ function final(kind, text, meta) {
45
+ if (stopped)
46
+ return;
47
+ stopped = true;
48
+ if (timer)
49
+ clearInterval(timer);
50
+ clearLine();
51
+ process.stdout.write(`${Status(kind, text, meta)}\n`);
52
+ }
53
+ // First frame (or static line for non-TTY).
54
+ if (isTTY) {
55
+ draw();
56
+ timer = setInterval(() => {
57
+ frame = (frame + 1) % FRAMES.length;
58
+ draw();
59
+ }, FRAME_MS);
60
+ // Unref so the timer never blocks process exit on its own.
61
+ timer.unref?.();
62
+ }
63
+ else {
64
+ process.stdout.write(`${Status("progress", currentLabel)}\n`);
65
+ }
66
+ return {
67
+ ok(text, meta) {
68
+ final("ok", text, meta);
69
+ },
70
+ fail(text, meta) {
71
+ final("fail", text, meta);
72
+ },
73
+ update(nextLabel) {
74
+ currentLabel = nextLabel;
75
+ draw();
76
+ },
77
+ stop() {
78
+ if (stopped)
79
+ return;
80
+ stopped = true;
81
+ if (timer)
82
+ clearInterval(timer);
83
+ clearLine();
84
+ },
85
+ };
86
+ }
87
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../../../src/lib/setup/ui/spinner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Status atom — one-liner with leading glyph + optional right-aligned meta.
3
+ *
4
+ * Kinds:
5
+ * ok ✓ in ok color
6
+ * warn ⚠ in warn color
7
+ * fail ✗ in fail color
8
+ * progress ◌ in accent color (use Spinner for animated variants)
9
+ */
10
+ export type StatusKind = "ok" | "warn" | "fail" | "progress";
11
+ /**
12
+ * Render a status line. Returns the formatted string (no trailing newline).
13
+ *
14
+ * @param kind ok | warn | fail | progress
15
+ * @param text Body, in `text`.
16
+ * @param meta Optional right-aligned, in `text-dim`.
17
+ */
18
+ export declare function Status(kind: StatusKind, text: string, meta?: string): string;
19
+ /** Convenience: print a single status line. */
20
+ export declare function printStatus(kind: StatusKind, text: string, meta?: string): void;
21
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/lib/setup/ui/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAgB7D;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAY5E;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAE/E"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Status atom — one-liner with leading glyph + optional right-aligned meta.
3
+ *
4
+ * Kinds:
5
+ * ok ✓ in ok color
6
+ * warn ⚠ in warn color
7
+ * fail ✗ in fail color
8
+ * progress ◌ in accent color (use Spinner for animated variants)
9
+ */
10
+ import { c, color, glyph, width } from "./tokens.js";
11
+ import { stripAnsi } from "./header.js";
12
+ const KIND_TO_GLYPH = {
13
+ ok: glyph.ok,
14
+ warn: glyph.warn,
15
+ fail: glyph.fail,
16
+ progress: glyph.spin0,
17
+ };
18
+ const KIND_TO_COLOR = {
19
+ ok: c.ok,
20
+ warn: c.warn,
21
+ fail: c.fail,
22
+ progress: c.accent,
23
+ };
24
+ /**
25
+ * Render a status line. Returns the formatted string (no trailing newline).
26
+ *
27
+ * @param kind ok | warn | fail | progress
28
+ * @param text Body, in `text`.
29
+ * @param meta Optional right-aligned, in `text-dim`.
30
+ */
31
+ export function Status(kind, text, meta) {
32
+ const W = width();
33
+ const indent = " ";
34
+ const g = color(KIND_TO_COLOR[kind], KIND_TO_GLYPH[kind]);
35
+ const body = color(c.text, text);
36
+ const left = `${indent}${g} ${body}`;
37
+ if (!meta)
38
+ return left;
39
+ const metaTxt = color(c.textDim, meta);
40
+ const leftBare = stripAnsi(left);
41
+ const metaBare = stripAnsi(metaTxt);
42
+ const pad = " ".repeat(Math.max(1, W - 1 - leftBare.length - metaBare.length));
43
+ return `${left}${pad}${metaTxt}`;
44
+ }
45
+ /** Convenience: print a single status line. */
46
+ export function printStatus(kind, text, meta) {
47
+ process.stdout.write(`${Status(kind, text, meta)}\n`);
48
+ }
49
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/lib/setup/ui/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,MAAM,aAAa,GAA+B;IAChD,EAAE,EAAE,KAAK,CAAC,EAAE;IACZ,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,QAAQ,EAAE,KAAK,CAAC,KAAK;CACtB,CAAC;AAEF,MAAM,aAAa,GAA+B;IAChD,EAAE,EAAE,CAAC,CAAC,EAAE;IACR,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,QAAQ,EAAE,CAAC,CAAC,MAAM;CACnB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAC,IAAgB,EAAE,IAAY,EAAE,IAAa;IAClE,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;IAClB,MAAM,MAAM,GAAG,GAAG,CAAC;IACnB,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/E,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG,OAAO,EAAE,CAAC;AACnC,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,IAAgB,EAAE,IAAY,EAAE,IAAa;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Title atom — screen-level heading + optional subtitle.
3
+ */
4
+ /**
5
+ * Render a title + optional subtitle. Caller follows with the standard
6
+ * blank line via normal flow.
7
+ *
8
+ * @param title Bold, `text-hi`.
9
+ * @param sub Optional, `text-mid`, rendered on the next line.
10
+ */
11
+ export declare function Title(title: string, sub?: string): string;
12
+ /** Convenience: print title + trailing blank line to stdout. */
13
+ export declare function printTitle(title: string, sub?: string): void;
14
+ //# sourceMappingURL=title.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title.d.ts","sourceRoot":"","sources":["../../../../src/lib/setup/ui/title.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,gEAAgE;AAChE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAE5D"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Title atom — screen-level heading + optional subtitle.
3
+ */
4
+ import { c, color } from "./tokens.js";
5
+ /**
6
+ * Render a title + optional subtitle. Caller follows with the standard
7
+ * blank line via normal flow.
8
+ *
9
+ * @param title Bold, `text-hi`.
10
+ * @param sub Optional, `text-mid`, rendered on the next line.
11
+ */
12
+ export function Title(title, sub) {
13
+ const indent = " ";
14
+ const line1 = `${indent}${color(c.textHi, title)}`;
15
+ if (!sub)
16
+ return line1;
17
+ const line2 = `${indent}${color(c.textMid, sub)}`;
18
+ return `${line1}\n${line2}`;
19
+ }
20
+ /** Convenience: print title + trailing blank line to stdout. */
21
+ export function printTitle(title, sub) {
22
+ process.stdout.write(`${Title(title, sub)}\n\n`);
23
+ }
24
+ //# sourceMappingURL=title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title.js","sourceRoot":"","sources":["../../../../src/lib/setup/ui/title.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,GAAY;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC;IACnB,MAAM,KAAK,GAAG,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IACnD,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;IAClD,OAAO,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,GAAY;IACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC"}