tldr-experts 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,110 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.0 — 2026-09-03
4
+
5
+ ### Added
6
+
7
+ - **Codex is now a second honest automated runner.** Set `TLDRX_AGENT_PROVIDER=codex` to
8
+ run plain `codex exec --json` through the existing facilitator seam; `TLDRX_CODEX_BIN`
9
+ selects a wrapper or pinned executable. The adapter is pinned to a real codex-cli 0.152.0
10
+ JSONL transcript and a real executable stub, preserves thread identity and token usage,
11
+ feeds the existing structured envelopes, runs developers in `workspace-write`, and makes
12
+ Build reviewers mechanically `read-only`. Because Codex exposes neither provider-metered
13
+ USD nor a provider-side USD cap, every Codex turn is recorded `cost_usd: null,
14
+ metered: false`; no Codex prices were added and dollar totals remain lower bounds. Agent
15
+ gate provenance uses the measured Codex thread id as `executed_by.id`. Claude remains the
16
+ byte-identical default. File formats remain `version: 1`; `DASHBOARD_MODEL_VERSION` remains
17
+ `3`.
18
+
19
+ ### Fixed
20
+
21
+ - **A citation to a file that exists only on the run's unmerged epic branch passed unflagged, or broke,
22
+ depending on whether a temp directory still existed (#140).** Live evidence, run
23
+ `260830-money-and-payments` (aparece-v2, closed 2026-09-03): `retro.md` was committed to `main` carrying
24
+ 96 `[src: src/Modules/Payments/…:28]` citations to files that exist on `epic/money-and-payments` and on
25
+ no merged ref. The driver's words: *"cuatro de mis citas apuntaban a archivos que solo existen en el epic.
26
+ Nadie me las señaló."* #16 had made those resolve against the epic WORKTREE
27
+ (`.tldrx/worktrees/<repo>/_epic-<run>-<epic>`), and that is a temp directory, so the same citation had two
28
+ silent answers — measured on `24e9358` with the new fixture:
29
+ - worktree **present** (the state the retro was written in): the whole check detail read
30
+ `1 handoff(s) sourced`, with no mention of the branch the path is only on;
31
+ - worktree **gone** (the state `main` is always in, and the state after cleanup):
32
+ `no such file: src/Modules/Payments/CreateChargeHandler.cs — tried repo \`api\` (api)` — the stage's own
33
+ evidence refused for being true.
34
+ - **A `file` src now gets one more chance after every base on disk: the branches the run RECORDED.**
35
+ `run.yml`'s `build.epic_branch` — the same record `tldrx ship` opens its PR from — read as a git blob with
36
+ `git cat-file blob <ref>:<path>` in each declared repo. No worktree, and no retention policy needed for
37
+ this purpose. `cat-file blob` and not `show`: `git show <ref>:<dir>` prints a tree listing and exits 0, so
38
+ `show` would resolve a citation to a directory as though it were a file (measured 2026-09-03: `cat-file blob`
39
+ exits 0 for a blob, 128 for a tree, 128 for a path the ref does not have).
40
+ - **It resolves, and it is NAMED.** A citation whose only home is unmerged is `ok` — refusing it would refuse
41
+ a stage for reporting its own evidence — and the resolution carries the ref, so `claim-sources` prints
42
+ `on unmerged refs: 96 (epic/money-and-payments — unmerged)` in the one detail string the gate, `tldrx next`
43
+ and the run record all read. A reader of `main` is told which branch to look on. A hit on the epic
44
+ worktree is named the same way, so the "passes in silence" half is closed too.
45
+ - **Still refused:** a path on no ref at all (the failure now admits it tried the recorded branches), and a
46
+ cited line past the end of the epic's blob — which names the ref and the length the file has there. Only
47
+ branches `build.epic_branch` records are tried; a branch that merely exists in the repo is not a base.
48
+ An `absent:` src deliberately does NOT reach for the refs: an absence is a claim about where somebody
49
+ looked, and a branch nobody checked out is not somewhere anybody looked.
50
+ - **The blob read is opt-in, and the `claim-sources` hook does not opt in.** It is the one subprocess the
51
+ §2.8 reader spawns, and that hook runs on every PreToolUse write inside the 50 ms budget of spec §0. The
52
+ guard is reachability rather than a cap: `toSrcContext(workspace, runDir)` — the hook's spelling — leaves
53
+ `epicRefs` empty, so no handoff can reach a `spawnSync` from a write. Measured 2026-09-03 on 96 epic-only
54
+ citations: **0.36 ms** on the hook path, **1166 ms** cold on the gate path with all 96 reads paid, **0.36 ms**
55
+ warm (memoised per repo/ref/path, capped at 256 reads per process). `tldrx approve`, the stage/gate
56
+ `claim-sources` check, `tldrx next`'s auto gate, `tldrx watch` and `watch arm` opt in — every one of them a
57
+ boundary that already spawns git.
58
+ - **It behaves like `noted`, not like `unverified`:** it passes the stage and it does not block an auto gate
59
+ (spec §5, condition 5). It is a check that ran and came back true, of a branch nothing has merged.
60
+ - **The auto gate's NOTE carries the ref too.** `claimSourcesCondition` carried `outcome.detail` into its
61
+ note only when the unchecked-absence count was non-zero — #110's rule reading one of the two things that
62
+ detail now holds. So a stage whose handoff cited nothing but the epic and held no absence at all
63
+ auto-signed with a note that read, in full, `claim-sources=passed`. Both counts are consulted now, and
64
+ the branch reaches the sentence a person actually reads when a stage signs itself.
65
+ - **A watcher card could cite a path only the unmerged epic has, and say nothing (#143).** The one artefact
66
+ #140's annotation did not reach. `watcherFile.ts` recorded an issue only when a resolution was NOT `ok`,
67
+ and every issue it records makes the card fail — so "true, and true only on `epic/…`" could not be said
68
+ without failing a card that is not wrong. Since `tldrx watch`, `watch arm` and the Watch executor opt into
69
+ the recorded epic refs (`toSrcContext(…, { epicRefs: true })`), such a citation resolved in silence, and a
70
+ card committed to the trunk could point a reader at paths no merged ref has. Measured RED, on a card whose
71
+ four checked sections all cite `epic/money-and-payments`: `watch check` said `ok — verified; every source
72
+ resolves` and `watch list`'s footer said `1 card(s): 1 verified, 0 draft`, neither naming the branch.
73
+ - The card now carries a **separate, non-fatal `epicOnly` list** — the shape `handoff.ts` already uses for
74
+ the same reason, rather than a third `WatcherIssueKind`, because `ok` reads `issues` and nothing else, so
75
+ the annotation cannot fail a card however long it gets.
76
+ - It is printed in the words `claim-sources` already uses at a gate — `on unmerged refs: 4
77
+ (epic/money-and-payments — unmerged)` — beside the card's status in `watch check`, as a footer under the
78
+ `watch list` table, as `unmerged_refs` (plus an `unmerged` count) in `watch list --json`, and on the Watch
79
+ executor's own per-card line, which is where the driver reads a card's status.
80
+ - Three guards say it is not a rubber stamp, and all three were green before the change: a path on a
81
+ **merged** ref gets no annotation, a citation that resolves **nowhere** is still a failing `source` issue,
82
+ and with epic refs **off** — the context the PreToolUse hook builds — nothing resolves and nothing is
83
+ annotated.
84
+ - **A run could close with a question nobody ever answered, and nothing said so (#141).** Filed from the
85
+ driver of `260830-money-and-payments` (aparece-v2) as *"D7.6 nunca recibió respuesta ni disparó su
86
+ default"*, labelled INFERRED. **Measured first, and the reported mechanism does not exist:**
87
+ - `D7.6` was never a question. The §2.7 heading grammar is `^## (Q\d{1,6}) · ` — `D7.6` is a
88
+ Definition-of-Done criterion in that run's own seeded documents
89
+ (`docs/domain-design/docs/12-DEFINITION-OF-DONE.md:118-125`). The run's `questions.md` files hold exactly
90
+ three blocks — `Q1`, `Q2`, `Q3` — and every one is `status: answered`.
91
+ - A question **cannot declare** a default. §2.7's metadata keys are `id status area asked_by asked_at` plus
92
+ the optional `affects:`; there is no `default:` and no `timeout:`.
93
+ - **Nothing fires one.** The only thing in the codebase called a default is `tldrx interview
94
+ --yes-to-defaults`, which an operator invokes by hand, takes option A, and is labelled `[assumption]` in
95
+ its own implementation. No timer, no gate and no close applies anything to an open question.
96
+
97
+ The fail-open the report was reaching for is real, and narrower guards had hidden it: the auto gate's
98
+ `questions` condition reads only the CURRENT stage's declared file, a human `approve` does not look at
99
+ questions at all, and `closeRun` read `run.yml` and git and nothing else. A question raised in `01-what`
100
+ could age through every later stage, past a signed gate and out of the run in silence. Measured RED, on a
101
+ run cancelled with `Q1` open: `cancelled 260828-demo — 1 stage(s) closed: 01-what/alpha` and not one word
102
+ about the question. **All three close paths** — `tldrx next` closing the last stage, `tldrx approve` signing
103
+ the last gate, `tldrx run cancel` — now name every open block by id, title and file, plus any heading the
104
+ §2.7 parser cannot read (worse than open: the block was never visible to anything). The sentence ends by
105
+ saying that nothing was going to answer them, because that belief is what produced the report. It is a
106
+ report and nothing else: no exit code changes, no close is refused, not one byte is written.
107
+
3
108
  ## 0.6.1 — 2026-09-03
4
109
 
5
110
  ### Fixed
@@ -301,7 +406,6 @@
301
406
  correctly and is spliced into no prompt is the `templates/story.md` failure again (#48).
302
407
  6 red before, green after. `docs/spec.md` §2.13 and the `delivery` expert each carry one
303
408
  line pointing at the checklist.
304
-
305
409
  - **The landing page now sells the unattended flow it never mentioned (#128).** Measured at
306
410
  `95a39db`: `grep -c 'tldrx drive' docs-site/index.md` returned `0`, and so did its Spanish
307
411
  twin — a bare `grep drive` exited `1` on both. `tldrx drive` is the star command for handing
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/tldr-experts?label=npm%20tldr-experts)](https://www.npmjs.com/package/tldr-experts) [![ci](https://github.com/ederwii/tldr-experts/actions/workflows/ci.yml/badge.svg)](https://github.com/ederwii/tldr-experts/actions/workflows/ci.yml) ![status](https://img.shields.io/badge/status-beta-blue)
4
4
 
5
- **An evidence-first, file-based AI development framework: five stages, a gate on every one, and every claim cited or refused.** Open source. The workflow and the persisted state format are provider-independent; the automated runner currently supports Claude Code. **Beta:** every command is implemented and verified by running it, the `version: 1` file formats only grow from here, and `tldrx --help` is the authoritative command surface.
5
+ **An evidence-first, file-based AI development framework: five stages, a gate on every one, and every claim cited or refused.** Open source. The workflow and the persisted state format are provider-independent; the automated runner currently supports Claude Code and Codex. **Beta:** every command is implemented and verified by running it, the `version: 1` file formats only grow from here, and `tldrx --help` is the authoritative command surface.
6
6
 
7
7
  One loop — *Investigate → Handoff → Interview → Gate* — five phases, **what · how · plan · build ·
8
8
  watch**, one stage per command, each stopping at a gate you own; the files ARE the state, the
@@ -59,7 +59,7 @@ and names the `--prepare` command instead.
59
59
 
60
60
  | | who executes each turn | what a turn costs | where it stops |
61
61
  |---|---|---|---|
62
- | `tldrx run auto` | the framework — `claude -p`, spawned stage after stage | metered per spawn, rolled up by `tldrx cost` | the first human gate or open question (`4`), stage failure (`5`), ceiling (`2`) |
62
+ | `tldrx run auto` | the framework — Claude Code by default, or `codex exec` when selected | Claude reports metered USD; Codex reports tokens and is unmetered in dollars | the first human gate or open question (`4`), stage failure (`5`), ceiling (`2`) |
63
63
  | `tldrx run attend host`, driven from a session | your session's own sub-agents | host-billed; the framework records `cost_usd: null, metered: false` | every turn — `--prepare` writes the bundle, `--commit` settles it |
64
64
  | the same, under a **mandate** | your session's own sub-agents | host-billed | a new product decision, a ceiling raise, a boundary exit — nothing else |
65
65
 
@@ -298,6 +298,7 @@ back on the registry is 0.3.0.
298
298
 
299
299
  | Version | Date | Status | Contains |
300
300
  |---|---|---|---|
301
+ | 0.7.0 | 2026-09-03 | `beta` | Codex as a second honest automated runner: recorded JSONL contract, structured envelopes, role-based sandboxes, token/session provenance, and explicitly unmetered USD accounting; Claude remains the default and the pilot harness. Also absorbs the citation-honesty work previously staged as 0.6.2: a `file` src resolves against the branches the run RECORDED and NAMES the unmerged ref instead of passing in silence or breaking with the temp dir (#140), watcher cards name it the same way (#143), and every run close reports the questions nobody answered (#141) |
301
302
  | 0.6.1 | 2026-09-03 | `beta` | dogfooding fixes from the first fully-unattended runs: blocked stories never lose uncommitted work (rescue commits + `story.work_rescued`), a fix is only Resolved with a reachable sha, re-entered stages reconstruct their handoff from the ledger instead of degrading it, the Cost header reports the phase and names its lower bound (shared `spendBasis`), feature presets resolve their per-repo maps, Plan sees the command allowlist its gate enforces, the landing sells the unattended flow |
302
303
  | 0.6.0 | 2026-09-02 | `beta` | the dashboard suite — a "Now" hero strip, `--serve` live refresh, stage durations and gate notes on page and CLI, and a public demo generated from fixtures; honest dual-economy spend (metered + host, lower-bound named); gate provenance — `executed_by` + `authority` so a delegated signature never reads as a personal one, machine-signed reporting fixed; ONE `absent:` semantic shared by claim-sources and the auto gate; superseded stamps when an owner answer flips an earlier phase doc; run close commits its state and `ship` refuses a state-carrying epic; merge-wave gates `docs:build`, survives interruption and self-rewrite; a public-surface drift guard; env.yml validation (unique ids, tool cap) |
303
304
  | 0.5.0 | 2026-09-02 | `beta` | `tldrx drive` and its own preflight, `watch check` / `watch arm`, `questions cards`, `plan schema`, `retro --all` (with its findings fed back into every reviewer prompt) and `story reopen --for-fix`; `tldrx update` plus a cached newer-version notice; the dashboard reads `budget.yml` and `events.jsonl` — operator notes, reopens and retries, the per-phase budget panel, and a host-attended run metered in tokens against `ceiling_host_tokens`; a rejected review envelope no longer burns a story attempt; `ship` opens one PR per repo; merge-wave lock + ref guard; five golden-transcript evals, one per stage; `CONTRIBUTING.md` and a model-provider contract |
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  FactsStore
4
- } from "./chunk-17gv74sr.js";
4
+ } from "./chunk-ecfqpeyj.js";
5
5
  import {
6
6
  parseHookInput,
7
7
  readStdin
8
- } from "./chunk-vrhczzxs.js";
8
+ } from "./chunk-x3zy7zrn.js";
9
9
  import {
10
10
  EventLog,
11
11
  PHASE_ID_RE
12
- } from "./chunk-dgct01h0.js";
13
- import"./chunk-g4db8rbs.js";
14
- import"./chunk-v4ay50nq.js";
12
+ } from "./chunk-b9rjx4qc.js";
13
+ import"./chunk-5w5eg00k.js";
14
+ import"./chunk-6405vkzk.js";
15
15
  import {
16
16
  MAX_FACT_CHARS,
17
17
  detectAnswered,
@@ -19,12 +19,12 @@ import {
19
19
  recordAnswer,
20
20
  replaceBlock,
21
21
  serializeQuestions
22
- } from "./chunk-97ncnegd.js";
22
+ } from "./chunk-37fwvg3x.js";
23
23
  import"./chunk-39zh2e44.js";
24
24
  import {
25
25
  PROJECT_WORK_DIR,
26
26
  factsPath
27
- } from "./chunk-9w64mxdh.js";
27
+ } from "./chunk-y3cxqvnx.js";
28
28
 
