linersh 0.5.7 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -159
- package/bin/liner.js +89 -44
- package/cli-update-docs/README.md +6 -6
- package/cli-update-docs/SKILL.md +72 -37
- package/cli-update-docs/quality-check-tests.md +256 -8
- package/cli-update-docs/source-finding-tactics.md +140 -3
- package/cli-update-docs/source-quality-hierarchy.md +83 -0
- package/cli-update-docs/synthesis-guidance.md +19 -5
- package/dist/agents/artifact-validation.js +440 -0
- package/dist/agents/artifact-validation.js.map +1 -0
- package/dist/agents/candidate-longlist.js +100 -0
- package/dist/agents/candidate-longlist.js.map +1 -0
- package/dist/agents/detect.js +3 -2
- package/dist/agents/detect.js.map +1 -1
- package/dist/agents/evaluation-assembly.js +270 -0
- package/dist/agents/evaluation-assembly.js.map +1 -0
- package/dist/agents/headless-runner.js +227 -0
- package/dist/agents/headless-runner.js.map +1 -0
- package/dist/agents/jtbd-clarify.js +42 -41
- package/dist/agents/jtbd-clarify.js.map +1 -1
- package/dist/agents/models.js +6 -7
- package/dist/agents/models.js.map +1 -1
- package/dist/agents/prompts.js +220 -20
- package/dist/agents/prompts.js.map +1 -1
- package/dist/agents/runner.js +462 -21
- package/dist/agents/runner.js.map +1 -1
- package/dist/phases.js +13 -13
- package/dist/phases.js.map +1 -1
- package/dist/source-inbox.js +297 -0
- package/dist/source-inbox.js.map +1 -0
- package/dist/version.js +3 -9
- package/dist/version.js.map +1 -1
- package/dist/yaml-io.js +42 -11
- package/dist/yaml-io.js.map +1 -1
- package/package.json +26 -23
- package/cli-update-docs/ABOUT.md +0 -69
- package/cli-update-docs/AI-HANDOFF.md +0 -241
- package/cli-update-docs/CURATION.md +0 -261
- package/cli-update-docs/JOB-STORY-MIGRATION.md +0 -99
- package/cli-update-docs/JTBD-MASTER-PROMPT-ABOUT.md +0 -133
- package/cli-update-docs/JTBD-MASTER-PROMPT.md +0 -147
- package/cli-update-docs/LINER-MASTER.md +0 -546
- package/cli-update-docs/MIXTAPE-FORMAT.md +0 -398
- package/cli-update-docs/PLATFORM.md +0 -210
- package/cli-update-docs/TUI-BACKLOG.md +0 -155
- package/dist/App.js +0 -220
- package/dist/App.js.map +0 -1
- package/dist/colors.js +0 -132
- package/dist/colors.js.map +0 -1
- package/dist/components/Header.js +0 -15
- package/dist/components/Header.js.map +0 -1
- package/dist/components/KeyHints.js +0 -17
- package/dist/components/KeyHints.js.map +0 -1
- package/dist/components/LabeledBox.js +0 -53
- package/dist/components/LabeledBox.js.map +0 -1
- package/dist/components/NextSteps.js +0 -18
- package/dist/components/NextSteps.js.map +0 -1
- package/dist/index.js +0 -17
- package/dist/index.js.map +0 -1
- package/dist/screens/AgentSetup.js +0 -224
- package/dist/screens/AgentSetup.js.map +0 -1
- package/dist/screens/BootSplash.js +0 -163
- package/dist/screens/BootSplash.js.map +0 -1
- package/dist/screens/CompileView.js +0 -567
- package/dist/screens/CompileView.js.map +0 -1
- package/dist/screens/FramingConfirmReview.js +0 -197
- package/dist/screens/FramingConfirmReview.js.map +0 -1
- package/dist/screens/Gate1Review.js +0 -147
- package/dist/screens/Gate1Review.js.map +0 -1
- package/dist/screens/Gate2Review.js +0 -162
- package/dist/screens/Gate2Review.js.map +0 -1
- package/dist/screens/ImportPrompt.js +0 -173
- package/dist/screens/ImportPrompt.js.map +0 -1
- package/dist/screens/JsSetup.js +0 -77
- package/dist/screens/JsSetup.js.map +0 -1
- package/dist/screens/LocalFilePicker.js +0 -139
- package/dist/screens/LocalFilePicker.js.map +0 -1
- package/dist/screens/NewMixtapeWizard.js +0 -662
- package/dist/screens/NewMixtapeWizard.js.map +0 -1
- package/dist/screens/PhaseRunner.js +0 -1203
- package/dist/screens/PhaseRunner.js.map +0 -1
- package/dist/screens/ProcessManifest.js +0 -160
- package/dist/screens/ProcessManifest.js.map +0 -1
- package/dist/screens/ProjectHub.js +0 -557
- package/dist/screens/ProjectHub.js.map +0 -1
- package/dist/screens/SourceModal.js +0 -269
- package/dist/screens/SourceModal.js.map +0 -1
- package/dist/screens/TapeBrowser.js +0 -312
- package/dist/screens/TapeBrowser.js.map +0 -1
- package/dist/screens/TapeDraftReview.js +0 -444
- package/dist/screens/TapeDraftReview.js.map +0 -1
- package/dist/screens/TapeEditor.js +0 -310
- package/dist/screens/TapeEditor.js.map +0 -1
- package/dist/screens/cassette-art.js +0 -72
- package/dist/screens/cassette-art.js.map +0 -1
- package/dist/store.js +0 -10
- package/dist/store.js.map +0 -1
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
# TUI backlog
|
|
2
|
-
|
|
3
|
-
Running list of work deferred from earlier slices. Newest at the top of each section. When something ships, move it to **Done** with the date.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Lessons from cli-writer-6 (2026-05-22)
|
|
8
|
-
|
|
9
|
-
Captured after comparing cli-writer-3 (v0.3 methodology, 15 sources) and cli-writer-6 (v0.4 methodology, 23 sources) on the same JTBD lineage. The v0.4 methodology changes are visibly paying off (sharper JTBD, task-oriented sections, source-kind chips, framing-gap audit firing). The items below are the next layer of methodology, prompt, and UX tightening suggested by what the artifact shows.
|
|
10
|
-
|
|
11
|
-
### Synthesis-level — generative rules deserve explicit slots
|
|
12
|
-
|
|
13
|
-
- **Require a "Generative rules" or "If you remember nothing else…" subsection in the synthesis.** v3 had five top-level operational principles (predictability, density, help-is-doc, errors-deserve-care, streams-have-meaning). v6 has the equivalent material but it's dispersed inside paragraphs, harder for the consuming AI to load as decision rules. A prompt directive in Phase 6 to surface ~5 operational generative rules — phrased as imperatives — would close this gap without changing source selection. Worked example to embed in `synthesis-guidance.md`: "Channel discipline: stdout for data, stderr for human, exit codes mean what they say. This single rule resolves most 'should I print this?' questions."
|
|
14
|
-
- **The "stances this corpus takes" section was great — keep it as a required header.** v6 introduced it explicitly; v3 did similar work under "Contested questions" but less decisively. Make it canonical in the synthesis template.
|
|
15
|
-
|
|
16
|
-
### Curator notes — chip the kind into the note line
|
|
17
|
-
|
|
18
|
-
- **Render the source `kind` chip inline at the top of each curator note in MIXTAPE.md.** Today the kind is one of many bullet attributes; consuming AIs don't always carry it forward when they load a single source file. Prepending `**[principle]**` or similar to the first line of the note ("**[principle]** Read for the framing — …") would make the weighting impossible to miss when the AI loads only `sources/NN-foo.md` for a deep read. Render-only change in `output/mixtape.py`.
|
|
19
|
-
|
|
20
|
-
### Methodology — unverified content and the verification re-check
|
|
21
|
-
|
|
22
|
-
- **Auto re-run the perspectives audit at compile time when previously-unverified sources became verified.** v6 kept two YouTube sources (Küber, Pinsker) with curator notes acknowledging transcripts were unfetched at evaluation. By compile time `yt-dlp` produced real transcripts, but the perspectives audit's "unverified does not count" verdict from Phase 5 was never revisited. A `liner verify <folder>` command (or a compile-time hook) could re-check whether unverified perspective slots are now verifiable, and flag the gap closing as a soft signal back to the curator.
|
|
23
|
-
- **Curator-added sources should default to a sensible kind and prompt for it before commit.** The new `[+] add own` flow leaves `kind` unset. Either default to `principle` (the synthesis-writing default per `prompts.ts`) or open a four-button kind picker after URL submission. Cheap UX add; saves the curator a tape.yaml edit pass.
|
|
24
|
-
|
|
25
|
-
### Quality of evaluation — note-quality smell test
|
|
26
|
-
|
|
27
|
-
- **Add a Phase 5 sub-check: "is each curator note doing real work?"** Notes that read as filler (e.g., "Skim a few command pages to calibrate density and rhythm") aren't earning weight in the consuming AI's loading decisions. A simple rubric — note must (a) cite what to read for, (b) name the bar it sets, (c) flag one limitation or scope boundary — would force the agent to deepen thin notes before shipping. Belongs in `quality-check-tests.md` as a 6th test.
|
|
28
|
-
|
|
29
|
-
### Compile-time fetcher chain
|
|
30
|
-
|
|
31
|
-
- **Wayback Machine as a fetcher tier between Playwright and the agent-summary fallback.** Cheap, no tokens, returns raw HTML the trafilatura extractor can use — full article instead of summary. Right move when richer fallback content matters for production-quality mixtapes. Discussed in the v6 session; deferred at curator's request because the agent-summary fallback is sufficient for current scope.
|
|
32
|
-
- **Per-source actions on compile failure** (`[d]` drop, `[o]` open in browser, maybe source-specific retry). The broad "install JS rendering" action now exists when Playwright Chromium is missing, and compile-result retry copy is clearer, but source-by-source recourse still needs a dedicated interaction model.
|
|
33
|
-
- **Failure detail capture.** When the web handler raises, capture the HTTP code, content-type, first ~500 bytes of body, and a category (`paywall`, `not_found`, `forbidden`, `js_required`, `tls`, `network`, `unknown`). Display on the failed source line. 80% of "why did this fail" questions resolved with no LLM call.
|
|
34
|
-
|
|
35
|
-
### Surface improvements
|
|
36
|
-
|
|
37
|
-
- **Surface Test 5 (kind-balance) outcomes visibly in the TUI.** Make the curator see the distribution at Phase 5 completion — a `4 prescription · 6 principle · 2 example · 0 reference` line in the gate2/quality-check review screen, with the zero column flagged in yellow if undefended. Lightweight implementation: parse `working/04-quality-checks.md` for the Test 5 section and render in the existing Gate2Review surface.
|
|
38
|
-
- **Perspectives audit display.** Same idea — show the curator the named perspectives + stance/concerns coverage as a structured list, not just buried in markdown.
|
|
39
|
-
- **Library cross-reference at JTBD time (deferred — needs library).** When the library exists, surface "mixtapes in your library that match these JTBD keywords" during Phase 1 so the curator can opt to start from a related one and preserve sources/framings that worked.
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Up next (functional — needed to "get everything working")
|
|
44
|
-
|
|
45
|
-
### Token cost surfaces (2026-05-27)
|
|
46
|
-
|
|
47
|
-
- **Cumulative token counter for the whole run.** Today the PhaseRunner shows live tokens for the current phase via the `tokens` event. There is no roll-up at the mixtape level — a curator finishes a 7-phase run with no idea what it cost in total. Aggregate token usage across all `.liner-runs/*.jsonl` entries for a project and surface a `Total tokens` line on the ProjectHub (or its own row in the ProcessManifest screen, which already aggregates similar data). Cheap because the aggregator already exists.
|
|
48
|
-
- **Pre-flight token estimate before kicking off a phase.** Before pressing Enter to run Phase 2 (or any agent-eligible phase), the user should see a "this phase typically costs ~X tokens" hint so they know roughly what they're committing to. Implementation idea: instrument the next several real runs to record actual per-phase token counts in `.liner-runs/`, then compute a rolling median per phase. After ~3–5 sample mixtapes, the median per-phase + per-mode (quick vs. methodology) becomes a useful baseline that ships with the package; later it should update dynamically from the user's own history. Open question: show the estimate per phase, or as a single "whole mixtape ≈ N tokens" number at wizard exit — both are useful, the latter is the bigger conversion lever. **Seed data exists:** a 2026-05-28 pass over the existing `.liner-runs` gives real per-phase medians on Opus (framing ~$0.35, candidates ~$3.2, evaluation ~$2.2, quality ~$1.1, synthesis ~$0.5, assembly ~$0.55; a full cycle ≈ 7–9M tokens, most of it cached reads). These can ship as the first baseline before per-user history kicks in.
|
|
49
|
-
|
|
50
|
-
### Slice 3 — agent integration polish
|
|
51
|
-
|
|
52
|
-
- **Background-banner concurrent runs.** Current architecture cancels the run when the user navigates away from PhaseRunner. If we want to support "leave the agent working while I edit elsewhere," we need to lift run state to app context and add a hub banner. Not blocking — pause-and-resume is a real product question, not just an implementation one.
|
|
53
|
-
|
|
54
|
-
### Empirical-test path (now optional, post-0.5.2)
|
|
55
|
-
|
|
56
|
-
- **Optional empirical-test capture.** The empirical test was removed as a driven TUI phase in 0.5.2 (*compiled = complete*); it now lives as methodology guidance. If we ever want to bring it back as an *opt-in* tool, it could run the same question through two agent sessions (with and without `MIXTAPE.md`) and write the comparison to an artifact — invoked explicitly, never as a step that parks the hub.
|
|
57
|
-
|
|
58
|
-
### CLI affordances the TUI might want
|
|
59
|
-
|
|
60
|
-
- **`liner status <folder> --json`** — phase-by-phase completion report from the CLI so the TUI doesn't duplicate filesystem checks. Optional; current detection works.
|
|
61
|
-
- **`liner init` flags** — `--mode`, `--jtbd`, `--title`, `--description`, `--curator` so the wizard doesn't post-process the scaffolded `tape.yaml`. Optional; current writeTape works.
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## Visual polish (optional, after functional work is done)
|
|
66
|
-
|
|
67
|
-
- **Boot logo screen.** Use `ink-gradient` + `ink-big-text` for a real branded splash on first paint. ~40KB extra deps.
|
|
68
|
-
- **Animated phase-transition flash.** When a phase moves to `complete` (status change detected on refresh), briefly flash the row with a pulsing background color.
|
|
69
|
-
- **Notification fade-out.** Right now notifications time out at 3500ms with a hard cut. A 200ms fade would feel more polished.
|
|
70
|
-
- **Custom mode picker.** Replace the current arrow + cyan-text mode chooser in the wizard with background-color chips (`[ Quick ]` / `[ Methodology ]`) styled like the brand chip.
|
|
71
|
-
- **Inline help overlay.** `?` key opens a modal listing every binding on the current screen. Grows in value as the keymap expands.
|
|
72
|
-
- **measureElement-based responsive sizing.** For artifact previews, table widths in Gate UIs, etc. The hub uses percentage widths already; this would tighten the rest.
|
|
73
|
-
- **Per-screen color discipline pass.** The skill says magenta = "highlights / special items." We use it for header brand and step chips; could pick one home and be more consistent.
|
|
74
|
-
- **`ux-intro-outro` outro.** On `q` exit, show a one-line outro (Clack-style). The chip in the header is the intro; we don't currently have an outro.
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
## Quality / hygiene
|
|
79
|
-
|
|
80
|
-
- **`ink-link` for clickable URLs** in error messages (e.g., the "missing agent" install hints).
|
|
81
|
-
- **Smoke test that mounts the TUI** — vitest currently only covers `yaml-io`. Could use `ink-testing-library` to render-test the wizard and hub.
|
|
82
|
-
- **Width-aware truncation.** Several places do `truncate(s, 70)` with a hardcoded width. Should derive from terminal columns.
|
|
83
|
-
- **NO_COLOR + FORCE_COLOR test.** Ink respects these; we should manually verify on a real `NO_COLOR=1` run that the brand chip degrades gracefully.
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
## Project-level (not TUI but related)
|
|
88
|
-
|
|
89
|
-
The TUI work isn't blocking on these, but they shape what we build next.
|
|
90
|
-
|
|
91
|
-
- Curating-mixtapes skill bundle second pass (worked examples for the five companion files).
|
|
92
|
-
- Methodology-mode validation: a planned side-by-side CLI vs. TUI design comparison.
|
|
93
|
-
- First library entry (Cowork synthesis → methodology-mode mixtape folder).
|
|
94
|
-
- MCP server scaffolding.
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## Done
|
|
99
|
-
|
|
100
|
-
- 2026-05-29 — **Per-phase model selection (on by default) + model-rejection fallback.** Candidate discovery + evaluation (~65% of a cycle's tokens) now run on a cheaper model by default — Sonnet for Claude, `gpt-5-mini` for Codex — while framing/quality/synthesis/assembly stay on the agent's default. New `src/agents/models.ts` holds the default downgrade map + `modelForPhase()` resolver; `runner.ts` resolves the model in `runPhaseWithAgent` (config overrides win) and `buildArgs` emits `--model` for both agents on fresh runs only (a resumed session keeps its model). `UserConfig.models` (per-agent → phase → model id) added to `config.ts`; `writeConfig` now merges a partial over the on-disk config so changing the agent doesn't wipe overrides. Override in `~/.liner/config.yaml` under `models:`. **Maintenance:** Claude uses the `sonnet` alias (auto-tracks the latest Sonnet — no release needed on version bumps); only the concrete Codex id can rot. **Fallback:** `runAgentTask` was split into a delegating wrapper + `runAttempt`; if the agent rejects the model (detected via `looksLikeModelRejection`), it emits a warning naming the exact config fix and retries once on the agent's default model. Tests: `models.test.ts` (6), `runner.test.ts` (4 — detection heuristic), config round-trip/merge/malformed (3). **Caveat:** Codex's `gpt-5-mini` id is unverified against the user's Codex install — the fallback now covers a wrong id gracefully, and it's overridable in config.
|
|
101
|
-
- 2026-05-29 — **Agent-unavailability watchdog.** A launched-but-mute agent (signed out / expired subscription / deprecated model) used to hang the run spinner forever. `runAgentTask` now starts a 15s watchdog; if no stdout/stderr arrives in that window it emits a clear "no response from <agent> — check auth/subscription" raw event and SIGTERMs the child, so the run lands in the failed state (where retry / switch-agent already live). Any output clears it; cleared on close/error too. Constant `WATCHDOG_MS` in `runner.ts`. (Pre-flight `--version`/whoami check on agent selection still open as a nicer-but-optional follow-up.)
|
|
102
|
-
- 2026-05-29 — **Removed the invented `$` cost from `ProcessManifest.tsx`.** Dropped the Totals "Cost (USD)" row + the Runs-table "Cost" column/cell (and the "cost" mention in the empty-state copy). PhaseRunner's was already removed in 0.5.2; the two surfaces no longer diverge. Token counts stay (real); the `cost_usd` fields remain in the manifest types/Python output, just unrendered.
|
|
103
|
-
- 2026-05-29 — **Marketing site: agent requirement now stated up front.** The landing page (`marketing/site/src/pages/index.astro`) now makes the "bring your own agent" requirement explicit near install: a fourth Install-CTA requirements chip ("Bring your own agent — Claude Code or Codex", grid widened 3→2 cols for a 2×2) and an expanded FAQ answer ("Do I need my own AI subscription?…") that names Claude Code/Codex, states you need one to *build* a mixtape, and clarifies the finished mixtape is tool-agnostic. Honesty point (no surprise "why isn't it working") + positioning point (rides the subscription the user already pays for). Documented in `liner-private-docs/marketing-planning/page-outline.md` §9/§10 + decisions log.
|
|
104
|
-
- 2026-05-28 (0.5.3) — **`liner --version` reports the TUI version + version-pin drift killed.** The shim forwarded `--version` to the Python core, so it printed the core version (0.5.0) regardless of the installed npm package — confusing when verifying a publish. Now intercepts `--version`/`-v` in `bin/liner.js` and prints `liner <tui> (tui) · <core> (core)`. Also collapsed the three separately-edited version constants (package.json, Header.tsx, BootSplash.tsx) into one runtime read of package.json via `src/version.ts` — BootSplash had silently sat at 0.5.0 through the whole 0.5.2 cycle. Closes the old "Header version pin" hygiene item.
|
|
105
|
-
- 2026-05-28 (0.5.2) — **Fixed the hard API-400 crash on long/resumed agent runs.** A multi-turn phase (or any resume of a failed run) died with `400 … thinking blocks in the latest assistant message cannot be modified` once Claude Code auto-compacted a conversation with interleaved thinking on. Confirmed it was *not* resume-only: a fresh framing run hit it at ~26 turns, and resume then re-hit it instantly because it replays the corrupted message. Fix: spawn the agent with `MAX_THINKING_TOKENS=0` (verified empirically that this zeroes thinking blocks on claude 2.1.146 + opus-4-7), so the failure class can't occur. Supersedes the old "Resume + extended-thinking → API 400" item, which was mis-scoped as resume-only and low-priority. Change in `runner.ts` spawn env.
|
|
106
|
-
- 2026-05-28 (0.5.2) — **Isolated the methodology agent from the user's global environment.** The run log showed the spawned `claude` inheriting all the user's global MCP servers (Gmail, Drive, third-party connectors), plus Bash/Task — the `--allowedTools` whitelist is a no-op under `--dangerously-skip-permissions`. Added `--strict-mcp-config` (with no `--mcp-config` → zero MCP servers) so the agent no longer loads irrelevant connectors. *Still open:* hooks/auto-memory still load (didn't touch `--setting-sources` to avoid auth/behavior risk), and Bash/Task aren't hard-denied — a follow-up could add `--disallowedTools` or drop skip-permissions. Change in `runner.ts buildArgs`.
|
|
107
|
-
- 2026-05-28 (0.5.2) — **Fixed the mixtape browser (`TapeBrowser`) scrollback laddering + garbled selected row.** On a small terminal the project list rendered taller AND wider than the window, so arrow-key navigation reprinted the header on every keystroke (stacked `▶ liner` rows) and the selected row's highlight bled across wrapped lines. Fixes: a terminal-sized scrolling viewport (`maxRows = termRows − 12`, windowed around the selection, with `↑/↓ N more` indicators) so total height never exceeds the terminal; each row rendered as a single `wrap="truncate"` line with terminal-responsive column widths so rows never wrap; and `Header` subtitle set to `wrap="truncate"`. The alt-screen buffer alone couldn't fix this — it doesn't help when a single frame is taller than the viewport.
|
|
108
|
-
- 2026-05-31 (0.5.5) — **Completed Compile opens the existing result instead of rerunning.** If `MIXTAPE.md` is current, the hub marks Compile complete and pressing Enter opens a reconstructed compile-result screen from `MIXTAPE.md` + `sources/` instead of starting a fresh fetch. Recompile/retry is explicit with `r` from CompileView. This resolved the "Ready to use, but Enter compiles again" confusion from testing.
|
|
109
|
-
- 2026-05-31 (0.5.5) — **Partial compile is a usable ready state.** Compile now advances progress when it writes `MIXTAPE.md` with some failed sources, and the hub surfaces "Ready to use — compiled with warnings" with the source/warning counts. This keeps users from landing forever on "ready to compile" after they already have a finished artifact.
|
|
110
|
-
- 2026-05-31 (0.5.5) — **JS rendering setup is surfaced at onboarding and compile time.** Fresh installs get an optional JS setup screen after agent/model setup. Compile results that detect missing Playwright Chromium show "JS rendering needed", explain that headless Chromium is required for some pages, list the `liner setup-js --yes` action, show the ~150MB size, and bind `j` to install + retry.
|
|
111
|
-
- 2026-05-31 (0.5.5) — **Compile and done screens got internal scroll viewports.** The PhaseRunner final response and CompileView source list no longer depend on terminal scrollback in the alternate screen. ↑/↓ and pgup/pgdn scroll the relevant viewport; inspect mode keeps tool-call navigation distinct.
|
|
112
|
-
- 2026-05-31 (0.5.5) — **Web extraction handler crash fallback.** `trafilatura` exceptions now become soft failures with tag-stripped fallback content where possible instead of surfacing raw Python errors like `'NoneType' object is not subscriptable`. Covered in `tests/test_web_handler.py`.
|
|
113
|
-
- 2026-05-31 (0.5.5) — **`liner uninstall` added to the npm shim.** Removes `~/.liner`, npm `_npx`, and Playwright Chromium cache for clean-user testing. It intentionally leaves mixtape project folders alone.
|
|
114
|
-
- 2026-05-28 (0.5.2) — **Empirical test (Phase 7/8) removed from the driven flow.** Dropped `empirical` from `PhaseId`, `PHASE_TEMPLATES`, `PHASE_ORDER` (`TOTAL_STEPS` 11→10); removed the empirical branches in `phases.ts` and `PhaseRunner.tsx`. `everythingComplete()` collapses to `progress.step >= TOTAL_STEPS` and `coreMethodologyComplete` is gone — *compiled = complete*. The with-vs-without validation survives as methodology guidance in `cli-update-docs/LINER-MASTER.md` / skill docs, not a TUI phase.
|
|
115
|
-
- 2026-05-28 (0.5.2) — **ProjectHub redesigned into a single summary view.** Removed the dual focus-card / TOC `l` toggle. New `StatusBox` (Ready to use / In progress / Not started), an always-visible phase checklist, and a single HEADING/purple "next · …" call-to-action line. Importing a complete mixtape now lands here showing it's ready, never on a phase prompt.
|
|
116
|
-
- 2026-05-28 (0.5.2) — **Import screen auto-detects `.mixtape` files.** `ImportPrompt.tsx` rewritten: scans the cwd for `*.mixtape`, renders a selectable list with file sizes, `r` re-scans, `p` switches to path entry. Dropped the opaque "archive" label. Lands on the imported mixtape's hub (folder = `basename(path).replace(/\.mixtape$/,"")`) rather than the browser or a phase prompt. Import still doesn't auto-refetch.
|
|
117
|
-
- 2026-05-28 (0.5.2) — **Consistent quit-key convention: `q` quits from every screen, `esc` goes back.** Added `q` = `ink.exit()` to the gates, FramingConfirmReview, TapeDraftReview (guarded against text-input mode), PhaseRunner picking/done states; split `q`(quit)/`esc`(back) on CompileView + ProcessManifest. Gate2Review's quality-checks editor moved `q`→`k`. Text-input screens still rely on esc-then-quit / Ctrl-C since a bare `q` types into the field.
|
|
118
|
-
- 2026-05-28 (0.5.2) — **One call-to-action per screen: HEADING "next · …" description line above a uniform navbar.** Every screen carries a single purple plain-language line spelling out what Enter does; `KeyHints` stays a uniform dim reference navbar (MUTED label, STRUCTURE key) with no per-binding highlight. Supersedes the reverted 0.5.1 "highlight the primary action" attempt.
|
|
119
|
-
- 2026-05-28 (0.5.2) — **Removed the misleading dollar-cost figure from PhaseRunner run summaries.** Subscription-driven runs (Claude Code / Codex) aren't metered API billing, so a `$X.XXX` figure was invented. Token counts stay (they're real). *Note: `ProcessManifest.tsx` still renders a `$` cost line — tracked below in "Up next" until removed there too.*
|
|
120
|
-
- 2026-05-28 (0.5.2) — **PhaseRunner scrollback laddering capped by terminal height.** On top of the 0.5.1 alt-screen buffer, the final-response panel now caps to `Math.max(4, Math.min(18, termRows - 24))` lines via `useStdout`, so the tallest renders (session-limit failure + 48-tool-call list) can't exceed the viewport and ladder.
|
|
121
|
-
- 2026-05-28 (0.5.2) — **Pickers accept on Enter only.** `AgentSetup.tsx` (and the picker convention) no longer treat Space as a second accept key — Space is reserved for toggle semantics. The recommended/first option stays pre-highlighted so Enter takes the safe default.
|
|
122
|
-
- 2026-05-28 — **Scrollback laddering killed globally via terminal alt-screen mode.** Replaces the partial 2026-05-19 PhaseRunner compaction fix and the 0.5.1 wizard Transcript padding hack with one architectural fix in `bin/liner.js`: wrap the TUI launch in `\x1b[?1049h` / `\x1b[?1049l` (terminal alt-screen). No scrollback in the alt buffer = no stacked-header artifact, regardless of how variable-height a screen is. Cleanup handlers cover normal exit, SIGINT, SIGTERM, and uncaughtException so the terminal can't be left stuck in alt mode. Falls back to no-op when stdout isn't a TTY (piped output, CI). Trade-off: the TUI session vanishes on exit (post-exit context lives in `.liner-runs/` and `MIXTAPE.md`, which were always the source of truth anyway).
|
|
123
|
-
- 2026-05-22 — Process manifest: aggregator over `.liner-runs/*.jsonl` produces `process.json` (tokens / cost / tool calls / fetched URLs / domains / per-run breakdown). New CLI commands `liner manifest` + `liner status`. New TUI surface `ProcessManifest.tsx`, reachable via `[p]` on ProjectHub.
|
|
124
|
-
- 2026-05-22 — Compile auto-start from TapeDraftReview: accepting the source checklist now navigates directly to compile (CompileView already auto-starts on mount), removing the redundant "press enter to compile" second confirmation.
|
|
125
|
-
- 2026-05-22 — Compile re-run hint labeled per phase: "retry failed" when partial/failed (cache makes this true in effect), "re-run" when fully succeeded.
|
|
126
|
-
- 2026-05-22 — Web fetcher bot-challenge auto-fallback: `WebHandler` now raises `JsRenderingRequired` (not `HandlerHardFailure`) on 4xx/5xx responses whose body matches Cloudflare / Akamai / Imperva / PerimeterX signatures. Compile's existing auto-fallback path retries via `web_js` (Playwright). New helper `looks_like_bot_challenge()` in `html_extraction.py`.
|
|
127
|
-
- 2026-05-22 — Agent-summary fallback at compile: when all fetcher tiers fail, compile recovers the URL from `.liner-runs/` (the agent's WebFetch summary captured during research) and writes it as the source body with `metadata.extraction = "agent-summary"`. MIXTAPE.md surfaces a `Provenance: summary captured during research` line so the curator knows. Verified live on the Medium URL in cli-writer-6.
|
|
128
|
-
- 2026-05-22 — Orphan source-file cleanup: `write_mixtape()` now garbage-collects `sources/NN-*.md` files from prior compiles whose slug no longer matches the current title. Safe — only touches files matching the compile-output signature; curator-added files survive.
|
|
129
|
-
- 2026-05-22 — Framing-gap rubric rewrite: split coverage into `stance` vs. `concerns` to stop the methodology from treating "scriptability concerns covered by humans-first sources" as full coverage of a Unix-purist stance. Three actions now possible: (a) backfill, (b) argue concerns sufficient with explicit trade-off, (c) flag bias. Editied in both `quality-check-tests.md` and the Phase 5 prompt in `prompts.ts`.
|
|
130
|
-
- 2026-05-22 — Source-kind balance test (Test 5): every mixtape's `kind` distribution must be defended if any kind is zero. Catches the v6 case of 0 reference sources. Documented in `quality-check-tests.md`; Phase 5 prompt enforces.
|
|
131
|
-
- 2026-05-22 — Methodology mode hidden from the wizard surface: new mixtapes default to quick mode, the mode-selection step is gone, ProjectHub's `[m]` toggle is removed. Underlying methodology code (gates, prompts, mode field) is preserved for forward compatibility with existing methodology-mode mixtapes.
|
|
132
|
-
- 2026-05-22 — "Add your own source" affordance in TapeDraftReview: `[+]` opens an inline URL prompt; the URL gets appended to the working draft as a checked, curator-added source (auto-detected web/youtube type). Surfaces in the helper text + KeyHints so the affordance is discoverable.
|
|
133
|
-
- 2026-05-19 — Slice 1: 8-step wizard, ProjectHub two-pane phase tracker, scaffolding helpers.
|
|
134
|
-
- 2026-05-19 — Slice 2: Agent adapter (Claude + Codex), PhaseRunner screen, hub `r` key.
|
|
135
|
-
- 2026-05-19 — Polish pass: terminal-ui audit (5 CRITICAL/HIGH fixes), brand chip header, next-steps callout, background-color row selection, wizard step chip + progress dots, KeyHints wrap.
|
|
136
|
-
- 2026-05-19 — Slice 3 functional: auto-launch on `LINER_AGENT=` pinning, narrowed Claude tool whitelist (`--allowedTools Read Write Edit Glob Grep WebFetch`), Gate 1 review screen (parses `02-candidate-longlist.md` by section), Gate 2 review screen (parses `03-evaluation.yaml` as keep/trim/drop + `04-quality-checks.md` findings, tabbed view). Concurrent-run guard resolved by current cancel-on-unmount architecture.
|
|
137
|
-
- 2026-05-19 — Stream-JSON parsing: normalized `AgentEvent` type + per-CLI parsers (Claude `--output-format stream-json --verbose`, Codex `--json`), `LineBuffer` for partial-line chunking, 14 parser unit tests. PhaseRunner redesigned around structured events — top pane shows tool calls with status glyphs, middle pane streams assistant text in a bordered box, status bar shows event count + cost + duration from `summary` events.
|
|
138
|
-
- 2026-05-19 — Final-message preservation: PhaseRunner emits a notification on completion containing the first line of the agent's final response (or last text block for Codex), so the message survives navigation back to the hub.
|
|
139
|
-
- 2026-05-19 — Tool-call expand mode: `t` key toggles between tail (last 8) and full list.
|
|
140
|
-
- 2026-05-19 — Phase 7 agent-driven assembly: agent prompt now writes to `working/07-tape-draft.yaml` (never touches `tape.yaml` directly). New `TapeDraftReview` screen parses the draft, shows sections + source list + curator note for the cursor, with `a` accept (merges sources into tape.yaml + deletes draft), `e` edit (loads into source editor), `d` discard. PhaseRunner auto-routes to draft review on successful assembly run; hub shows "draft pending" hint and routes `enter` on Phase 7 to the review when a draft is on disk.
|
|
141
|
-
- 2026-05-19 — Hub key model rewrite per CLI-research synthesis (Skip-or-Enter §2.8, Caligula condense-one-prompt, "don't hide features behind keys"): **Enter is now the single primary action per phase** — runs the agent for agent-eligible phases (or falls back to $EDITOR with notification if no agent installed); opens gate review for gates; routes to draft review on Phase 7 when a draft exists; runs compile on the compile row. `e` is the explicit manual escape hatch ($EDITOR). Removed `E`/`c`/`R` as separate top-level keys. `r` kept as a hidden alias for Enter (back-compat). Right-pane action labels read aloud naturally ("run Phase 1 with the agent", "review the candidate long-list", etc.).
|
|
142
|
-
- 2026-05-19 — Hot fixes: (a) `require is not defined` crash in `phases.ts` writeGateState — replaced CJS require with imported writeFileSync; (b) PhaseRunner scrollback-laddering on long agent runs caused by dynamic content overflowing terminal — compacted running view to spinner + one-line stats + latest tool only (no streamed text, no full tool list); (c) live cumulative token counter via new `tokens` event extracted from Claude `assistant.usage` / Codex `turn.completed.usage`; (d) done state now leads with a NextSteps panel and Enter advances to the next logical screen (Phase 2 → Gate 1, Phase 4 → Phase 5, Phase 5 → Gate 2, etc.); (e) Gate 1 and Gate 2 reframed — Enter = accept + auto-advance, summary leads the screen, scroll list visually demoted; (f) auto-launch when only one agent is installed (was: still showed picker).
|
|
143
|
-
- 2026-05-19 — Wizard placeholder pattern: stopped pre-filling draft state (curator no longer pre-populated with $USER; title/description no longer pre-populated from JTBD). Suggestions surface via TextInput placeholder; Enter on empty submit accepts the suggestion. Going back to a previously-answered step from review still shows the existing value for editing. Removes the "I have to delete the previous question's text" friction.
|
|
144
|
-
- 2026-05-19 — Path-aware truncation in PhaseRunner: `truncatePath` keeps the basename (e.g. `…/working/02-candidate-longlist.md`) instead of right-trimming the prefix. Tool-call previews route through `previewify()` which detects paths vs. URLs vs. plain strings.
|
|
145
|
-
- 2026-05-19 — PhaseRunner running view shows phase label inline ("Phase 2 — Candidate discovery · Claude Code") so users always know where they are without looking up at the header.
|
|
146
|
-
- 2026-05-19 — Removed `r` re-run from the done state — user feedback was it had no value (re-running an agent with the same prompt is unlikely to give a different result). Done state actions: Enter advances, b/esc backs to hub.
|
|
147
|
-
- 2026-05-19 — Hub focus mode: default view is now a single hero card for the current incomplete phase + a one-line progress strip showing all phases with status glyphs. `l` toggles into the full TOC list (existing two-pane view) with future-phase locking. Esc from TOC returns to focus; esc from focus backs to browser.
|
|
148
|
-
- 2026-05-19 — Quick mode now skips gate review screens (per CURATION.md v2.0 "Quick mode defaults gates to continue"). PhaseRunner.nextScreenFor reads `tape.mode`; quick mode auto-writes `gate1Accepted` / `gate2Accepted` to `.liner-gates.json` and routes directly from candidates → evaluation and from quality → synthesis. Methodology mode still shows the gates.
|
|
149
|
-
- 2026-05-19 — Gate review screens slimmed down (methodology mode): removed the scrollable candidate / evaluation list. Now a bordered summary card (counts + section breakdown) plus a NextSteps panel. Inspection is delegated to `$EDITOR` via `e` — the rendered list was never going to compete with a real editor for actual reading.
|
|
150
|
-
- 2026-05-19 — Editor default switched from `vi` → `nano`. New `src/editor.ts` resolves `$VISUAL` → `$EDITOR` → probes for `nano`/`pico`/`vi` on PATH. Vi is hostile if you don't already know it; nano shows its keybindings at the bottom of the screen and is on every macOS install. All four screens (ProjectHub, Gate1Review, Gate2Review, TapeEditor) route through the helper.
|
|
151
|
-
- 2026-05-19 — Agent resume on failure: PhaseRunner's failed-done state now offers "Press Enter to resume" (cheap continuation via `claude --continue` / `codex exec resume --last`). The previous session's conversation — prompt, tool-call results, partial work — stays in context, so the agent doesn't re-fetch anything. `r` falls back to re-run from scratch. Runner accepts `resume: true`; on resume it sends a tiny "continue from where you left off" nudge instead of re-shipping SKILL.md. Failure-state NextSteps and KeyHints now lead with "resume" instead of the misleading "continue".
|
|
152
|
-
- 2026-05-19 — Done state collapsed to two visible choices: `enter` (continue on success / try again on failure) + `b` (back to hub). `r` (re-run from scratch) and `t` (expand tools) remain bound as hidden power-user escapes but no longer clutter the NextSteps panel or KeyHints. Failure-state copy reworded to "try again — picks up where the agent stopped, no re-fetching" so the user isn't decoding "resume" terminology.
|
|
153
|
-
- 2026-05-19 — Phase list cleanup: (a) **dropped Phase 3 (Fetching)** — it was a methodology step that does nothing in Liner (the agent fetches automatically at compile time), so a row that said "✓ complete · happens at compile" was actively misleading. Removed from PhaseId, computePhases, ProjectHub.enterPhase, primaryActionLabel. (b) **Tightened future-phase lockout in TOC mode**: anything past the current incomplete phase is now blocked from entry, not just `not_started` ones — prevents out-of-order runs. (c) **Sequential status enforcement**: once a phase is non-complete, any later "complete" downgrades to ⚠ needs_review with `· earlier phases not complete` appended to the detail. Stops the swiss-cheese hub view where Phase 7 shows ✓ but Phase 2 is empty. Phase 8 (empirical, optional) is exempt from the sequential rule.
|
|
154
|
-
- 2026-05-19 — **Progress cursor model** (replaces per-artifact status entirely). New `src/progress.ts` owns `.liner-progress.json` (one int: `step`). Phase status is now derived purely from the cursor (`i < step → ✓`, `i === step → ▶`, `i > step → ○`), not from filesystem checks. Detail strings still pull from disk for context but don't drive the badge. `markPhaseComplete()` advances the cursor only when called for the current phase (idempotent, refuses out-of-order advance). One-time migration on hub mount walks `PHASE_ORDER` and sets step to the longest consecutive "done" prefix — handles existing projects from older builds. Wired into all advancement points: PhaseRunner done-success (except assembly), Gate1/Gate2 accept, TapeDraftReview accept (advances "assembly"), CompileView result with failed=0, quick-mode gate auto-skip in `nextScreenFor`. The legacy `enforceSequentialOrder` patch is gone — no longer needed. 12 new unit tests for progress.ts.
|
|
155
|
-
- 2026-05-19 — **Tee-style audit log** (`src/agents/run-log.ts`). Every agent run writes raw JSONL to `<project>/.liner-runs/<phaseId>/<isoTs>.jsonl` with a `_liner_meta` header, raw stream events, stderr lines (wrapped to avoid masquerading as JSON), and a `_liner_close` marker. Not load-bearing for resume (Claude's session.json already handles that) — gives us a per-run transcript curators can scroll back through and a forensic record when things misbehave.
|
package/dist/App.js
DELETED
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
import { AppContext } from "./store.js";
|
|
4
|
-
import { MUTED, ERROR } from "./colors.js";
|
|
5
|
-
import { TapeBrowser } from "./screens/TapeBrowser.js";
|
|
6
|
-
import { TapeEditor } from "./screens/TapeEditor.js";
|
|
7
|
-
import { SourceModal } from "./screens/SourceModal.js";
|
|
8
|
-
import { CompileView } from "./screens/CompileView.js";
|
|
9
|
-
import { NewMixtapeWizard } from "./screens/NewMixtapeWizard.js";
|
|
10
|
-
import { ProjectHub } from "./screens/ProjectHub.js";
|
|
11
|
-
import { PhaseRunner } from "./screens/PhaseRunner.js";
|
|
12
|
-
import { FramingConfirmReview } from "./screens/FramingConfirmReview.js";
|
|
13
|
-
import { Gate1Review } from "./screens/Gate1Review.js";
|
|
14
|
-
import { Gate2Review } from "./screens/Gate2Review.js";
|
|
15
|
-
import { TapeDraftReview } from "./screens/TapeDraftReview.js";
|
|
16
|
-
import { ImportPrompt } from "./screens/ImportPrompt.js";
|
|
17
|
-
import { AgentSetup } from "./screens/AgentSetup.js";
|
|
18
|
-
import { JsSetup } from "./screens/JsSetup.js";
|
|
19
|
-
import { ProcessManifest } from "./screens/ProcessManifest.js";
|
|
20
|
-
import { BootSplash, shouldShowSplash } from "./screens/BootSplash.js";
|
|
21
|
-
import { configExists, readConfig } from "./config.js";
|
|
22
|
-
import { detectAgents } from "./agents/detect.js";
|
|
23
|
-
import { listProjects } from "./ipc.js";
|
|
24
|
-
import { existsSync, mkdirSync } from "node:fs";
|
|
25
|
-
import { join } from "node:path";
|
|
26
|
-
const NOTIFICATION_MS = 3500;
|
|
27
|
-
/** Cap on the back stack — deeper history isn't useful and just costs memory. */
|
|
28
|
-
const HISTORY_LIMIT = 10;
|
|
29
|
-
export function App() {
|
|
30
|
-
const baseDir = useRef(resolveBaseDir()).current;
|
|
31
|
-
// Decide what the user sees first. Four states, in priority order:
|
|
32
|
-
//
|
|
33
|
-
// 1. Agent setup — first launch on a machine with multiple agents
|
|
34
|
-
// installed AND no config file yet. Force a choice before the splash
|
|
35
|
-
// so the methodology phases don't hit the mid-phase picker.
|
|
36
|
-
// 2. JS setup — one-time onboarding for Playwright/Chromium support.
|
|
37
|
-
// 3. Splash — the normal greeting (cassette art + launch menu).
|
|
38
|
-
// 4. Browser — fallback when stdout isn't a TTY or LINER_NO_SPLASH is
|
|
39
|
-
// set (CI runs, narrow terminals).
|
|
40
|
-
//
|
|
41
|
-
// Single-agent installs skip step 1: there's nothing to pick. Repeat runs
|
|
42
|
-
// skip it too because config.yaml exists.
|
|
43
|
-
const initialScreen = resolveInitialScreen();
|
|
44
|
-
const [screen, setScreen] = useState(initialScreen);
|
|
45
|
-
const [history, setHistory] = useState([]);
|
|
46
|
-
const [projects, setProjects] = useState([]);
|
|
47
|
-
const [notification, setNotification] = useState(null);
|
|
48
|
-
const [bootError, setBootError] = useState(null);
|
|
49
|
-
// navigate(next) moves to `next` and maintains the back stack.
|
|
50
|
-
//
|
|
51
|
-
// Dedupe rule: if `next` is already somewhere in the back stack, we REWIND
|
|
52
|
-
// to it (drop everything above it) instead of pushing a duplicate. This is
|
|
53
|
-
// what stops esc loops: several screens hardcode `navigate({kind:"hub"})` /
|
|
54
|
-
// `navigate({kind:"browser"})` for their "go back" action instead of
|
|
55
|
-
// back(), which would otherwise push A→B→A→B forever (e.g. hub esc →
|
|
56
|
-
// browser, browser esc → back to hub, repeat). Rewinding collapses the
|
|
57
|
-
// cycle so esc always makes progress toward home (splash).
|
|
58
|
-
//
|
|
59
|
-
// Side effect: clears the terminal scrollback when the user moves between
|
|
60
|
-
// meaningfully different surfaces. Done before setScreen so Ink's next
|
|
61
|
-
// render lands on a fresh canvas.
|
|
62
|
-
const navigate = useCallback((next) => {
|
|
63
|
-
setScreen((current) => {
|
|
64
|
-
if (process.stdout.isTTY && shouldClearOnNavigate(current, next)) {
|
|
65
|
-
process.stdout.write("\x1B[2J\x1B[3J\x1B[H");
|
|
66
|
-
}
|
|
67
|
-
const nextKey = JSON.stringify(next);
|
|
68
|
-
setHistory((h) => {
|
|
69
|
-
const existingIdx = h.findIndex((s) => JSON.stringify(s) === nextKey);
|
|
70
|
-
if (existingIdx !== -1)
|
|
71
|
-
return h.slice(0, existingIdx);
|
|
72
|
-
return [...h, current].slice(-HISTORY_LIMIT);
|
|
73
|
-
});
|
|
74
|
-
return next;
|
|
75
|
-
});
|
|
76
|
-
}, []);
|
|
77
|
-
// back() pops the history stack and navigates to the prior screen. When
|
|
78
|
-
// the stack is empty (root) it falls back to the splash (home). We pop
|
|
79
|
-
// INSIDE setScreen so the two updates batch and Ink renders once.
|
|
80
|
-
const back = useCallback(() => {
|
|
81
|
-
setHistory((h) => {
|
|
82
|
-
if (h.length === 0) {
|
|
83
|
-
// Empty history = user is at the root. Land on home (splash), not
|
|
84
|
-
// the browser — home is the terminal screen for esc, and esc on home
|
|
85
|
-
// is a no-op (see BootSplash), so navigation stops there instead of
|
|
86
|
-
// looping home ↔ browser.
|
|
87
|
-
if (process.stdout.isTTY)
|
|
88
|
-
process.stdout.write("\x1B[2J\x1B[3J\x1B[H");
|
|
89
|
-
setScreen({ kind: "splash" });
|
|
90
|
-
return h;
|
|
91
|
-
}
|
|
92
|
-
const prev = h[h.length - 1];
|
|
93
|
-
if (process.stdout.isTTY)
|
|
94
|
-
process.stdout.write("\x1B[2J\x1B[3J\x1B[H");
|
|
95
|
-
setScreen(prev);
|
|
96
|
-
return h.slice(0, -1);
|
|
97
|
-
});
|
|
98
|
-
}, []);
|
|
99
|
-
const refreshProjects = useCallback(async () => {
|
|
100
|
-
try {
|
|
101
|
-
const result = await listProjects(baseDir);
|
|
102
|
-
setProjects(result);
|
|
103
|
-
}
|
|
104
|
-
catch (e) {
|
|
105
|
-
setBootError(e.message);
|
|
106
|
-
}
|
|
107
|
-
}, [baseDir]);
|
|
108
|
-
useEffect(() => {
|
|
109
|
-
void refreshProjects();
|
|
110
|
-
}, [refreshProjects]);
|
|
111
|
-
useEffect(() => {
|
|
112
|
-
if (!notification)
|
|
113
|
-
return;
|
|
114
|
-
const timer = setTimeout(() => setNotification(null), NOTIFICATION_MS);
|
|
115
|
-
return () => clearTimeout(timer);
|
|
116
|
-
}, [notification]);
|
|
117
|
-
if (bootError) {
|
|
118
|
-
return (React.createElement(Box, { flexDirection: "column" },
|
|
119
|
-
React.createElement(Text, { color: ERROR }, bootError),
|
|
120
|
-
React.createElement(Text, { color: MUTED }, "Press Ctrl+C to exit.")));
|
|
121
|
-
}
|
|
122
|
-
const ctx = {
|
|
123
|
-
screen,
|
|
124
|
-
baseDir,
|
|
125
|
-
projects,
|
|
126
|
-
notification,
|
|
127
|
-
navigate,
|
|
128
|
-
back,
|
|
129
|
-
refreshProjects,
|
|
130
|
-
setNotification,
|
|
131
|
-
};
|
|
132
|
-
return (React.createElement(AppContext.Provider, { value: ctx },
|
|
133
|
-
React.createElement(ScreenRoot, { screen: screen })));
|
|
134
|
-
}
|
|
135
|
-
function ScreenRoot({ screen }) {
|
|
136
|
-
switch (screen.kind) {
|
|
137
|
-
case "splash":
|
|
138
|
-
return React.createElement(BootSplash, null);
|
|
139
|
-
case "agentSetup":
|
|
140
|
-
return React.createElement(AgentSetup, null);
|
|
141
|
-
case "jsSetup":
|
|
142
|
-
return React.createElement(JsSetup, null);
|
|
143
|
-
case "browser":
|
|
144
|
-
return React.createElement(TapeBrowser, null);
|
|
145
|
-
case "newProject":
|
|
146
|
-
return React.createElement(NewMixtapeWizard, null);
|
|
147
|
-
case "hub":
|
|
148
|
-
return React.createElement(ProjectHub, { tape: screen.tape, folder: screen.folder });
|
|
149
|
-
case "phaseRunner":
|
|
150
|
-
// `key` forces React to unmount and remount when phaseId changes —
|
|
151
|
-
// PhaseRunner's auto-launch effect has empty deps and only fires on
|
|
152
|
-
// initial mount, so without the key, navigating Phase 2 → Phase 4 (both
|
|
153
|
-
// "phaseRunner" kind) leaves the component dormant: same DOM, no
|
|
154
|
-
// agent launch. The remount is also what resets the tool list,
|
|
155
|
-
// finalText, and stats from the previous phase.
|
|
156
|
-
return (React.createElement(PhaseRunner, { key: screen.phaseId, tape: screen.tape, folder: screen.folder, phaseId: screen.phaseId }));
|
|
157
|
-
case "gate0":
|
|
158
|
-
return React.createElement(FramingConfirmReview, { tape: screen.tape, folder: screen.folder });
|
|
159
|
-
case "gate1":
|
|
160
|
-
return React.createElement(Gate1Review, { tape: screen.tape, folder: screen.folder });
|
|
161
|
-
case "gate2":
|
|
162
|
-
return React.createElement(Gate2Review, { tape: screen.tape, folder: screen.folder });
|
|
163
|
-
case "tapeDraft":
|
|
164
|
-
return React.createElement(TapeDraftReview, { tape: screen.tape, folder: screen.folder });
|
|
165
|
-
case "import":
|
|
166
|
-
return React.createElement(ImportPrompt, null);
|
|
167
|
-
case "editor":
|
|
168
|
-
return React.createElement(TapeEditor, { tape: screen.tape, folder: screen.folder });
|
|
169
|
-
case "sourceModal":
|
|
170
|
-
return (React.createElement(SourceModal, { tape: screen.tape, folder: screen.folder, editingIndex: screen.editingIndex }));
|
|
171
|
-
case "compile":
|
|
172
|
-
return (React.createElement(CompileView, { key: `${screen.folder}:${screen.showExisting ? "view" : "run"}`, tape: screen.tape, folder: screen.folder, showExisting: screen.showExisting }));
|
|
173
|
-
case "manifest":
|
|
174
|
-
return React.createElement(ProcessManifest, { tape: screen.tape, folder: screen.folder });
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Pick the screen the user lands on at startup. See the inline doc in
|
|
179
|
-
* `App()` for the priority order.
|
|
180
|
-
*/
|
|
181
|
-
function resolveInitialScreen() {
|
|
182
|
-
// If no splash (non-TTY / narrow / opted-out), don't show setup either —
|
|
183
|
-
// the user is probably in CI or scripting and just wants the browser.
|
|
184
|
-
if (!shouldShowSplash())
|
|
185
|
-
return { kind: "browser" };
|
|
186
|
-
// First-run agent setup only when we have a real choice to surface. One
|
|
187
|
-
// agent (or zero) has nothing to pick, so go straight to the JS-rendering
|
|
188
|
-
// setup prompt.
|
|
189
|
-
if (!configExists()) {
|
|
190
|
-
const installed = detectAgents();
|
|
191
|
-
if (installed.length >= 2)
|
|
192
|
-
return { kind: "agentSetup" };
|
|
193
|
-
return { kind: "jsSetup" };
|
|
194
|
-
}
|
|
195
|
-
if (!readConfig().jsSetupPrompted)
|
|
196
|
-
return { kind: "jsSetup" };
|
|
197
|
-
return { kind: "splash" };
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Decide whether navigation `prev → next` should clear the terminal. We clear
|
|
201
|
-
* on any kind change, and on phaseRunner re-entry with a different phaseId so
|
|
202
|
-
* "entering Phase 3" feels like starting fresh, not stacking on top of Phase 2.
|
|
203
|
-
*/
|
|
204
|
-
function shouldClearOnNavigate(prev, next) {
|
|
205
|
-
if (prev.kind !== next.kind)
|
|
206
|
-
return true;
|
|
207
|
-
if (prev.kind === "phaseRunner" && next.kind === "phaseRunner") {
|
|
208
|
-
return prev.phaseId !== next.phaseId;
|
|
209
|
-
}
|
|
210
|
-
return false;
|
|
211
|
-
}
|
|
212
|
-
function resolveBaseDir() {
|
|
213
|
-
const override = process.env["LINER_DIR"];
|
|
214
|
-
const dir = override || join(process.cwd(), "mixtapes");
|
|
215
|
-
if (!existsSync(dir)) {
|
|
216
|
-
mkdirSync(dir, { recursive: true });
|
|
217
|
-
}
|
|
218
|
-
return dir;
|
|
219
|
-
}
|
|
220
|
-
//# sourceMappingURL=App.js.map
|
package/dist/App.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"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"}
|
package/dist/colors.js
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
// Liner color palette — exactly five colors, no more.
|
|
2
|
-
//
|
|
3
|
-
// We use ONLY these hex values across the TUI. If you find yourself reaching
|
|
4
|
-
// for "cyan", "red", "white", "black", or any other named color, stop and
|
|
5
|
-
// pick one of the five below. The constraint is intentional — five colors,
|
|
6
|
-
// consistently applied, gives the product a recognizable signature and
|
|
7
|
-
// keeps the visual language tight.
|
|
8
|
-
//
|
|
9
|
-
// Palette
|
|
10
|
-
// =======
|
|
11
|
-
//
|
|
12
|
-
// #ff4500 red-orange — main brand color: structure, interactivity
|
|
13
|
-
// #00ac11 green — success / completion / progress
|
|
14
|
-
// #b68800 goldenrod — attention, "look here now" / AI running
|
|
15
|
-
// #ab65ff purple — heading / brand accent
|
|
16
|
-
// #ff0086 hot pink — alarm / error
|
|
17
|
-
// #daf1fd pale blue — light-on-dark text (chip labels, highlights)
|
|
18
|
-
//
|
|
19
|
-
// Roles
|
|
20
|
-
// =====
|
|
21
|
-
//
|
|
22
|
-
// STRUCTURE (red-orange) — borders, chip backgrounds, hotkey labels, "this
|
|
23
|
-
// is interactive" affordances, selection
|
|
24
|
-
// highlight backgrounds. The main brand color and
|
|
25
|
-
// the structural skeleton of every screen. Text
|
|
26
|
-
// placed ON a STRUCTURE background must be light
|
|
27
|
-
// (white / HIGHLIGHT), never black.
|
|
28
|
-
//
|
|
29
|
-
// CURRENT (yellow) — "you are here." The currently-selected menu
|
|
30
|
-
// item, the chip on the focus card when its
|
|
31
|
-
// phase is in_progress, the active selection in
|
|
32
|
-
// every list. NEVER use for borders.
|
|
33
|
-
//
|
|
34
|
-
// HEADING (purple) — content section headers. Markdown `**Heading:**`
|
|
35
|
-
// runs, wizard step questions, the "Get started"
|
|
36
|
-
// label on the splash, "Review:" before the
|
|
37
|
-
// confirmation table.
|
|
38
|
-
//
|
|
39
|
-
// SUCCESS (green) — "done." ✓ glyphs, completed phases, accepted
|
|
40
|
-
// gates, a fully-succeeded compile, the progress
|
|
41
|
-
// indicator's filled portion. A distinct green,
|
|
42
|
-
// no longer the same hue as STRUCTURE.
|
|
43
|
-
//
|
|
44
|
-
// WARNING (yellow) — partial / draft-pending / "in flight, look at
|
|
45
|
-
// this." Doubles up with CURRENT — both are
|
|
46
|
-
// attention signals; the only difference is
|
|
47
|
-
// whether the user caused it (CURRENT) or the
|
|
48
|
-
// system did (WARNING).
|
|
49
|
-
//
|
|
50
|
-
// ERROR (magenta-pink) — "failed." ✗ glyphs, failed compiles, error
|
|
51
|
-
// messages. Loud and unambiguous against the
|
|
52
|
-
// other four colors.
|
|
53
|
-
//
|
|
54
|
-
// HIGHLIGHT (pale blue) — light text on dark chip backgrounds (replaces
|
|
55
|
-
// the legacy "black on cyan" pattern), and any
|
|
56
|
-
// place a foreground text accent should pop
|
|
57
|
-
// against the default body color.
|
|
58
|
-
//
|
|
59
|
-
// MUTED (grey #9a9a9a) — secondary content. Replaces Ink's `dimColor`
|
|
60
|
-
// prop, which dims relative to the terminal's
|
|
61
|
-
// foreground and renders near-invisible on many
|
|
62
|
-
// themes. An explicit grey guarantees legible
|
|
63
|
-
// contrast on dark backgrounds while still
|
|
64
|
-
// reading as clearly secondary.
|
|
65
|
-
//
|
|
66
|
-
// Default (no color) — primary body text. Most content lands here so
|
|
67
|
-
// the colored accents have somewhere to pop.
|
|
68
|
-
//
|
|
69
|
-
// Box color rule (the only rule)
|
|
70
|
-
// ==============================
|
|
71
|
-
//
|
|
72
|
-
// **Border and chip share the same color**, always. The chip is a solid
|
|
73
|
-
// section of the top border line; visually they're one element, so they
|
|
74
|
-
// can never disagree.
|
|
75
|
-
//
|
|
76
|
-
// default state → STRUCTURE (teal)
|
|
77
|
-
// current / "you are here" → CURRENT (yellow)
|
|
78
|
-
// running / in-flight → CURRENT (yellow) — same as current
|
|
79
|
-
// done / accepted → SUCCESS (teal)
|
|
80
|
-
// partial / warn / draft → WARNING (yellow)
|
|
81
|
-
// failed → ERROR (magenta-pink)
|
|
82
|
-
//
|
|
83
|
-
// Pass exactly ONE color to `LabeledBox` via the `color` prop and the chip
|
|
84
|
-
// background follows automatically. Don't override `labelBg` separately
|
|
85
|
-
// unless you have a specific reason (e.g. the Header brand chip).
|
|
86
|
-
// Raw palette values. Prefer the role aliases below — these are exported
|
|
87
|
-
// for the cassette logo and any other place that wants the full palette
|
|
88
|
-
// (e.g. a random pick per character).
|
|
89
|
-
// Constant names (TEAL / YELLOW / MAGENTA) describe the role they
|
|
90
|
-
// historically held, not the literal hex. Callers import the role aliases
|
|
91
|
-
// below (STRUCTURE / CURRENT / HEADING / etc.) — renaming the raw
|
|
92
|
-
// constants would churn unrelated files without changing behavior.
|
|
93
|
-
export const COLOR_ORANGE = "#ff4500"; // red-orange — the main brand color
|
|
94
|
-
export const COLOR_TEAL = "#00ac11"; // a true green (success / progress)
|
|
95
|
-
export const COLOR_YELLOW = "#b68800"; // a goldenrod (attention / running)
|
|
96
|
-
export const COLOR_PURPLE = "#ab65ff"; // a vibrant purple (headings)
|
|
97
|
-
export const COLOR_MAGENTA = "#ff0086"; // a hot pink (errors)
|
|
98
|
-
export const COLOR_PALE = "#daf1fd";
|
|
99
|
-
export const COLOR_GREY = "#9a9a9a";
|
|
100
|
-
export const COLOR_BLACK = "#000000";
|
|
101
|
-
/** The full palette as an array — useful for randomized rendering. */
|
|
102
|
-
export const PALETTE = [
|
|
103
|
-
COLOR_ORANGE,
|
|
104
|
-
COLOR_TEAL,
|
|
105
|
-
COLOR_YELLOW,
|
|
106
|
-
COLOR_PURPLE,
|
|
107
|
-
COLOR_MAGENTA,
|
|
108
|
-
COLOR_PALE,
|
|
109
|
-
];
|
|
110
|
-
// Role aliases — what every screen should import.
|
|
111
|
-
//
|
|
112
|
-
// STRUCTURE and SUCCESS are intentionally DIFFERENT colors now: STRUCTURE is
|
|
113
|
-
// the red-orange brand color used for borders, chip backgrounds, selection
|
|
114
|
-
// highlights, and hotkey labels; SUCCESS is green and reserved for ✓ glyphs,
|
|
115
|
-
// completed phases, and the progress indicator. Anything selected with a
|
|
116
|
-
// STRUCTURE background should use white/HIGHLIGHT text, not black — the
|
|
117
|
-
// orange background needs a light foreground for contrast.
|
|
118
|
-
export const STRUCTURE = COLOR_ORANGE;
|
|
119
|
-
export const CURRENT = COLOR_YELLOW;
|
|
120
|
-
export const HEADING = COLOR_PURPLE;
|
|
121
|
-
export const SUCCESS = COLOR_TEAL;
|
|
122
|
-
export const WARNING = COLOR_YELLOW;
|
|
123
|
-
export const ERROR = COLOR_MAGENTA;
|
|
124
|
-
export const HIGHLIGHT = COLOR_PALE;
|
|
125
|
-
export const MUTED = COLOR_GREY;
|
|
126
|
-
// ON_FILL — true-black foreground for text sitting on a solid colored
|
|
127
|
-
// background (the STRUCTURE/orange selection highlight, LabeledBox label
|
|
128
|
-
// chips, etc.). Use this instead of the named color "black": ANSI "black"
|
|
129
|
-
// (color 0) renders as dark grey on many terminal themes and fails contrast
|
|
130
|
-
// against the orange fill. An explicit hex guarantees true black everywhere.
|
|
131
|
-
export const ON_FILL = COLOR_BLACK;
|
|
132
|
-
//# sourceMappingURL=colors.js.map
|
package/dist/colors.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
import { MUTED, ON_FILL, STRUCTURE } from "../colors.js";
|
|
4
|
-
import { VERSION } from "../version.js";
|
|
5
|
-
export function Header({ title, subtitle, }) {
|
|
6
|
-
return (React.createElement(Box, { flexDirection: "column", marginBottom: 1 },
|
|
7
|
-
React.createElement(Box, null,
|
|
8
|
-
React.createElement(Text, { backgroundColor: STRUCTURE, color: ON_FILL, bold: true }, " ▶ liner "),
|
|
9
|
-
React.createElement(Text, null, " "),
|
|
10
|
-
React.createElement(Text, { bold: true, color: STRUCTURE }, title),
|
|
11
|
-
React.createElement(Text, { color: MUTED }, " · v" + VERSION)),
|
|
12
|
-
subtitle ? (React.createElement(Box, { marginTop: 0 },
|
|
13
|
-
React.createElement(Text, { color: MUTED, wrap: "truncate" }, subtitle))) : null));
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=Header.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/components/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,UAAU,MAAM,CAAC,EACrB,KAAK,EACL,QAAQ,GAIT;IACC,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC;QACzC,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,UACnD,WAAW,CACP;YACP,oBAAC,IAAI,QAAE,IAAI,CAAQ;YACnB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,SAAS,IACxB,KAAK,CACD;YACP,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,IAAG,QAAQ,GAAG,OAAO,CAAQ,CAC3C;QACL,QAAQ,CAAC,CAAC,CAAC,CACV,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;YACf,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,UAAU,IAAE,QAAQ,CAAQ,CACjD,CACP,CAAC,CAAC,CAAC,IAAI,CACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
import { MUTED, STRUCTURE } from "../colors.js";
|
|
4
|
-
/**
|
|
5
|
-
* Renders the bottom navbar of keyboard hints — a uniform, dim row of
|
|
6
|
-
* reference bindings. The "what to press next" call-to-action lives in a
|
|
7
|
-
* separate description line above the navbar on each screen (not in this
|
|
8
|
-
* component), so the navbar stays a reference and doesn't compete with the
|
|
9
|
-
* description for attention.
|
|
10
|
-
*/
|
|
11
|
-
export function KeyHints({ hints }) {
|
|
12
|
-
return (React.createElement(Box, { flexWrap: "wrap", columnGap: 2 }, hints.map((h) => (React.createElement(Text, { key: h.key, color: MUTED },
|
|
13
|
-
React.createElement(Text, { color: STRUCTURE }, h.key),
|
|
14
|
-
" ",
|
|
15
|
-
h.label)))));
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=KeyHints.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"KeyHints.js","sourceRoot":"","sources":["../../src/components/KeyHints.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIhD;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAqB;IACnD,OAAO,CACL,oBAAC,GAAG,IAAC,QAAQ,EAAC,MAAM,EAAC,SAAS,EAAE,CAAC,IAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,oBAAC,IAAI,IAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK;QAC5B,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS,IAAG,CAAC,CAAC,GAAG,CAAQ;;QAAE,CAAC,CAAC,KAAK,CAC1C,CACR,CAAC,CACE,CACP,CAAC;AACJ,CAAC"}
|