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.
- package/README.md +84 -159
- package/bin/liner.js +89 -44
- package/cli-update-docs/README.md +6 -6
- package/cli-update-docs/SKILL.md +72 -37
- package/cli-update-docs/quality-check-tests.md +256 -8
- package/cli-update-docs/source-finding-tactics.md +140 -3
- package/cli-update-docs/source-quality-hierarchy.md +83 -0
- package/cli-update-docs/synthesis-guidance.md +19 -5
- package/dist/agents/artifact-validation.js +440 -0
- package/dist/agents/artifact-validation.js.map +1 -0
- package/dist/agents/candidate-longlist.js +100 -0
- package/dist/agents/candidate-longlist.js.map +1 -0
- package/dist/agents/detect.js +3 -2
- package/dist/agents/detect.js.map +1 -1
- package/dist/agents/evaluation-assembly.js +270 -0
- package/dist/agents/evaluation-assembly.js.map +1 -0
- package/dist/agents/headless-runner.js +227 -0
- package/dist/agents/headless-runner.js.map +1 -0
- package/dist/agents/jtbd-clarify.js +42 -41
- package/dist/agents/jtbd-clarify.js.map +1 -1
- package/dist/agents/models.js +6 -7
- package/dist/agents/models.js.map +1 -1
- package/dist/agents/prompts.js +220 -20
- package/dist/agents/prompts.js.map +1 -1
- package/dist/agents/runner.js +462 -21
- package/dist/agents/runner.js.map +1 -1
- package/dist/phases.js +13 -13
- package/dist/phases.js.map +1 -1
- package/dist/source-inbox.js +297 -0
- package/dist/source-inbox.js.map +1 -0
- package/dist/version.js +3 -9
- package/dist/version.js.map +1 -1
- package/dist/yaml-io.js +42 -11
- package/dist/yaml-io.js.map +1 -1
- package/package.json +26 -23
- package/cli-update-docs/ABOUT.md +0 -69
- package/cli-update-docs/AI-HANDOFF.md +0 -241
- package/cli-update-docs/CURATION.md +0 -261
- package/cli-update-docs/JOB-STORY-MIGRATION.md +0 -99
- package/cli-update-docs/JTBD-MASTER-PROMPT-ABOUT.md +0 -133
- package/cli-update-docs/JTBD-MASTER-PROMPT.md +0 -147
- package/cli-update-docs/LINER-MASTER.md +0 -546
- package/cli-update-docs/MIXTAPE-FORMAT.md +0 -398
- package/cli-update-docs/PLATFORM.md +0 -210
- package/cli-update-docs/TUI-BACKLOG.md +0 -155
- package/dist/App.js +0 -220
- package/dist/App.js.map +0 -1
- package/dist/colors.js +0 -132
- package/dist/colors.js.map +0 -1
- package/dist/components/Header.js +0 -15
- package/dist/components/Header.js.map +0 -1
- package/dist/components/KeyHints.js +0 -17
- package/dist/components/KeyHints.js.map +0 -1
- package/dist/components/LabeledBox.js +0 -53
- package/dist/components/LabeledBox.js.map +0 -1
- package/dist/components/NextSteps.js +0 -18
- package/dist/components/NextSteps.js.map +0 -1
- package/dist/index.js +0 -17
- package/dist/index.js.map +0 -1
- package/dist/screens/AgentSetup.js +0 -224
- package/dist/screens/AgentSetup.js.map +0 -1
- package/dist/screens/BootSplash.js +0 -163
- package/dist/screens/BootSplash.js.map +0 -1
- package/dist/screens/CompileView.js +0 -567
- package/dist/screens/CompileView.js.map +0 -1
- package/dist/screens/FramingConfirmReview.js +0 -197
- package/dist/screens/FramingConfirmReview.js.map +0 -1
- package/dist/screens/Gate1Review.js +0 -147
- package/dist/screens/Gate1Review.js.map +0 -1
- package/dist/screens/Gate2Review.js +0 -162
- package/dist/screens/Gate2Review.js.map +0 -1
- package/dist/screens/ImportPrompt.js +0 -173
- package/dist/screens/ImportPrompt.js.map +0 -1
- package/dist/screens/JsSetup.js +0 -77
- package/dist/screens/JsSetup.js.map +0 -1
- package/dist/screens/LocalFilePicker.js +0 -139
- package/dist/screens/LocalFilePicker.js.map +0 -1
- package/dist/screens/NewMixtapeWizard.js +0 -662
- package/dist/screens/NewMixtapeWizard.js.map +0 -1
- package/dist/screens/PhaseRunner.js +0 -1203
- package/dist/screens/PhaseRunner.js.map +0 -1
- package/dist/screens/ProcessManifest.js +0 -160
- package/dist/screens/ProcessManifest.js.map +0 -1
- package/dist/screens/ProjectHub.js +0 -557
- package/dist/screens/ProjectHub.js.map +0 -1
- package/dist/screens/SourceModal.js +0 -269
- package/dist/screens/SourceModal.js.map +0 -1
- package/dist/screens/TapeBrowser.js +0 -312
- package/dist/screens/TapeBrowser.js.map +0 -1
- package/dist/screens/TapeDraftReview.js +0 -444
- package/dist/screens/TapeDraftReview.js.map +0 -1
- package/dist/screens/TapeEditor.js +0 -310
- package/dist/screens/TapeEditor.js.map +0 -1
- package/dist/screens/cassette-art.js +0 -72
- package/dist/screens/cassette-art.js.map +0 -1
- package/dist/store.js +0 -10
- 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.
|