29
29
  // src/hooks/answer-capture.ts
30
30
  import { existsSync as existsSync3 } from "fs";
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  budgetGateDeny
4
- } from "./chunk-dhbxzjfs.js";
4
+ } from "./chunk-cf4az0j5.js";
5
5
  import {
6
6
  allow,
7
7
  deny,
8
8
  readPayload,
9
9
  runHook,
10
10
  toolInput
11
- } from "./chunk-x6n8b5fp.js";
12
- import"./chunk-vrhczzxs.js";
11
+ } from "./chunk-2y3kwfrx.js";
12
+ import"./chunk-x3zy7zrn.js";
13
13
  import {
14
14
  asRunBudget,
15
15
  currentActor,
@@ -29,15 +29,15 @@ import {
29
29
  validateRunBudget,
30
30
  wouldExceed,
31
31
  wouldExceedHostTokens
32
- } from "./chunk-pstax1g9.js";
32
+ } from "./chunk-md1c7z7q.js";
33
33
  import {
34
34
  EventLog
35
- } from "./chunk-dgct01h0.js";
35
+ } from "./chunk-b9rjx4qc.js";
36
36
  import"./chunk-rrkdfk7s.js";
37
- import"./chunk-g4db8rbs.js";
37
+ import"./chunk-5w5eg00k.js";
38
38
  import {
39
39
  noteDeprecations
40
- } from "./chunk-97ncnegd.js";
40
+ } from "./chunk-37fwvg3x.js";
41
41
  import"./chunk-39zh2e44.js";
