jeo-code 0.9.4 → 0.9.6

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
@@ -8,6 +8,28 @@ The README mirrors the latest 5 entries — regenerate with `bun run changelog:s
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [0.9.6] - 2026-07-27
12
+ _Resize-safe ledger flush and terminal clear handling after viewport shrink._
13
+
14
+ ### Fixed
15
+ - **TUI ledger/clear cursor anchoring** (`src/tui/renderer.ts`) — clamps `insertAbove()` and reserve-mode `clear()` to the current visible row count, preventing asynchronous ledger flushes or finish-time cleanup from overshooting a newly shrunken terminal bottom margin.
16
+
17
+ ### Verified
18
+ - Renderer resize suite: 25 pass / 0 fail, including shrink-before-ledger and shrink-before-clear paths.
19
+ - LaunchTui integration: real ledger flush remains cursor-bounded when a 40-row viewport shrinks to 6 rows before repaint.
20
+ - `bun run typecheck`: clean.
21
+
22
+ ## [0.9.5] - 2026-07-27
23
+ _Resize-safe live TUI rendering for terminal viewport shrink/grow transitions._
24
+
25
+ ### Fixed
26
+ - **TUI viewport shrink anchoring** (`src/tui/renderer.ts`) — bounds differential row walks and cursor movement to the visible terminal height, preventing clipped frames from moving the repaint anchor past the bottom margin and corrupting subsequent footer/input rendering.
27
+
28
+ ### Verified
29
+ - Renderer resize suite: 24 pass / 0 fail, including a viewport shrink below the previous frame and recovery after growth.
30
+ - LaunchTui resize integration: real renderer output remains scroll-free and cursor-bounded during a live 30-row → 6-row transition.
31
+ - `bun run typecheck`: clean.
32
+
11
33
  ## [0.9.4] - 2026-07-27
12
34
  _Real OpenAI/Codex model discovery after login, npm package-content hardening, and pinned self-update support._
13
35
 
package/README.ja.md CHANGED
@@ -285,10 +285,10 @@ CI は `.github/workflows/npm-publish.yml` で公開します — GitHub リリ
285
285
 
286
286
  <!-- CHANGELOG:START (auto-generated from CHANGELOG.md — run `bun run changelog:sync`) -->
287
287
  - **[Unreleased]**
288
+ - **[0.9.6]** (2026-07-27) — Resize-safe ledger flush and terminal clear handling after viewport shrink.
289
+ - **[0.9.5]** (2026-07-27) — Resize-safe live TUI rendering for terminal viewport shrink/grow transitions.
288
290
  - **[0.9.4]** (2026-07-27) — Real OpenAI/Codex model discovery after login, npm package-content hardening, and pinned self-update support.
289
291
  - **[0.9.3]** (2026-07-26) — Released Telegram integration reliability improvements adapted from GJC v0.11.10, with safe jeo-native behavior and live verification.
290
- - **[0.9.2]** (2026-07-26) — Released the jeo-native GJC v0.11.6–v0.11.9 parity improvements after a complete cross-audit and live verification pass.
291
- - **[0.9.1]** (2026-07-24) — User request (paraphrased, Korean): "make the TUI resize responsively like gjc's TUI when terminal width/height changes, without breaking the layout — also borrow forge's layout and table components." Investigated the existing resize infrastructure first (already extensive: throttled live-frame resize repaint, a poll-based SIGWINCH safety net, resize-aware interactive pickers) before assuming a gap. Found one concrete un-responsive panel — `jeo doctor`'s Provider connectivity table — and, while rebuilding it on forge's own box-drawn table renderer, also found and fixed a real, previously-unknown overflow bug in `formatForgeBox` itself, shared by every tool card across the whole live TUI.
292
292
 
293
293
  See [CHANGELOG.md](CHANGELOG.md) for the full history.
294
294
  <!-- CHANGELOG:END -->
package/README.ko.md CHANGED
@@ -286,10 +286,10 @@ CI는 `.github/workflows/npm-publish.yml`로 배포합니다 — GitHub 릴리
286
286
 
287
287
  <!-- CHANGELOG:START (auto-generated from CHANGELOG.md — run `bun run changelog:sync`) -->
288
288
  - **[Unreleased]**
289
+ - **[0.9.6]** (2026-07-27) — Resize-safe ledger flush and terminal clear handling after viewport shrink.
290
+ - **[0.9.5]** (2026-07-27) — Resize-safe live TUI rendering for terminal viewport shrink/grow transitions.
289
291
  - **[0.9.4]** (2026-07-27) — Real OpenAI/Codex model discovery after login, npm package-content hardening, and pinned self-update support.
290
292
  - **[0.9.3]** (2026-07-26) — Released Telegram integration reliability improvements adapted from GJC v0.11.10, with safe jeo-native behavior and live verification.
291
- - **[0.9.2]** (2026-07-26) — Released the jeo-native GJC v0.11.6–v0.11.9 parity improvements after a complete cross-audit and live verification pass.
292
- - **[0.9.1]** (2026-07-24) — User request (paraphrased, Korean): "make the TUI resize responsively like gjc's TUI when terminal width/height changes, without breaking the layout — also borrow forge's layout and table components." Investigated the existing resize infrastructure first (already extensive: throttled live-frame resize repaint, a poll-based SIGWINCH safety net, resize-aware interactive pickers) before assuming a gap. Found one concrete un-responsive panel — `jeo doctor`'s Provider connectivity table — and, while rebuilding it on forge's own box-drawn table renderer, also found and fixed a real, previously-unknown overflow bug in `formatForgeBox` itself, shared by every tool card across the whole live TUI.
293
293
 
294
294
  See [CHANGELOG.md](CHANGELOG.md) for the full history.
295
295
  <!-- CHANGELOG:END -->
package/README.md CHANGED
@@ -293,10 +293,10 @@ Huge thanks to [gajae-code](https://github.com/Yeachan-Heo/gajae-code) for the i
293
293
 
294
294
  <!-- CHANGELOG:START (auto-generated from CHANGELOG.md — run `bun run changelog:sync`) -->
295
295
  - **[Unreleased]**
296
+ - **[0.9.6]** (2026-07-27) — Resize-safe ledger flush and terminal clear handling after viewport shrink.
297
+ - **[0.9.5]** (2026-07-27) — Resize-safe live TUI rendering for terminal viewport shrink/grow transitions.
296
298
  - **[0.9.4]** (2026-07-27) — Real OpenAI/Codex model discovery after login, npm package-content hardening, and pinned self-update support.
297
299
  - **[0.9.3]** (2026-07-26) — Released Telegram integration reliability improvements adapted from GJC v0.11.10, with safe jeo-native behavior and live verification.
298
- - **[0.9.2]** (2026-07-26) — Released the jeo-native GJC v0.11.6–v0.11.9 parity improvements after a complete cross-audit and live verification pass.
299
- - **[0.9.1]** (2026-07-24) — User request (paraphrased, Korean): "make the TUI resize responsively like gjc's TUI when terminal width/height changes, without breaking the layout — also borrow forge's layout and table components." Investigated the existing resize infrastructure first (already extensive: throttled live-frame resize repaint, a poll-based SIGWINCH safety net, resize-aware interactive pickers) before assuming a gap. Found one concrete un-responsive panel — `jeo doctor`'s Provider connectivity table — and, while rebuilding it on forge's own box-drawn table renderer, also found and fixed a real, previously-unknown overflow bug in `formatForgeBox` itself, shared by every tool card across the whole live TUI.
300
300
 
301
301
  See [CHANGELOG.md](CHANGELOG.md) for the full history.
302
302
  <!-- CHANGELOG:END -->
package/README.zh.md CHANGED
@@ -285,10 +285,10 @@ CI 通过 `.github/workflows/npm-publish.yml` 发布 — GitHub 发布 release
285
285
 
286
286
  <!-- CHANGELOG:START (auto-generated from CHANGELOG.md — run `bun run changelog:sync`) -->
287
287
  - **[Unreleased]**
288
+ - **[0.9.6]** (2026-07-27) — Resize-safe ledger flush and terminal clear handling after viewport shrink.
289
+ - **[0.9.5]** (2026-07-27) — Resize-safe live TUI rendering for terminal viewport shrink/grow transitions.
288
290
  - **[0.9.4]** (2026-07-27) — Real OpenAI/Codex model discovery after login, npm package-content hardening, and pinned self-update support.
289
291
  - **[0.9.3]** (2026-07-26) — Released Telegram integration reliability improvements adapted from GJC v0.11.10, with safe jeo-native behavior and live verification.
290
- - **[0.9.2]** (2026-07-26) — Released the jeo-native GJC v0.11.6–v0.11.9 parity improvements after a complete cross-audit and live verification pass.
291
- - **[0.9.1]** (2026-07-24) — User request (paraphrased, Korean): "make the TUI resize responsively like gjc's TUI when terminal width/height changes, without breaking the layout — also borrow forge's layout and table components." Investigated the existing resize infrastructure first (already extensive: throttled live-frame resize repaint, a poll-based SIGWINCH safety net, resize-aware interactive pickers) before assuming a gap. Found one concrete un-responsive panel — `jeo doctor`'s Provider connectivity table — and, while rebuilding it on forge's own box-drawn table renderer, also found and fixed a real, previously-unknown overflow bug in `formatForgeBox` itself, shared by every tool card across the whole live TUI.
292
292
 
293
293
  See [CHANGELOG.md](CHANGELOG.md) for the full history.
294
294
  <!-- CHANGELOG:END -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jeo-code",
3
- "version": "0.9.4",
3
+ "version": "0.9.6",
4
4
  "description": "Clean, highly optimized AI coding agent using spec-first loop",
5
5
  "type": "module",
6
6
  "main": "src/cli.ts",
@@ -77,12 +77,15 @@ export class Renderer {
77
77
  this.prevRows = currentRows;
78
78
 
79
79
  const next = lines.map(line => truncate(line, currentCols));
80
- // Rows physically occupied by the prior frame — or recorded by reset() when the
81
- // baseline was dropped WITHOUT clearing the screen. The diff below EL-clears any
82
- // of these that the new (possibly shorter) frame does not cover, and the reserve
83
- // block below uses it so a post-reset repaint does not spuriously re-scroll.
84
- const occupied = Math.max(this.prev.length, this.coverRows);
85
- const maxLen = Math.max(this.prev.length, next.length, this.coverRows);
80
+ // A terminal can shrink below the number of rows occupied by the prior frame.
81
+ // Rows beyond the new viewport are not addressable: cursor-down stops at the
82
+ // bottom margin and a later cursor-up would then underflow the anchor, leaving
83
+ // every following diff one or more rows out of phase. Limit both the physical
84
+ // occupancy and diff walk to visible rows; the next resize/grow repaints from
85
+ // the bounded baseline at the restored geometry.
86
+ const viewportRows = Math.max(1, currentRows);
87
+ const occupied = Math.min(Math.max(this.prev.length, this.coverRows), viewportRows);
88
+ const maxLen = Math.min(Math.max(this.prev.length, next.length, this.coverRows), viewportRows);
86
89
  this.coverRows = 0;
87
90
  let cursorRow = 0;
88
91
  let out = "";
@@ -161,10 +164,12 @@ export class Renderer {
161
164
  .join("\n");
162
165
  let out = BEGIN_SYNC + body;
163
166
  // EL-clear the old frame rows the inserted block did NOT cover, then hop back to the
164
- // row right below the insert (where the next render() anchors). occupied = max(prev,
165
- // coverRows) matches the reserve block so a reset()->insertAbove() ordering still
166
- // clears the old frame's lower rows (the off-by-one that duplicated the model bar).
167
- const occupied = Math.max(this.prev.length, this.coverRows);
167
+ // row right below the insert (where the next render() anchors). The terminal may have
168
+ // shrunk since the last render, so never walk farther than its currently visible rows:
169
+ // cursor-down clamps at the bottom margin and an uncapped cursor-up would desync the
170
+ // physical anchor used by every subsequent diff.
171
+ const viewportRows = Math.max(1, size().rows);
172
+ const occupied = Math.min(Math.max(this.prev.length, this.coverRows), viewportRows);
168
173
  const stale = occupied - written;
169
174
  if (stale > 0) {
170
175
  for (let i = 0; i < stale; i++) {
@@ -184,7 +189,8 @@ export class Renderer {
184
189
  clear(): void {
185
190
  let out: string;
186
191
  if (this.reserve) {
187
- const rows = Math.max(this.prev.length, this.coverRows);
192
+ const viewportRows = Math.max(1, size().rows);
193
+ const rows = Math.min(Math.max(this.prev.length, this.coverRows), viewportRows);
188
194
  out = toColumn(1);
189
195
  for (let i = 0; i < rows; i++) {
190
196
  out += (i > 0 ? cursorDown(1) : "") + toColumn(1) + clearLine();