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.
Files changed (98) hide show
  1. package/README.md +65 -165
  2. package/bin/liner.js +82 -44
  3. package/cli-update-docs/ABOUT.md +16 -16
  4. package/cli-update-docs/AI-HANDOFF.md +62 -190
  5. package/cli-update-docs/CURATION.md +48 -19
  6. package/cli-update-docs/JTBD-MASTER-PROMPT-ABOUT.md +9 -12
  7. package/cli-update-docs/JTBD-MASTER-PROMPT.md +1 -1
  8. package/cli-update-docs/LINER-MASTER.md +77 -63
  9. package/cli-update-docs/LINER-MD-PRD.md +531 -0
  10. package/cli-update-docs/MIXTAPE-FORMAT.md +76 -44
  11. package/cli-update-docs/PLATFORM.md +47 -46
  12. package/cli-update-docs/README.md +6 -6
  13. package/cli-update-docs/SKILL.md +72 -37
  14. package/cli-update-docs/TUI-BACKLOG.md +205 -26
  15. package/cli-update-docs/quality-check-tests.md +256 -8
  16. package/cli-update-docs/source-finding-tactics.md +140 -3
  17. package/cli-update-docs/source-quality-hierarchy.md +83 -0
  18. package/cli-update-docs/synthesis-guidance.md +19 -5
  19. package/dist/agents/artifact-validation.js +440 -0
  20. package/dist/agents/artifact-validation.js.map +1 -0
  21. package/dist/agents/candidate-longlist.js +100 -0
  22. package/dist/agents/candidate-longlist.js.map +1 -0
  23. package/dist/agents/detect.js +3 -2
  24. package/dist/agents/detect.js.map +1 -1
  25. package/dist/agents/evaluation-assembly.js +270 -0
  26. package/dist/agents/evaluation-assembly.js.map +1 -0
  27. package/dist/agents/headless-runner.js +227 -0
  28. package/dist/agents/headless-runner.js.map +1 -0
  29. package/dist/agents/jtbd-clarify.js +42 -41
  30. package/dist/agents/jtbd-clarify.js.map +1 -1
  31. package/dist/agents/models.js +6 -7
  32. package/dist/agents/models.js.map +1 -1
  33. package/dist/agents/prompts.js +220 -20
  34. package/dist/agents/prompts.js.map +1 -1
  35. package/dist/agents/runner.js +462 -21
  36. package/dist/agents/runner.js.map +1 -1
  37. package/dist/phases.js +13 -13
  38. package/dist/phases.js.map +1 -1
  39. package/dist/source-inbox.js +297 -0
  40. package/dist/source-inbox.js.map +1 -0
  41. package/dist/version.js +3 -9
  42. package/dist/version.js.map +1 -1
  43. package/dist/yaml-io.js +42 -11
  44. package/dist/yaml-io.js.map +1 -1
  45. package/package.json +26 -23
  46. package/cli-update-docs/JOB-STORY-MIGRATION.md +0 -99
  47. package/dist/App.js +0 -220
  48. package/dist/App.js.map +0 -1
  49. package/dist/colors.js +0 -132
  50. package/dist/colors.js.map +0 -1
  51. package/dist/components/Header.js +0 -15
  52. package/dist/components/Header.js.map +0 -1
  53. package/dist/components/KeyHints.js +0 -17
  54. package/dist/components/KeyHints.js.map +0 -1
  55. package/dist/components/LabeledBox.js +0 -53
  56. package/dist/components/LabeledBox.js.map +0 -1
  57. package/dist/components/NextSteps.js +0 -18
  58. package/dist/components/NextSteps.js.map +0 -1
  59. package/dist/index.js +0 -17
  60. package/dist/index.js.map +0 -1
  61. package/dist/screens/AgentSetup.js +0 -224
  62. package/dist/screens/AgentSetup.js.map +0 -1
  63. package/dist/screens/BootSplash.js +0 -163
  64. package/dist/screens/BootSplash.js.map +0 -1
  65. package/dist/screens/CompileView.js +0 -567
  66. package/dist/screens/CompileView.js.map +0 -1
  67. package/dist/screens/FramingConfirmReview.js +0 -197
  68. package/dist/screens/FramingConfirmReview.js.map +0 -1
  69. package/dist/screens/Gate1Review.js +0 -147
  70. package/dist/screens/Gate1Review.js.map +0 -1
  71. package/dist/screens/Gate2Review.js +0 -162
  72. package/dist/screens/Gate2Review.js.map +0 -1
  73. package/dist/screens/ImportPrompt.js +0 -173
  74. package/dist/screens/ImportPrompt.js.map +0 -1
  75. package/dist/screens/JsSetup.js +0 -77
  76. package/dist/screens/JsSetup.js.map +0 -1
  77. package/dist/screens/LocalFilePicker.js +0 -139
  78. package/dist/screens/LocalFilePicker.js.map +0 -1
  79. package/dist/screens/NewMixtapeWizard.js +0 -662
  80. package/dist/screens/NewMixtapeWizard.js.map +0 -1
  81. package/dist/screens/PhaseRunner.js +0 -1203
  82. package/dist/screens/PhaseRunner.js.map +0 -1
  83. package/dist/screens/ProcessManifest.js +0 -160
  84. package/dist/screens/ProcessManifest.js.map +0 -1
  85. package/dist/screens/ProjectHub.js +0 -557
  86. package/dist/screens/ProjectHub.js.map +0 -1
  87. package/dist/screens/SourceModal.js +0 -269
  88. package/dist/screens/SourceModal.js.map +0 -1
  89. package/dist/screens/TapeBrowser.js +0 -312
  90. package/dist/screens/TapeBrowser.js.map +0 -1
  91. package/dist/screens/TapeDraftReview.js +0 -444
  92. package/dist/screens/TapeDraftReview.js.map +0 -1
  93. package/dist/screens/TapeEditor.js +0 -310
  94. package/dist/screens/TapeEditor.js.map +0 -1
  95. package/dist/screens/cassette-art.js +0 -72
  96. package/dist/screens/cassette-art.js.map +0 -1
  97. package/dist/store.js +0 -10
  98. 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** 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.
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 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.
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 mixtape is a directory. The directory name is a slug — lowercase, hyphenated, filesystem-safe:
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
- ├── 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
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 mixtape works on a folder, not on individual files.
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 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.
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 | At least one source entry |
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 three source types: `youtube`, `web`, and `local_file`.
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`. Relative path under `personal/` (e.g., `personal/foo.pdf`) |
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; install `linersh[js]` first.
168
+ note: Requires headless-browser rendering; run `liner setup-js` first.
162
169
  section: foundations
163
170
 
164
171
  - type: local_file
165
- path: personal/touch-target-paper.pdf
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 non-empty list
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. `youtube` and `web` sources must not declare `path` or `citation`; `local_file` sources must not declare `url`
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 project folder and gets included verbatim at the top of `MIXTAPE.md`.
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
- └── 05-empirical-test.md # optional methodology validation
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, dropped, deferred) and the rationale. This is distinct from the cache (which holds source *content*); the evaluation file holds *decisions about* sources.
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/` (or wherever `platformdirs` puts it on the user's OS).
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 project folder. The cache itself is not part of the mixtape and is not included in exports.
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: `MIXTAPE.md`, `tape.yaml`, `synthesis.md`, `sources/`, `working/`, and `personal/` (when present). The archive does not contain anything from the shared content cache.
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 the archived `personal/` directly — no refetch.
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 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.
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 `personal/` to a local file containing the saved content.
392
- - `path` (for `local_media`) — path under `personal/` to the media file.
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, `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.
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** (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`.
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**. 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.
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**. 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.
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. None requires the others.
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
- 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.
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 mixtape is a folder, not a file. The folder is the canonical unit; everything else is derived from it.
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
- ├── 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
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. 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.
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/` (or wherever `platformdirs` puts it on the user's OS).
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 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
+ **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 accepts pull requests for methodology-mode mixtapes only.
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/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`
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: `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
+ 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. 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
+ 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 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.
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 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.
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 is curated by the maintainer and invited guest curators; submissions are welcomed but not guaranteed acceptance or response
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 topic to a project folder ready for `liner compile`, and supports both quick mode (the AI does most of the work, the user confirms at two gates) and methodology mode (the curator engages substantively at every phase).
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 two gates, the eight-phase 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.
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 repo-root `cli-update-docs/`. 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.
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 two gates pause for user input. In quick mode, the default is "looks good, continue" — Claude proceeds unless the user actively objects. In methodology mode, Claude pauses for substantive review.
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.5.5`, compilation is the product completion 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.
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 quick-mode authoring via the Claude Agent SDK. Same methodology, different UX.
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