linersh 0.5.7 → 1.0.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.
Files changed (97) hide show
  1. package/README.md +84 -159
  2. package/bin/liner.js +89 -44
  3. package/cli-update-docs/README.md +6 -6
  4. package/cli-update-docs/SKILL.md +72 -37
  5. package/cli-update-docs/quality-check-tests.md +256 -8
  6. package/cli-update-docs/source-finding-tactics.md +140 -3
  7. package/cli-update-docs/source-quality-hierarchy.md +83 -0
  8. package/cli-update-docs/synthesis-guidance.md +19 -5
  9. package/dist/agents/artifact-validation.js +440 -0
  10. package/dist/agents/artifact-validation.js.map +1 -0
  11. package/dist/agents/candidate-longlist.js +100 -0
  12. package/dist/agents/candidate-longlist.js.map +1 -0
  13. package/dist/agents/detect.js +3 -2
  14. package/dist/agents/detect.js.map +1 -1
  15. package/dist/agents/evaluation-assembly.js +270 -0
  16. package/dist/agents/evaluation-assembly.js.map +1 -0
  17. package/dist/agents/headless-runner.js +227 -0
  18. package/dist/agents/headless-runner.js.map +1 -0
  19. package/dist/agents/jtbd-clarify.js +42 -41
  20. package/dist/agents/jtbd-clarify.js.map +1 -1
  21. package/dist/agents/models.js +6 -7
  22. package/dist/agents/models.js.map +1 -1
  23. package/dist/agents/prompts.js +220 -20
  24. package/dist/agents/prompts.js.map +1 -1
  25. package/dist/agents/runner.js +462 -21
  26. package/dist/agents/runner.js.map +1 -1
  27. package/dist/phases.js +13 -13
  28. package/dist/phases.js.map +1 -1
  29. package/dist/source-inbox.js +297 -0
  30. package/dist/source-inbox.js.map +1 -0
  31. package/dist/version.js +3 -9
  32. package/dist/version.js.map +1 -1
  33. package/dist/yaml-io.js +42 -11
  34. package/dist/yaml-io.js.map +1 -1
  35. package/package.json +26 -23
  36. package/cli-update-docs/ABOUT.md +0 -69
  37. package/cli-update-docs/AI-HANDOFF.md +0 -241
  38. package/cli-update-docs/CURATION.md +0 -261
  39. package/cli-update-docs/JOB-STORY-MIGRATION.md +0 -99
  40. package/cli-update-docs/JTBD-MASTER-PROMPT-ABOUT.md +0 -133
  41. package/cli-update-docs/JTBD-MASTER-PROMPT.md +0 -147
  42. package/cli-update-docs/LINER-MASTER.md +0 -546
  43. package/cli-update-docs/MIXTAPE-FORMAT.md +0 -398
  44. package/cli-update-docs/PLATFORM.md +0 -210
  45. package/cli-update-docs/TUI-BACKLOG.md +0 -155
  46. package/dist/App.js +0 -220
  47. package/dist/App.js.map +0 -1
  48. package/dist/colors.js +0 -132
  49. package/dist/colors.js.map +0 -1
  50. package/dist/components/Header.js +0 -15
  51. package/dist/components/Header.js.map +0 -1
  52. package/dist/components/KeyHints.js +0 -17
  53. package/dist/components/KeyHints.js.map +0 -1
  54. package/dist/components/LabeledBox.js +0 -53
  55. package/dist/components/LabeledBox.js.map +0 -1
  56. package/dist/components/NextSteps.js +0 -18
  57. package/dist/components/NextSteps.js.map +0 -1
  58. package/dist/index.js +0 -17
  59. package/dist/index.js.map +0 -1
  60. package/dist/screens/AgentSetup.js +0 -224
  61. package/dist/screens/AgentSetup.js.map +0 -1
  62. package/dist/screens/BootSplash.js +0 -163
  63. package/dist/screens/BootSplash.js.map +0 -1
  64. package/dist/screens/CompileView.js +0 -567
  65. package/dist/screens/CompileView.js.map +0 -1
  66. package/dist/screens/FramingConfirmReview.js +0 -197
  67. package/dist/screens/FramingConfirmReview.js.map +0 -1
  68. package/dist/screens/Gate1Review.js +0 -147
  69. package/dist/screens/Gate1Review.js.map +0 -1
  70. package/dist/screens/Gate2Review.js +0 -162
  71. package/dist/screens/Gate2Review.js.map +0 -1
  72. package/dist/screens/ImportPrompt.js +0 -173
  73. package/dist/screens/ImportPrompt.js.map +0 -1
  74. package/dist/screens/JsSetup.js +0 -77
  75. package/dist/screens/JsSetup.js.map +0 -1
  76. package/dist/screens/LocalFilePicker.js +0 -139
  77. package/dist/screens/LocalFilePicker.js.map +0 -1
  78. package/dist/screens/NewMixtapeWizard.js +0 -662
  79. package/dist/screens/NewMixtapeWizard.js.map +0 -1
  80. package/dist/screens/PhaseRunner.js +0 -1203
  81. package/dist/screens/PhaseRunner.js.map +0 -1
  82. package/dist/screens/ProcessManifest.js +0 -160
  83. package/dist/screens/ProcessManifest.js.map +0 -1
  84. package/dist/screens/ProjectHub.js +0 -557
  85. package/dist/screens/ProjectHub.js.map +0 -1
  86. package/dist/screens/SourceModal.js +0 -269
  87. package/dist/screens/SourceModal.js.map +0 -1
  88. package/dist/screens/TapeBrowser.js +0 -312
  89. package/dist/screens/TapeBrowser.js.map +0 -1
  90. package/dist/screens/TapeDraftReview.js +0 -444
  91. package/dist/screens/TapeDraftReview.js.map +0 -1
  92. package/dist/screens/TapeEditor.js +0 -310
  93. package/dist/screens/TapeEditor.js.map +0 -1
  94. package/dist/screens/cassette-art.js +0 -72
  95. package/dist/screens/cassette-art.js.map +0 -1
  96. package/dist/store.js +0 -10
  97. package/dist/store.js.map +0 -1