42
42
  import {
43
43
  PROJECT_WORK_DIR,
@@ -45,7 +45,7 @@ import {
45
45
  locateWork,
46
46
  parseYaml,
47
47
  stageYamlPath
48
- } from "./chunk-9w64mxdh.js";
48
+ } from "./chunk-y3cxqvnx.js";
49
49
 
50
50
  // src/hooks/budget-gate.ts
51
51
  import { existsSync as existsSync2, readFileSync as readFileSync2, statSync } from "node:fs";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  parseHookInput,
3
3
  readStdin
4
- } from "./chunk-vrhczzxs.js";
4
+ } from "./chunk-x3zy7zrn.js";
5
5
 
6
6
  // src/hooks/lib/decide.ts
7
7
  function deny(reason) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseSrcToken
3
- } from "./chunk-9w64mxdh.js";
3
+ } from "./chunk-y3cxqvnx.js";
4
4
 
5
5
  // src/core/text/questions.ts
6
6
  var REQUIRED_METADATA_KEYS = ["id", "status", "area", "asked_by", "asked_at"];
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-39zh2e44.js";
4
4
  import {
5
5
  parseYaml
6
- } from "./chunk-9w64mxdh.js";
6
+ } from "./chunk-y3cxqvnx.js";
7
7
 
8
8
  // src/core/schemas/planCommon.ts
