linersh 0.5.6 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -165
- package/bin/liner.js +82 -44
- package/cli-update-docs/ABOUT.md +16 -16
- package/cli-update-docs/AI-HANDOFF.md +62 -190
- package/cli-update-docs/CURATION.md +48 -19
- package/cli-update-docs/JTBD-MASTER-PROMPT-ABOUT.md +9 -12
- package/cli-update-docs/JTBD-MASTER-PROMPT.md +1 -1
- package/cli-update-docs/LINER-MASTER.md +77 -63
- package/cli-update-docs/LINER-MD-PRD.md +531 -0
- package/cli-update-docs/MIXTAPE-FORMAT.md +76 -44
- package/cli-update-docs/PLATFORM.md +47 -46
- package/cli-update-docs/README.md +6 -6
- package/cli-update-docs/SKILL.md +72 -37
- package/cli-update-docs/TUI-BACKLOG.md +205 -26
- 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/JOB-STORY-MIGRATION.md +0 -99
- 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
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
The technical specification for Liner mixtapes.
|
|
4
4
|
|
|
5
|
-
> **Status:** This specification describes the **v1
|
|
5
|
+
> **Status:** This specification describes the **v1 tape format** (with v1.1 additions for `local_file`, `skill`, and `render: js`) and the **v2 Liner project folder shape** now used by new projects. Legacy root-level mixtape folders remain readable.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## Overview
|
|
10
10
|
|
|
11
|
-
A Liner
|
|
11
|
+
A Liner project is a **folder**, not a single file. The root folder contains `LINER.md` and project capabilities. The `mixtape/` subfolder contains the recipe, fetched source content, synthesis, run logs, and compiled `MIXTAPE.md`. Together they form a self-contained artifact ready to share, publish, or paste into an AI conversation.
|
|
12
12
|
|
|
13
13
|
This document specifies:
|
|
14
14
|
|
|
@@ -23,37 +23,35 @@ This document specifies:
|
|
|
23
23
|
|
|
24
24
|
## The project folder
|
|
25
25
|
|
|
26
|
-
Every Liner
|
|
26
|
+
Every Liner project is a directory. The directory name is a slug — lowercase, hyphenated, filesystem-safe:
|
|
27
27
|
|
|
28
28
|
```
|
|
29
29
|
mobile-design-foundations/
|
|
30
|
-
├──
|
|
31
|
-
├──
|
|
32
|
-
├──
|
|
33
|
-
├──
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
├──
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
├──
|
|
42
|
-
├──
|
|
43
|
-
|
|
44
|
-
├── 04-quality-checks.md
|
|
45
|
-
└── 05-empirical-test.md # optional methodology validation
|
|
30
|
+
├── liner.yaml # v2 project marker
|
|
31
|
+
├── LINER.md # project instructions for using the corpus
|
|
32
|
+
├── skills/ # reusable project capabilities
|
|
33
|
+
├── working/ # audits, impact tests, composition drafts
|
|
34
|
+
├── children/ # optional child project references
|
|
35
|
+
├── lineage.yaml # optional composition history
|
|
36
|
+
└── mixtape/
|
|
37
|
+
├── MIXTAPE.md # the consumable corpus artifact
|
|
38
|
+
├── tape.yaml # the recipe
|
|
39
|
+
├── synthesis.md # the curator's distilled understanding
|
|
40
|
+
├── sources/ # extracted content for kept sources
|
|
41
|
+
├── local-sources/ # curator/local captured files (optional)
|
|
42
|
+
├── .liner-runs/ # phase run logs
|
|
43
|
+
└── working/ # methodology working files
|
|
46
44
|
```
|
|
47
45
|
|
|
48
|
-
The folder is the canonical unit. Any operation that reads or writes a
|
|
46
|
+
The root folder is the canonical unit. Any operation that reads or writes a Liner project works on the project folder, not on individual files. Corpus-specific readers resolve through `mixtape/`; legacy folders with root-level `tape.yaml` still resolve at the root.
|
|
49
47
|
|
|
50
|
-
A minimal
|
|
48
|
+
A minimal compiled v2 project contains `liner.yaml`, `mixtape/tape.yaml`, `mixtape/synthesis.md`, `mixtape/MIXTAPE.md`, and `mixtape/sources/` with at least one file. The methodology `mixtape/working/` folder is recommended but not required. `mixtape/local-sources/` exists only when local or captured sources are saved.
|
|
51
49
|
|
|
52
50
|
---
|
|
53
51
|
|
|
54
52
|
## `tape.yaml` — the recipe
|
|
55
53
|
|
|
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
|
|
54
|
+
The recipe lists the kept sources with curator notes, organized by section. It is the input to `liner compile`, which produces `mixtape/MIXTAPE.md` and populates `mixtape/sources/` in v2 projects.
|
|
57
55
|
|
|
58
56
|
### Required top-level fields
|
|
59
57
|
|
|
@@ -64,7 +62,7 @@ The recipe lists the kept sources with curator notes, organized by section. It i
|
|
|
64
62
|
| `curator` | string | Name of the curator |
|
|
65
63
|
| `version` | integer | Tape format version. Must be `1` for v1 format |
|
|
66
64
|
| `mode` | string | `quick` or `methodology` — how this mixtape was curated |
|
|
67
|
-
| `sources` | list |
|
|
65
|
+
| `sources` | list | Source entries. May be empty while drafting; compile/share require usable sources. |
|
|
68
66
|
|
|
69
67
|
### Optional top-level fields
|
|
70
68
|
|
|
@@ -80,15 +78,15 @@ The recipe lists the kept sources with curator notes, organized by section. It i
|
|
|
80
78
|
|
|
81
79
|
### Source entries
|
|
82
80
|
|
|
83
|
-
v1 supports
|
|
81
|
+
v1 supports four source types: `youtube`, `web`, `local_file`, and `skill`.
|
|
84
82
|
|
|
85
83
|
**Required fields per source:**
|
|
86
84
|
|
|
87
85
|
| Field | Type | Description |
|
|
88
86
|
|---|---|---|
|
|
89
|
-
| `type` | string | One of `youtube`, `web`, `local_file` |
|
|
87
|
+
| `type` | string | One of `youtube`, `web`, `local_file`, `skill` |
|
|
90
88
|
| `url` | URL | Required for `youtube` and `web` source types. Omitted for `local_file` |
|
|
91
|
-
| `path` | string | Required for `local_file`.
|
|
89
|
+
| `path` | string | Required for `local_file`; accepted for `skill`. `local_file` paths live under `local-sources/` or legacy `personal/` (e.g., `local-sources/foo.pdf`) |
|
|
92
90
|
| `citation` | string | Required for `local_file`. Human-readable provenance: author, title, publication, date |
|
|
93
91
|
|
|
94
92
|
**Optional fields per source (all types):**
|
|
@@ -111,7 +109,16 @@ v1 supports three source types: `youtube`, `web`, and `local_file`.
|
|
|
111
109
|
|---|---|---|
|
|
112
110
|
| (none yet) | | The required `path` and `citation` cover v1.1 |
|
|
113
111
|
|
|
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.
|
|
112
|
+
`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 `local-sources/` subdirectory or the legacy `personal/` subdirectory; absolute paths and `..` traversal are rejected at validation. Supported extensions are `.md`, `.txt`, `.html`, `.htm`, `.pdf`. The maximum file size is 10MB.
|
|
113
|
+
|
|
114
|
+
**Fields specific to `skill` sources:**
|
|
115
|
+
|
|
116
|
+
| Field | Type | Description |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| `path` | string | Installed skill name, local skill folder, `SKILL.md` path, or project-relative snapshot |
|
|
119
|
+
| `url` | URL | GitHub skill URL. Use instead of `path` |
|
|
120
|
+
|
|
121
|
+
Skill sources are read as reference artifacts. Liner never installs or executes them.
|
|
115
122
|
|
|
116
123
|
### Example
|
|
117
124
|
|
|
@@ -158,14 +165,19 @@ sources:
|
|
|
158
165
|
- type: web
|
|
159
166
|
url: https://developer.apple.com/design/human-interface-guidelines/accessibility
|
|
160
167
|
render: js
|
|
161
|
-
note: Requires headless-browser rendering;
|
|
168
|
+
note: Requires headless-browser rendering; run `liner setup-js` first.
|
|
162
169
|
section: foundations
|
|
163
170
|
|
|
164
171
|
- type: local_file
|
|
165
|
-
path:
|
|
172
|
+
path: local-sources/touch-target-paper.pdf
|
|
166
173
|
citation: "Parhi et al., 'Target Size for One-Handed Thumb Use on Small Touchscreen Devices,' Mobile HCI 2006."
|
|
167
174
|
note: The canonical empirical study behind Apple's 44pt minimum.
|
|
168
175
|
section: craft
|
|
176
|
+
|
|
177
|
+
- type: skill
|
|
178
|
+
path: mobile-design-review
|
|
179
|
+
note: Reference skill for how to structure mobile design critique.
|
|
180
|
+
section: craft
|
|
169
181
|
```
|
|
170
182
|
|
|
171
183
|
### Validation rules
|
|
@@ -176,14 +188,15 @@ A `tape.yaml` is valid if and only if:
|
|
|
176
188
|
2. All required top-level fields are present
|
|
177
189
|
3. `version` is `1` (v1 parsers reject other values)
|
|
178
190
|
4. `mode` is `quick` or `methodology`
|
|
179
|
-
5. `sources` is a
|
|
180
|
-
6. Every source has a `type` in the allowed set: `youtube`, `web`, `local_file`
|
|
191
|
+
5. `sources` is a list. It may be empty while drafting; compile/share require usable sources.
|
|
192
|
+
6. Every source has a `type` in the allowed set: `youtube`, `web`, `local_file`, `skill`
|
|
181
193
|
7. For `youtube` and `web` sources: `url` is present and parses as a valid URL
|
|
182
194
|
8. For `web` sources: if `render` is present, it is `server` or `js`
|
|
183
195
|
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
|
|
196
|
+
10. For `local_file` sources: `path` is a relative POSIX path starting with `local-sources/` or legacy `personal/` and contains no `..` segments
|
|
185
197
|
11. For `local_file` sources: the extension is one of `.md`, `.txt`, `.html`, `.htm`, `.pdf`
|
|
186
|
-
12.
|
|
198
|
+
12. For `skill` sources: either `path` or a GitHub `url` is present
|
|
199
|
+
13. `youtube` and `web` sources must not declare `path` or `citation`; `local_file` sources must not declare `url`
|
|
187
200
|
|
|
188
201
|
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
202
|
|
|
@@ -204,7 +217,7 @@ The synthesis covers:
|
|
|
204
217
|
|
|
205
218
|
Length is typically 800–2000 words. Shorter for narrow topics; longer for broader ones.
|
|
206
219
|
|
|
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
|
|
220
|
+
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 corpus folder (`mixtape/synthesis.md` in v2 projects) and gets included verbatim at the top of `MIXTAPE.md`.
|
|
208
221
|
|
|
209
222
|
---
|
|
210
223
|
|
|
@@ -304,12 +317,13 @@ working/
|
|
|
304
317
|
├── 02-candidate-longlist.md
|
|
305
318
|
├── 03-evaluation.yaml
|
|
306
319
|
├── 04-quality-checks.md
|
|
307
|
-
|
|
320
|
+
├── 05-operating-fit-audit.md # optional improvement recommendation
|
|
321
|
+
└── 06-empirical-test.md # optional methodology validation
|
|
308
322
|
```
|
|
309
323
|
|
|
310
324
|
These are not required by the format but are recommended. Library contributions must include them.
|
|
311
325
|
|
|
312
|
-
The evaluation file (`03-evaluation.yaml`) is structured — it lists every candidate source with the decision (kept
|
|
326
|
+
The evaluation file (`03-evaluation.yaml`) is structured — it lists every candidate source with the decision (`kept`, `trim`, or `dropped`), the rationale, and content evidence for every kept or trimmed source. This is distinct from the cache (which holds source *content*); the evaluation file holds *decisions about* sources and the evidence that those decisions came from readable content.
|
|
313
327
|
|
|
314
328
|
Example `03-evaluation.yaml`:
|
|
315
329
|
|
|
@@ -320,6 +334,15 @@ candidates:
|
|
|
320
334
|
section: foundations
|
|
321
335
|
rationale: Canonical reference for the foundations section.
|
|
322
336
|
rating: 5
|
|
337
|
+
jtbd_fit: direct
|
|
338
|
+
fetch_status: readable
|
|
339
|
+
content_quality: high
|
|
340
|
+
evidence:
|
|
341
|
+
- The article names the core method the corpus teaches.
|
|
342
|
+
- It shows the method working through a concrete example.
|
|
343
|
+
note: >
|
|
344
|
+
Role: Canonical reference. Value: Defines the foundation clearly.
|
|
345
|
+
Limitations: Needs to be paired with applied examples.
|
|
323
346
|
- url: https://example.com/listicle
|
|
324
347
|
decision: dropped
|
|
325
348
|
rationale: Shallow listicle, duplicates content in Source 3.
|
|
@@ -329,17 +352,26 @@ candidates:
|
|
|
329
352
|
section: patterns
|
|
330
353
|
rationale: Strong perspective; paired with Source 5 which disagrees.
|
|
331
354
|
rating: 4
|
|
355
|
+
jtbd_fit: bridge
|
|
356
|
+
fetch_status: partial
|
|
357
|
+
content_quality: medium
|
|
358
|
+
evidence:
|
|
359
|
+
- The available excerpt makes a specific argument about the pattern.
|
|
360
|
+
- The source identifies a tradeoff that can be tested against Source 5.
|
|
361
|
+
note: >
|
|
362
|
+
Role: Contrasting perspective. Value: Prevents a one-note pattern section.
|
|
363
|
+
Limitations: Partial fetch, so only use the claims evidenced by the excerpt.
|
|
332
364
|
```
|
|
333
365
|
|
|
334
366
|
---
|
|
335
367
|
|
|
336
368
|
## The content cache
|
|
337
369
|
|
|
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
|
|
370
|
+
Source content fetched during research is stored in the curator's local cache, not in the project folder. The cache lives at `~/.liner/cache.db` (or wherever `platformdirs` puts it on the user's OS).
|
|
339
371
|
|
|
340
372
|
The cache is shared across all the curator's projects. A source fetched for one mixtape is available for all future mixtapes.
|
|
341
373
|
|
|
342
|
-
When `liner compile` runs, it copies the cached content for kept sources into `sources/` in the
|
|
374
|
+
When `liner compile` runs, it copies the cached content for kept sources into `sources/` in the corpus folder. The cache itself is not part of the mixtape and is not included in exports.
|
|
343
375
|
|
|
344
376
|
See [PLATFORM.md](./PLATFORM.md) for the cache's role in the broader architecture.
|
|
345
377
|
|
|
@@ -349,14 +381,14 @@ See [PLATFORM.md](./PLATFORM.md) for the cache's role in the broader architectur
|
|
|
349
381
|
|
|
350
382
|
A `.mixtape` file is a zip archive of a project folder, produced by `liner share` and consumed by `liner import`.
|
|
351
383
|
|
|
352
|
-
The archive contains the project folder at its root
|
|
384
|
+
The archive contains the project folder at its root. For v2 projects that includes root project files such as `liner.yaml`, `LINER.md`, and `SKILL.md`, plus `mixtape/tape.yaml`, `mixtape/synthesis.md`, `mixtape/MIXTAPE.md`, `mixtape/sources/`, `mixtape/working/`, and `mixtape/local-sources/` when present. Legacy root-level projects with `tape.yaml`, `MIXTAPE.md`, `sources/`, `working/`, and `personal/` remain supported. The archive does not contain anything from the shared content cache.
|
|
353
385
|
|
|
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
|
|
386
|
+
On CLI import, the receiving Liner unzips the folder, then refetches any sources whose URLs aren't already in the receiving curator's cache unless `--no-refetch` is passed. Sources already cached are reused. `local_file` sources are read from archived `local-sources/` or legacy `personal/` files directly — no refetch. TUI import extracts the archive into the workspace and leaves refetching to a later compile.
|
|
355
387
|
|
|
356
388
|
Flags affecting the export:
|
|
357
389
|
|
|
358
390
|
- `--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.
|
|
391
|
+
- `--no-personal`: exclude `local-sources/` and legacy `personal/` files from the archive. Used when the curator considers the local copies private (gated content, licensed material) or is preparing a library submission.
|
|
360
392
|
- `--no-source-content`: exclude `sources/` from the archive. The recipient must re-fetch on first compile.
|
|
361
393
|
- `--minimal`: include only `tape.yaml`. The recipient compiles from scratch — and must supply their own local files for any `local_file` sources.
|
|
362
394
|
|
|
@@ -369,7 +401,7 @@ Flags affecting the export:
|
|
|
369
401
|
The mixtape format has its own version number, independent of the CLI/TUI version.
|
|
370
402
|
|
|
371
403
|
- **v1** is the current format. Stable.
|
|
372
|
-
- **v1.1 additions** (additive, non-breaking): the `local_file` source
|
|
404
|
+
- **v1.1 additions** (additive, non-breaking): the `local_file` and `skill` source types, the `render` field on `web` sources, and the `local-sources/` subdirectory with legacy `personal/` compatibility. 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
405
|
- 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
406
|
- Additive, non-breaking changes (new optional fields, new source types) may happen within a major version with a minor version note.
|
|
375
407
|
|
|
@@ -388,8 +420,8 @@ The following source types and fields are designed but not yet implemented. Full
|
|
|
388
420
|
### Additional fields
|
|
389
421
|
|
|
390
422
|
- `content` (for `pasted` sources) — the literal content as a multi-line string.
|
|
391
|
-
- `content_file` (for `gated_url`) — path under `
|
|
392
|
-
- `path` (for `local_media`) — path under `
|
|
423
|
+
- `content_file` (for `gated_url`) — path under `local-sources/` to a local file containing the saved content.
|
|
424
|
+
- `path` (for `local_media`) — path under `local-sources/` to the media file.
|
|
393
425
|
|
|
394
426
|
---
|
|
395
427
|
|
|
@@ -10,17 +10,17 @@ This document assumes the reader has read [ABOUT.md](./ABOUT.md) (what Liner is)
|
|
|
10
10
|
|
|
11
11
|
Liner is several tools sharing a methodology and a file format. Each surface exists for a specific moment in the workflow.
|
|
12
12
|
|
|
13
|
-
**CLI** (Python
|
|
13
|
+
**CLI** (bundled Python core behind the npm `liner` binary). Atomic operations on Liner 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
14
|
|
|
15
|
-
**TUI** (
|
|
15
|
+
**Go TUI** (Charm Bubble Tea, launched with `npx linersh`). Interactive multi-step lifecycle runner. Drives the methodology with sensible defaults, calls the bundled Python core for setup and compilation, and invokes the configured AI runner for research phases. The right tool for authoring new Liner projects. Features a projects browser, guided agent phases, structured review gates, optional JS-rendering setup, source-warning recovery paths, import file picker, and progress views for long-running work.
|
|
16
16
|
|
|
17
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
18
|
|
|
19
|
-
**MCP server
|
|
19
|
+
**MCP server** (planned). Will expose 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
20
|
|
|
21
|
-
**Web builder
|
|
21
|
+
**Web builder** (planned). 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
22
|
|
|
23
|
-
The surfaces are independent.
|
|
23
|
+
The implemented surfaces are independent. Planned surfaces should preserve that contract.
|
|
24
24
|
|
|
25
25
|
---
|
|
26
26
|
|
|
@@ -42,46 +42,47 @@ The TUI runs quick mode by default with methodology mode available as a slower p
|
|
|
42
42
|
|
|
43
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
44
|
|
|
45
|
-
1. **Framing** — JTBD statement, knowledge map
|
|
46
|
-
2. **Candidate discovery** — long-list of URLs based on the knowledge map, no fetching yet
|
|
45
|
+
1. **Framing** — JTBD statement, capability brief, knowledge map, required source roles
|
|
46
|
+
2. **Candidate discovery** — long-list of URLs based on the knowledge map and source roles, no fetching yet
|
|
47
47
|
3. **Fetching** — pull content for candidates into the shared cache
|
|
48
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
|
|
49
|
+
5. **Quality checks** — redundancy, coverage, disagreement, framing-gap, source-kind, and source-role tests
|
|
50
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/`
|
|
51
|
+
7. **Final assembly** — `liner compile` writes `mixtape/MIXTAPE.md` and populates `mixtape/sources/` in v2 projects
|
|
52
52
|
8. **Empirical test** (optional but recommended) — compile, paste into AI conversation, compare with/without
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
Three natural human-in-the-loop gates: framing confirmation before source search, candidate confirmation before fetching (saves wasted network calls), and evaluation review before synthesis (catches the AI's misjudgments). Quick mode can auto-accept gates while preserving progress state; methodology mode pauses for real review.
|
|
55
|
+
|
|
56
|
+
The TUI also enforces a Phase 1 artifact contract. Framing is not complete until `working/01-jtbd-and-knowledge-map.md` contains a capability brief and required source roles with why/evidence/minimum coverage. If the agent exits cleanly but misses the contract, the TUI keeps the project on Phase 1 and resumes the agent with the validation issue.
|
|
55
57
|
|
|
56
58
|
---
|
|
57
59
|
|
|
58
60
|
## The artifacts
|
|
59
61
|
|
|
60
|
-
A
|
|
62
|
+
A Liner project is a folder, not a file. The project folder is the canonical unit; the mixtape corpus lives under `mixtape/` in v2 projects and everything else is derived from it.
|
|
61
63
|
|
|
62
64
|
```
|
|
63
65
|
mobile-design-foundations/
|
|
64
|
-
├──
|
|
65
|
-
├──
|
|
66
|
-
├──
|
|
67
|
-
├──
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
├──
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
├──
|
|
74
|
-
├──
|
|
75
|
-
├──
|
|
76
|
-
|
|
77
|
-
└── 05-empirical-test.md # optional methodology validation
|
|
66
|
+
├── liner.yaml # v2 project marker and metadata
|
|
67
|
+
├── LINER.md # operating instructions for future agents
|
|
68
|
+
├── SKILL.md # optional project skill entry point
|
|
69
|
+
├── skills/ # reusable project capabilities
|
|
70
|
+
├── working/ # audits, impact tests, composition drafts
|
|
71
|
+
└── mixtape/
|
|
72
|
+
├── MIXTAPE.md # the consumable corpus artifact
|
|
73
|
+
├── tape.yaml # the recipe — kept sources, sections, notes
|
|
74
|
+
├── synthesis.md # the curator's distilled understanding
|
|
75
|
+
├── sources/ # extracted content for kept sources
|
|
76
|
+
├── local-sources/ # curator/local captured files (optional)
|
|
77
|
+
├── .liner-runs/ # phase run logs
|
|
78
|
+
└── working/ # methodology working files
|
|
78
79
|
```
|
|
79
80
|
|
|
80
81
|
Three concepts to distinguish:
|
|
81
82
|
|
|
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.
|
|
84
|
-
- The **consumable mixtape** is `MIXTAPE.md` plus the `sources/*.md` files it references. This is what gets pasted into an AI conversation.
|
|
83
|
+
- A **tape file** (`mixtape/tape.yaml` in v2 projects) is the recipe. References sources by URL or path. Shareable on its own; anyone with the file can recompile from scratch.
|
|
84
|
+
- A **mixtape** is the corpus inside the project folder. In v2 projects it lives under `mixtape/`; legacy root-level mixtape folders remain readable.
|
|
85
|
+
- The **consumable mixtape** is `mixtape/MIXTAPE.md` plus the `mixtape/sources/*.md` files it references. This is what gets pasted into an AI conversation.
|
|
85
86
|
|
|
86
87
|
[MIXTAPE-FORMAT.md](./MIXTAPE-FORMAT.md) specifies the structure in detail.
|
|
87
88
|
|
|
@@ -91,7 +92,7 @@ Three concepts to distinguish:
|
|
|
91
92
|
|
|
92
93
|
The cache is a shared, curator-level resource. One cache per machine, used across all projects.
|
|
93
94
|
|
|
94
|
-
Default location: `~/.liner/cache
|
|
95
|
+
Default location: `~/.liner/cache.db` (or wherever `platformdirs` puts it on the user's OS).
|
|
95
96
|
|
|
96
97
|
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
|
|
|
@@ -101,15 +102,15 @@ The cache is never included in `.mixtape` exports. When a recipient imports a `.
|
|
|
101
102
|
|
|
102
103
|
---
|
|
103
104
|
|
|
104
|
-
## The library
|
|
105
|
+
## The library (planned)
|
|
105
106
|
|
|
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
|
+
The Liner library is planned as a curated collection of public mixtapes at [liner.sh/library](https://liner.sh/library), backed by a Git repository.
|
|
107
108
|
|
|
108
109
|
**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
|
|
|
110
111
|
**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
|
|
|
112
|
-
**Structure.** Each mixtape
|
|
113
|
+
**Structure.** Each mixtape will be a directory in the repo. The website will render these as individual pages. Users will be able to clone the tape file and edit it, browse the compiled mixtape, or read the working notes.
|
|
113
114
|
|
|
114
115
|
**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,11 +118,11 @@ The Liner library is a curated collection of public mixtapes at [liner.sh/librar
|
|
|
117
118
|
|
|
118
119
|
## Contributing
|
|
119
120
|
|
|
120
|
-
The library
|
|
121
|
+
The planned library will accept pull requests for methodology-mode mixtapes only.
|
|
121
122
|
|
|
122
123
|
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/
|
|
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`
|
|
124
|
+
2. Run the empirical test — compile the mixtape, compare AI output with and without it on a real question. Document the result in `mixtape/working/06-empirical-test.md`. This is methodology guidance, not a driven TUI phase.
|
|
125
|
+
3. Submit a PR with the full project folder — exported via `liner share --no-personal`, and with no `local_file` sources in `mixtape/tape.yaml`
|
|
125
126
|
4. A maintainer reviews. Submissions can be accepted, returned with feedback, or declined
|
|
126
127
|
|
|
127
128
|
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.
|
|
@@ -134,16 +135,16 @@ Accepted mixtapes are credited to the curator by name. Curators retain authorshi
|
|
|
134
135
|
|
|
135
136
|
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
|
|
|
137
|
-
The exported `.mixtape` includes everything in the project folder: `
|
|
138
|
+
The exported `.mixtape` includes everything in the project folder: root project files such as `liner.yaml`, `LINER.md`, and `SKILL.md`, plus `mixtape/tape.yaml`, `mixtape/synthesis.md`, `mixtape/MIXTAPE.md`, `mixtape/sources/`, `mixtape/working/`, and `mixtape/local-sources/` when present. Legacy root-level `sources/`, `working/`, and `personal/` folders are still supported. The archive does not include anything from the shared content cache.
|
|
138
139
|
|
|
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
|
|
140
|
+
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 unless import is run with `--no-refetch`. Sources already cached are reused. `local_file` sources read from archived `local-sources/` or legacy `personal/` files directly — no refetch. The TUI import flow extracts the archive and leaves refetching to a later compile.
|
|
140
141
|
|
|
141
142
|
**Flags worth knowing about:**
|
|
142
143
|
|
|
143
|
-
- `--no-working-notes`: exclude
|
|
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
|
|
146
|
-
- `--minimal`: produce a smaller zip containing only `tape.yaml
|
|
144
|
+
- `--no-working-notes`: exclude `mixtape/working/` and legacy root-level `working/` from the export. For curators who consider their working notes private. Default is to include them.
|
|
145
|
+
- `--no-personal`: exclude `local-sources/` and legacy `personal/` files 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.
|
|
146
|
+
- `--no-source-content`: skip `mixtape/sources/` and legacy root-level `sources/`. The recipient must re-fetch on first compile.
|
|
147
|
+
- `--minimal`: produce a smaller zip containing only `mixtape/tape.yaml` in v2 projects. For sharing the recipe only. The recipient compiles fresh.
|
|
147
148
|
|
|
148
149
|
---
|
|
149
150
|
|
|
@@ -152,10 +153,10 @@ On `liner import <file.mixtape>`, the receiving Liner unzips the folder, then re
|
|
|
152
153
|
Boundaries that shape the project's scope:
|
|
153
154
|
|
|
154
155
|
- **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 accounts in v1.** The CLI, TUI, planned library, and website all work without authentication. A future community index will use GitHub OAuth only.
|
|
156
157
|
- **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
|
|
158
|
-
- **No headless browser by default.** Plain `
|
|
158
|
+
- **No LLM calls in the core CLI.** The CLI does not call AI models. The TUI invokes the user's configured local runner for methodology phases. All AI work happens through the user's own subscription or local toolchain. Liner doesn't pay for inference.
|
|
159
|
+
- **No headless browser by default.** Plain `npx linersh` works without downloading Chromium. JavaScript-rendered sites (Apple HIG, Notion, many SPAs) require the opt-in `liner setup-js` step, which installs Playwright browser support locally. There is no hosted rendering service.
|
|
159
160
|
- **No telemetry.** The tools don't phone home. Usage is the user's own business.
|
|
160
161
|
- **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
|
|
|
@@ -187,7 +188,7 @@ Liner is a side project. The maintenance contract:
|
|
|
187
188
|
- No SLA, no guaranteed compatibility, no support commitments
|
|
188
189
|
- Breaking changes are possible between versions; versioning will be honest about them
|
|
189
190
|
- 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
|
|
191
|
+
- The planned library will be curated by the maintainer and invited guest curators; submissions are welcomed but not guaranteed acceptance or response
|
|
191
192
|
|
|
192
193
|
Open source does not mean free maintenance. Users who need guaranteed support should use a hosted product.
|
|
193
194
|
|
|
@@ -199,7 +200,7 @@ Liner versions three things independently:
|
|
|
199
200
|
|
|
200
201
|
- **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
202
|
- **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
|
+
- **Tools** (CLI, Go TUI, skill, and planned MCP server) follow semver. Major versions can break compatibility; minor and patch versions don't.
|
|
203
204
|
|
|
204
205
|
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
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Curating Mixtapes — Skill Bundle
|
|
2
2
|
|
|
3
|
-
This is the Liner methodology made executable by Claude. The bundle implements CURATION.md v2.0 as instructions to a running AI, drives the mixtape lifecycle from a
|
|
3
|
+
This is the Liner methodology made executable by Claude or Codex. The bundle implements CURATION.md v2.0 as instructions to a running AI, drives the mixtape lifecycle from a task description to a project folder ready for `liner compile`, and supports both quick mode (the AI does most of the work, with lightweight gate review) and methodology mode (the curator engages substantively at every phase).
|
|
4
4
|
|
|
5
5
|
It is one of Liner's surfaces, alongside the CLI, the TUI, the planned MCP server, and the planned web builder. The skill is the surface for Claude-Code-native and TUI-subprocess authoring. Methodology-mode curators can also use it directly when working in a Claude Code session.
|
|
6
6
|
|
|
@@ -18,7 +18,7 @@ curating-mixtapes/
|
|
|
18
18
|
└── synthesis-guidance.md # Phase 6
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
`SKILL.md` is the orchestrator. It defines the trigger description, the two modes, the
|
|
21
|
+
`SKILL.md` is the orchestrator. It defines the trigger description, the two modes, the review gates, the lifecycle skeleton, the AI biases to compensate for, the boundaries (what the skill does NOT do), and the failure modes to watch. It is always loaded when the skill fires.
|
|
22
22
|
|
|
23
23
|
The five companion files are loaded only at the phases that use them. Phases 1, 3, 7, and 8 have no companion file — their guidance fits inside SKILL.md.
|
|
24
24
|
|
|
@@ -28,7 +28,7 @@ The split is deliberate. Every invocation pulls SKILL.md's ~2,300 words into con
|
|
|
28
28
|
|
|
29
29
|
**Local testing.** Drop this directory into `~/.claude/skills/curating-mixtapes/`. Claude Code and Claude Desktop both look there for user-installed skills. The skill fires when the user says something the description matches — "help me make a mixtape on [topic]" is the canonical trigger.
|
|
30
30
|
|
|
31
|
-
**Shipping.** The canonical bundle lives at
|
|
31
|
+
**Shipping.** The canonical bundle lives at `docs/curation-skill/`. The TUI copies this directory into `packages/tui/cli-update-docs/` during `prepack` and ships it inside the `linersh` npm package, so end users do not need a separate skill install for TUI-driven agent phases.
|
|
32
32
|
|
|
33
33
|
**Direct skill use.** A documented copy/install flow for using the skill outside the TUI is still planned. Until then, direct local use is a developer workflow.
|
|
34
34
|
|
|
@@ -48,7 +48,7 @@ The user says something the description matches. Claude loads SKILL.md. Claude r
|
|
|
48
48
|
|
|
49
49
|
At Phase 2, Claude reads `source-finding-tactics.md`. At Phase 4, Claude reads `source-quality-hierarchy.md` and `curator-notes.md`. At Phase 5, Claude reads `quality-check-tests.md`. At Phase 6, Claude reads `synthesis-guidance.md`. Each companion file is read at the start of its phase, before any work in that phase happens.
|
|
50
50
|
|
|
51
|
-
The
|
|
51
|
+
The gates pause for user input. In quick mode, defaults can auto-continue while preserving project state. In methodology mode, the AI pauses for substantive review.
|
|
52
52
|
|
|
53
53
|
The skill writes artifacts to a project folder named for the topic (e.g., `mobile-design-foundations/`) as it goes. The working notes are produced phase by phase, so the user can stop at any phase boundary and resume later — the working files are picked up where they were left.
|
|
54
54
|
|
|
@@ -80,7 +80,7 @@ The bundle is functional and ships inside the npm TUI package so agent-backed ph
|
|
|
80
80
|
|
|
81
81
|
The bundle still benefits from more worked examples in the companion files, but it is no longer blocked by the old "second pass before any shipping" constraint. Current product risk lives more in curation quality and fetcher edge cases than in basic skill availability.
|
|
82
82
|
|
|
83
|
-
As of `linersh@0.
|
|
83
|
+
As of `linersh@1.0.0`, compilation is the corpus-ready milestone and Create Operating Layer is the project-complete milestone. A project can be "ready to use — compiled with warnings" when `MIXTAPE.md` is written but some sources are missing or soft-failed. The TUI opens the existing compile result for a completed mixtape and requires an explicit retry/re-run from that screen. Framing also has a validation contract: Phase 1 must produce a capability brief and required source roles before source discovery can proceed.
|
|
84
84
|
|
|
85
85
|
## Versioning
|
|
86
86
|
|
|
@@ -100,7 +100,7 @@ The skill is the methodology made executable. It sits alongside Liner's other su
|
|
|
100
100
|
|
|
101
101
|
**The Liner CLI** runs `liner compile` against the project folder this skill produces. The skill never compiles; the CLI never authors. Clean split.
|
|
102
102
|
|
|
103
|
-
**The Liner TUI** invokes this skill internally for
|
|
103
|
+
**The Liner TUI** invokes this skill internally for agent-backed authoring via the local Claude or Codex CLI. Same methodology, different UX.
|
|
104
104
|
|
|
105
105
|
**The Liner MCP server** (planned) will expose mechanical operations — fetch this URL, validate this tape file, query the cache — as tools. A future skill version will use those tools where v1 uses Claude's own web search.
|
|
106
106
|
|