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,444 +0,0 @@
1
- import React, { useEffect, useMemo, useState } from "react";
2
- import { Box, Text, useApp as useInkApp, useInput } from "ink";
3
- import TextInput from "ink-text-input";
4
- import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
5
- import { join } from "node:path";
6
- import * as YAML from "yaml";
7
- import { Header } from "../components/Header.js";
8
- import { KeyHints } from "../components/KeyHints.js";
9
- import { LabeledBox } from "../components/LabeledBox.js";
10
- import { useApp } from "../store.js";
11
- import { detectSourceType, projectFolder, writeTape, readTape } from "../yaml-io.js";
12
- import { markPhaseComplete } from "../progress.js";
13
- import { MUTED, CURRENT, ERROR, HEADING, STRUCTURE, SUCCESS, WARNING } from "../colors.js";
14
- const DRAFT_PATH_REL = "working/07-tape-draft.yaml";
15
- const VIEWPORT = 14;
16
- export function TapeDraftReview({ tape, folder, }) {
17
- const app = useApp();
18
- const ink = useInkApp();
19
- const project = useMemo(() => projectFolder(folder), [folder]);
20
- const draftPath = useMemo(() => join(project.path, DRAFT_PATH_REL), [project]);
21
- const [tick, setTick] = useState(0);
22
- const parsed = useMemo(() => loadDraftSources(draftPath),
23
- // tick re-derives. eslint-disable-next-line react-hooks/exhaustive-deps
24
- [draftPath, tick]);
25
- const draftSources = parsed.ok ? parsed.sources : [];
26
- const sectionCounts = useMemo(() => groupBySection(draftSources), [draftSources]);
27
- const [cursor, setCursor] = useState(0);
28
- const [scrollTop, setScrollTop] = useState(0);
29
- // Inline "add my own source" prompt. Off by default; opened with `+`.
30
- // Kept as a small URL-only input so the curator's "and here's one of mine"
31
- // moment doesn't require leaving the review surface. The user can refine
32
- // note/section/kind later via $EDITOR on tape.yaml.
33
- const [addingUrl, setAddingUrl] = useState(null);
34
- // Set of source URLs (or path|citation for local_file) that the curator has
35
- // UN-checked. Everything not in this set is kept. We track exclusions rather
36
- // than inclusions so freshly-loaded drafts default to "all checked" without
37
- // an init step, and the set stays small when most sources are accepted.
38
- const [excluded, setExcluded] = useState(() => new Set());
39
- // When the draft sources list changes (e.g. refresh via R), drop any
40
- // exclusion keys that no longer match a real source.
41
- useEffect(() => {
42
- if (!parsed.ok)
43
- return;
44
- const validKeys = new Set(draftSources.map(sourceKey));
45
- setExcluded((prev) => {
46
- let changed = false;
47
- const next = new Set();
48
- for (const k of prev) {
49
- if (validKeys.has(k))
50
- next.add(k);
51
- else
52
- changed = true;
53
- }
54
- return changed ? next : prev;
55
- });
56
- // eslint-disable-next-line react-hooks/exhaustive-deps
57
- }, [parsed.ok ? draftSources.length : 0, tick]);
58
- const keptCount = draftSources.filter((s) => !excluded.has(sourceKey(s))).length;
59
- const droppedCount = draftSources.length - keptCount;
60
- function moveCursor(delta) {
61
- if (draftSources.length === 0)
62
- return;
63
- const next = Math.max(0, Math.min(draftSources.length - 1, cursor + delta));
64
- setCursor(next);
65
- if (next < scrollTop)
66
- setScrollTop(next);
67
- else if (next >= scrollTop + VIEWPORT)
68
- setScrollTop(next - VIEWPORT + 1);
69
- }
70
- function toggleCursor() {
71
- const source = draftSources[cursor];
72
- if (!source)
73
- return;
74
- const key = sourceKey(source);
75
- setExcluded((prev) => {
76
- const next = new Set(prev);
77
- if (next.has(key))
78
- next.delete(key);
79
- else
80
- next.add(key);
81
- return next;
82
- });
83
- }
84
- function setAllChecked(checked) {
85
- if (checked) {
86
- setExcluded(new Set());
87
- }
88
- else {
89
- setExcluded(new Set(draftSources.map(sourceKey)));
90
- }
91
- }
92
- function accept() {
93
- if (!parsed.ok) {
94
- app.setNotification({ kind: "error", message: `Draft is invalid: ${parsed.error}` });
95
- return;
96
- }
97
- const kept = parsed.sources.filter((s) => !excluded.has(sourceKey(s)));
98
- if (kept.length === 0) {
99
- app.setNotification({
100
- kind: "error",
101
- message: "Nothing checked — press space to keep at least one source, or esc to back out.",
102
- });
103
- return;
104
- }
105
- try {
106
- // Re-read tape from disk so we don't clobber any changes the curator
107
- // made since this screen was mounted.
108
- const { tape: current, doc } = readTape(project.tapePath);
109
- const next = { ...current, sources: kept };
110
- writeTape(project.tapePath, next, doc);
111
- // Clean up the draft after a successful merge. The user has committed
112
- // to a specific subset; the draft has served its purpose.
113
- try {
114
- unlinkSync(draftPath);
115
- }
116
- catch {
117
- // non-fatal; user can delete it manually if it lingers
118
- }
119
- // Phase 7 is "done" the moment the curator accepts a non-empty subset.
120
- markPhaseComplete(folder, "assembly");
121
- const dropped = parsed.sources.length - kept.length;
122
- const droppedNote = dropped > 0 ? `, dropped ${dropped}` : "";
123
- app.setNotification({
124
- kind: "info",
125
- message: `Wrote ${kept.length} source${kept.length === 1 ? "" : "s"} to tape.yaml${droppedNote}.`,
126
- });
127
- void app.refreshProjects();
128
- // Go straight to compile — the curator's act of pressing enter on
129
- // this screen IS the decision to start compiling. Routing through
130
- // the hub would force a second confirmation for no new information.
131
- app.navigate({ kind: "compile", tape: next, folder });
132
- }
133
- catch (e) {
134
- app.setNotification({ kind: "error", message: `Merge failed: ${e.message}` });
135
- }
136
- }
137
- function commitNewUrl(rawUrl) {
138
- const url = rawUrl.trim();
139
- if (!url) {
140
- setAddingUrl(null);
141
- return;
142
- }
143
- try {
144
- appendUrlToDraft(draftPath, url);
145
- setAddingUrl(null);
146
- setTick((t) => t + 1);
147
- app.setNotification({ kind: "info", message: `Added ${url}` });
148
- }
149
- catch (e) {
150
- app.setNotification({
151
- kind: "error",
152
- message: `Could not add source: ${e.message}`,
153
- });
154
- }
155
- }
156
- useInput((input, key) => {
157
- // While the add-url prompt is open, hand all input to TextInput.
158
- // The only key we intercept here is esc, to cancel the prompt cleanly.
159
- if (addingUrl !== null) {
160
- if (key.escape)
161
- setAddingUrl(null);
162
- return;
163
- }
164
- if (key.upArrow || input === "k")
165
- moveCursor(-1);
166
- else if (key.downArrow || input === "j")
167
- moveCursor(1);
168
- else if (key.pageUp)
169
- moveCursor(-VIEWPORT);
170
- else if (key.pageDown)
171
- moveCursor(VIEWPORT);
172
- else if (input === " " || input === "x")
173
- toggleCursor();
174
- else if (input === "A")
175
- setAllChecked(true); // shift-A: check all
176
- else if (input === "N")
177
- setAllChecked(false); // shift-N: uncheck all
178
- else if (input === "+")
179
- setAddingUrl(""); // open inline URL prompt
180
- else if (key.return)
181
- accept();
182
- else if (input === "R")
183
- setTick((t) => t + 1);
184
- else if (input === "q")
185
- ink.exit();
186
- else if (key.escape || input === "b")
187
- app.navigate({ kind: "hub", tape, folder });
188
- });
189
- // Empty-state: draft file missing entirely.
190
- if (!existsSync(draftPath)) {
191
- return (React.createElement(Box, { flexDirection: "column" },
192
- React.createElement(Header, { title: "review proposed sources", subtitle: folder }),
193
- React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
194
- React.createElement(Text, { color: WARNING }, "No draft to review."),
195
- React.createElement(Text, { color: MUTED },
196
- "Expected ",
197
- React.createElement(Text, { color: STRUCTURE }, DRAFT_PATH_REL),
198
- " \u2014 Phase 7 hasn't been run with an agent yet (or the draft was already accepted).")),
199
- React.createElement(KeyHints, { hints: [
200
- { key: "b", label: "back to hub" },
201
- { key: "R", label: "refresh" },
202
- ] })));
203
- }
204
- if (!parsed.ok) {
205
- return (React.createElement(Box, { flexDirection: "column" },
206
- React.createElement(Header, { title: "review proposed sources", subtitle: folder }),
207
- React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
208
- React.createElement(Text, { color: ERROR }, "Could not parse the draft."),
209
- React.createElement(Text, { color: MUTED }, parsed.error),
210
- React.createElement(Box, { marginTop: 1 },
211
- React.createElement(Text, { color: MUTED },
212
- "Open ",
213
- React.createElement(Text, { color: STRUCTURE }, DRAFT_PATH_REL),
214
- " in an editor and fix the YAML, or press ",
215
- React.createElement(Text, { color: STRUCTURE }, "d"),
216
- " to discard and re-run Phase 7."))),
217
- React.createElement(KeyHints, { hints: [
218
- { key: "d", label: "discard" },
219
- { key: "R", label: "refresh" },
220
- { key: "b", label: "back" },
221
- ] })));
222
- }
223
- const visible = draftSources.slice(scrollTop, scrollTop + VIEWPORT);
224
- const cursorSource = draftSources[cursor];
225
- return (React.createElement(Box, { flexDirection: "column" },
226
- React.createElement(Header, { title: "pick what goes into the tape", subtitle: `${folder} · current tape: ${tape.sources.length}` }),
227
- React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
228
- React.createElement(Text, { color: MUTED },
229
- "The agent proposed",
230
- " ",
231
- React.createElement(Text, { color: STRUCTURE }, draftSources.length),
232
- " ",
233
- "source",
234
- draftSources.length === 1 ? "" : "s",
235
- ". Use",
236
- " ",
237
- React.createElement(Text, { color: STRUCTURE }, "\u2191\u2193"),
238
- " to move,",
239
- " ",
240
- React.createElement(Text, { color: STRUCTURE }, "space"),
241
- " to toggle,",
242
- " ",
243
- React.createElement(Text, { color: STRUCTURE }, "[+]"),
244
- " to add one of your own,",
245
- " ",
246
- React.createElement(Text, { color: STRUCTURE }, "enter"),
247
- " to write the checked subset into tape.yaml and compile."),
248
- React.createElement(Text, { color: MUTED },
249
- "by section: ",
250
- sectionCounts.map((s) => `${s.section} (${s.count})`).join(" · "))),
251
- React.createElement(Box, { marginBottom: 1 },
252
- React.createElement(LabeledBox, { label: `proposed sources · ${keptCount} keep · ${droppedCount} drop`, color: STRUCTURE, paddingX: 1 },
253
- visible.map((s, i) => {
254
- const idx = scrollTop + i;
255
- const isCursor = idx === cursor;
256
- const isExcluded = excluded.has(sourceKey(s));
257
- return (React.createElement(Box, { key: idx },
258
- React.createElement(Text, { color: isCursor ? CURRENT : undefined, bold: isCursor }, isCursor ? "▸ " : " "),
259
- React.createElement(Text, { color: isExcluded ? ERROR : SUCCESS, bold: true }, isExcluded ? "[ ]" : "[x]"),
260
- React.createElement(Text, { color: MUTED },
261
- " ",
262
- String(idx + 1).padStart(2, " "),
263
- "."),
264
- React.createElement(Text, null, " "),
265
- React.createElement(Text, { color: isExcluded ? MUTED : undefined }, iconFor(s)),
266
- React.createElement(Text, { color: MUTED }, s.section ? ` [${truncate(s.section, 14)}]` : " [-]"),
267
- s.kind ? React.createElement(Text, { color: MUTED }, ` ${kindChip(s.kind)}`) : null,
268
- React.createElement(Text, { color: isExcluded ? MUTED : undefined }, " " + truncate(labelFor(s), 50)),
269
- s.priority === "optional" ? React.createElement(Text, { color: MUTED }, " opt") : null));
270
- }),
271
- draftSources.length > VIEWPORT ? (React.createElement(Box, { marginTop: 1 },
272
- React.createElement(Text, { color: MUTED }, `showing ${scrollTop + 1}–${Math.min(scrollTop + VIEWPORT, draftSources.length)} of ${draftSources.length}`))) : null)),
273
- addingUrl !== null ? (React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
274
- React.createElement(Text, { color: HEADING, bold: true }, "Add your own source"),
275
- React.createElement(Box, { marginTop: 1 },
276
- React.createElement(Text, { color: STRUCTURE }, "URL: "),
277
- React.createElement(TextInput, { value: addingUrl, onChange: setAddingUrl, onSubmit: commitNewUrl })),
278
- React.createElement(Text, { color: MUTED },
279
- " ",
280
- "Type a URL and press ",
281
- React.createElement(Text, { color: STRUCTURE }, "enter"),
282
- " to append it as a checked source.",
283
- " ",
284
- React.createElement(Text, { color: STRUCTURE }, "esc"),
285
- " cancels. You can edit notes/section/kind later in tape.yaml."))) : null,
286
- cursorSource && cursorSource.note?.trim() ? (React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
287
- React.createElement(Text, { color: ERROR }, "curator note"),
288
- cursorSource.note
289
- .split("\n")
290
- .slice(0, 4)
291
- .map((line, i) => (React.createElement(Text, { key: i, color: ERROR }, " " + truncate(line.trim(), 90)))))) : null,
292
- app.notification ? (React.createElement(Box, { marginBottom: 1 },
293
- React.createElement(Text, { color: app.notification.kind === "error" ? ERROR : SUCCESS }, app.notification.message))) : null,
294
- droppedCount > 0 ? (React.createElement(Box, { marginBottom: 1 },
295
- React.createElement(Text, { color: WARNING }, `${droppedCount} source${droppedCount === 1 ? "" : "s"} will be dropped on enter. `),
296
- React.createElement(Text, { color: MUTED }, "(toggle back with space)"))) : null,
297
- React.createElement(KeyHints, { hints: [
298
- { key: "↑↓", label: "move" },
299
- { key: "space", label: "toggle" },
300
- { key: "+", label: "add own" },
301
- { key: "enter", label: `accept ${keptCount}` },
302
- { key: "A", label: "all" },
303
- { key: "N", label: "none" },
304
- { key: "esc", label: "go back" },
305
- { key: "q", label: "quit" },
306
- ] })));
307
- }
308
- /**
309
- * Stable identity key for a draft source. URL works for web/youtube; for
310
- * local_file we combine path + citation so two distinct local files don't
311
- * collide on an empty url.
312
- */
313
- function sourceKey(s) {
314
- if (s.type === "local_file") {
315
- return `local|${s.path ?? ""}|${s.citation ?? ""}`;
316
- }
317
- return `url|${s.url}`;
318
- }
319
- function loadDraftSources(path) {
320
- if (!existsSync(path))
321
- return { ok: false, error: `${path} not on disk` };
322
- let raw;
323
- try {
324
- raw = YAML.parse(readFileSync(path, "utf8"));
325
- }
326
- catch (e) {
327
- return { ok: false, error: e.message };
328
- }
329
- if (!raw || typeof raw !== "object") {
330
- return { ok: false, error: "draft is empty or not a YAML mapping" };
331
- }
332
- const sources = raw["sources"];
333
- if (!Array.isArray(sources)) {
334
- return { ok: false, error: "draft has no `sources:` list at the top level" };
335
- }
336
- const parsed = [];
337
- for (let i = 0; i < sources.length; i++) {
338
- const entry = sources[i];
339
- if (!entry || typeof entry !== "object") {
340
- return { ok: false, error: `sources[${i}] is not a mapping` };
341
- }
342
- const type = String(entry["type"] ?? "web");
343
- if (type !== "web" && type !== "youtube" && type !== "local_file") {
344
- return { ok: false, error: `sources[${i}].type is invalid: ${type}` };
345
- }
346
- parsed.push({
347
- type,
348
- url: String(entry["url"] ?? ""),
349
- note: typeof entry["note"] === "string" ? entry["note"] : null,
350
- section: typeof entry["section"] === "string" ? entry["section"] : null,
351
- priority: entry["priority"] === "optional"
352
- ? "optional"
353
- : "required",
354
- render: entry["render"] ?? null,
355
- path: typeof entry["path"] === "string" ? entry["path"] : null,
356
- citation: typeof entry["citation"] === "string" ? entry["citation"] : null,
357
- kind: typeof entry["kind"] === "string"
358
- ? entry["kind"]
359
- : null,
360
- });
361
- }
362
- return { ok: true, sources: parsed };
363
- }
364
- function groupBySection(sources) {
365
- const map = new Map();
366
- for (const s of sources) {
367
- const key = s.section?.trim() || "(unsectioned)";
368
- map.set(key, (map.get(key) ?? 0) + 1);
369
- }
370
- return Array.from(map.entries()).map(([section, count]) => ({ section, count }));
371
- }
372
- function kindChip(kind) {
373
- switch (kind) {
374
- case "reference":
375
- return "[ref]";
376
- case "principle":
377
- return "[pri]";
378
- case "prescription":
379
- return "[pre]";
380
- case "example":
381
- return "[ex]";
382
- default:
383
- return "";
384
- }
385
- }
386
- function iconFor(source) {
387
- if (source.type === "youtube")
388
- return "▶";
389
- if (source.type === "local_file")
390
- return "▣";
391
- if (source.render === "js")
392
- return "◍";
393
- if (source.render === "server")
394
- return "◎";
395
- return "◌";
396
- }
397
- function labelFor(source) {
398
- if (source.type === "local_file") {
399
- return source.citation || source.path || "(unset local file)";
400
- }
401
- return source.url || "(no url)";
402
- }
403
- function truncate(s, n) {
404
- return s.length > n ? s.slice(0, n - 1) + "…" : s;
405
- }
406
- /**
407
- * Append a curator-added URL to the working draft yaml file. Type is
408
- * auto-detected (youtube vs. web). Note/section are left empty for the
409
- * curator to refine later via tape.yaml.
410
- *
411
- * Re-reads + serializes the file so the new entry survives a TUI restart.
412
- * Skips silently if the URL is already present — re-adding the same URL is
413
- * harmless and prevents duplicates if the curator pastes twice.
414
- */
415
- function appendUrlToDraft(draftPath, url) {
416
- if (!existsSync(draftPath)) {
417
- throw new Error(`draft not on disk: ${draftPath}`);
418
- }
419
- const raw = YAML.parse(readFileSync(draftPath, "utf8"));
420
- if (!raw || typeof raw !== "object") {
421
- throw new Error("draft yaml has no top-level mapping");
422
- }
423
- const sources = Array.isArray(raw["sources"]) ? raw["sources"] : [];
424
- for (const existing of sources) {
425
- if (existing && typeof existing === "object") {
426
- const eu = existing["url"];
427
- if (typeof eu === "string" && eu.trim() === url) {
428
- return; // already present; no-op
429
- }
430
- }
431
- }
432
- const detected = detectSourceType(url);
433
- const entry = {
434
- type: detected,
435
- url,
436
- note: "Added by curator.",
437
- section: "curator-added",
438
- priority: "required",
439
- };
440
- sources.push(entry);
441
- raw["sources"] = sources;
442
- writeFileSync(draftPath, YAML.stringify(raw), "utf8");
443
- }
444
- //# sourceMappingURL=TapeDraftReview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TapeDraftReview.js","sourceRoot":"","sources":["../../src/screens/TapeDraftReview.tsx"],"names":[],"mappings":"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"}