linersh 0.5.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 (95) hide show
  1. package/README.md +168 -0
  2. package/bin/liner.js +126 -0
  3. package/dist/App.js +195 -0
  4. package/dist/App.js.map +1 -0
  5. package/dist/agents/detect.js +102 -0
  6. package/dist/agents/detect.js.map +1 -0
  7. package/dist/agents/events.js +8 -0
  8. package/dist/agents/events.js.map +1 -0
  9. package/dist/agents/jtbd-clarify.js +144 -0
  10. package/dist/agents/jtbd-clarify.js.map +1 -0
  11. package/dist/agents/parsers.js +316 -0
  12. package/dist/agents/parsers.js.map +1 -0
  13. package/dist/agents/prompts.js +301 -0
  14. package/dist/agents/prompts.js.map +1 -0
  15. package/dist/agents/run-log.js +71 -0
  16. package/dist/agents/run-log.js.map +1 -0
  17. package/dist/agents/runner.js +180 -0
  18. package/dist/agents/runner.js.map +1 -0
  19. package/dist/agents/types.js +2 -0
  20. package/dist/agents/types.js.map +1 -0
  21. package/dist/bin-resolver.js +92 -0
  22. package/dist/bin-resolver.js.map +1 -0
  23. package/dist/browser-support.js +62 -0
  24. package/dist/browser-support.js.map +1 -0
  25. package/dist/colors.js +105 -0
  26. package/dist/colors.js.map +1 -0
  27. package/dist/components/Header.js +17 -0
  28. package/dist/components/Header.js.map +1 -0
  29. package/dist/components/KeyHints.js +10 -0
  30. package/dist/components/KeyHints.js.map +1 -0
  31. package/dist/components/LabeledBox.js +53 -0
  32. package/dist/components/LabeledBox.js.map +1 -0
  33. package/dist/components/NextSteps.js +18 -0
  34. package/dist/components/NextSteps.js.map +1 -0
  35. package/dist/config.js +88 -0
  36. package/dist/config.js.map +1 -0
  37. package/dist/editor.js +40 -0
  38. package/dist/editor.js.map +1 -0
  39. package/dist/gates.js +121 -0
  40. package/dist/gates.js.map +1 -0
  41. package/dist/index.js +17 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/ipc.js +136 -0
  44. package/dist/ipc.js.map +1 -0
  45. package/dist/phases.js +348 -0
  46. package/dist/phases.js.map +1 -0
  47. package/dist/progress.js +185 -0
  48. package/dist/progress.js.map +1 -0
  49. package/dist/screens/AgentSetup.js +217 -0
  50. package/dist/screens/AgentSetup.js.map +1 -0
  51. package/dist/screens/BootSplash.js +159 -0
  52. package/dist/screens/BootSplash.js.map +1 -0
  53. package/dist/screens/BrowserSetup.js +181 -0
  54. package/dist/screens/BrowserSetup.js.map +1 -0
  55. package/dist/screens/CompileView.js +297 -0
  56. package/dist/screens/CompileView.js.map +1 -0
  57. package/dist/screens/FramingConfirmReview.js +193 -0
  58. package/dist/screens/FramingConfirmReview.js.map +1 -0
  59. package/dist/screens/Gate1Review.js +143 -0
  60. package/dist/screens/Gate1Review.js.map +1 -0
  61. package/dist/screens/Gate2Review.js +158 -0
  62. package/dist/screens/Gate2Review.js.map +1 -0
  63. package/dist/screens/ImportPrompt.js +65 -0
  64. package/dist/screens/ImportPrompt.js.map +1 -0
  65. package/dist/screens/LocalFilePicker.js +139 -0
  66. package/dist/screens/LocalFilePicker.js.map +1 -0
  67. package/dist/screens/NewMixtapeWizard.js +662 -0
  68. package/dist/screens/NewMixtapeWizard.js.map +1 -0
  69. package/dist/screens/NewProjectPrompt.js +66 -0
  70. package/dist/screens/NewProjectPrompt.js.map +1 -0
  71. package/dist/screens/PhaseRunner.js +1119 -0
  72. package/dist/screens/PhaseRunner.js.map +1 -0
  73. package/dist/screens/ProcessManifest.js +158 -0
  74. package/dist/screens/ProcessManifest.js.map +1 -0
  75. package/dist/screens/ProjectHub.js +546 -0
  76. package/dist/screens/ProjectHub.js.map +1 -0
  77. package/dist/screens/Settings.js +72 -0
  78. package/dist/screens/Settings.js.map +1 -0
  79. package/dist/screens/SourceModal.js +269 -0
  80. package/dist/screens/SourceModal.js.map +1 -0
  81. package/dist/screens/TapeBrowser.js +277 -0
  82. package/dist/screens/TapeBrowser.js.map +1 -0
  83. package/dist/screens/TapeDraftReview.js +440 -0
  84. package/dist/screens/TapeDraftReview.js.map +1 -0
  85. package/dist/screens/TapeEditor.js +310 -0
  86. package/dist/screens/TapeEditor.js.map +1 -0
  87. package/dist/screens/cassette-art.js +72 -0
  88. package/dist/screens/cassette-art.js.map +1 -0
  89. package/dist/store.js +10 -0
  90. package/dist/store.js.map +1 -0
  91. package/dist/types.js +3 -0
  92. package/dist/types.js.map +1 -0
  93. package/dist/yaml-io.js +345 -0
  94. package/dist/yaml-io.js.map +1 -0
  95. package/package.json +54 -0
