linersh 1.1.3 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -61
- package/bin/liner.js +60 -16
- package/package.json +10 -17
- package/cli-update-docs/README.md +0 -129
- package/cli-update-docs/SKILL.md +0 -294
- package/cli-update-docs/curator-notes.md +0 -85
- package/cli-update-docs/quality-check-tests.md +0 -435
- package/cli-update-docs/source-finding-tactics.md +0 -224
- package/cli-update-docs/source-quality-hierarchy.md +0 -209
- package/cli-update-docs/synthesis-guidance.md +0 -151
- package/dist/agents/artifact-validation.js +0 -567
- package/dist/agents/artifact-validation.js.map +0 -1
- package/dist/agents/candidate-longlist.js +0 -116
- package/dist/agents/candidate-longlist.js.map +0 -1
- package/dist/agents/detect.js +0 -169
- package/dist/agents/detect.js.map +0 -1
- package/dist/agents/evaluation-assembly.js +0 -270
- package/dist/agents/evaluation-assembly.js.map +0 -1
- package/dist/agents/events.js +0 -8
- package/dist/agents/events.js.map +0 -1
- package/dist/agents/headless-runner.js +0 -432
- package/dist/agents/headless-runner.js.map +0 -1
- package/dist/agents/jtbd-clarify.js +0 -169
- package/dist/agents/jtbd-clarify.js.map +0 -1
- package/dist/agents/models.js +0 -98
- package/dist/agents/models.js.map +0 -1
- package/dist/agents/parsers.js +0 -316
- package/dist/agents/parsers.js.map +0 -1
- package/dist/agents/prompts.js +0 -522
- package/dist/agents/prompts.js.map +0 -1
- package/dist/agents/run-log.js +0 -71
- package/dist/agents/run-log.js.map +0 -1
- package/dist/agents/runner.js +0 -906
- package/dist/agents/runner.js.map +0 -1
- package/dist/agents/types.js +0 -2
- package/dist/agents/types.js.map +0 -1
- package/dist/bin-resolver.js +0 -92
- package/dist/bin-resolver.js.map +0 -1
- package/dist/config.js +0 -282
- package/dist/config.js.map +0 -1
- package/dist/editor.js +0 -40
- package/dist/editor.js.map +0 -1
- package/dist/gates.js +0 -121
- package/dist/gates.js.map +0 -1
- package/dist/ipc.js +0 -145
- package/dist/ipc.js.map +0 -1
- package/dist/open-folder.js +0 -28
- package/dist/open-folder.js.map +0 -1
- package/dist/phases.js +0 -346
- package/dist/phases.js.map +0 -1
- package/dist/progress.js +0 -184
- package/dist/progress.js.map +0 -1
- package/dist/source-inbox.js +0 -297
- package/dist/source-inbox.js.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/version.js +0 -18
- package/dist/version.js.map +0 -1
- package/dist/yaml-io.js +0 -376
- package/dist/yaml-io.js.map +0 -1
- package/maintenance-skill/SKILL.md +0 -18
- package/maintenance-skill/agents/openai.yaml +0 -4
package/README.md
CHANGED
|
@@ -1,21 +1,13 @@
|
|
|
1
|
-
# Liner
|
|
1
|
+
# Liner npm package
|
|
2
2
|
|
|
3
|
-
This package is
|
|
4
|
-
binary. It is no longer the React/Ink TUI implementation.
|
|
3
|
+
This package is named `linersh` because it owns the published `liner` binary.
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
- `bin/liner.js`: the launcher. It opens the navigator, or forwards a subcommand
|
|
6
|
+
to Core.
|
|
7
|
+
- Optional per-platform packages hold the native CLI and navigator binaries.
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
- TypeScript headless methodology runner under `src/agents/`
|
|
11
|
-
- packaged curation skill bundle copied from `../../docs/curation-skill/` into
|
|
12
|
-
`cli-update-docs/`
|
|
13
|
-
- optional per-platform packages that contain the native CLI and Go TUI
|
|
14
|
-
binaries for installed users
|
|
15
|
-
|
|
16
|
-
The old React/Ink TUI has been decommissioned and is no longer part of the
|
|
17
|
-
active package shape. `LINER_TUI=ink` intentionally fails with a decommissioning
|
|
18
|
-
message.
|
|
9
|
+
Every Core command has to be listed in `bin/liner.js`, or the launcher opens the
|
|
10
|
+
navigator instead. A test in `tests/test_library_view.py` checks this.
|
|
19
11
|
|
|
20
12
|
## Install
|
|
21
13
|
|
|
@@ -25,7 +17,7 @@ npm install -g linersh
|
|
|
25
17
|
liner
|
|
26
18
|
```
|
|
27
19
|
|
|
28
|
-
With no arguments, `liner`
|
|
20
|
+
With no arguments, `liner` opens the navigator. CLI subcommands such as
|
|
29
21
|
`liner compile`, `liner share`, `liner import`, `liner project`,
|
|
30
22
|
`liner sources`, `liner adapters`, `liner status`, and `liner setup-js` pass
|
|
31
23
|
through to the Python core. If you are using one-shot
|
|
@@ -46,7 +38,7 @@ liner sources add <project> --type web --url <url> --note <note>
|
|
|
46
38
|
liner project rename <project> --name <name>
|
|
47
39
|
```
|
|
48
40
|
|
|
49
|
-
|
|
41
|
+
Optional Codex
|
|
50
42
|
and Claude Maintenance Adapters are explicit CLI-delegating installations:
|
|
51
43
|
|
|
52
44
|
```sh
|
|
@@ -74,47 +66,17 @@ HOME="$home" npm_config_cache="$cache" LINER_DIR="$projects" npx --yes linersh@l
|
|
|
74
66
|
rm -rf "$tmp"
|
|
75
67
|
```
|
|
76
68
|
|
|
77
|
-
The second command opens the
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
69
|
+
The second command opens the navigator, which is read-only. Ask your agent to
|
|
70
|
+
build a test liner with `liner research`, using the same `LINER_DIR`, and watch
|
|
71
|
+
it appear in the navigator. Because `HOME`, the npm cache, and `LINER_DIR` all
|
|
72
|
+
point inside `$tmp`, cleanup is just `rm -rf "$tmp"`.
|
|
81
73
|
|
|
82
74
|
## Run Locally
|
|
83
75
|
|
|
84
|
-
For normal repository testing, use the isolated launch so Projects and Settings
|
|
85
|
-
cannot write to the production Liner library or profile:
|
|
86
|
-
|
|
87
76
|
```sh
|
|
88
77
|
npm --prefix packages/tui run dev:isolated
|
|
89
78
|
```
|
|
90
79
|
|
|
91
|
-
See [../../docs/development.md](../../docs/development.md) for explicit
|
|
92
|
-
authenticated provider-home options and the offline runner-preferences smoke.
|
|
93
|
-
|
|
94
|
-
From the repo root:
|
|
95
|
-
|
|
96
|
-
```sh
|
|
97
|
-
npm --prefix packages/tui run dev
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
From this package:
|
|
101
|
-
|
|
102
|
-
```sh
|
|
103
|
-
npm run dev
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Override the projects folder:
|
|
107
|
-
|
|
108
|
-
```sh
|
|
109
|
-
LINER_DIR=/path/to/projects node bin/liner.js
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
Override the Python/core binary:
|
|
113
|
-
|
|
114
|
-
```sh
|
|
115
|
-
LINER_BIN=/absolute/path/to/liner node bin/liner.js
|
|
116
|
-
```
|
|
117
|
-
|
|
118
80
|
## Build And Test
|
|
119
81
|
|
|
120
82
|
```sh
|
|
@@ -126,7 +88,7 @@ npm test
|
|
|
126
88
|
|
|
127
89
|
Notes:
|
|
128
90
|
|
|
129
|
-
- `build` compiles the
|
|
91
|
+
- `build` compiles the version helper.
|
|
130
92
|
- `build:go` compiles `../go-tui/cmd/liner-tui` into `bin/liner-tui` for local
|
|
131
93
|
development.
|
|
132
94
|
- `build:package` runs both.
|
|
@@ -141,20 +103,12 @@ Notes:
|
|
|
141
103
|
|
|
142
104
|
- `LINER_DIR=/path/to/projects`: change the projects folder.
|
|
143
105
|
- `LINER_BIN=/path/to/liner`: force the Python/core binary.
|
|
144
|
-
- `LINER_GO_TUI_BIN=/path/to/liner-tui`: force the
|
|
145
|
-
- `LINER_HEADLESS_RUNNER=/path/to/headless-runner.js`: force the methodology
|
|
146
|
-
runner script.
|
|
147
|
-
- `LINER_AGENT=codex|claude`: override the agent selected by Liner config.
|
|
106
|
+
- `LINER_GO_TUI_BIN=/path/to/liner-tui`: force the navigator binary.
|
|
148
107
|
- `LINER_TUI=go`: accepted for compatibility, but no longer required.
|
|
149
108
|
|
|
150
109
|
## Developer Gotchas
|
|
151
110
|
|
|
152
111
|
- Rebuild `bin/liner-tui` after Go changes or the npm shim may launch an older
|
|
153
112
|
binary.
|
|
154
|
-
- Rebuild `dist/` after TypeScript runner changes or methodology will fail.
|
|
155
113
|
- The published main package intentionally excludes `bin/liner-tui`; installed
|
|
156
114
|
users get the native TUI from `linersh-<platform>-<arch>`.
|
|
157
|
-
- If Project Health says `status failed`, check the resolved core. Older bundled
|
|
158
|
-
cores may reject `--no-write`; the Go wrapper has a fallback, but direct
|
|
159
|
-
`node bin/liner.js status ... --no-write` can still fail until platform cores
|
|
160
|
-
are refreshed.
|
package/bin/liner.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// Entry shim for `npx linersh` / `liner`.
|
|
3
3
|
//
|
|
4
|
-
// No args:
|
|
5
|
-
// unset ->
|
|
6
|
-
// LINER_TUI=go ->
|
|
7
|
-
//
|
|
4
|
+
// No args: open the navigator (the Charm Go TUI).
|
|
5
|
+
// unset -> open the navigator
|
|
6
|
+
// LINER_TUI=go -> open the navigator explicitly
|
|
7
|
+
// A known command: forward to the bundled Python core (or LINER_BIN/dev fallback).
|
|
8
|
+
// Anything else: print an error instead of opening the navigator.
|
|
8
9
|
//
|
|
9
10
|
// This lets the npm package expose one binary name while still supporting
|
|
10
11
|
// mechanical commands like `liner setup-js`, `liner compile`, and `liner status`.
|
|
@@ -43,6 +44,21 @@ const COMMAND_GROUPS = [
|
|
|
43
44
|
{ name: "status", description: "Show Liner Project status", owner: "core" },
|
|
44
45
|
{ name: "setup-js", description: "Set up JavaScript rendering support", owner: "core" },
|
|
45
46
|
{ name: "uninstall", description: "Remove local Liner state and caches", owner: "launcher" },
|
|
47
|
+
{ name: "catalog", description: "List every liner in your library", owner: "core" },
|
|
48
|
+
{ name: "search", description: "Search your liners", owner: "core" },
|
|
49
|
+
{ name: "find-sources", description: "Find sources already in your library", owner: "core" },
|
|
50
|
+
{ name: "library", description: "Report your whole library as JSON", owner: "core" },
|
|
51
|
+
{ name: "handoff", description: "Write prompts for your agent", owner: "core" },
|
|
52
|
+
{ name: "research", description: "Build a liner step by step with an agent", owner: "core" },
|
|
53
|
+
{ name: "fetch", description: "Save a web page to a file in a liner", owner: "core" },
|
|
54
|
+
{ name: "citations", description: "List a synthesis's citations", owner: "core" },
|
|
55
|
+
{ name: "refresh", description: "Report what changed online", owner: "core" },
|
|
56
|
+
{ name: "gaps", description: "Record what a liner couldn't answer", owner: "core" },
|
|
57
|
+
{ name: "findings", description: "Review what real work learned", owner: "core" },
|
|
58
|
+
{ name: "test", description: "Record with-and-without tests", owner: "core" },
|
|
59
|
+
{ name: "use", description: "Point a repository at a liner", owner: "core" },
|
|
60
|
+
{ name: "agent-skill", description: "Manage the liner skill", owner: "core" },
|
|
61
|
+
{ name: "mcp", description: "Serve your liners over MCP", owner: "core" },
|
|
46
62
|
{
|
|
47
63
|
name: "--version",
|
|
48
64
|
description: "Show installed launcher and core versions (-v)",
|
|
@@ -91,7 +107,11 @@ const CLI_COMMANDS = new Set(
|
|
|
91
107
|
),
|
|
92
108
|
);
|
|
93
109
|
|
|
94
|
-
|
|
110
|
+
// Help wins anywhere unless a command owns the arguments
|
|
111
|
+
// (`liner compile --help` and `liner uninstall --help` print their own help).
|
|
112
|
+
const HELP_ARGS = new Set(["--help", "-h", "help"]);
|
|
113
|
+
const ownsHelp = CLI_COMMANDS.has(argv[0]) || argv[0] === "uninstall";
|
|
114
|
+
if (argv.length > 0 && !ownsHelp && argv.some((arg) => HELP_ARGS.has(arg))) {
|
|
95
115
|
printHelp();
|
|
96
116
|
process.exit(0);
|
|
97
117
|
}
|
|
@@ -130,6 +150,9 @@ if (wantsCli(argv)) {
|
|
|
130
150
|
}
|
|
131
151
|
process.exit(code ?? 1);
|
|
132
152
|
});
|
|
153
|
+
} else if (argv.length > 0) {
|
|
154
|
+
printUnknownCommand(argv[0]);
|
|
155
|
+
process.exit(2);
|
|
133
156
|
} else {
|
|
134
157
|
const tui = (process.env.LINER_TUI || "go").toLowerCase();
|
|
135
158
|
if (tui !== "go") {
|
|
@@ -145,14 +168,12 @@ if (wantsCli(argv)) {
|
|
|
145
168
|
}
|
|
146
169
|
|
|
147
170
|
const resolved = resolveGoTuiBinary();
|
|
148
|
-
const headlessRunner = tryResolveHeadlessRunnerScript();
|
|
149
171
|
const child = spawn(resolved.command, resolved.args, {
|
|
150
172
|
stdio: "inherit",
|
|
151
173
|
cwd: resolved.cwd || process.cwd(),
|
|
152
174
|
env: {
|
|
153
175
|
...process.env,
|
|
154
176
|
LINER_BIN: process.env.LINER_BIN || tryResolveCliCommand() || "",
|
|
155
|
-
LINER_HEADLESS_RUNNER: process.env.LINER_HEADLESS_RUNNER || headlessRunner || "",
|
|
156
177
|
},
|
|
157
178
|
});
|
|
158
179
|
child.on("exit", (code, signal) => {
|
|
@@ -441,13 +462,13 @@ function readTuiVersion() {
|
|
|
441
462
|
|
|
442
463
|
function printHelp() {
|
|
443
464
|
const lines = [
|
|
444
|
-
"Liner —
|
|
465
|
+
"Liner — a personal library of reusable research.",
|
|
445
466
|
"",
|
|
446
467
|
"Usage:",
|
|
447
|
-
" liner Open the
|
|
468
|
+
" liner Open the navigator",
|
|
448
469
|
" liner <command> [options] Run a command",
|
|
449
470
|
"",
|
|
450
|
-
"liner with no arguments opens the
|
|
471
|
+
"liner with no arguments opens the navigator.",
|
|
451
472
|
"Run `liner <command> --help` for detailed command help.",
|
|
452
473
|
"",
|
|
453
474
|
];
|
|
@@ -466,6 +487,34 @@ function printHelp() {
|
|
|
466
487
|
console.log(lines.join("\n"));
|
|
467
488
|
}
|
|
468
489
|
|
|
490
|
+
// A typo such as `liner compil` used to open the navigator silently. Name the
|
|
491
|
+
// closest command instead, when one is a likely match.
|
|
492
|
+
function printUnknownCommand(name) {
|
|
493
|
+
const known = [...COMMAND_GROUPS.flatMap((group) => group.commands.map((command) => command.name)), "--help"];
|
|
494
|
+
const typed = name.toLowerCase();
|
|
495
|
+
const suggestion = known
|
|
496
|
+
.map((command) => ({ command, distance: editDistance(typed, command) }))
|
|
497
|
+
.filter(({ command, distance }) => distance <= Math.max(1, Math.floor(command.length / 3)))
|
|
498
|
+
.sort((a, b) => a.distance - b.distance)[0];
|
|
499
|
+
const lines = [`Unknown command: ${name}`];
|
|
500
|
+
if (suggestion) lines.push(`Did you mean \`liner ${suggestion.command}\`?`);
|
|
501
|
+
lines.push("Run `liner --help` for the commands, or `liner` alone to open the navigator.");
|
|
502
|
+
console.error(lines.join("\n"));
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
function editDistance(a, b) {
|
|
506
|
+
let previous = Array.from({ length: b.length + 1 }, (_, index) => index);
|
|
507
|
+
for (let i = 1; i <= a.length; i += 1) {
|
|
508
|
+
const current = [i];
|
|
509
|
+
for (let j = 1; j <= b.length; j += 1) {
|
|
510
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
511
|
+
current.push(Math.min(previous[j] + 1, current[j - 1] + 1, previous[j - 1] + cost));
|
|
512
|
+
}
|
|
513
|
+
previous = current;
|
|
514
|
+
}
|
|
515
|
+
return previous[b.length];
|
|
516
|
+
}
|
|
517
|
+
|
|
469
518
|
// Like resolveCliBinary() but non-fatal: returns null instead of exiting when
|
|
470
519
|
// no core binary is found, so `--version` still prints the TUI version on a
|
|
471
520
|
// host where the bundled core is missing (e.g. Windows pre-unblock).
|
|
@@ -475,11 +524,6 @@ function tryResolveCliCommand() {
|
|
|
475
524
|
return findRepoVenvBinary() || findBundledBinary() || findPathBinary() || null;
|
|
476
525
|
}
|
|
477
526
|
|
|
478
|
-
function tryResolveHeadlessRunnerScript() {
|
|
479
|
-
const candidate = join(packageRoot, "dist", "agents", "headless-runner.js");
|
|
480
|
-
return existsSync(candidate) ? candidate : null;
|
|
481
|
-
}
|
|
482
|
-
|
|
483
527
|
function printVersion() {
|
|
484
528
|
const tui = readTuiVersion();
|
|
485
529
|
let coreVer = null;
|
|
@@ -490,5 +534,5 @@ function printVersion() {
|
|
|
490
534
|
coreVer = r.stdout.trim().replace(/^liner\s+/i, "") || null;
|
|
491
535
|
}
|
|
492
536
|
}
|
|
493
|
-
console.log(coreVer ? `liner ${tui} (tui)
|
|
537
|
+
console.log(coreVer ? `liner ${tui} (tui) · ${coreVer} (core)` : `liner ${tui} (tui)`);
|
|
494
538
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "linersh",
|
|
3
|
-
"version": "1.1
|
|
4
|
-
"description": "Liner — npm
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "Liner — npm launcher for the terminal navigator and Core CLI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "cmdux-sh",
|
|
@@ -17,10 +17,7 @@
|
|
|
17
17
|
"liner": "bin/liner.js"
|
|
18
18
|
},
|
|
19
19
|
"files": [
|
|
20
|
-
"bin/liner.js"
|
|
21
|
-
"dist/",
|
|
22
|
-
"cli-update-docs/",
|
|
23
|
-
"maintenance-skill/"
|
|
20
|
+
"bin/liner.js"
|
|
24
21
|
],
|
|
25
22
|
"scripts": {
|
|
26
23
|
"build": "tsc",
|
|
@@ -31,8 +28,7 @@
|
|
|
31
28
|
"dev:go": "node bin/liner.js",
|
|
32
29
|
"predev:isolated": "node scripts/unhide-venv.mjs && npm run build:package",
|
|
33
30
|
"dev:isolated": "node scripts/dev-isolated.mjs",
|
|
34
|
-
"
|
|
35
|
-
"prepack": "npm run release:check && node scripts/copy-skill-bundle.mjs && npm run build:package",
|
|
31
|
+
"prepack": "npm run release:check && npm run build:package",
|
|
36
32
|
"release:check": "uv run python ../../scripts/release-version.py --check",
|
|
37
33
|
"release:check:publish": "uv run python ../../scripts/release-version.py --check --check-registry --registry-package linersh",
|
|
38
34
|
"prepublishOnly": "npm run release:check:publish && npm run typecheck && npm test && npm run build:package",
|
|
@@ -44,20 +40,17 @@
|
|
|
44
40
|
"typecheck": "tsc --noEmit",
|
|
45
41
|
"test": "vitest run"
|
|
46
42
|
},
|
|
47
|
-
"dependencies": {
|
|
48
|
-
"yaml": "^2.6.1"
|
|
49
|
-
},
|
|
50
43
|
"optionalDependencies": {
|
|
51
|
-
"linersh-darwin-arm64": "1.1
|
|
52
|
-
"linersh-darwin-x64": "1.1
|
|
53
|
-
"linersh-linux-arm64": "1.1
|
|
54
|
-
"linersh-linux-x64": "1.1
|
|
55
|
-
"linersh-win32-x64": "1.1
|
|
44
|
+
"linersh-darwin-arm64": "1.2.1",
|
|
45
|
+
"linersh-darwin-x64": "1.2.1",
|
|
46
|
+
"linersh-linux-arm64": "1.2.1",
|
|
47
|
+
"linersh-linux-x64": "1.2.1",
|
|
48
|
+
"linersh-win32-x64": "1.2.1"
|
|
56
49
|
},
|
|
57
50
|
"devDependencies": {
|
|
58
51
|
"@types/node": "^22.10.0",
|
|
59
52
|
"typescript": "^5.7.2",
|
|
60
|
-
"vitest": "^
|
|
53
|
+
"vitest": "^4.1.12"
|
|
61
54
|
},
|
|
62
55
|
"engines": {
|
|
63
56
|
"node": ">=18"
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# Curating Mixtapes — Skill Bundle
|
|
2
|
-
|
|
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
|
-
|
|
5
|
-
It is one of Liner's authoring surfaces, alongside the CLI and TUI. The skill is
|
|
6
|
-
the surface for Claude-Code-native and TUI-subprocess curation. Methodology-mode
|
|
7
|
-
curators can also use it directly when working in a Claude Code session. It is
|
|
8
|
-
not the Project Skill or the optional Maintenance Adapter.
|
|
9
|
-
|
|
10
|
-
## Bundle contents
|
|
11
|
-
|
|
12
|
-
Six files in one directory:
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
curating-mixtapes/
|
|
16
|
-
├── SKILL.md # the orchestrator
|
|
17
|
-
├── source-finding-tactics.md # Phase 2
|
|
18
|
-
├── source-quality-hierarchy.md # Phase 4
|
|
19
|
-
├── curator-notes.md # Phase 4
|
|
20
|
-
├── quality-check-tests.md # Phase 5
|
|
21
|
-
└── synthesis-guidance.md # Phase 6
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
`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.
|
|
25
|
-
|
|
26
|
-
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.
|
|
27
|
-
|
|
28
|
-
The split is deliberate. Every invocation pulls SKILL.md's ~2,300 words into context regardless. Companion files add 1,000–1,500 words each but only at the phase that needs them, so total context cost scales with where the user is in the lifecycle rather than with the bundle's full size.
|
|
29
|
-
|
|
30
|
-
## Where the bundle lives
|
|
31
|
-
|
|
32
|
-
**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.
|
|
33
|
-
|
|
34
|
-
**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.
|
|
35
|
-
|
|
36
|
-
**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.
|
|
37
|
-
|
|
38
|
-
**TUI subprocess.** The Liner TUI bundles the skill internally and invokes it via the local Claude or Codex CLI in quick mode. The user doesn't see the skill directly; they see the TUI's wizard UI. The methodology being applied is this skill's.
|
|
39
|
-
|
|
40
|
-
The same file contents work in every location. Don't fork between a local-test version and the package-shipped version.
|
|
41
|
-
|
|
42
|
-
## Runtime requirements
|
|
43
|
-
|
|
44
|
-
Filesystem access is required, not optional. The skill reads its own companion files at specific phases and writes mixtape artifacts to a project folder. It is designed for execution inside Claude Code or as a TUI subprocess, both of which have filesystem access by default. It is not designed for pure-chat (claude.ai) use.
|
|
45
|
-
|
|
46
|
-
No MCP server is required. v1 uses Claude's own web search for candidate discovery and URL verification. When the Liner MCP server ships, a future skill version will use it for fetching and cache operations; v1 doesn't depend on it.
|
|
47
|
-
|
|
48
|
-
## How invocation works
|
|
49
|
-
|
|
50
|
-
The user says something the description matches. Claude loads SKILL.md. Claude reads it, identifies which mode applies (quick by default unless the user says otherwise or asks for library contribution), and begins the lifecycle.
|
|
51
|
-
|
|
52
|
-
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.
|
|
53
|
-
|
|
54
|
-
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.
|
|
55
|
-
|
|
56
|
-
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.
|
|
57
|
-
|
|
58
|
-
When all phases complete, the user runs `liner compile <project-folder>` themselves. The skill never compiles.
|
|
59
|
-
|
|
60
|
-
## How to test the bundle
|
|
61
|
-
|
|
62
|
-
Pick a small topic the curator hasn't already researched. "Writing better LLM evals," "Notion API patterns," "designing for color blindness" — narrow, technical, with enough source material that the corpus has shape but not so much that the run takes hours. Run the skill end-to-end in quick mode. Note where Claude struggles, where the methodology produces friction, where the gates fire awkwardly.
|
|
63
|
-
|
|
64
|
-
Run again in methodology mode on the same topic. Compare the artifacts. The two modes should produce same-shape folders with different depth of curator engagement showing through. If the methodology-mode output looks indistinguishable from the quick-mode output, that's a signal the skill isn't asking enough of methodology-mode curators.
|
|
65
|
-
|
|
66
|
-
For higher signal: run the skill in quick mode on a topic that already has a hand-curated mixtape (the CLI/TUI corpus is the obvious one). Compare the skill's tape file and synthesis against the hand-curated version. This is the empirical test for the skill itself, structurally identical to the methodology's Phase 8 test for mixtapes. If the skill's quick-mode output is meaningfully worse than the hand-curated version, that's expected — quick mode targets "good enough for personal use." If the gap is larger than expected, the skill needs work.
|
|
67
|
-
|
|
68
|
-
## How to update or extend the bundle
|
|
69
|
-
|
|
70
|
-
Three kinds of changes happen, each with a different shape.
|
|
71
|
-
|
|
72
|
-
**Tightening SKILL.md.** Phase descriptions, gate behavior, trigger description, the AI-biases list, the failure-modes list. Edit in place. SKILL.md is the source of truth for the bundle's structure; everything else conforms to what SKILL.md says.
|
|
73
|
-
|
|
74
|
-
**Editing a companion file.** Refinements to the tactics, hierarchy, notes guidance, tests, or synthesis advice. Edit in place. Keep the orchestrator references in SKILL.md unchanged unless the change affects when or how a companion gets read.
|
|
75
|
-
|
|
76
|
-
**Adding a new companion file.** Two questions to answer first. Is the content concretely better than what could fit in SKILL.md? (Worked examples and pattern catalogs are the usual reasons.) Does the content apply to one specific phase rather than the whole lifecycle? If yes to both, add the companion and reference it from SKILL.md's lifecycle section. If no to either, the content probably belongs in SKILL.md itself or in CURATION.md.
|
|
77
|
-
|
|
78
|
-
When adding a companion, update this README's "Bundle contents" section and the load-profile note in SKILL.md. Don't let the bundle's structure drift from how the README describes it.
|
|
79
|
-
|
|
80
|
-
## Current status
|
|
81
|
-
|
|
82
|
-
The bundle is functional and ships inside the npm TUI package so agent-backed phases can run from `npx linersh` without a separate skill install. The TUI copies this directory into the package during `prepack` and resolves it from the installed package root.
|
|
83
|
-
|
|
84
|
-
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.
|
|
85
|
-
|
|
86
|
-
In the local `1.1.0` release candidate, compilation is the Corpus Ready
|
|
87
|
-
milestone and Create Operating Layer is the Project Complete milestone. A
|
|
88
|
-
project can be usable when `MIXTAPE.md` is written but some Sources are missing
|
|
89
|
-
or soft-failed after review. The TUI opens the existing compile result and
|
|
90
|
-
requires an explicit retry or rerun. Phase 1 must produce a Capability Brief and
|
|
91
|
-
Required source roles before discovery can proceed.
|
|
92
|
-
|
|
93
|
-
## Three Skill Surfaces
|
|
94
|
-
|
|
95
|
-
- The **curating-mixtapes skill** authors the initial corpus recipe, synthesis,
|
|
96
|
-
and working notes. It never performs post-creation maintenance.
|
|
97
|
-
- The root **Project Skill** is created by the Operating Layer and teaches future
|
|
98
|
-
sessions how to use one completed Project.
|
|
99
|
-
- The optional **Maintenance Adapter** is installed explicitly for Codex or
|
|
100
|
-
Claude and delegates supported changes to the installed CLI's current
|
|
101
|
-
guidance. A `type: skill` Source remains inert evidence and is not installed.
|
|
102
|
-
|
|
103
|
-
## Versioning
|
|
104
|
-
|
|
105
|
-
The skill bundle has its own version, independent of the CLI, TUI, and methodology document. Three version numbers track separately:
|
|
106
|
-
|
|
107
|
-
- **Methodology version** is tracked in CURATION.md (`Current version: 2.0`).
|
|
108
|
-
- **Skill bundle version** is the bundle's own — currently v0.3 internally, not yet stamped into SKILL.md frontmatter. Adding a `version` field to the frontmatter is a small open decision; the convention isn't established yet across Liner's surfaces.
|
|
109
|
-
- **Methodology compatibility** is asserted by the `methodology_version` field the skill writes into generated `tape.yaml` files. The skill claims compatibility with the methodology version it was built against.
|
|
110
|
-
|
|
111
|
-
When CURATION.md updates, the skill bundle may need a corresponding update. The question to ask: does the methodology change affect what the running AI should do, or just how a human reader explains the work? If the former, the skill needs an update; if the latter, the skill is fine as-is. Bias toward updating both together when in doubt.
|
|
112
|
-
|
|
113
|
-
## Relationship to other Liner pieces
|
|
114
|
-
|
|
115
|
-
The skill is the methodology made executable. It sits alongside Liner's other surfaces and shares the format and methodology with them.
|
|
116
|
-
|
|
117
|
-
**CURATION.md** is the methodology described to humans. The skill bundle implements it for an AI executor. The two are paired artifacts that update together when the methodology changes substantively.
|
|
118
|
-
|
|
119
|
-
**The Liner CLI** runs `liner compile` against the project folder this skill
|
|
120
|
-
produces and owns supported post-creation maintenance. The curation skill never
|
|
121
|
-
compiles and never bypasses the Core maintenance contract.
|
|
122
|
-
|
|
123
|
-
**The Liner TUI** invokes this skill internally for agent-backed authoring via the local Claude or Codex CLI. Same methodology, different UX.
|
|
124
|
-
|
|
125
|
-
**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.
|
|
126
|
-
|
|
127
|
-
**The Liner library** publishes methodology-mode mixtapes. The skill can produce library-eligible output if run in methodology mode and the empirical test passes — but the bar for library contribution is real curator engagement, not the skill's quick-mode default.
|
|
128
|
-
|
|
129
|
-
Treat changes to the bundle the way you'd treat changes to the methodology: deliberately, with examples, with a clear reason. The skill is the methodology executed at scale; drift in the skill is drift in the methodology.
|