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,398 +0,0 @@
1
- # Mixtape Format
2
-
3
- The technical specification for Liner mixtapes.
4
-
5
- > **Status:** This specification describes the **v1** format (with v1.1 additions for `local_file` sources and `render: js`) as implemented in the CLI. Additional source types planned for v2 are documented at the end.
6
-
7
- ---
8
-
9
- ## Overview
10
-
11
- A Liner mixtape is a **folder**, not a single file. The folder contains the recipe, fetched source content, a synthesis, and a master file. Together they form a self-contained artifact ready to share, publish, or paste into an AI conversation.
12
-
13
- This document specifies:
14
-
15
- - The project folder structure
16
- - The `tape.yaml` recipe format
17
- - The contents of `MIXTAPE.md`, `synthesis.md`, and `sources/*.md`
18
- - The `working/` folder convention
19
- - The `.mixtape` export format
20
- - The versioning policy
21
-
22
- ---
23
-
24
- ## The project folder
25
-
26
- Every Liner mixtape is a directory. The directory name is a slug — lowercase, hyphenated, filesystem-safe:
27
-
28
- ```
29
- mobile-design-foundations/
30
- ├── MIXTAPE.md # the consumable artifact
31
- ├── tape.yaml # the recipe
32
- ├── synthesis.md # the curator's distilled understanding
33
- ├── sources/ # extracted content for kept sources
34
- │ ├── 01-<slug>.md
35
- │ ├── 02-<slug>.md
36
- │ └── ...
37
- ├── personal/ # curator's local copies of `local_file` sources (optional)
38
- │ ├── chapter-3.pdf
39
- │ └── reader-mode-saved-article.md
40
- └── working/ # the methodology made visible
41
- ├── 01-jtbd-and-knowledge-map.md
42
- ├── 02-candidate-longlist.md
43
- ├── 03-evaluation.yaml
44
- ├── 04-quality-checks.md
45
- └── 05-empirical-test.md # optional methodology validation
46
- ```
47
-
48
- The folder is the canonical unit. Any operation that reads or writes a mixtape works on a folder, not on individual files.
49
-
50
- A minimal valid project folder contains `tape.yaml`, `synthesis.md`, `MIXTAPE.md`, and a `sources/` directory with at least one file. The `working/` folder is recommended but not required. The `personal/` folder exists only when the recipe references at least one `local_file` source.
51
-
52
- ---
53
-
54
- ## `tape.yaml` — the recipe
55
-
56
- The recipe lists the kept sources with curator notes, organized by section. It is the input to `liner compile`, which produces `MIXTAPE.md` and populates `sources/`.
57
-
58
- ### Required top-level fields
59
-
60
- | Field | Type | Description |
61
- |---|---|---|
62
- | `title` | string | Display name of the mixtape |
63
- | `description` | string | One-sentence description of the mixtape's purpose |
64
- | `curator` | string | Name of the curator |
65
- | `version` | integer | Tape format version. Must be `1` for v1 format |
66
- | `mode` | string | `quick` or `methodology` — how this mixtape was curated |
67
- | `sources` | list | At least one source entry |
68
-
69
- ### Optional top-level fields
70
-
71
- | Field | Type | Description |
72
- |---|---|---|
73
- | `tags` | list of strings | Tags for discovery and filtering |
74
- | `created` | ISO date | Creation date |
75
- | `updated` | ISO date | Last meaningful update |
76
- | `license` | string | License identifier (e.g., `CC-BY-4.0`, `MIT`) |
77
- | `homepage` | URL | Link to the mixtape's home (e.g., its GitHub page) |
78
- | `jtbd` | string | The job-to-be-done statement in Job Story form: `When [circumstance], I want [motivation], so I can [outcome].` All three slots required. No solution names (vendor, framework, library, methodology, tool) in any slot. One job per slot — no "and"/comma/slash conjunctions. See [`CURATION.md`](CURATION.md) Phase 1 and [`JTBD-MASTER-PROMPT.md`](JTBD-MASTER-PROMPT.md) for the full rubric. |
79
- | `methodology_version` | string | Which version of CURATION.md was applied |
80
-
81
- ### Source entries
82
-
83
- v1 supports three source types: `youtube`, `web`, and `local_file`.
84
-
85
- **Required fields per source:**
86
-
87
- | Field | Type | Description |
88
- |---|---|---|
89
- | `type` | string | One of `youtube`, `web`, `local_file` |
90
- | `url` | URL | Required for `youtube` and `web` source types. Omitted for `local_file` |
91
- | `path` | string | Required for `local_file`. Relative path under `personal/` (e.g., `personal/foo.pdf`) |
92
- | `citation` | string | Required for `local_file`. Human-readable provenance: author, title, publication, date |
93
-
94
- **Optional fields per source (all types):**
95
-
96
- | Field | Type | Description |
97
- |---|---|---|
98
- | `note` | string | Curator note. Strongly recommended; required for library contributions |
99
- | `section` | string | Section label for grouping sources in the compiled mixtape |
100
- | `priority` | string | `required` (default) or `optional`. Optional sources can be excluded with `--skip-optional` |
101
-
102
- **Optional fields specific to `web` sources:**
103
-
104
- | Field | Type | Description |
105
- |---|---|---|
106
- | `render` | string | Controls how the page is fetched. **Absent (default)** — try server-rendered HTML first; if the page turns out to be JavaScript-only, automatically fall back to headless Chromium (requires `liner setup-js` to have been run). **`js`** — skip the server attempt and go straight to Chromium. **`server`** — server-rendered only; fail loudly on a JS stub. Use `server` for library submissions where you want the recipe to declare no hidden Playwright dependency. |
107
-
108
- **Optional fields specific to `local_file` sources:**
109
-
110
- | Field | Type | Description |
111
- |---|---|---|
112
- | (none yet) | | The required `path` and `citation` cover v1.1 |
113
-
114
- `local_file` sources can reference content the curator has on disk — book chapters, gated articles, exported PDFs, Reader-Mode-saved HTML. The `path` must resolve under the project's `personal/` subdirectory; absolute paths and `..` traversal are rejected at validation. Supported extensions are `.md`, `.txt`, `.html`, `.htm`, `.pdf`. The maximum file size is 10MB.
115
-
116
- ### Example
117
-
118
- ```yaml
119
- title: Mobile Design Foundations
120
- description: Core principles for native mobile UX.
121
- curator: Your Name
122
- version: 1
123
- mode: methodology
124
- tags: [mobile, design, ux]
125
- created: 2026-05-18
126
- license: CC-BY-4.0
127
- jtbd: When I'm designing the core UI of a consumer iOS app, I want to follow Apple's interaction conventions while choosing where to deviate visually, so I can ship something that feels native without looking generic.
128
- methodology_version: "2.0"
129
-
130
- sources:
131
- - type: web
132
- url: https://developer.apple.com/design/human-interface-guidelines/gestures
133
- note: |
134
- Apple's canonical gesture reference. Skim the overview;
135
- the per-gesture detail is what matters.
136
- section: foundations
137
-
138
- - type: youtube
139
- url: https://www.youtube.com/watch?v=XXXX
140
- note: |
141
- Watch first. The section starting at 14:30 on touch
142
- target hierarchy is the load-bearing point.
143
- section: foundations
144
-
145
- - type: web
146
- url: https://example.com/article-on-mobile-nav
147
- note: |
148
- Critique of bottom-tab navigation patterns. Take with
149
- the next source which disagrees.
150
- section: patterns
151
-
152
- - type: web
153
- url: https://example.com/counterargument
154
- note: Defends bottom tabs for high-frequency apps.
155
- section: patterns
156
- priority: optional
157
-
158
- - type: web
159
- url: https://developer.apple.com/design/human-interface-guidelines/accessibility
160
- render: js
161
- note: Requires headless-browser rendering; install `linersh[js]` first.
162
- section: foundations
163
-
164
- - type: local_file
165
- path: personal/touch-target-paper.pdf
166
- citation: "Parhi et al., 'Target Size for One-Handed Thumb Use on Small Touchscreen Devices,' Mobile HCI 2006."
167
- note: The canonical empirical study behind Apple's 44pt minimum.
168
- section: craft
169
- ```
170
-
171
- ### Validation rules
172
-
173
- A `tape.yaml` is valid if and only if:
174
-
175
- 1. The YAML parses
176
- 2. All required top-level fields are present
177
- 3. `version` is `1` (v1 parsers reject other values)
178
- 4. `mode` is `quick` or `methodology`
179
- 5. `sources` is a non-empty list
180
- 6. Every source has a `type` in the allowed set: `youtube`, `web`, `local_file`
181
- 7. For `youtube` and `web` sources: `url` is present and parses as a valid URL
182
- 8. For `web` sources: if `render` is present, it is `server` or `js`
183
- 9. For `local_file` sources: `path` and `citation` are present
184
- 10. For `local_file` sources: `path` is a relative POSIX path starting with `personal/` and contains no `..` segments
185
- 11. For `local_file` sources: the extension is one of `.md`, `.txt`, `.html`, `.htm`, `.pdf`
186
- 12. `youtube` and `web` sources must not declare `path` or `citation`; `local_file` sources must not declare `url`
187
-
188
- Path existence and file-size limits are checked at compile time, not validation time — a tape can be valid even when the file isn't on disk yet (e.g., shared recipe before the recipient adds their own copy).
189
-
190
- Validation errors should point to the specific field and the specific problem.
191
-
192
- ---
193
-
194
- ## `synthesis.md`
195
-
196
- The synthesis is the curator's distilled understanding of the domain, expressed in their own voice. It is required — every mixtape has one.
197
-
198
- The synthesis covers:
199
-
200
- - The principles or framework the curator sees in the domain
201
- - Contested questions and where the curator stands
202
- - Distinctions between concepts that get confused
203
- - When to use what's in the mixtape and when to look elsewhere
204
-
205
- Length is typically 800–2000 words. Shorter for narrow topics; longer for broader ones.
206
-
207
- In quick mode, the synthesis is AI-drafted during compilation. In methodology mode, the curator writes or substantially edits it. Either way, it lives at `synthesis.md` in the project folder and gets included verbatim at the top of `MIXTAPE.md`.
208
-
209
- ---
210
-
211
- ## `MIXTAPE.md` — the master file
212
-
213
- `MIXTAPE.md` is what the consuming AI actually reads. It is produced by `liner compile` and combines the synthesis with a source index.
214
-
215
- Structure:
216
-
217
- ```markdown
218
- # {title}
219
-
220
- > {description}
221
-
222
- **Curator:** {curator}
223
- **Compiled:** {ISO timestamp}
224
- **Sources:** {n}
225
- **JTBD:** {jtbd if present}
226
-
227
- ---
228
-
229
- ## How to use this mixtape
230
-
231
- [Standard boilerplate explaining that this is a curated context
232
- bundle, that the synthesis below provides framing, and that
233
- individual source files are referenced in the index and should
234
- be consulted when specific detail is needed.]
235
-
236
- ---
237
-
238
- ## Synthesis
239
-
240
- {contents of synthesis.md, verbatim}
241
-
242
- ---
243
-
244
- ## Sources
245
-
246
- {for each section, in order of first appearance:}
247
-
248
- ### {section name}
249
-
250
- #### Source {N}: {source title or citation}
251
-
252
- - **Type:** {youtube|web|local_file}
253
- - **URL:** {source url} *(for youtube/web)*
254
- - **Citation:** {citation} *(for local_file)*
255
- - **Local path:** {path} *(for local_file)*
256
- - **Render:** {server|js} *(for web sources, only when explicitly set)*
257
- - **Author:** {author if known}
258
- - **Published:** {date if known}
259
- - **Curator note:** {note}
260
- - **Content file:** [sources/{nn}-{slug}.md](./sources/{nn}-{slug}.md)
261
- ```
262
-
263
- The "How to use this mixtape" section is standard boilerplate. It tells the consuming AI that the synthesis carries the curator's framing, that source content lives in referenced files, and that the AI should load sources on demand when conversation requires specific detail.
264
-
265
- The source index entries contain enough metadata for the consuming AI to decide whether to load each source's full content. Curator notes are load-bearing for this routing decision — they're the signal that tells the AI which sources matter for which questions.
266
-
267
- ---
268
-
269
- ## `sources/`
270
-
271
- The `sources/` folder contains extracted text for every kept source, one file per source, named `01-<slug>.md` through `nn-<slug>.md`. Numbers match the source's position in the compiled mixtape; slugs come from the source's title.
272
-
273
- Each source file contains:
274
-
275
- ```markdown
276
- # {source title or citation}
277
-
278
- **Source type:** {youtube|web|local_file}
279
- **URL:** {url} *(for youtube/web)*
280
- **Citation:** {citation} *(for local_file)*
281
- **Local path:** {path} *(for local_file)*
282
- **Author:** {author if known}
283
- **Published:** {date if known}
284
- **Fetched:** {ISO timestamp}
285
-
286
- {extracted content}
287
- ```
288
-
289
- For YouTube sources, the extracted content is the transcript, cleaned and joined into paragraphs. For web sources, it's the article text extracted via readability tools, stripped of navigation and boilerplate. For `local_file` sources, the content is extracted by type: `.md`/`.txt` files are read as-is; `.html` is extracted via the same readability pipeline as web sources; `.pdf` is extracted page-by-page via pdfplumber.
290
-
291
- Source content is stored at full extracted length. The master file pattern handles in-context efficiency by referencing sources on demand rather than embedding them in `MIXTAPE.md`.
292
-
293
- ---
294
-
295
- ## `working/` — the methodology made visible
296
-
297
- The `working/` folder contains the curator's research artifacts: the JTBD statement, the knowledge map, the candidate long-list, the evaluation pass with decisions and ratings, and the empirical test result if performed.
298
-
299
- Files are numbered to indicate phase order:
300
-
301
- ```
302
- working/
303
- ├── 01-jtbd-and-knowledge-map.md
304
- ├── 02-candidate-longlist.md
305
- ├── 03-evaluation.yaml
306
- ├── 04-quality-checks.md
307
- └── 05-empirical-test.md # optional methodology validation
308
- ```
309
-
310
- These are not required by the format but are recommended. Library contributions must include them.
311
-
312
- The evaluation file (`03-evaluation.yaml`) is structured — it lists every candidate source with the decision (kept, dropped, deferred) and the rationale. This is distinct from the cache (which holds source *content*); the evaluation file holds *decisions about* sources.
313
-
314
- Example `03-evaluation.yaml`:
315
-
316
- ```yaml
317
- candidates:
318
- - url: https://example.com/great-article
319
- decision: kept
320
- section: foundations
321
- rationale: Canonical reference for the foundations section.
322
- rating: 5
323
- - url: https://example.com/listicle
324
- decision: dropped
325
- rationale: Shallow listicle, duplicates content in Source 3.
326
- rating: 1
327
- - url: https://example.com/contested
328
- decision: kept
329
- section: patterns
330
- rationale: Strong perspective; paired with Source 5 which disagrees.
331
- rating: 4
332
- ```
333
-
334
- ---
335
-
336
- ## The content cache
337
-
338
- Source content fetched during research is stored in the curator's local cache, not in the project folder. The cache lives at `~/.liner/cache/` (or wherever `platformdirs` puts it on the user's OS).
339
-
340
- The cache is shared across all the curator's projects. A source fetched for one mixtape is available for all future mixtapes.
341
-
342
- When `liner compile` runs, it copies the cached content for kept sources into `sources/` in the project folder. The cache itself is not part of the mixtape and is not included in exports.
343
-
344
- See [PLATFORM.md](./PLATFORM.md) for the cache's role in the broader architecture.
345
-
346
- ---
347
-
348
- ## The `.mixtape` export format
349
-
350
- A `.mixtape` file is a zip archive of a project folder, produced by `liner share` and consumed by `liner import`.
351
-
352
- The archive contains the project folder at its root: `MIXTAPE.md`, `tape.yaml`, `synthesis.md`, `sources/`, `working/`, and `personal/` (when present). The archive does not contain anything from the shared content cache.
353
-
354
- On import, the receiving Liner unzips the folder, then refetches any sources whose URLs aren't already in the receiving curator's cache. Sources already cached are reused. `local_file` sources are read from the archived `personal/` directly — no refetch.
355
-
356
- Flags affecting the export:
357
-
358
- - `--no-working-notes`: exclude `working/` from the archive
359
- - `--no-personal`: exclude `personal/` from the archive. Used when the curator considers the local copies private (gated content, licensed material) or is preparing a library submission.
360
- - `--no-source-content`: exclude `sources/` from the archive. The recipient must re-fetch on first compile.
361
- - `--minimal`: include only `tape.yaml`. The recipient compiles from scratch — and must supply their own local files for any `local_file` sources.
362
-
363
- **Library contributions** must use `--no-personal` *and* must not contain any `local_file` sources in `tape.yaml`. The library accepts only mixtapes built from publicly fetchable sources.
364
-
365
- ---
366
-
367
- ## Versioning policy
368
-
369
- The mixtape format has its own version number, independent of the CLI/TUI version.
370
-
371
- - **v1** is the current format. Stable.
372
- - **v1.1 additions** (additive, non-breaking): the `local_file` source type, the `render` field on `web` sources, and the `personal/` subdirectory. v1 parsers that don't know about these will reject tapes that use them — they're not silently forward-compatible. v1.1-aware parsers accept everything older v1 parsers accept.
373
- - Breaking changes increment the format version. v1 mixtapes will continue to parse with v1 tools indefinitely. v2 tools will accept both v1 and v2 mixtapes for some transition period, with a documented migration path.
374
- - Additive, non-breaking changes (new optional fields, new source types) may happen within a major version with a minor version note.
375
-
376
- ---
377
-
378
- ## v2 — Planned additions (not yet implemented)
379
-
380
- The following source types and fields are designed but not yet implemented. Full specifications will land when the implementations do.
381
-
382
- ### Additional source types
383
-
384
- - `gated_url` — content behind a paywall or login the curator has access to. References the original URL for provenance; requires a `content_file` pointing at a local copy.
385
- - `pasted` — short content entered directly into `tape.yaml`.
386
- - `local_media` — audio or video files. Requires external transcription before use.
387
-
388
- ### Additional fields
389
-
390
- - `content` (for `pasted` sources) — the literal content as a multi-line string.
391
- - `content_file` (for `gated_url`) — path under `personal/` to a local file containing the saved content.
392
- - `path` (for `local_media`) — path under `personal/` to the media file.
393
-
394
- ---
395
-
396
- ## License
397
-
398
- This specification is part of the Liner project and is MIT-licensed.
@@ -1,210 +0,0 @@
1
- # Liner Platform
2
-
3
- How the Liner project operates: the surfaces, the lifecycle, the library, and the boundaries.
4
-
5
- This document assumes the reader has read [ABOUT.md](./ABOUT.md) (what Liner is) and [CURATION.md](./CURATION.md) (the methodology). It describes Liner's specific implementation choices, not the methodology itself.
6
-
7
- ---
8
-
9
- ## The surfaces
10
-
11
- Liner is several tools sharing a methodology and a file format. Each surface exists for a specific moment in the workflow.
12
-
13
- **CLI** (Python, `pipx install linersh`). Atomic operations on mixtape projects — `liner init`, `liner compile`, `liner share`, `liner import`, `liner list`, `liner clone`, `liner cache {info,list,show,clear,purge}`, `liner setup-js` (one-shot JavaScript-rendering setup). The right tool for scripting, automation, and one-shot operations.
14
-
15
- **TUI** (Node + Ink, `npx linersh`). Interactive multi-step lifecycle runner. Drives the methodology with sensible defaults, calls the Python CLI as subprocesses for fetching, parsing, and compilation. The right tool for authoring new mixtapes. Features a project-folder browser, a structured editor for `tape.yaml` with synthesis-readiness indicator, a local-file picker for `local_file` sources, and a live progress view that streams NDJSON events from `liner compile --emit-events`.
16
-
17
- **Skill** (`curating-mixtapes`). A portable methodology document Claude reads when invoked. Drops into `~/.claude/skills/`. Works without the CLI for users who prefer chat-native authoring.
18
-
19
- **MCP server**. Exposes Liner's functions as tools any MCP-compatible host can call (Claude Code, Codex, Cursor, others). Local install, stdio transport. The right tool for agent-driven workflows.
20
-
21
- **Web builder**. Stateless form on `liner.sh` that produces a `tape.yaml` for download. The right tool for casual users who don't want to install anything.
22
-
23
- The surfaces are independent. None requires the others.
24
-
25
- ---
26
-
27
- ## The two modes
28
-
29
- Most curators won't practice the methodology in detail. They want a tool that produces a usable mixtape with minimal effort. A small minority will engage substantively at each step.
30
-
31
- Liner supports both through two modes that share the same architecture and produce the same artifact shape.
32
-
33
- **Quick mode** (default). The AI does maximum work. The curator confirms or lightly edits at each gate. Defaults are accept-all. A complete mixtape takes 15–30 minutes. Quality is "good enough for personal use."
34
-
35
- **Methodology mode**. The curator engages substantively. Writes their own synthesis if they want. Reviews evaluation rationales. Adds and rejects sources deliberately. A complete mixtape takes several hours. Quality is library-eligible.
36
-
37
- The TUI runs quick mode by default with methodology mode available as a slower path. The skill defaults to quick mode and includes instructions for methodology mode. Library contributions require methodology mode.
38
-
39
- ---
40
-
41
- ## The lifecycle
42
-
43
- Every mixtape moves through the same phases regardless of mode. Quick mode runs through them with AI doing the work and the curator confirming. Methodology mode runs through them with the curator doing substantive work alongside the AI.
44
-
45
- 1. **Framing** — JTBD statement, knowledge map
46
- 2. **Candidate discovery** — long-list of URLs based on the knowledge map, no fetching yet
47
- 3. **Fetching** — pull content for candidates into the shared cache
48
- 4. **Evaluation** — AI reads fetched content, proposes keep/trim/drop with ratings against the JTBD
49
- 5. **Quality checks** — redundancy, coverage, disagreement, framing-gap tests
50
- 6. **Synthesis** — AI drafts the synthesis; curator may edit (synthesis is required, not optional)
51
- 7. **Final assembly** — `liner compile` writes `MIXTAPE.md` and populates `sources/`
52
- 8. **Empirical test** (optional but recommended) — compile, paste into AI conversation, compare with/without
53
-
54
- Two natural human-in-the-loop gates: candidate confirmation before fetching (saves wasted network calls) and evaluation review before finalization (catches the AI's misjudgments). Quick mode shows these gates with "looks good, continue" defaulted; methodology mode pauses for real review.
55
-
56
- ---
57
-
58
- ## The artifacts
59
-
60
- A mixtape is a folder, not a file. The folder is the canonical unit; everything else is derived from it.
61
-
62
- ```
63
- mobile-design-foundations/
64
- ├── MIXTAPE.md # the consumable artifact
65
- ├── tape.yaml # the recipe — kept sources, sections, notes
66
- ├── synthesis.md # the curator's distilled understanding
67
- ├── sources/ # extracted content for kept sources
68
- │ ├── 01-<slug>.md
69
- │ └── ...
70
- ├── personal/ # curator's local copies of `local_file` sources (optional)
71
- │ └── ...
72
- └── working/ # the methodology made visible
73
- ├── 01-jtbd-and-knowledge-map.md
74
- ├── 02-candidate-longlist.md
75
- ├── 03-evaluation.yaml
76
- ├── 04-quality-checks.md
77
- └── 05-empirical-test.md # optional methodology validation
78
- ```
79
-
80
- Three concepts to distinguish:
81
-
82
- - A **tape file** (`tape.yaml`) is the recipe. References sources by URL or path. Shareable on its own; anyone with the file can recompile from scratch.
83
- - A **mixtape** is the project folder. Contains the recipe, the working notes, the fetched content, the synthesis, and the master file.
84
- - The **consumable mixtape** is `MIXTAPE.md` plus the `sources/*.md` files it references. This is what gets pasted into an AI conversation.
85
-
86
- [MIXTAPE-FORMAT.md](./MIXTAPE-FORMAT.md) specifies the structure in detail.
87
-
88
- ---
89
-
90
- ## The content cache
91
-
92
- The cache is a shared, curator-level resource. One cache per machine, used across all projects.
93
-
94
- Default location: `~/.liner/cache/` (or wherever `platformdirs` puts it on the user's OS).
95
-
96
- The cache holds extracted source content keyed by canonical URL. The same source used in three different mixtapes is fetched once. Sources that change over time (transcripts, articles) have per-type TTLs; permanent references (specs, papers) can be pinned.
97
-
98
- The cache is the curator's local research library. Treat it that way. `liner cache list` shows what's there. `liner cache show <url>` displays a cached source. `liner cache purge <url>` removes one.
99
-
100
- The cache is never included in `.mixtape` exports. When a recipient imports a `.mixtape`, the receiving Liner repopulates *their* cache by fetching sources fresh — reusing whatever they already have.
101
-
102
- ---
103
-
104
- ## The library
105
-
106
- The Liner library is a curated collection of public mixtapes at [liner.sh/library](https://liner.sh/library), backed by a Git repository.
107
-
108
- **What the library contains.** Methodology-mode mixtapes authored by Liner maintainers and invited guest curators. Every mixtape uses only sources anyone can fetch. The folders are published in full — recipe, synthesis, working notes, sources, the compiled `MIXTAPE.md`. Library readers can browse the compiled artifact directly without compiling anything themselves.
109
-
110
- **What the library does not contain.** Quick-mode tapes. Tapes containing `local_file` sources (which by definition reference content the maintainers can't republish). Tapes with `render: js` that depend on opt-in dependencies. Tapes that haven't passed the empirical test.
111
-
112
- **Structure.** Each mixtape is a directory in the repo. The website renders these as individual pages. Users can clone the tape file and edit it, browse the compiled mixtape, or read the working notes.
113
-
114
- **Curation philosophy.** Small, slow-growing, opinionated. Quality over coverage. A library of fifty excellent mixtapes is more useful than five hundred mediocre ones.
115
-
116
- ---
117
-
118
- ## Contributing
119
-
120
- The library accepts pull requests for methodology-mode mixtapes only.
121
-
122
- 1. Build the mixtape in methodology mode, applying [CURATION.md](./CURATION.md) substantively
123
- 2. Run the empirical test — compile the mixtape, compare AI output with and without it on a real question. Document the result in `working/05-empirical-test.md`. This is methodology guidance, not a driven TUI phase.
124
- 3. Submit a PR with the full project folder — exported via `liner share --no-personal`, and with no `local_file` sources in `tape.yaml`
125
- 4. A maintainer reviews. Submissions can be accepted, returned with feedback, or declined
126
-
127
- The bar is "demonstrably improves AI output for the stated job-to-be-done." Effort alone isn't sufficient. A well-meaning mixtape that doesn't move the needle isn't a library mixtape.
128
-
129
- Accepted mixtapes are credited to the curator by name. Curators retain authorship. Library mixtapes are MIT-licensed by default unless otherwise specified.
130
-
131
- ---
132
-
133
- ## Sharing
134
-
135
- Mixtapes are folders. To share a mixtape as a single file, use `liner share <project-folder>`. This produces `<project-folder>.mixtape` — a zip containing the project folder.
136
-
137
- The exported `.mixtape` includes everything in the project folder: `MIXTAPE.md`, `tape.yaml`, `synthesis.md`, `sources/`, `working/`, and `personal/` (when the recipe uses `local_file` sources). It does not include anything from the shared content cache (which lives outside the project folder anyway).
138
-
139
- On `liner import <file.mixtape>`, the receiving Liner unzips the folder, then refetches any sources that aren't already in the receiving curator's cache. Sources already cached are reused. `local_file` sources read from the archived `personal/` directly — no refetch. The result is a working project folder identical to what the original curator had.
140
-
141
- **Flags worth knowing about:**
142
-
143
- - `--no-working-notes`: exclude the `working/` folder from the export. For curators who consider their working notes private. Default is to include them.
144
- - `--no-personal`: exclude `personal/` from the export. Used when the local copies are licensed/gated material the curator can't redistribute, or when preparing a library submission. The recipient won't be able to compile `local_file` sources without supplying their own copies.
145
- - `--no-source-content`: skip the `sources/` folder. The recipient must re-fetch on first compile.
146
- - `--minimal`: produce a smaller zip containing only `tape.yaml`. For sharing the recipe only. The recipient compiles fresh.
147
-
148
- ---
149
-
150
- ## What Liner doesn't do
151
-
152
- Boundaries that shape the project's scope:
153
-
154
- - **No hosted compilation.** All compilation happens on the curator's machine. Liner does not run a server that fetches sources for users.
155
- - **No accounts in v1.** The CLI, TUI, library, and website all work without authentication. A future community index will use GitHub OAuth only.
156
- - **No paywall bypass.** Liner does not help users access content they don't already have. Source handlers for gated content require the user to provide content from their existing access.
157
- - **No LLM calls in the core tools.** The CLI, TUI, library tools, and web builder don't make LLM calls. All AI work happens through the user's own subscription (Claude Code, Codex, or API key) via the skill or MCP server. Liner doesn't pay for inference.
158
- - **No headless browser by default.** Plain `pipx install linersh` ships with the lightweight server-side web handler only. JavaScript-rendered sites (Apple HIG, Notion, many SPAs) require the opt-in `linersh[js]` extra, which adds Playwright and a Chromium binary. The extra is local-only — there's no hosted rendering service.
159
- - **No telemetry.** The tools don't phone home. Usage is the user's own business.
160
- - **No curator-required compression decisions.** Sources are stored at full extracted length. In-context efficiency comes from the master file pattern — `MIXTAPE.md` is small and always-loaded, sources are referenced and loaded on demand by the consuming AI.
161
-
162
- These boundaries are stable. Anything outside them either lives in a separate project or doesn't get built.
163
-
164
- ---
165
-
166
- ## The community index (planned, deferred)
167
-
168
- A future addition will be a community index — a directory of community-published mixtapes hosted by their curators on GitHub. Liner does not host the content; it indexes links to user repositories.
169
-
170
- The design:
171
-
172
- - Curators sign in with GitHub OAuth and submit a link to a public GitHub repository containing their mixtape folder
173
- - The repository must be on GitHub (no other hosts in v1)
174
- - Entries are reviewed before featuring; the front page is editorially curated
175
- - No comments, ratings, or community voting in v1
176
- - A passive popularity signal may be shown but does not drive default sorting
177
-
178
- This feature is not part of the initial Liner release. It will be built only if there's evidence of demand from real users of the v1 tools and library. In the meantime, the `/mixtapes` route on the website serves as a placeholder with an interest signup.
179
-
180
- ---
181
-
182
- ## Maintenance contract
183
-
184
- Liner is a side project. The maintenance contract:
185
-
186
- - Issues and PRs are reviewed when time permits, not on any schedule
187
- - No SLA, no guaranteed compatibility, no support commitments
188
- - Breaking changes are possible between versions; versioning will be honest about them
189
- - The transcript-fetching and content-extraction layers depend on third-party platforms that change over time; the tools will sometimes break and will be fixed when fixes are practical
190
- - The library is curated by the maintainer and invited guest curators; submissions are welcomed but not guaranteed acceptance or response
191
-
192
- Open source does not mean free maintenance. Users who need guaranteed support should use a hosted product.
193
-
194
- ---
195
-
196
- ## Versioning
197
-
198
- Liner versions three things independently:
199
-
200
- - **Tape format** has its own version field. Breaking format changes increment the format version; older tapes either continue to work or get a clear migration path. See [MIXTAPE-FORMAT.md](./MIXTAPE-FORMAT.md) for the versioning policy.
201
- - **Methodology** is versioned in [CURATION.md](./CURATION.md). Substantive changes increment the methodology version.
202
- - **Tools** (CLI, TUI, skill, MCP server) follow semver. Major versions can break compatibility; minor and patch versions don't.
203
-
204
- The methodology, the format, and the tools are versioned independently. Updates to one don't force updates to the others unless there's a real dependency.
205
-
206
- ---
207
-
208
- ## License
209
-
210
- MIT.