linersh 1.0.0 → 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.
@@ -1,430 +0,0 @@
1
- # Mixtape Format
2
-
3
- The technical specification for Liner mixtapes.
4
-
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
-
7
- ---
8
-
9
- ## Overview
10
-
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
-
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 project is a directory. The directory name is a slug — lowercase, hyphenated, filesystem-safe:
27
-
28
- ```
29
- mobile-design-foundations/
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
44
- ```
45
-
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.
47
-
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.
49
-
50
- ---
51
-
52
- ## `tape.yaml` — the recipe
53
-
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.
55
-
56
- ### Required top-level fields
57
-
58
- | Field | Type | Description |
59
- |---|---|---|
60
- | `title` | string | Display name of the mixtape |
61
- | `description` | string | One-sentence description of the mixtape's purpose |
62
- | `curator` | string | Name of the curator |
63
- | `version` | integer | Tape format version. Must be `1` for v1 format |
64
- | `mode` | string | `quick` or `methodology` — how this mixtape was curated |
65
- | `sources` | list | Source entries. May be empty while drafting; compile/share require usable sources. |
66
-
67
- ### Optional top-level fields
68
-
69
- | Field | Type | Description |
70
- |---|---|---|
71
- | `tags` | list of strings | Tags for discovery and filtering |
72
- | `created` | ISO date | Creation date |
73
- | `updated` | ISO date | Last meaningful update |
74
- | `license` | string | License identifier (e.g., `CC-BY-4.0`, `MIT`) |
75
- | `homepage` | URL | Link to the mixtape's home (e.g., its GitHub page) |
76
- | `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. |
77
- | `methodology_version` | string | Which version of CURATION.md was applied |
78
-
79
- ### Source entries
80
-
81
- v1 supports four source types: `youtube`, `web`, `local_file`, and `skill`.
82
-
83
- **Required fields per source:**
84
-
85
- | Field | Type | Description |
86
- |---|---|---|
87
- | `type` | string | One of `youtube`, `web`, `local_file`, `skill` |
88
- | `url` | URL | Required for `youtube` and `web` source types. Omitted 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`) |
90
- | `citation` | string | Required for `local_file`. Human-readable provenance: author, title, publication, date |
91
-
92
- **Optional fields per source (all types):**
93
-
94
- | Field | Type | Description |
95
- |---|---|---|
96
- | `note` | string | Curator note. Strongly recommended; required for library contributions |
97
- | `section` | string | Section label for grouping sources in the compiled mixtape |
98
- | `priority` | string | `required` (default) or `optional`. Optional sources can be excluded with `--skip-optional` |
99
-
100
- **Optional fields specific to `web` sources:**
101
-
102
- | Field | Type | Description |
103
- |---|---|---|
104
- | `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. |
105
-
106
- **Optional fields specific to `local_file` sources:**
107
-
108
- | Field | Type | Description |
109
- |---|---|---|
110
- | (none yet) | | The required `path` and `citation` cover v1.1 |
111
-
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.
122
-
123
- ### Example
124
-
125
- ```yaml
126
- title: Mobile Design Foundations
127
- description: Core principles for native mobile UX.
128
- curator: Your Name
129
- version: 1
130
- mode: methodology
131
- tags: [mobile, design, ux]
132
- created: 2026-05-18
133
- license: CC-BY-4.0
134
- 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.
135
- methodology_version: "2.0"
136
-
137
- sources:
138
- - type: web
139
- url: https://developer.apple.com/design/human-interface-guidelines/gestures
140
- note: |
141
- Apple's canonical gesture reference. Skim the overview;
142
- the per-gesture detail is what matters.
143
- section: foundations
144
-
145
- - type: youtube
146
- url: https://www.youtube.com/watch?v=XXXX
147
- note: |
148
- Watch first. The section starting at 14:30 on touch
149
- target hierarchy is the load-bearing point.
150
- section: foundations
151
-
152
- - type: web
153
- url: https://example.com/article-on-mobile-nav
154
- note: |
155
- Critique of bottom-tab navigation patterns. Take with
156
- the next source which disagrees.
157
- section: patterns
158
-
159
- - type: web
160
- url: https://example.com/counterargument
161
- note: Defends bottom tabs for high-frequency apps.
162
- section: patterns
163
- priority: optional
164
-
165
- - type: web
166
- url: https://developer.apple.com/design/human-interface-guidelines/accessibility
167
- render: js
168
- note: Requires headless-browser rendering; run `liner setup-js` first.
169
- section: foundations
170
-
171
- - type: local_file
172
- path: local-sources/touch-target-paper.pdf
173
- citation: "Parhi et al., 'Target Size for One-Handed Thumb Use on Small Touchscreen Devices,' Mobile HCI 2006."
174
- note: The canonical empirical study behind Apple's 44pt minimum.
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
181
- ```
182
-
183
- ### Validation rules
184
-
185
- A `tape.yaml` is valid if and only if:
186
-
187
- 1. The YAML parses
188
- 2. All required top-level fields are present
189
- 3. `version` is `1` (v1 parsers reject other values)
190
- 4. `mode` is `quick` or `methodology`
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`
193
- 7. For `youtube` and `web` sources: `url` is present and parses as a valid URL
194
- 8. For `web` sources: if `render` is present, it is `server` or `js`
195
- 9. For `local_file` sources: `path` and `citation` are present
196
- 10. For `local_file` sources: `path` is a relative POSIX path starting with `local-sources/` or legacy `personal/` and contains no `..` segments
197
- 11. For `local_file` sources: the extension is one of `.md`, `.txt`, `.html`, `.htm`, `.pdf`
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`
200
-
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).
202
-
203
- Validation errors should point to the specific field and the specific problem.
204
-
205
- ---
206
-
207
- ## `synthesis.md`
208
-
209
- The synthesis is the curator's distilled understanding of the domain, expressed in their own voice. It is required — every mixtape has one.
210
-
211
- The synthesis covers:
212
-
213
- - The principles or framework the curator sees in the domain
214
- - Contested questions and where the curator stands
215
- - Distinctions between concepts that get confused
216
- - When to use what's in the mixtape and when to look elsewhere
217
-
218
- Length is typically 800–2000 words. Shorter for narrow topics; longer for broader ones.
219
-
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`.
221
-
222
- ---
223
-
224
- ## `MIXTAPE.md` — the master file
225
-
226
- `MIXTAPE.md` is what the consuming AI actually reads. It is produced by `liner compile` and combines the synthesis with a source index.
227
-
228
- Structure:
229
-
230
- ```markdown
231
- # {title}
232
-
233
- > {description}
234
-
235
- **Curator:** {curator}
236
- **Compiled:** {ISO timestamp}
237
- **Sources:** {n}
238
- **JTBD:** {jtbd if present}
239
-
240
- ---
241
-
242
- ## How to use this mixtape
243
-
244
- [Standard boilerplate explaining that this is a curated context
245
- bundle, that the synthesis below provides framing, and that
246
- individual source files are referenced in the index and should
247
- be consulted when specific detail is needed.]
248
-
249
- ---
250
-
251
- ## Synthesis
252
-
253
- {contents of synthesis.md, verbatim}
254
-
255
- ---
256
-
257
- ## Sources
258
-
259
- {for each section, in order of first appearance:}
260
-
261
- ### {section name}
262
-
263
- #### Source {N}: {source title or citation}
264
-
265
- - **Type:** {youtube|web|local_file}
266
- - **URL:** {source url} *(for youtube/web)*
267
- - **Citation:** {citation} *(for local_file)*
268
- - **Local path:** {path} *(for local_file)*
269
- - **Render:** {server|js} *(for web sources, only when explicitly set)*
270
- - **Author:** {author if known}
271
- - **Published:** {date if known}
272
- - **Curator note:** {note}
273
- - **Content file:** [sources/{nn}-{slug}.md](./sources/{nn}-{slug}.md)
274
- ```
275
-
276
- 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.
277
-
278
- 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.
279
-
280
- ---
281
-
282
- ## `sources/`
283
-
284
- 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.
285
-
286
- Each source file contains:
287
-
288
- ```markdown
289
- # {source title or citation}
290
-
291
- **Source type:** {youtube|web|local_file}
292
- **URL:** {url} *(for youtube/web)*
293
- **Citation:** {citation} *(for local_file)*
294
- **Local path:** {path} *(for local_file)*
295
- **Author:** {author if known}
296
- **Published:** {date if known}
297
- **Fetched:** {ISO timestamp}
298
-
299
- {extracted content}
300
- ```
301
-
302
- 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.
303
-
304
- 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`.
305
-
306
- ---
307
-
308
- ## `working/` — the methodology made visible
309
-
310
- 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.
311
-
312
- Files are numbered to indicate phase order:
313
-
314
- ```
315
- working/
316
- ├── 01-jtbd-and-knowledge-map.md
317
- ├── 02-candidate-longlist.md
318
- ├── 03-evaluation.yaml
319
- ├── 04-quality-checks.md
320
- ├── 05-operating-fit-audit.md # optional improvement recommendation
321
- └── 06-empirical-test.md # optional methodology validation
322
- ```
323
-
324
- These are not required by the format but are recommended. Library contributions must include them.
325
-
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.
327
-
328
- Example `03-evaluation.yaml`:
329
-
330
- ```yaml
331
- candidates:
332
- - url: https://example.com/great-article
333
- decision: kept
334
- section: foundations
335
- rationale: Canonical reference for the foundations section.
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.
346
- - url: https://example.com/listicle
347
- decision: dropped
348
- rationale: Shallow listicle, duplicates content in Source 3.
349
- rating: 1
350
- - url: https://example.com/contested
351
- decision: kept
352
- section: patterns
353
- rationale: Strong perspective; paired with Source 5 which disagrees.
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.
364
- ```
365
-
366
- ---
367
-
368
- ## The content cache
369
-
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).
371
-
372
- The cache is shared across all the curator's projects. A source fetched for one mixtape is available for all future mixtapes.
373
-
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.
375
-
376
- See [PLATFORM.md](./PLATFORM.md) for the cache's role in the broader architecture.
377
-
378
- ---
379
-
380
- ## The `.mixtape` export format
381
-
382
- A `.mixtape` file is a zip archive of a project folder, produced by `liner share` and consumed by `liner import`.
383
-
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.
385
-
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.
387
-
388
- Flags affecting the export:
389
-
390
- - `--no-working-notes`: exclude `working/` from the archive
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.
392
- - `--no-source-content`: exclude `sources/` from the archive. The recipient must re-fetch on first compile.
393
- - `--minimal`: include only `tape.yaml`. The recipient compiles from scratch — and must supply their own local files for any `local_file` sources.
394
-
395
- **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.
396
-
397
- ---
398
-
399
- ## Versioning policy
400
-
401
- The mixtape format has its own version number, independent of the CLI/TUI version.
402
-
403
- - **v1** is the current format. Stable.
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.
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.
406
- - Additive, non-breaking changes (new optional fields, new source types) may happen within a major version with a minor version note.
407
-
408
- ---
409
-
410
- ## v2 — Planned additions (not yet implemented)
411
-
412
- The following source types and fields are designed but not yet implemented. Full specifications will land when the implementations do.
413
-
414
- ### Additional source types
415
-
416
- - `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.
417
- - `pasted` — short content entered directly into `tape.yaml`.
418
- - `local_media` — audio or video files. Requires external transcription before use.
419
-
420
- ### Additional fields
421
-
422
- - `content` (for `pasted` sources) — the literal content as a multi-line string.
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.
425
-
426
- ---
427
-
428
- ## License
429
-
430
- This specification is part of the Liner project and is MIT-licensed.
@@ -1,211 +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** (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
-
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
-
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** (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
-
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
-
23
- The implemented surfaces are independent. Planned surfaces should preserve that contract.
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, 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
- 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, source-kind, and source-role tests
50
- 6. **Synthesis** — AI drafts the synthesis; curator may edit (synthesis is required, not optional)
51
- 7. **Final assembly** — `liner compile` writes `mixtape/MIXTAPE.md` and populates `mixtape/sources/` in v2 projects
52
- 8. **Empirical test** (optional but recommended) — compile, paste into AI conversation, compare with/without
53
-
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.
57
-
58
- ---
59
-
60
- ## The artifacts
61
-
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.
63
-
64
- ```
65
- mobile-design-foundations/
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
79
- ```
80
-
81
- Three concepts to distinguish:
82
-
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.
86
-
87
- [MIXTAPE-FORMAT.md](./MIXTAPE-FORMAT.md) specifies the structure in detail.
88
-
89
- ---
90
-
91
- ## The content cache
92
-
93
- The cache is a shared, curator-level resource. One cache per machine, used across all projects.
94
-
95
- Default location: `~/.liner/cache.db` (or wherever `platformdirs` puts it on the user's OS).
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.
98
-
99
- 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.
100
-
101
- 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.
102
-
103
- ---
104
-
105
- ## The library (planned)
106
-
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.
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.
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.
112
-
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.
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.
116
-
117
- ---
118
-
119
- ## Contributing
120
-
121
- The planned library will accept pull requests for methodology-mode mixtapes only.
122
-
123
- 1. Build the mixtape in methodology mode, applying [CURATION.md](./CURATION.md) substantively
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`
126
- 4. A maintainer reviews. Submissions can be accepted, returned with feedback, or declined
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.
129
-
130
- Accepted mixtapes are credited to the curator by name. Curators retain authorship. Library mixtapes are MIT-licensed by default unless otherwise specified.
131
-
132
- ---
133
-
134
- ## Sharing
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.
137
-
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.
139
-
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.
141
-
142
- **Flags worth knowing about:**
143
-
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.
148
-
149
- ---
150
-
151
- ## What Liner doesn't do
152
-
153
- Boundaries that shape the project's scope:
154
-
155
- - **No hosted compilation.** All compilation happens on the curator's machine. Liner does not run a server that fetches sources for users.
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.
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.
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.
160
- - **No telemetry.** The tools don't phone home. Usage is the user's own business.
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.
162
-
163
- These boundaries are stable. Anything outside them either lives in a separate project or doesn't get built.
164
-
165
- ---
166
-
167
- ## The community index (planned, deferred)
168
-
169
- 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.
170
-
171
- The design:
172
-
173
- - Curators sign in with GitHub OAuth and submit a link to a public GitHub repository containing their mixtape folder
174
- - The repository must be on GitHub (no other hosts in v1)
175
- - Entries are reviewed before featuring; the front page is editorially curated
176
- - No comments, ratings, or community voting in v1
177
- - A passive popularity signal may be shown but does not drive default sorting
178
-
179
- 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.
180
-
181
- ---
182
-
183
- ## Maintenance contract
184
-
185
- Liner is a side project. The maintenance contract:
186
-
187
- - Issues and PRs are reviewed when time permits, not on any schedule
188
- - No SLA, no guaranteed compatibility, no support commitments
189
- - Breaking changes are possible between versions; versioning will be honest about them
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
191
- - The planned library will be curated by the maintainer and invited guest curators; submissions are welcomed but not guaranteed acceptance or response
192
-
193
- Open source does not mean free maintenance. Users who need guaranteed support should use a hosted product.
194
-
195
- ---
196
-
197
- ## Versioning
198
-
199
- Liner versions three things independently:
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.
202
- - **Methodology** is versioned in [CURATION.md](./CURATION.md). Substantive changes increment the methodology version.
203
- - **Tools** (CLI, Go TUI, skill, and planned MCP server) follow semver. Major versions can break compatibility; minor and patch versions don't.
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.
206
-
207
- ---
208
-
209
- ## License
210
-
211
- MIT.