@@ -1,53 +0,0 @@
1
- import React from "react";
2
- import { Box, Text, useStdout } from "ink";
3
- import { ON_FILL, STRUCTURE } from "../colors.js";
4
- // Charm/Lipgloss-style card: a bordered box with a chip on the top border line.
5
- // Inspired by the Daytona TUI screenshots — the chip provides a clear card label
6
- // that doesn't waste a content line.
7
- //
8
- // Implementation: Ink 5 lets us toggle each side of a border independently
9
- // (borderTop={false}). We render the top border ourselves as a manual row of
10
- // characters with the chip embedded, then let Ink draw the side + bottom
11
- // borders normally. The corner glyphs must match between the manual top row
12
- // and Ink's border style — both use the same "round" or "single" set.
13
- const ROUND = {
14
- topLeft: "╭",
15
- topRight: "╮",
16
- h: "─",
17
- };
18
- const SINGLE = {
19
- topLeft: "┌",
20
- topRight: "┐",
21
- h: "─",
22
- };
23
- const DOUBLE = {
24
- topLeft: "╔",
25
- topRight: "╗",
26
- h: "═",
27
- };
28
- export function LabeledBox({ label, color = STRUCTURE, labelBg, labelColor = ON_FILL, borderStyle = "round", width, paddingX = 2, paddingY = 1, children, }) {
29
- // Default chip bg = border color, so the chip looks like a solid section
30
- // of the top border. Callers can opt out by passing a different bg.
31
- const resolvedLabelBg = labelBg ?? color;
32
- const { stdout } = useStdout();
33
- const cols = stdout?.columns ?? 80;
34
- // Default width: terminal minus a 2-cell right margin so the box doesn't
35
- // butt against the edge of the pane. Floor at 40 so things don't collapse
36
- // in very narrow terminals.
37
- const w = Math.max(40, width ?? cols - 2);
38
- const chars = borderStyle === "round" ? ROUND : borderStyle === "double" ? DOUBLE : SINGLE;
39
- // Truncate the label if it would overflow the top row.
40
- // Budget: 2 corners + 2 leading dashes + " label " + at least 1 filler dash.
41
- const maxLabelLen = Math.max(4, w - 2 - 2 - 2 - 1);
42
- const safeLabel = label.length > maxLabelLen ? label.slice(0, maxLabelLen - 1) + "…" : label;
43
- const labelText = ` ${safeLabel} `;
44
- const leadDashes = 2;
45
- const filler = Math.max(1, w - 2 - leadDashes - labelText.length);
46
- return (React.createElement(Box, { flexDirection: "column", width: w },
47
- React.createElement(Box, { width: w },
48
- React.createElement(Text, { color: color }, chars.topLeft + chars.h.repeat(leadDashes)),
49
- React.createElement(Text, { backgroundColor: resolvedLabelBg, color: labelColor, bold: true }, labelText),
50
- React.createElement(Text, { color: color }, chars.h.repeat(filler) + chars.topRight)),
51
- React.createElement(Box, { borderStyle: borderStyle, borderColor: color, borderTop: false, flexDirection: "column", width: w, paddingX: paddingX, paddingY: paddingY }, children)));
52
- }
53
- //# sourceMappingURL=LabeledBox.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LabeledBox.js","sourceRoot":"","sources":["../../src/components/LabeledBox.tsx"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import React from "react";
2
- import { Box, Text } from "ink";
3
- import { MUTED, STRUCTURE } from "../colors.js";
4
- /**
5
- * Bordered callout listing what to do next. Modeled on `clack`'s `p.note()`.
6
- * Use after a wizard completes, a compile succeeds, or any other moment
7
- * where the user just finished a discrete unit of work.
8
- */
9
- export function NextSteps({ title = "Next steps", items, color = STRUCTURE, }) {
10
- return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: color, paddingX: 2, paddingY: 0, marginBottom: 1 },
11
- React.createElement(Box, { marginBottom: 1 },
12
- React.createElement(Text, { color: color, bold: true }, title)),
13
- items.map((item, i) => (React.createElement(Box, { key: i },
14
- React.createElement(Text, { color: color }, `${i + 1}. `),
15
- React.createElement(Text, null, item.label),
16
- item.hint ? (React.createElement(Text, { color: MUTED }, " " + item.hint)) : null)))));
17
- }
18
- //# sourceMappingURL=NextSteps.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NextSteps.js","sourceRoot":"","sources":["../../src/components/NextSteps.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAShD;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,GAAG,YAAY,EACpB,KAAK,EACL,KAAK,GAAG,SAAS,GAKlB;IACC,OAAO,CACL,oBAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,EAClB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,EACX,YAAY,EAAE,CAAC;QAEf,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,UACrB,KAAK,CACD,CACH;QACL,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC;YACT,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAQ;YACzC,oBAAC,IAAI,QAAE,IAAI,CAAC,KAAK,CAAQ;YACxB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACX,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAQ,CAC9C,CAAC,CAAC,CAAC,IAAI,CACJ,CACP,CAAC,CACE,CACP,CAAC;AACJ,CAAC"}
package/dist/index.js DELETED
@@ -1,17 +0,0 @@
1
- import React from "react";
2
- import { render } from "ink";
3
- import { App } from "./App.js";
4
- // Clear the terminal (screen + scrollback) before Ink mounts so the TUI
5
- // starts at the top of a blank canvas — no `npm run dev` lines visible above
6
- // the splash. `\x1B[2J` = erase visible viewport, `\x1B[3J` = erase scrollback,
7
- // `\x1B[H` = home cursor.
8
- if (process.stdout.isTTY) {
9
- process.stdout.write("\x1B[2J\x1B[3J\x1B[H");
10
- }
11
- const { waitUntilExit } = render(React.createElement(App, null));
12
- waitUntilExit().catch((e) => {
13
- // eslint-disable-next-line no-console
14
- console.error(e);
15
- process.exit(1);
16
- });
17
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,wEAAwE;AACxE,6EAA6E;AAC7E,gFAAgF;AAChF,0BAA0B;AAC1B,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,oBAAC,GAAG,OAAG,CAAC,CAAC;AAC1C,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;IACnC,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,224 +0,0 @@
1
- import React, { useMemo, useState } from "react";
2
- import { Box, Text, useInput } from "ink";
3
- import { Header } from "../components/Header.js";
4
- import { KeyHints } from "../components/KeyHints.js";
5
- import { LabeledBox } from "../components/LabeledBox.js";
6
- import { useApp } from "../store.js";
7
- import { detectAgents, KNOWN_AGENTS } from "../agents/detect.js";
8
- import { readConfig, writeConfig } from "../config.js";
9
- import { MUTED, CURRENT, ERROR, HEADING, STRUCTURE, SUCCESS } from "../colors.js";
10
- // One-time picker for "which AI agent should drive the methodology phases?"
11
- // — runs as the first screen on a fresh install when both Claude Code and
12
- // Codex are present, and is reachable later via the splash Settings entry.
13
- //
14
- // Persists the choice to ~/.liner/config.yaml (via the config module). The
15
- // LINER_AGENT env var still overrides — power users / CI keep the escape
16
- // hatch. The mid-phase picker becomes dead code in practice but stays bound
17
- // as a defensive fallback (e.g. config file disappears, env var names a
18
- // non-installed agent).
19
- /**
20
- * Source of truth for what the screen says about each agent. Kept inline so
21
- * the copy lives with the screen that shows it, rather than in agents/types
22
- * (which is where the cold type lives).
23
- */
24
- const AGENT_BLURBS = {
25
- claude: {
26
- tagline: "Anthropic's Claude Code — strong at long-context tasks and at writing prose.",
27
- install: "npm install -g @anthropic-ai/claude-code",
28
- },
29
- codex: {
30
- tagline: "OpenAI Codex — fast for code-heavy phases, snappy on shorter prompts.",
31
- install: "see https://github.com/openai/codex",
32
- },
33
- };
34
- export function AgentSetup() {
35
- const app = useApp();
36
- const installed = useMemo(() => detectAgents(), []);
37
- const config = useMemo(() => readConfig(), []);
38
- // Agents the TUI knows about but didn't find on this machine. Surfaced as
39
- // a footer so a user with (e.g.) Codex installed via fnm but unreachable
40
- // from the TUI's PATH has a concrete unblock path rather than just "not
41
- // detected." The KNOWN_AGENTS catalog is the single source of truth.
42
- const undetected = useMemo(() => KNOWN_AGENTS.filter((meta) => !installed.some((a) => a.id === meta.id)), [installed]);
43
- // Where the cursor lands by default: the currently-configured agent if
44
- // it's installed, otherwise the first one. New installs start at index 0.
45
- const initialIndex = useMemo(() => {
46
- if (config.agent) {
47
- const idx = installed.findIndex((a) => a.id === config.agent);
48
- if (idx >= 0)
49
- return idx;
50
- }
51
- return 0;
52
- }, [installed, config.agent]);
53
- const [cursor, setCursor] = useState(initialIndex);
54
- const [error, setError] = useState(null);
55
- /**
56
- * Return to wherever launched this screen. If the JS-rendering onboarding
57
- * has not been shown yet, continue the first-run flow there before home.
58
- */
59
- function done() {
60
- if (!config.jsSetupPrompted) {
61
- app.navigate({ kind: "jsSetup" });
62
- return;
63
- }
64
- app.back();
65
- }
66
- function pick(agent) {
67
- try {
68
- writeConfig({ agent: agent.id });
69
- app.setNotification({
70
- kind: "info",
71
- message: `Agent set to ${agent.name}. Change anytime from the splash menu.`,
72
- });
73
- done();
74
- }
75
- catch (e) {
76
- setError(`Could not write config: ${e.message}`);
77
- }
78
- }
79
- function clearChoice() {
80
- try {
81
- writeConfig({ agent: null });
82
- app.setNotification({
83
- kind: "info",
84
- message: "Cleared agent preference. The mid-phase picker will appear when needed.",
85
- });
86
- done();
87
- }
88
- catch (e) {
89
- setError(`Could not write config: ${e.message}`);
90
- }
91
- }
92
- useInput((input, key) => {
93
- if (installed.length === 0) {
94
- if (key.escape || input === "b")
95
- done();
96
- return;
97
- }
98
- if (key.upArrow || input === "k") {
99
- setCursor((c) => Math.max(0, c - 1));
100
- }
101
- else if (key.downArrow || input === "j") {
102
- setCursor((c) => Math.min(installed.length - 1, c + 1));
103
- }
104
- else if (key.return) {
105
- // Enter accepts; space is intentionally NOT an accept key — it's
106
- // reserved for toggle semantics elsewhere, so we keep one meaning per key.
107
- const agent = installed[cursor];
108
- if (agent)
109
- pick(agent);
110
- }
111
- else if (input === "u" && config.agent) {
112
- clearChoice();
113
- }
114
- else if (key.escape || input === "b") {
115
- done();
116
- }
117
- });
118
- // Zero-agent state: instructions, no picker. User can't proceed without
119
- // an agent for methodology phases — but they can still browse compiled
120
- // mixtapes, so we let them through to the browser.
121
- if (installed.length === 0) {
122
- return (React.createElement(Box, { flexDirection: "column" },
123
- React.createElement(Header, { title: "choose your AI agent", subtitle: "first-run setup" }),
124
- React.createElement(Box, { marginBottom: 1 },
125
- React.createElement(LabeledBox, { label: "no agent installed", color: ERROR },
126
- React.createElement(Text, { color: ERROR, bold: true }, "Neither Claude Code nor Codex was found on your PATH."),
127
- React.createElement(Box, { marginTop: 1, flexDirection: "column" },
128
- React.createElement(Text, null, "Liner can run the methodology with either:"),
129
- React.createElement(Box, { marginTop: 1, flexDirection: "column" },
130
- React.createElement(Text, null,
131
- " ",
132
- React.createElement(Text, { color: STRUCTURE, bold: true }, "Claude Code"),
133
- React.createElement(Text, { color: MUTED },
134
- " — ",
135
- AGENT_BLURBS.claude.install)),
136
- React.createElement(Text, null,
137
- " ",
138
- React.createElement(Text, { color: STRUCTURE, bold: true }, "OpenAI Codex"),
139
- React.createElement(Text, { color: MUTED },
140
- " — ",
141
- AGENT_BLURBS.codex.install)))),
142
- React.createElement(Box, { marginTop: 1 },
143
- React.createElement(Text, { color: MUTED },
144
- "You can still browse compiled mixtapes without an agent \u2014 just press ",
145
- React.createElement(Text, { color: STRUCTURE }, "esc"),
146
- " to continue.")))),
147
- React.createElement(KeyHints, { hints: [{ key: "esc", label: "skip to browser" }] })));
148
- }
149
- return (React.createElement(Box, { flexDirection: "column" },
150
- React.createElement(Header, { title: "choose your AI agent", subtitle: config.agent
151
- ? `current: ${config.agent} · change anytime`
152
- : "first-run setup · pick once, change anytime" }),
153
- React.createElement(Box, { marginBottom: 1, flexDirection: "column" },
154
- React.createElement(Text, { color: HEADING, bold: true }, "Which agent should drive the methodology?"),
155
- React.createElement(Box, { marginTop: 1 },
156
- React.createElement(Text, { color: MUTED }, "Liner spawns the agent CLI for each methodology phase (framing, candidate discovery, evaluation, \u2026). Both options run the same skill bundle and produce the same artifacts \u2014 pick the one you already use, or default to whichever is faster on your hardware. You can change this later from the splash menu's Settings entry."))),
157
- React.createElement(Box, { marginBottom: 1 },
158
- React.createElement(LabeledBox, { label: "installed agents", color: STRUCTURE }, installed.map((agent, i) => {
159
- const active = i === cursor;
160
- const blurb = AGENT_BLURBS[agent.id];
161
- const isConfigured = config.agent === agent.id;
162
- return (React.createElement(Box, { key: agent.id, flexDirection: "column", marginBottom: i === installed.length - 1 ? 0 : 1 },
163
- React.createElement(Box, null,
164
- React.createElement(Text, { color: active ? CURRENT : undefined, bold: active }, active ? "> " : " "),
165
- React.createElement(Text, { color: STRUCTURE }, `[${i + 1}]`),
166
- React.createElement(Text, null, " "),
167
- React.createElement(Text, { color: active ? CURRENT : undefined, bold: active }, agent.name),
168
- isConfigured ? (React.createElement(Text, { color: SUCCESS }, " · current")) : null),
169
- blurb ? (React.createElement(Box, { paddingLeft: 6 },
170
- React.createElement(Text, { color: MUTED }, blurb.tagline))) : null,
171
- React.createElement(Box, { paddingLeft: 6 },
172
- React.createElement(Text, { color: MUTED }, agent.bin))));
173
- }))),
174
- React.createElement(Box, { marginBottom: 1 },
175
- React.createElement(Text, { color: STRUCTURE }, "enter"),
176
- React.createElement(Text, { color: MUTED }, ` → pick ${installed[cursor]?.name ?? "agent"} and continue`)),
177
- undetected.length > 0 ? (React.createElement(Box, { marginBottom: 1 },
178
- React.createElement(LabeledBox, { label: "not detected", color: STRUCTURE },
179
- React.createElement(Text, { color: MUTED },
180
- undetected.length === 1
181
- ? `${undetected[0].name} isn't on Liner's PATH right now.`
182
- : `${undetected.map((u) => u.name).join(" and ")} aren't on Liner's PATH right now.`,
183
- " ",
184
- "If you have one installed but it's not showing up \u2014 usually fnm / nvm / asdf shims that aren't loaded in the launcher's environment \u2014 try one of:"),
185
- React.createElement(Box, { marginTop: 1, flexDirection: "column" },
186
- React.createElement(Text, { color: MUTED },
187
- " • ",
188
- "Restart the TUI from a shell where",
189
- " ",
190
- React.createElement(Text, { color: STRUCTURE },
191
- "which ",
192
- undetected[0].id),
193
- " ",
194
- "returns a path."),
195
- React.createElement(Text, { color: MUTED },
196
- " • ",
197
- "Set",
198
- " ",
199
- React.createElement(Text, { color: STRUCTURE },
200
- undetected[0].envVar,
201
- "=/full/path/to/",
202
- undetected[0].id),
203
- " ",
204
- "in your shell config (or pass it inline:",
205
- " ",
206
- React.createElement(Text, { color: STRUCTURE },
207
- undetected[0].envVar,
208
- "=\u2026 npm run dev"),
209
- ")."),
210
- React.createElement(Text, { color: MUTED },
211
- " • ",
212
- "If you don't have it installed yet:",
213
- " ",
214
- React.createElement(Text, { color: STRUCTURE }, AGENT_BLURBS[undetected[0].id]?.install ?? "(install instructions vary)")))))) : null,
215
- error ? (React.createElement(Box, { marginBottom: 1 },
216
- React.createElement(Text, { color: ERROR }, error))) : null,
217
- React.createElement(KeyHints, { hints: [
218
- { key: "↑↓", label: "select" },
219
- { key: "enter", label: "pick + save" },
220
- ...(config.agent ? [{ key: "u", label: "clear preference" }] : []),
221
- { key: "esc", label: "skip" },
222
- ] })));
223
- }
224
- //# sourceMappingURL=AgentSetup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentSetup.js","sourceRoot":"","sources":["../../src/screens/AgentSetup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGlF,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,4EAA4E;AAC5E,wEAAwE;AACxE,wBAAwB;AAExB;;;;GAIG;AACH,MAAM,YAAY,GAAyD;IACzE,MAAM,EAAE;QACN,OAAO,EAAE,8EAA8E;QACvF,OAAO,EAAE,0CAA0C;KACpD;IACD,KAAK,EAAE;QACL,OAAO,EAAE,uEAAuE;QAChF,OAAO,EAAE,qCAAqC;KAC/C;CACF,CAAC;AAEF,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,0EAA0E;IAC1E,yEAAyE;IACzE,wEAAwE;IACxE,qEAAqE;IACrE,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CACH,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,EACzE,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,uEAAuE;IACvE,0EAA0E;IAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9D,IAAI,GAAG,IAAI,CAAC;gBAAE,OAAO,GAAG,CAAC;QAC3B,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD;;;OAGG;IACH,SAAS,IAAI;QACX,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC5B,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED,SAAS,IAAI,CAAC,KAAsB;QAClC,IAAI,CAAC;YACH,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,GAAG,CAAC,eAAe,CAAC;gBAClB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,gBAAgB,KAAK,CAAC,IAAI,wCAAwC;aAC5E,CAAC,CAAC;YACH,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,2BAA4B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,SAAS,WAAW;QAClB,IAAI,CAAC;YACH,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7B,GAAG,CAAC,eAAe,CAAC;gBAClB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,yEAAyE;aACnF,CAAC,CAAC;YACH,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,2BAA4B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,KAAK,GAAG;gBAAE,IAAI,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACjC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC1C,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACtB,iEAAiE;YACjE,2EAA2E;YAC3E,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,KAAK;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACzC,WAAW,EAAE,CAAC;QAChB,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACvC,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,uEAAuE;IACvE,mDAAmD;IACnD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACzB,oBAAC,MAAM,IAAC,KAAK,EAAC,sBAAsB,EAAC,QAAQ,EAAC,iBAAiB,GAAG;YAClE,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;gBAClB,oBAAC,UAAU,IAAC,KAAK,EAAC,oBAAoB,EAAC,KAAK,EAAE,KAAK;oBACjD,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,kEAEjB;oBACP,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;wBACvC,oBAAC,IAAI,qDAAkD;wBACvD,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;4BACvC,oBAAC,IAAI;gCACF,IAAI;gCACL,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS,EAAE,IAAI,wBAAmB;gCAC/C,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;oCAAG,KAAK;oCAAE,YAAY,CAAC,MAAO,CAAC,OAAO,CAAQ,CAC3D;4BACP,oBAAC,IAAI;gCACF,IAAI;gCACL,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS,EAAE,IAAI,yBAAoB;gCAChD,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;oCAAG,KAAK;oCAAE,YAAY,CAAC,KAAM,CAAC,OAAO,CAAQ,CAC1D,CACH,CACF;oBACN,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;wBACf,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;;4BAEV,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS,UAAY;4CACnC,CACH,CACK,CACT;YAEN,oBAAC,QAAQ,IAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,GAAI,CAC3D,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,MAAM,IACL,KAAK,EAAC,sBAAsB,EAC5B,QAAQ,EACN,MAAM,CAAC,KAAK;gBACV,CAAC,CAAC,YAAY,MAAM,CAAC,KAAK,mBAAmB;gBAC7C,CAAC,CAAC,6CAA6C,GAEnD;QAEF,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;YAC1C,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,EAAE,IAAI,sDAAiD;YAC3E,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;gBACf,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,gVAMX,CACH,CACF;QAEN,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,UAAU,IAAC,KAAK,EAAC,kBAAkB,EAAC,KAAK,EAAE,SAAS,IAClD,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC1B,MAAM,MAAM,GAAG,CAAC,KAAK,MAAM,CAAC;gBAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC;gBAC/C,OAAO,CACL,oBAAC,GAAG,IAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzF,oBAAC,GAAG;wBACF,oBAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,IACpD,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAChB;wBACP,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS,IAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAQ;wBAC7C,oBAAC,IAAI,QAAE,IAAI,CAAQ;wBACnB,oBAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,IACpD,KAAK,CAAC,IAAI,CACN;wBACN,YAAY,CAAC,CAAC,CAAC,CACd,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,IAAG,cAAc,CAAQ,CAC9C,CAAC,CAAC,CAAC,IAAI,CACJ;oBACL,KAAK,CAAC,CAAC,CAAC,CACP,oBAAC,GAAG,IAAC,WAAW,EAAE,CAAC;wBACjB,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,KAAK,CAAC,OAAO,CAAQ,CACtC,CACP,CAAC,CAAC,CAAC,IAAI;oBACR,oBAAC,GAAG,IAAC,WAAW,EAAE,CAAC;wBACjB,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,KAAK,CAAC,GAAG,CAAQ,CAClC,CACF,CACP,CAAC;YACJ,CAAC,CAAC,CACS,CACT;QAEN,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS,YAAc;YACpC,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,WAAW,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,OAAO,eAAe,CAAQ,CACrF;QAEL,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACvB,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,UAAU,IAAC,KAAK,EAAC,cAAc,EAAC,KAAK,EAAE,SAAS;gBAC/C,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;oBACf,UAAU,CAAC,MAAM,KAAK,CAAC;wBACtB,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC,IAAI,mCAAmC;wBAC3D,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,oCAAoC;oBACrF,GAAG;kLAGC;gBACP,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;oBACvC,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;wBACf,MAAM;;wBAAoC,GAAG;wBAC9C,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS;;4BAAS,UAAU,CAAC,CAAC,CAAE,CAAC,EAAE,CAAQ;wBAAC,GAAG;0CAEvD;oBACP,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;wBACf,MAAM;;wBAAK,GAAG;wBACf,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS;4BAAG,UAAU,CAAC,CAAC,CAAE,CAAC,MAAM;;4BAAiB,UAAU,CAAC,CAAC,CAAE,CAAC,EAAE,CAAQ;wBAAC,GAAG;;wBACnD,GAAG;wBAC5C,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS;4BAAG,UAAU,CAAC,CAAC,CAAE,CAAC,MAAM;kDAAsB;6BAC/D;oBACP,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK;wBACf,MAAM;;wBAAqC,GAAG;wBAC/C,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS,IAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,EAAE,OAAO,IAAI,6BAA6B,CAAQ,CACrG,CACH,CACK,CACT,CACP,CAAC,CAAC,CAAC,IAAI;QAEP,KAAK,CAAC,CAAC,CAAC,CACP,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,KAAK,CAAQ,CAC9B,CACP,CAAC,CAAC,CAAC,IAAI;QAER,oBAAC,QAAQ,IACP,KAAK,EAAE;gBACL,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAC9B,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE;gBACtC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;aAC9B,GACD,CACE,CACP,CAAC;AACJ,CAAC"}
@@ -1,163 +0,0 @@
1
- import React, { useMemo, useState } from "react";
2
- import { Box, Text, useApp as useInkApp, useInput, useStdout } from "ink";
3
- import BigText from "ink-big-text";
4
- import Gradient from "ink-gradient";
5
- import { useApp } from "../store.js";
6
- import { MUTED, CURRENT, HEADING, PALETTE, STRUCTURE } from "../colors.js";
7
- import { VERSION } from "../version.js";
8
- import { SMALL_CASSETTE_ROWS, SMALL_CASSETTE_WIDTH, } from "./cassette-art.js";
9
- const ITEMS = [
10
- { action: "new", hotkey: "n", label: "New mixtape", hint: "open the curation wizard" },
11
- { action: "import", hotkey: "i", label: "Import archive", hint: "load a .mixtape file" },
12
- { action: "open", hotkey: "o", label: "Open existing", hint: "browse your mixtapes folder" },
13
- { action: "settings", hotkey: "s", label: "Settings", hint: "change AI agent" },
14
- ];
15
- export function BootSplash() {
16
- const app = useApp();
17
- const ink = useInkApp();
18
- const { stdout } = useStdout();
19
- const cols = stdout?.columns ?? 80;
20
- // Show the compact cassette whenever it fits; fall back to the wordmark
21
- // on terminals too narrow for it.
22
- const showCassette = cols >= SMALL_CASSETTE_WIDTH;
23
- const [selected, setSelected] = useState(0);
24
- function dispatch(action) {
25
- switch (action) {
26
- case "new":
27
- app.navigate({ kind: "newProject" });
28
- return;
29
- case "import":
30
- app.navigate({ kind: "import" });
31
- return;
32
- case "open":
33
- app.navigate({ kind: "browser" });
34
- return;
35
- case "settings":
36
- app.navigate({ kind: "agentSetup" });
37
- return;
38
- }
39
- }
40
- useInput((input, key) => {
41
- if (key.upArrow || input === "k") {
42
- setSelected((i) => (i - 1 + ITEMS.length) % ITEMS.length);
43
- }
44
- else if (key.downArrow || input === "j") {
45
- setSelected((i) => (i + 1) % ITEMS.length);
46
- }
47
- else if (input === "n") {
48
- dispatch("new");
49
- }
50
- else if (input === "i") {
51
- dispatch("import");
52
- }
53
- else if (input === "o") {
54
- dispatch("open");
55
- }
56
- else if (input === "s") {
57
- dispatch("settings");
58
- }
59
- else if (key.return || input === " ") {
60
- dispatch(ITEMS[selected].action);
61
- }
62
- else if (input === "q") {
63
- ink.exit();
64
- }
65
- // No esc handler: the splash is home. Esc anywhere else walks back to
66
- // here and stops — esc on home itself is a deliberate no-op.
67
- });
68
- return (React.createElement(Box, { flexDirection: "column", paddingY: 1 },
69
- showCassette ? (React.createElement(CassetteLogo, { rows: SMALL_CASSETTE_ROWS })) : (React.createElement(Gradient, { name: "vice" },
70
- React.createElement(BigText, { text: "liner", font: "block" }))),
71
- React.createElement(Box, { flexDirection: "column", paddingLeft: 2, marginTop: showCassette ? 1 : -1 },
72
- React.createElement(Box, null,
73
- React.createElement(Text, { color: STRUCTURE, bold: true }, "liner"),
74
- React.createElement(Text, { color: MUTED }, " \u00B7 curate AI-ready mixtapes from any set of sources")),
75
- React.createElement(Text, { color: MUTED },
76
- "v",
77
- VERSION)),
78
- React.createElement(Box, { flexDirection: "column", paddingLeft: 2, marginTop: 1 },
79
- React.createElement(Text, { color: HEADING, bold: true }, "Get started"),
80
- React.createElement(Box, { marginTop: 1, flexDirection: "column" }, ITEMS.map((item, i) => (React.createElement(MenuRow, { key: item.action, item: item, active: i === selected }))))),
81
- React.createElement(Box, { marginTop: 1, paddingLeft: 2 },
82
- React.createElement(Text, { color: MUTED }, "\u2191\u2193 navigate \u00B7 "),
83
- React.createElement(Text, { color: STRUCTURE }, "enter"),
84
- React.createElement(Text, { color: MUTED }, " select \u00B7 "),
85
- React.createElement(Text, { color: STRUCTURE }, "[n]"),
86
- React.createElement(Text, { color: MUTED }, " "),
87
- React.createElement(Text, { color: STRUCTURE }, "[i]"),
88
- React.createElement(Text, { color: MUTED }, " "),
89
- React.createElement(Text, { color: STRUCTURE }, "[o]"),
90
- React.createElement(Text, { color: MUTED }, " "),
91
- React.createElement(Text, { color: STRUCTURE }, "[s]"),
92
- React.createElement(Text, { color: MUTED }, " direct shortcuts \u00B7 "),
93
- React.createElement(Text, { color: STRUCTURE }, "q"),
94
- React.createElement(Text, { color: MUTED }, " quit"))));
95
- }
96
- /**
97
- * Render the ASCII cassette logo with every non-space character painted in
98
- * a randomly-chosen palette color. The randomization is computed once per
99
- * mount (via useMemo) — re-randomizing on every re-render would flicker.
100
- *
101
- * For perf we group consecutive characters that landed on the same color
102
- * into runs so each row ships a handful of `Text` nodes instead of one per
103
- * character — Ink mounts a separate element per `<Text>`, and 66 elements
104
- * × 19 rows × every re-paint adds up.
105
- *
106
- * Spaces are emitted as their own color-less run so we don't burn nodes
107
- * coloring invisible cells.
108
- */
109
- function CassetteLogo({ rows }) {
110
- const colored = useMemo(() => rows.map(colorizeRow), [rows]);
111
- return (React.createElement(Box, { flexDirection: "column" }, colored.map((runs, rowIdx) => (React.createElement(Box, { key: rowIdx }, runs.map((run, runIdx) => (React.createElement(Text, { key: runIdx, color: run.color }, run.chars))))))));
112
- }
113
- // Logo coloring mode:
114
- // "solid" — every glyph in the brand orange (STRUCTURE). Current default.
115
- // "random" — each glyph gets a random palette color (the original look).
116
- // Flip this to "random" to bring back the multicolor cassette.
117
- const LOGO_COLOR_MODE = "solid";
118
- function glyphColor() {
119
- return LOGO_COLOR_MODE === "solid"
120
- ? STRUCTURE
121
- : PALETTE[Math.floor(Math.random() * PALETTE.length)];
122
- }
123
- function colorizeRow(row) {
124
- const runs = [];
125
- for (const ch of row) {
126
- // Spaces don't need coloring — collapse them into uncolored runs so we
127
- // don't allocate a color per blank cell.
128
- const color = ch === " " ? undefined : glyphColor();
129
- const tail = runs[runs.length - 1];
130
- if (tail && tail.color === color) {
131
- tail.chars += ch;
132
- }
133
- else {
134
- runs.push({ color, chars: ch });
135
- }
136
- }
137
- return runs;
138
- }
139
- function MenuRow({ item, active }) {
140
- // ASCII ">" is guaranteed single-cell. The unicode ▶ glyph renders
141
- // double-wide in many terminal fonts, which made the inactive rows shift
142
- // every time the user moved the selection. Using a fixed two-char prefix
143
- // ("> " or " ") keeps every row anchored at the same column.
144
- return (React.createElement(Box, null,
145
- React.createElement(Text, { color: active ? CURRENT : undefined, bold: active }, active ? "> " : " "),
146
- React.createElement(Text, { color: STRUCTURE }, `[${item.hotkey}]`),
147
- React.createElement(Text, null, " "),
148
- React.createElement(Text, { color: active ? CURRENT : undefined, bold: active }, item.label.padEnd(18, " ")),
149
- React.createElement(Text, { color: MUTED }, item.hint)));
150
- }
151
- export function shouldShowSplash() {
152
- if (process.env["LINER_NO_SPLASH"])
153
- return false;
154
- if (!process.stdout.isTTY)
155
- return false;
156
- // Narrow terminals (< 60 cols) can't render the big-text wordmark well —
157
- // skip rather than show a clipped logo.
158
- const cols = process.stdout.columns ?? 80;
159
- if (cols < 60)
160
- return false;
161
- return true;
162
- }
163
- //# sourceMappingURL=BootSplash.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BootSplash.js","sourceRoot":"","sources":["../../src/screens/BootSplash.tsx"],"names":[],"mappings":"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"}