linersh 0.5.6 → 1.0.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 (98) hide show
  1. package/README.md +65 -165
  2. package/bin/liner.js +82 -44
  3. package/cli-update-docs/ABOUT.md +16 -16
  4. package/cli-update-docs/AI-HANDOFF.md +62 -190
  5. package/cli-update-docs/CURATION.md +48 -19
  6. package/cli-update-docs/JTBD-MASTER-PROMPT-ABOUT.md +9 -12
  7. package/cli-update-docs/JTBD-MASTER-PROMPT.md +1 -1
  8. package/cli-update-docs/LINER-MASTER.md +77 -63
  9. package/cli-update-docs/LINER-MD-PRD.md +531 -0
  10. package/cli-update-docs/MIXTAPE-FORMAT.md +76 -44
  11. package/cli-update-docs/PLATFORM.md +47 -46
  12. package/cli-update-docs/README.md +6 -6
  13. package/cli-update-docs/SKILL.md +72 -37
  14. package/cli-update-docs/TUI-BACKLOG.md +205 -26
  15. package/cli-update-docs/quality-check-tests.md +256 -8
  16. package/cli-update-docs/source-finding-tactics.md +140 -3
  17. package/cli-update-docs/source-quality-hierarchy.md +83 -0
  18. package/cli-update-docs/synthesis-guidance.md +19 -5
  19. package/dist/agents/artifact-validation.js +440 -0
  20. package/dist/agents/artifact-validation.js.map +1 -0
  21. package/dist/agents/candidate-longlist.js +100 -0
  22. package/dist/agents/candidate-longlist.js.map +1 -0
  23. package/dist/agents/detect.js +3 -2
  24. package/dist/agents/detect.js.map +1 -1
  25. package/dist/agents/evaluation-assembly.js +270 -0
  26. package/dist/agents/evaluation-assembly.js.map +1 -0
  27. package/dist/agents/headless-runner.js +227 -0
  28. package/dist/agents/headless-runner.js.map +1 -0
  29. package/dist/agents/jtbd-clarify.js +42 -41
  30. package/dist/agents/jtbd-clarify.js.map +1 -1
  31. package/dist/agents/models.js +6 -7
  32. package/dist/agents/models.js.map +1 -1
  33. package/dist/agents/prompts.js +220 -20
  34. package/dist/agents/prompts.js.map +1 -1
  35. package/dist/agents/runner.js +462 -21
  36. package/dist/agents/runner.js.map +1 -1
  37. package/dist/phases.js +13 -13
  38. package/dist/phases.js.map +1 -1
  39. package/dist/source-inbox.js +297 -0
  40. package/dist/source-inbox.js.map +1 -0
  41. package/dist/version.js +3 -9
  42. package/dist/version.js.map +1 -1
  43. package/dist/yaml-io.js +42 -11
  44. package/dist/yaml-io.js.map +1 -1
  45. package/package.json +26 -23
  46. package/cli-update-docs/JOB-STORY-MIGRATION.md +0 -99
  47. package/dist/App.js +0 -220
  48. package/dist/App.js.map +0 -1
  49. package/dist/colors.js +0 -132
  50. package/dist/colors.js.map +0 -1
  51. package/dist/components/Header.js +0 -15
  52. package/dist/components/Header.js.map +0 -1
  53. package/dist/components/KeyHints.js +0 -17
  54. package/dist/components/KeyHints.js.map +0 -1
  55. package/dist/components/LabeledBox.js +0 -53
  56. package/dist/components/LabeledBox.js.map +0 -1
  57. package/dist/components/NextSteps.js +0 -18
  58. package/dist/components/NextSteps.js.map +0 -1
  59. package/dist/index.js +0 -17
  60. package/dist/index.js.map +0 -1
  61. package/dist/screens/AgentSetup.js +0 -224
  62. package/dist/screens/AgentSetup.js.map +0 -1
  63. package/dist/screens/BootSplash.js +0 -163
  64. package/dist/screens/BootSplash.js.map +0 -1
  65. package/dist/screens/CompileView.js +0 -567
  66. package/dist/screens/CompileView.js.map +0 -1
  67. package/dist/screens/FramingConfirmReview.js +0 -197
  68. package/dist/screens/FramingConfirmReview.js.map +0 -1
  69. package/dist/screens/Gate1Review.js +0 -147
  70. package/dist/screens/Gate1Review.js.map +0 -1
  71. package/dist/screens/Gate2Review.js +0 -162
  72. package/dist/screens/Gate2Review.js.map +0 -1
  73. package/dist/screens/ImportPrompt.js +0 -173
  74. package/dist/screens/ImportPrompt.js.map +0 -1
  75. package/dist/screens/JsSetup.js +0 -77
  76. package/dist/screens/JsSetup.js.map +0 -1
  77. package/dist/screens/LocalFilePicker.js +0 -139
  78. package/dist/screens/LocalFilePicker.js.map +0 -1
  79. package/dist/screens/NewMixtapeWizard.js +0 -662
  80. package/dist/screens/NewMixtapeWizard.js.map +0 -1
  81. package/dist/screens/PhaseRunner.js +0 -1203
  82. package/dist/screens/PhaseRunner.js.map +0 -1
  83. package/dist/screens/ProcessManifest.js +0 -160
  84. package/dist/screens/ProcessManifest.js.map +0 -1
  85. package/dist/screens/ProjectHub.js +0 -557
  86. package/dist/screens/ProjectHub.js.map +0 -1
  87. package/dist/screens/SourceModal.js +0 -269
  88. package/dist/screens/SourceModal.js.map +0 -1
  89. package/dist/screens/TapeBrowser.js +0 -312
  90. package/dist/screens/TapeBrowser.js.map +0 -1
  91. package/dist/screens/TapeDraftReview.js +0 -444
  92. package/dist/screens/TapeDraftReview.js.map +0 -1
  93. package/dist/screens/TapeEditor.js +0 -310
  94. package/dist/screens/TapeEditor.js.map +0 -1
  95. package/dist/screens/cassette-art.js +0 -72
  96. package/dist/screens/cassette-art.js.map +0 -1
  97. package/dist/store.js +0 -10
  98. package/dist/store.js.map +0 -1