9
9
  var STORY_ID_RE = /^S\d{1,4}$/;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  PROJECT_FRAMEWORK_DIR,
3
3
  PROJECT_WORK_DIR
4
- } from "./chunk-9w64mxdh.js";
4
+ } from "./chunk-y3cxqvnx.js";
5
5
 
6
6
  // src/core/lock/workspaceLock.ts
7
7
  import { existsSync as existsSync2, mkdirSync as mkdirSync2, openSync, readFileSync as readFileSync2, rmSync as rmSync2, writeSync, closeSync } from "node:fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseFrontMatter
3
- } from "./chunk-g4db8rbs.js";
3
+ } from "./chunk-5w5eg00k.js";
4
4
  import {
5
5
  asDocument,
6
6
  isRecord,
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-39zh2e44.js";
15
15
  import {
16
16
  parseHandoff
17
- } from "./chunk-9w64mxdh.js";
17
+ } from "./chunk-y3cxqvnx.js";
18
18
 
19
19
  // src/core/events/EventLog.ts
20
20
  import { appendFileSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
@@ -3,7 +3,7 @@ import {
3
3
  EMPTY_SECTION_RULE,
4
4
  noneBullet,
5
5
  srcRule
6
- } from "./chunk-9w64mxdh.js";
6
+ } from "./chunk-y3cxqvnx.js";
7
7
 