@@ -0,0 +1,139 @@
1
+ import React, { useMemo, useState } from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ import TextInput from "ink-text-input";
4
+ import { existsSync, mkdirSync, readdirSync, statSync } from "node:fs";
5
+ import { join, relative } from "node:path";
6
+ import { KeyHints } from "../components/KeyHints.js";
7
+ import { HEADING, STRUCTURE } from "../colors.js";
8
+ const SUPPORTED_EXTENSIONS = new Set([".md", ".txt", ".html", ".htm", ".pdf"]);
9
+ export function LocalFilePicker({ projectFolder, initialPath, onPick, onCancel, }) {
10
+ const personalDir = join(projectFolder, "personal");
11
+ // Lazily ensure personal/ exists.
12
+ if (!existsSync(personalDir)) {
13
+ mkdirSync(personalDir, { recursive: true });
14
+ }
15
+ const entries = useMemo(() => listEntries(personalDir, projectFolder), [
16
+ personalDir,
17
+ projectFolder,
18
+ ]);
19
+ const initialIndex = useMemo(() => {
20
+ if (!initialPath)
21
+ return 0;
22
+ const i = entries.findIndex((e) => e.relPath === initialPath);
23
+ return i >= 0 ? i : 0;
24
+ }, [entries, initialPath]);
25
+ const [selected, setSelected] = useState(initialIndex);
26
+ const [pasteMode, setPasteMode] = useState(false);
27
+ const [pasteValue, setPasteValue] = useState(initialPath ?? "personal/");
28
+ useInput((input, key) => {
29
+ if (pasteMode) {
30
+ if (key.escape)
31
+ setPasteMode(false);
32
+ return;
33
+ }
34
+ if (key.escape) {
35
+ onCancel();
36
+ return;
37
+ }
38
+ if (key.upArrow || input === "k") {
39
+ if (entries.length > 0)
40
+ setSelected((s) => Math.max(0, s - 1));
41
+ }
42
+ else if (key.downArrow || input === "j") {
43
+ if (entries.length > 0)
44
+ setSelected((s) => Math.min(entries.length - 1, s + 1));
45
+ }
46
+ else if (key.return) {
47
+ const entry = entries[selected];
48
+ if (!entry)
49
+ return;
50
+ if (!entry.supported)
51
+ return;
52
+ onPick(entry.relPath);
53
+ }
54
+ else if (input === "n") {
55
+ setPasteMode(true);
56
+ }
57
+ });
58
+ if (pasteMode) {
59
+ return (React.createElement(Box, { flexDirection: "column" },
60
+ React.createElement(Text, { color: HEADING, bold: true }, "New local file \u2014 paste a path relative to the project folder"),
61
+ React.createElement(Text, { dimColor: true },
62
+ personalDir,
63
+ "/..."),
64
+ React.createElement(Box, { marginTop: 1 },
65
+ React.createElement(Text, { color: STRUCTURE }, "path: "),
66
+ React.createElement(TextInput, { value: pasteValue, onChange: setPasteValue, onSubmit: (v) => {
67
+ const cleaned = v.trim();
68
+ if (!cleaned)
69
+ return;
70
+ onPick(cleaned);
71
+ }, placeholder: "personal/foo.pdf" })),
72
+ React.createElement(Box, { marginTop: 1 },
73
+ React.createElement(KeyHints, { hints: [
74
+ { key: "enter", label: "use this path" },
75
+ { key: "esc", label: "back" },
76
+ ] }))));
77
+ }
78
+ return (React.createElement(Box, { flexDirection: "column" },
79
+ React.createElement(Text, { color: HEADING, bold: true }, "Select a file from personal/"),
80
+ React.createElement(Text, { dimColor: true }, personalDir),
81
+ entries.length === 0 ? (React.createElement(Box, { marginTop: 1, flexDirection: "column" },
82
+ React.createElement(Text, { dimColor: true }, "(empty \u2014 put files into personal/ first, or press `n` to paste a path)"))) : (React.createElement(Box, { flexDirection: "column", marginTop: 1, marginBottom: 1 }, entries.map((entry, i) => {
83
+ const isSelected = i === selected;
84
+ const tag = entry.supported ? entry.ext.slice(1) : `${entry.ext.slice(1)} (unsupported)`;
85
+ return (React.createElement(Box, { key: entry.relPath },
86
+ React.createElement(Text, { color: isSelected ? STRUCTURE : entry.supported ? undefined : undefined },
87
+ isSelected ? "▶ " : " ",
88
+ entry.basename),
89
+ React.createElement(Text, { dimColor: true },
90
+ " ",
91
+ formatSize(entry.size),
92
+ " \u00B7 ",
93
+ tag)));
94
+ }))),
95
+ React.createElement(KeyHints, { hints: [
96
+ { key: "↑↓", label: "select" },
97
+ { key: "enter", label: "use" },
98
+ { key: "n", label: "paste path" },
99
+ { key: "esc", label: "cancel" },
100
+ ] })));
101
+ }
102
+ function listEntries(personalDir, projectFolder) {
103
+ if (!existsSync(personalDir))
104
+ return [];
105
+ const out = [];
106
+ for (const name of readdirSync(personalDir)) {
107
+ const abs = join(personalDir, name);
108
+ try {
109
+ const stat = statSync(abs);
110
+ if (!stat.isFile())
111
+ continue;
112
+ const ext = extOf(name);
113
+ out.push({
114
+ relPath: relative(projectFolder, abs),
115
+ absPath: abs,
116
+ basename: name,
117
+ size: stat.size,
118
+ ext,
119
+ supported: SUPPORTED_EXTENSIONS.has(ext),
120
+ });
121
+ }
122
+ catch {
123
+ // skip
124
+ }
125
+ }
126
+ return out.sort((a, b) => a.basename.localeCompare(b.basename));
127
+ }
128
+ function extOf(name) {
129
+ const dot = name.lastIndexOf(".");
130
+ return dot < 0 ? "" : name.slice(dot).toLowerCase();
131
+ }
132
+ function formatSize(bytes) {
133
+ if (bytes < 1024)
134
+ return `${bytes} B`;
135
+ if (bytes < 1024 * 1024)
136
+ return `${(bytes / 1024).toFixed(1)} KB`;
137
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
138
+ }
139
+ //# sourceMappingURL=LocalFilePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalFilePicker.js","sourceRoot":"","sources":["../../src/screens/LocalFilePicker.tsx"],"names":[],"mappings":"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"}