package/dist/colors.js DELETED
@@ -1,132 +0,0 @@
1
- // Liner color palette — exactly five colors, no more.
2
- //
3
- // We use ONLY these hex values across the TUI. If you find yourself reaching
4
- // for "cyan", "red", "white", "black", or any other named color, stop and
5
- // pick one of the five below. The constraint is intentional — five colors,
6
- // consistently applied, gives the product a recognizable signature and
7
- // keeps the visual language tight.
8
- //
9
- // Palette
10
- // =======
11
- //
12
- // #ff4500 red-orange — main brand color: structure, interactivity
13
- // #00ac11 green — success / completion / progress
14
- // #b68800 goldenrod — attention, "look here now" / AI running
15
- // #ab65ff purple — heading / brand accent
16
- // #ff0086 hot pink — alarm / error
17
- // #daf1fd pale blue — light-on-dark text (chip labels, highlights)
18
- //
19
- // Roles
20
- // =====
21
- //
22
- // STRUCTURE (red-orange) — borders, chip backgrounds, hotkey labels, "this
23
- // is interactive" affordances, selection
24
- // highlight backgrounds. The main brand color and
25
- // the structural skeleton of every screen. Text
26
- // placed ON a STRUCTURE background must be light
27
- // (white / HIGHLIGHT), never black.
28
- //
29
- // CURRENT (yellow) — "you are here." The currently-selected menu
30
- // item, the chip on the focus card when its
31
- // phase is in_progress, the active selection in
32
- // every list. NEVER use for borders.
33
- //
34
- // HEADING (purple) — content section headers. Markdown `**Heading:**`
35
- // runs, wizard step questions, the "Get started"
36
- // label on the splash, "Review:" before the
37
- // confirmation table.
38
- //
39
- // SUCCESS (green) — "done." ✓ glyphs, completed phases, accepted
40
- // gates, a fully-succeeded compile, the progress
41
- // indicator's filled portion. A distinct green,
42
- // no longer the same hue as STRUCTURE.
43
- //
44
- // WARNING (yellow) — partial / draft-pending / "in flight, look at
45
- // this." Doubles up with CURRENT — both are
46
- // attention signals; the only difference is
47
- // whether the user caused it (CURRENT) or the
48
- // system did (WARNING).
49
- //
50
- // ERROR (magenta-pink) — "failed." ✗ glyphs, failed compiles, error
51
- // messages. Loud and unambiguous against the
52
- // other four colors.
53
- //
54
- // HIGHLIGHT (pale blue) — light text on dark chip backgrounds (replaces
55
- // the legacy "black on cyan" pattern), and any
56
- // place a foreground text accent should pop
57
- // against the default body color.
58
- //
59
- // MUTED (grey #9a9a9a) — secondary content. Replaces Ink's `dimColor`
60
- // prop, which dims relative to the terminal's
61
- // foreground and renders near-invisible on many
62
- // themes. An explicit grey guarantees legible
63
- // contrast on dark backgrounds while still
64
- // reading as clearly secondary.
65
- //
66
- // Default (no color) — primary body text. Most content lands here so
67
- // the colored accents have somewhere to pop.
68
- //
69
- // Box color rule (the only rule)
70
- // ==============================
71
- //
72
- // **Border and chip share the same color**, always. The chip is a solid
73
- // section of the top border line; visually they're one element, so they
74
- // can never disagree.
75
- //
76
- // default state → STRUCTURE (teal)
77
- // current / "you are here" → CURRENT (yellow)
78
- // running / in-flight → CURRENT (yellow) — same as current
79
- // done / accepted → SUCCESS (teal)
80
- // partial / warn / draft → WARNING (yellow)
81
- // failed → ERROR (magenta-pink)
82
- //
83
- // Pass exactly ONE color to `LabeledBox` via the `color` prop and the chip
84
- // background follows automatically. Don't override `labelBg` separately
85
- // unless you have a specific reason (e.g. the Header brand chip).
86
- // Raw palette values. Prefer the role aliases below — these are exported
87
- // for the cassette logo and any other place that wants the full palette
88
- // (e.g. a random pick per character).
89
- // Constant names (TEAL / YELLOW / MAGENTA) describe the role they
90
- // historically held, not the literal hex. Callers import the role aliases
91
- // below (STRUCTURE / CURRENT / HEADING / etc.) — renaming the raw
92
- // constants would churn unrelated files without changing behavior.
93
- export const COLOR_ORANGE = "#ff4500"; // red-orange — the main brand color
94
- export const COLOR_TEAL = "#00ac11"; // a true green (success / progress)
95
- export const COLOR_YELLOW = "#b68800"; // a goldenrod (attention / running)
96
- export const COLOR_PURPLE = "#ab65ff"; // a vibrant purple (headings)
97
- export const COLOR_MAGENTA = "#ff0086"; // a hot pink (errors)
98
- export const COLOR_PALE = "#daf1fd";
99
- export const COLOR_GREY = "#9a9a9a";
100
- export const COLOR_BLACK = "#000000";
101
- /** The full palette as an array — useful for randomized rendering. */
102
- export const PALETTE = [
103
- COLOR_ORANGE,
104
- COLOR_TEAL,
105
- COLOR_YELLOW,
106
- COLOR_PURPLE,
107
- COLOR_MAGENTA,
108
- COLOR_PALE,
109
- ];
110
- // Role aliases — what every screen should import.
111
- //
112
- // STRUCTURE and SUCCESS are intentionally DIFFERENT colors now: STRUCTURE is
113
- // the red-orange brand color used for borders, chip backgrounds, selection
114
- // highlights, and hotkey labels; SUCCESS is green and reserved for ✓ glyphs,
115
- // completed phases, and the progress indicator. Anything selected with a
116
- // STRUCTURE background should use white/HIGHLIGHT text, not black — the
117
- // orange background needs a light foreground for contrast.
118
- export const STRUCTURE = COLOR_ORANGE;
119
- export const CURRENT = COLOR_YELLOW;
120
- export const HEADING = COLOR_PURPLE;
121
- export const SUCCESS = COLOR_TEAL;
122
- export const WARNING = COLOR_YELLOW;
123
- export const ERROR = COLOR_MAGENTA;
124
- export const HIGHLIGHT = COLOR_PALE;
125
- export const MUTED = COLOR_GREY;
126
- // ON_FILL — true-black foreground for text sitting on a solid colored
127
- // background (the STRUCTURE/orange selection highlight, LabeledBox label
128
- // chips, etc.). Use this instead of the named color "black": ANSI "black"
129
- // (color 0) renders as dark grey on many terminal themes and fails contrast
130
- // against the orange fill. An explicit hex guarantees true black everywhere.
131
- export const ON_FILL = COLOR_BLACK;
132
- //# sourceMappingURL=colors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import React from "react";
2
- import { Box, Text } from "ink";
3
- import { MUTED, ON_FILL, STRUCTURE } from "../colors.js";
4
- import { VERSION } from "../version.js";
5
- export function Header({ title, subtitle, }) {
6
- return (React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
7
- React.createElement(Box, null,
8
- React.createElement(Text, { backgroundColor: STRUCTURE, color: ON_FILL, bold: true }, " ▶ liner "),
9
- React.createElement(Text, null, " "),
10
- React.createElement(Text, { bold: true, color: STRUCTURE }, title),
11
- React.createElement(Text, { color: MUTED }, " · v" + VERSION)),
12
- subtitle ? (React.createElement(Box, { marginTop: 0 },
13
- React.createElement(Text, { color: MUTED, wrap: "truncate" }, subtitle))) : null));
14
- }
15
- //# sourceMappingURL=Header.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,UAAU,MAAM,CAAC,EACrB,KAAK,EACL,QAAQ,GAIT;IACC,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC;QACzC,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,UACnD,WAAW,CACP;YACP,oBAAC,IAAI,QAAE,IAAI,CAAQ;YACnB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,SAAS,IACxB,KAAK,CACD;YACP,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,QAAQ,GAAG,OAAO,CAAQ,CAC3C;QACL,QAAQ,CAAC,CAAC,CAAC,CACV,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;YACf,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,UAAU,IAAE,QAAQ,CAAQ,CACjD,CACP,CAAC,CAAC,CAAC,IAAI,CACJ,CACP,CAAC;AACJ,CAAC"}
@@ -1,17 +0,0 @@
1
- import React from "react";
2
- import { Box, Text } from "ink";
3
- import { MUTED, STRUCTURE } from "../colors.js";
4
- /**
5
- * Renders the bottom navbar of keyboard hints — a uniform, dim row of
6
- * reference bindings. The "what to press next" call-to-action lives in a
7
- * separate description line above the navbar on each screen (not in this
8
- * component), so the navbar stays a reference and doesn't compete with the
9
- * description for attention.
10
- */
11
- export function KeyHints({ hints }) {
12
- return (React.createElement(Box, { flexWrap: "wrap", columnGap: 2 }, hints.map((h) => (React.createElement(Text, { key: h.key, color: MUTED },
13
- React.createElement(Text, { color: STRUCTURE }, h.key),
14
- " ",
15
- h.label)))));
16
- }
17
- //# sourceMappingURL=KeyHints.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"KeyHints.js","sourceRoot":"","sources":["../../src/components/KeyHints.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;AAIhD;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAqB;IACnD,OAAO,CACL,oBAAC,GAAG,IAAC,QAAQ,EAAC,MAAM,EAAC,SAAS,EAAE,CAAC,IAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,oBAAC,IAAI,IAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK;QAC5B,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS,IAAG,CAAC,CAAC,GAAG,CAAQ;;QAAE,CAAC,CAAC,KAAK,CAC1C,CACR,CAAC,CACE,CACP,CAAC;AACJ,CAAC"}
@@ -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":"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"}