8
8
  // src/hooks/lib/messages.ts
9
9
  var GRAMMAR = "[src: <repo:path:line> | https://… | Q<n> | F<n> | $ <cmd> → exit <n> | graph:<node> | absent:<path>]";
@@ -3,7 +3,7 @@ import {
3
3
  withWorkspaceLock,
4
4
  workspaceRootOfFactsPath,
5
5
  writeAtomic
6
- } from "./chunk-v4ay50nq.js";
6
+ } from "./chunk-6405vkzk.js";
7
7
  import {
8
8
  FACT_CONFIDENCES,
9
9
  FACT_KINDS,
@@ -14,7 +14,7 @@ import {
14
14
  isLive,
15
15
  isRetired,
16
16
  noteDeprecations
17
- } from "./chunk-97ncnegd.js";
17
+ } from "./chunk-37fwvg3x.js";
18
18
  import {
19
19
  asDocument,
20
20
  isRecord,
@@ -29,7 +29,7 @@ import {
29
29
  SRC_PATTERNS,
30
30
  parseYaml,
31
31
  readableSource
32
- } from "./chunk-9w64mxdh.js";
32
+ } from "./chunk-y3cxqvnx.js";
33
33
 
34
34
  // src/core/facts/FactsStore.ts
35
35
  import { existsSync, readFileSync } from "node:fs";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  EVIDENCE_FILE,
3
3
  gateEvidenceRelPath
4
- } from "./chunk-dgct01h0.js";
4
+ } from "./chunk-b9rjx4qc.js";
5
5
  import {
6
6
  MAX_PLAN_STORIES,
7
7
  MAX_STORIES_PER_WAVE,
@@ -11,7 +11,7 @@ import {
11
11
  requirePattern,
12
12
  requireStringList,
13
13
  requireVersion1
14
- } from "./chunk-g4db8rbs.js";
14
+ } from "./chunk-5w5eg00k.js";
15
15
  import {
16
16
  asDocument,
17
17
  isRecord,
@@ -31,7 +31,7 @@ import {
31
31
  listRunDirs,
32
32
  parseYaml,
33
33
  readableSource
34
- } from "./chunk-9w64mxdh.js";
34
+ } from "./chunk-y3cxqvnx.js";
35
35
 
36
36
  // src/hooks/lib/runFile.ts
37
37
  import { existsSync, readFileSync } from "node:fs";
@@ -7,7 +7,7 @@ import {
7
7
  nowRfc3339,
8
8
  openRunViews,
9
9
  validateRunBudget
10
- } from "./chunk-pstax1g9.js";
10
+ } from "./chunk-md1c7z7q.js";
11
11
  import {
12
12
  EventLog,
13
13
  asRunFile,
@@ -19,7 +19,7 @@ import {
19
19
  isTerminal,
20
20
  stageAt,
21
21
  validateRunFile
22
- } from "./chunk-dgct01h0.js";
22
+ } from "./chunk-b9rjx4qc.js";
23
23
  import {
24
24
  backupPathFor,
25
25
  isAlive,
@@ -28,17 +28,17 @@ import {
28
28
  workspaceRootOfRunDir,
29
29
  writeAtomic,
30
30
  yamlScalar
31
- } from "./chunk-v4ay50nq.js";
31
+ } from "./chunk-6405vkzk.js";
32
32
  import {
33
33
  noteDeprecations,
34
34
  openBlocks,
35
35
  parseQuestions
36
- } from "./chunk-97ncnegd.js";
36
+ } from "./chunk-37fwvg3x.js";
37
37
  import {
38
38
  listRunDirs,
39
39
  parseYaml,
40
40
  parseYamlRepairing
41
- } from "./chunk-9w64mxdh.js";
41
+ } from "./chunk-y3cxqvnx.js";
42
42
 
43
43
  // src/core/statusline/runSnapshot.ts
44
44
  import { existsSync as existsSync3, readFileSync as readFileSync3 } from "node:fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  toolInput
3
- } from "./chunk-x6n8b5fp.js";
3
+ } from "./chunk-2y3kwfrx.js";
4
4
 
5
5
  // src/hooks/lib/wouldBe.ts
6
6
  import { existsSync, readFileSync } from "node:fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runtime
3
- } from "./chunk-9w64mxdh.js";
3
+ } from "./chunk-y3cxqvnx.js";
4
4
 
5
5
  // src/core/hooks/passthrough.ts
6
6
  async function readStdin() {