提交

提交图

298 次代码提交

作者 SHA1 备注 提交日期
Matthew Breedlove 28d98e320c Version bump and README update
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
Publish / Publish to npm (push) Has been cancelled
CI / Build (push) Has been cancelled
v2.2.20
2026-06-13 23:53:36 -04:00
Zach 04b4026f1d fix: prefer cumulative transcript metrics for input/output token widgets (#435)
Co-authored-by: Claude <noreply@anthropic.com>
2026-06-13 23:43:27 -04:00
Martijn Riemers bc34c3a97e fix: permanent [Timeout] in extra usage widgets when no monthly limit is set (#416)
* fix: treat enabled extra usage without a monthly limit as complete usage data

Accounts with extra usage enabled but no monthly limit configured
(monthly_limit: null) never receive extraUsageLimit/extraUsageUtilization
from the usage API. hasRequiredUsageField treated those absent fields as
incomplete data on every fetch - including successful ones - so cached
data was never accepted, the fetch loop re-fetched each cycle, and the
extra usage widgets surfaced the cached lock error as a permanent
[Timeout].

Extend the existing extraUsageEnabled === false special case to any
response where the extra usage state is known: once the API has told us
whether extra usage is enabled, absent detail fields are conclusive and
refetching cannot produce them.

Fixes #413

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test: drop currency from no-limit fixture to stay order-independent of #418

Once #418 teaches the parser about extra_usage.currency, a fixture
carrying the field would add extraUsageCurrency to the parsed result
and break this test's expectation depending on merge order. The field
is irrelevant to what this test covers (monthly_limit: null handling).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-06-13 20:24:14 -04:00
KorenKrita 96cb608294 fix: ignore transient 0% flashes in compaction counter (#370)
* fix: ignore transient 0% flashes in compaction counter

Ignore context percentage values below 1% to prevent false compaction
counts when Claude Code emits incomplete status JSON frames.

* test: clarify transient compaction glitches

---------

Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-06-13 20:16:21 -04:00
Zach 3058693a64 fix: keep usage-fetch tests from touching the real user cache (#432)
* fix: keep usage-fetch tests from touching the real user cache

The probe subprocesses overrode HOME but inherited the real USERPROFILE,
which os.homedir() prefers on Windows, so every test run read and wrote
the developer's live ~/.cache/ccstatusline: fixture data and stale locks
ended up in the running statusline, which showed [Timeout] until the
lock expired and fixture percentages until the cache aged out.

- Pin USERPROFILE alongside HOME in the probe environment
- Pin CLAUDE_CONFIG_DIR and both proxy variables so inherited developer
  settings never reach probes
- Report os.homedir() from every probe and assert it matches the sandbox
  home, so any future isolation escape fails loudly
- Make the lowercase https_proxy assertion platform-aware: Windows
  environment variables are case-insensitive, so it is indistinguishable
  from HTTPS_PROXY there

On Windows this takes the file from 0/11 passing to 11/11.

Co-authored-by: Claude <noreply@anthropic.com>

* fix(test): preserve lowercase proxy env in usage probes

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-06-13 20:05:18 -04:00
dependabot[bot] a221e8ab2c chore(deps-dev): bump the dev-dependencies group across 1 directory with 11 updates (#422)
Bumps the dev-dependencies group with 11 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@remotion/cli](https://github.com/remotion-dev/remotion) | `4.0.461` | `4.0.472` |
| [eslint](https://github.com/eslint/eslint) | `10.3.0` | `10.4.1` |
| [eslint-import-resolver-typescript](https://github.com/import-js/eslint-import-resolver-typescript) | `4.4.4` | `4.4.5` |
| [ink-gradient](https://github.com/sindresorhus/ink-gradient) | `4.0.0` | `4.0.1` |
| [react](https://github.com/facebook/react/tree/HEAD/packages/react) | `19.2.6` | `19.2.7` |
| [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `19.2.14` | `19.2.16` |
| [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) | `19.2.6` | `19.2.7` |
| [remotion](https://github.com/remotion-dev/remotion) | `4.0.461` | `4.0.472` |
| [tinyglobby](https://github.com/SuperchupuDev/tinyglobby) | `0.2.16` | `0.2.17` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.59.3` | `8.60.0` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `4.1.6` | `4.1.8` |



Updates `@remotion/cli` from 4.0.461 to 4.0.472
- [Release notes](https://github.com/remotion-dev/remotion/releases)
- [Commits](https://github.com/remotion-dev/remotion/compare/v4.0.461...v4.0.472)

Updates `eslint` from 10.3.0 to 10.4.1
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.3.0...v10.4.1)

Updates `eslint-import-resolver-typescript` from 4.4.4 to 4.4.5
- [Release notes](https://github.com/import-js/eslint-import-resolver-typescript/releases)
- [Changelog](https://github.com/import-js/eslint-import-resolver-typescript/blob/master/CHANGELOG.md)
- [Commits](https://github.com/import-js/eslint-import-resolver-typescript/compare/v4.4.4...v4.4.5)

Updates `ink-gradient` from 4.0.0 to 4.0.1
- [Release notes](https://github.com/sindresorhus/ink-gradient/releases)
- [Commits](https://github.com/sindresorhus/ink-gradient/compare/v4.0.0...v4.0.1)

Updates `react` from 19.2.6 to 19.2.7
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.7/packages/react)

Updates `@types/react` from 19.2.14 to 19.2.16
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `react-dom` from 19.2.6 to 19.2.7
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.7/packages/react-dom)

Updates `remotion` from 4.0.461 to 4.0.472
- [Release notes](https://github.com/remotion-dev/remotion/releases)
- [Commits](https://github.com/remotion-dev/remotion/compare/v4.0.461...v4.0.472)

Updates `tinyglobby` from 0.2.16 to 0.2.17
- [Release notes](https://github.com/SuperchupuDev/tinyglobby/releases)
- [Changelog](https://github.com/SuperchupuDev/tinyglobby/blob/main/CHANGELOG.md)
- [Commits](https://github.com/SuperchupuDev/tinyglobby/compare/0.2.16...0.2.17)

Updates `typescript-eslint` from 8.59.3 to 8.60.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.60.0/packages/typescript-eslint)

Updates `vitest` from 4.1.6 to 4.1.8
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.8/packages/vitest)

---
updated-dependencies:
- dependency-name: "@remotion/cli"
  dependency-version: 4.0.472
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: eslint
  dependency-version: 10.4.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
- dependency-name: eslint-import-resolver-typescript
  dependency-version: 4.4.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: ink-gradient
  dependency-version: 4.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: react
  dependency-version: 19.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: "@types/react"
  dependency-version: 19.2.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: react-dom
  dependency-version: 19.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: remotion
  dependency-version: 4.0.472
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: tinyglobby
  dependency-version: 0.2.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: typescript-eslint
  dependency-version: 8.60.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
- dependency-name: vitest
  dependency-version: 4.1.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-13 19:27:03 -04:00
Rayan Salhab 447e0e69eb fix: git-review detection with SSH host aliases (#424)
* Fix git review detection for SSH host aliases

* fix(git-review): preserve canonical SSH forge hosts

---------

Co-authored-by: cyphercodes <cyphercodes@users.noreply.github.com>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-06-13 19:25:10 -04:00
Cameron Sjo 97108fc1ea feat: Gradient color support and line-spanning foreground gradient overrides (#406)
* feat: line-spanning foreground gradients via overrideForegroundColor

Add a `gradient:<stop>,<stop>,...` form for `overrideForegroundColor` that
paints the whole status line with a continuous gradient — each visible
character is colored by its column position, so the gradient spans the line
rather than restarting per widget. Applies to standard (non-powerline) lines;
powerline separators derive their color from adjacent backgrounds, so a
foreground gradient is intentionally not applied there.

- src/utils/gradient.ts: parse hex stops (`hex:RRGGBB` / `#RRGGBB` / bare),
  interpolate in OKLab for perceptually even, non-muddy blends, and map to
  truecolor or the nearest ansi256 index.
- src/utils/ansi.ts: applyLineGradient walks the assembled line with the
  existing escape/cluster tokenizer, so SGR styling and OSC-8 hyperlinks pass
  through untouched and visible width is unchanged (flex layout unaffected).
- src/utils/renderer.ts: applied after assembly and before truncation in the
  standard path. `overrideForegroundColor` accepts the new `gradient:` form
  alongside the existing `hex:` / `ansi256:` / named tagged-string forms; a
  gradient spec is not treated as a per-widget solid color and degrades to a
  no-op at ansi16 (keeping widgets' own colors).

Tests cover spec parsing, OKLab sampling, ansi256 quantization,
width-invariance, OSC-8 passthrough, and a renderer integration case.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: add per-widget gradients + presets + TUI picker on the line-span core

Converges the two same-day gradient PRs into one coherent feature. #406
added line-spanning gradients via overrideForegroundColor (OKLab, zero-dep);
#404 (@akkaz) added gradient as a per-widget color with named presets and a
ColorMenu picker. Both created src/utils/gradient.ts and would conflict, so
this meshes them onto a single shared OKLab engine:

- gradient.ts: GRADIENT_PRESETS (akkaz's stops, gradient-string MIT;
  rainbow/pastel re-expressed as multi-stop hue wheels for OKLab); unified
  parseGradientSpec accepting presets, dash (RRGGBB-RRGGBB), and comma
  (hex:..,..) forms; applyGradientToText for the per-widget sweep.
- colors.ts: per-widget gradient hook in applyColors; getColorAnsiCode
  collapses a gradient to its first stop (powerline / ansi16 degrade).
- ColorMenu.tsx: 'g' opens a gradient picker (preset list + custom hex),
  foreground-only, colorLevel >= 2.
- No new dependency (tinygradient dropped in favor of OKLab).

Precedence: overrideForegroundColor gradient (line-span) > widget.color
gradient (per-widget) > solid. Gradients self-degrade at render time, so
color-sanitize leaves them untouched at every level.

Builds on the per-widget design from #404 by @akkaz.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: akkaz <giomarco@cleversoft.it>

* refactor: polish gradient feature — fix truncation reset-leak, tighten, document

Pre-PR polish pass over the gradient feature.

Fix (correctness):
- renderStatusLine now applies the line-span gradient AFTER truncation, not
  before. truncateStyledText cuts from the right and appends a raw "..." with no
  trailing reset, so a gradient applied earlier had its closing \x1b[39m sliced
  off, leaking the last color past the status line. Gradient codes are zero-width,
  so the truncation measurement is unaffected by deferring. Regression test added.

Simplify:
- Add exported isGradientSpec(); reuse it across colors.ts and renderer.ts instead
  of duplicating the 'gradient:' startsWith check. Drop the redundant prefix guard
  in applyColors (parseGradientSpec already self-guards).

Docs:
- Document applyGradientToText's code-point (vs grapheme-cluster) iteration as a
  known limitation, with the ZWJ/variation-selector consequence and the
  circular-import reason it isn't unified with applyLineGradient yet.
- Note that hex:/# /bare stops are valid in both comma and dash parse forms.
- Note getColorAnsiCode's ansi16 branch intentionally emits a truecolor first-stop
  escape (caller-degraded; never reached at a true ansi16 terminal).
- README + docs/USAGE.md: gradient color options (both scopes, presets, forms).

bun test 1433 pass / 0 fail; lint + tsc clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(gradient): preserve escape sequences in widget gradients

Keep ANSI and OSC control sequences byte-for-byte intact when applying per-widget gradients so hyperlinks and pre-styled widget output are not corrupted by inserted SGR codes.

Count and color only visible non-whitespace characters while passing escape sequences through unchanged. Add a regression covering styled OSC 8 link output.

* fix(colors): suppress gradient fallback at ansi16

Prevent stored gradient color specs from emitting 24-bit SGR codes when the active terminal color level has been reduced to Basic or No Color.

Leave gradient settings intact, but return no gradient ANSI fallback at ansi16 and cover the behavior in per-widget and raw-code regression tests.

* fix(renderer): detect truncated gradient lines visibly

Preserve truncation reporting after whole-line gradients insert SGR codes between the ellipsis characters.

Check the visible text for the truncation marker instead of the raw styled bytes, and add a regression where the rendered line no longer contains a literal contiguous ellipsis.

* feat(tui): add gradients to foreground overrides

Let Global Overrides assign a whole-line foreground gradient through the same preset/custom selector used by the color screen.

Move (g) to gradient selection, add (x) as the foreground override clear key, show gradient override values in the menu, and update usage docs for the new controls and Basic/No Color degradation behavior.

In Powerline mode, carry global gradient position continuously across widget text while leaving separators and caps under Powerline contrast rules. Surface an active foreground override warning on the Powerline Setup screen so theme masking is visible.

---------

Co-authored-by: Cameron Sjo <cameronsjo@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: akkaz <giomarco@cleversoft.it>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-06-13 18:56:09 -04:00
Matthew Breedlove 54fce0903e fix: support Windows npm shim execution
Closes #401.
2026-06-02 09:53:25 -04:00
Kotob 9d4b6ee4f9 feat: add remote control status widget (#382)
* feat: add remote control status widget

Adds a widget that reads ~/.claude/sessions/<pid>.json and shows whether
the current session has a remote-control bridge attached, matched by
session_id from the Claude Code status payload.

Claude Code sets bridgeSessionId to null on disconnect and rewrites the
session file within ~1s, so the widget reflects connect/disconnect
transitions at the next status-line refresh.

* feat: add label-check format to remote control status widget

Renders "remote " when connected and "remote " when disconnected, so
the bar can be parsed by shape/color at a glance instead of reading "on"
or "off". Slots into the existing format cycle after word.

* feat: add label-mark format using text-mode check/cross

Renders "remote ✓" / "remote ✗" using U+2713 and U+2717. Unlike the
label-check emoji variant these are text-mode glyphs, so they stay
single-cell and pick up the widget color instead of drawing in the OS
emoji palette — less visually invasive while still parseable by shape.
2026-05-20 02:26:47 -04:00
dependabot[bot] cd2e41adc8 chore(deps-dev): bump the dev-dependencies group with 5 updates (#386)
Bumps the dev-dependencies group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [@remotion/cli](https://github.com/remotion-dev/remotion) | `4.0.459` | `4.0.461` |
| [@types/bun](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/bun) | `1.3.13` | `1.3.14` |
| [remotion](https://github.com/remotion-dev/remotion) | `4.0.459` | `4.0.461` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.59.2` | `8.59.3` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `4.1.5` | `4.1.6` |


Updates `@remotion/cli` from 4.0.459 to 4.0.461
- [Release notes](https://github.com/remotion-dev/remotion/releases)
- [Commits](https://github.com/remotion-dev/remotion/compare/v4.0.459...v4.0.461)

Updates `@types/bun` from 1.3.13 to 1.3.14
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/bun)

Updates `remotion` from 4.0.459 to 4.0.461
- [Release notes](https://github.com/remotion-dev/remotion/releases)
- [Commits](https://github.com/remotion-dev/remotion/compare/v4.0.459...v4.0.461)

Updates `typescript-eslint` from 8.59.2 to 8.59.3
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.3/packages/typescript-eslint)

Updates `vitest` from 4.1.5 to 4.1.6
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.6/packages/vitest)

---
updated-dependencies:
- dependency-name: "@remotion/cli"
  dependency-version: 4.0.461
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: "@types/bun"
  dependency-version: 1.3.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: remotion
  dependency-version: 4.0.461
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: typescript-eslint
  dependency-version: 8.59.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: vitest
  dependency-version: 4.1.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-20 02:13:00 -04:00
Ronald E. Oribio R. 4b314d5fce fix(extra-usage): correct unit assumptions for usage API response (#388)
* fix(extra-usage): correct unit assumptions for usage API response

The Anthropic usage API returns `extra_usage.used_credits` in cents (not
dollars) and `extra_usage.utilization` as a percent 0-100 (not a 0-1
fraction). The current widget code assumed the inverse, which made:

- ExtraUsageUtilization always clamp to 100.0% (multiplying a percent
  by 100 and clamping to [0,100])
- ExtraUsageRemaining always show $0.00 (subtracting cents from dollars
  goes negative, clamped to 0)

Drop the `* 100` in ExtraUsageUtilization and divide `extraUsageUsed`
by 100 in ExtraUsageRemaining so both widgets render real values.

Verified locally against a live API response where util=6.74 and
used=27087/limit=400000 — now renders "Overage: 6.8% | Overage Left:
\$3,728.54" instead of "Overage: 100.0% | Overage Left: \$0.00".

* test(extra-usage): update fixtures for corrected unit assumptions

Adjust extraUsageUsed fixtures to cents and extraUsageUtilization
fixtures to 0-100 percentages so they exercise the corrected widget
math.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(extra-usage): align API unit fixtures

Update fetch and prefetch fixtures to reflect used credits as cents and extra usage utilization as a 0-100 percentage. Clarify the UsageData comments to match the widget contract.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-05-20 02:11:09 -04:00
Josi Aranda cc8e82f476 feat(weekly-reset): add weekday display mode for Weekly Reset Timer (#392)
Add a (w)eekday toggle to the Weekly Reset Timer widget in date mode.
When enabled, renders "Sun 11:00 PM GMT+9" instead of the full ISO date,
matching Claude web's weekly usage display style.

Co-authored-by: mm-aranda <aranda@macromill.com>
2026-05-20 01:49:42 -04:00
Matthew Breedlove 1b7cfb010b chore: bump version to 2.2.19
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
Publish / Publish to npm (push) Has been cancelled
CI / Build (push) Has been cancelled
v2.2.19
2026-05-17 03:07:31 -04:00
Daniel Naves de Carvalho ea97ddd69e feat(terminal): honor CCSTATUSLINE_WIDTH env var to override probe (#380)
* feat(terminal): honor CCSTATUSLINE_WIDTH env var to override probe

Provide an explicit width override so users can bypass the TTY probe
entirely when both ancestor-walk and `tput cols` fall through.

This is the fallback case the existing probe cannot solve on its own:
Claude Code >= 2.1.139 spawns statusline/hooks without terminal access,
and in some configurations (IDE integrations, nested shells, certain
agent-mode spawn paths) no ancestor process owns a TTY either. The
ancestor walk fails, `tput cols` returns 80, and the multi-line layout
truncates regardless of the actual iTerm2/terminal width.

PR #377 (`stty -F`/`stty -f`) covers the case where an ancestor does
hold a TTY but the legacy `< /dev/tty` form errors with ENOTTY. This
patch is complementary -- it handles the case where the ancestor walk
finds no TTY at all -- and gives users a knob today while upstream
work on passing `terminalWidth` via stdin JSON (#308) lands.

Change
------

`src/utils/terminal.ts` -- `probeTerminalWidth` now reads
`CCSTATUSLINE_WIDTH` before any platform check or probe. A valid
positive integer short-circuits with that value; anything else
(missing, empty, non-numeric, zero, negative) falls through to the
existing probe logic.

Usage
-----

Set the env var on the statusLine command in `~/.claude/settings.json`:

```json
"statusLine": {
  "type": "command",
  "command": "CCSTATUSLINE_WIDTH=200 ccstatusline"
}
```

Tests
-----

Four new cases in `src/utils/__tests__/terminal.test.ts`:

- override short-circuits probing entirely
- non-positive override (`0`) falls back to probing
- non-numeric override falls back to probing
- override applies on Windows where probing is otherwise disabled

`bunx vitest run src/utils/__tests__/terminal.test.ts` -> 12/12 pass.
Full-suite delta vs `main`: 4 new passing tests, zero new failures
(the pre-existing 105 env-specific failures in other suites are
unchanged on both branches).

`bun run lint` -> clean.

* docs: document terminal width override

---------

Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-05-17 03:01:58 -04:00
Matthew Breedlove 6a581e6c6a fix: cache git subprocess output for statusline
Add persistent git command caching under ~/.cache/ccstatusline/git-cache with command-only entries, cwd metadata, repo mtimes, and configurable TTL.

Expose Git Cache TTL in Configure Status Line, default it to 5s, and pass it through the real render context.

Make pinned global install the top/default option, clarify install wording, and add windowsHide to runtime child process options.

Closes #384.
2026-05-17 02:42:11 -04:00
Deepak Dewani 654802e4d6 fix(git): use compatible git commands for older git versions (#385)
* fix(git): use compatible git commands for older git versions

This commit updates git commands to be compatible with older versions of Git (e.g. 2.10.1). Specifically, it replaces branch --show-current with rev-parse --abbrev-ref HEAD and uses the GIT_OPTIONAL_LOCKS environment variable instead of the --no-optional-locks flag.

* fix(git): address review compatibility regressions

Use symbolic-ref --short HEAD for branch detection in the GitBranch widget and review cache so unborn branches keep rendering their branch name while detached HEAD still resolves as no branch.

Update git command assertions after replacing --no-optional-locks argv usage with GIT_OPTIONAL_LOCKS=0 in the exec environment, including shared coverage for widgets and git remote helpers.

Add a small test helper for asserting git exec options without depending on the full process environment.

Verification: bun test; bun run lint; git diff --check

---------

Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-05-17 01:33:09 -04:00
Matthew Breedlove cf5ab7be45 chore: Version bump and docs update
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
Publish / Publish to npm (push) Has been cancelled
CI / Build (push) Has been cancelled
v2.2.18
2026-05-15 09:42:38 -04:00
Bastian Staunstrup 861a2a0638 fix(git): always pass --no-optional-locks to prevent index.lock races (#381)
When the statusline refreshes while another git process is writing
.git/index.lock (e.g. a concurrent `git restore --staged`), commands
like `git diff --shortstat` fail with "Unable to create index.lock"
because diff tries to refresh the stat cache and races on the lock.

`runGitArgs` now prepends `--no-optional-locks` to every git
invocation so read-only commands cannot interfere with the user's
working git operations. The two call sites that already prefixed the
flag manually are simplified.
2026-05-15 09:38:40 -04:00
dependabot[bot] 4091574f52 chore(deps-dev): bump the dev-dependencies group across 1 directory with 4 updates (#368)
Bumps the dev-dependencies group with 4 updates in the / directory: [eslint](https://github.com/eslint/eslint), [globals](https://github.com/sindresorhus/globals), [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) and [zod](https://github.com/colinhacks/zod).


Updates `eslint` from 10.2.1 to 10.3.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.2.1...v10.3.0)

Updates `globals` from 17.5.0 to 17.6.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v17.5.0...v17.6.0)

Updates `typescript-eslint` from 8.59.0 to 8.59.2
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.2/packages/typescript-eslint)

Updates `zod` from 4.3.6 to 4.4.3
- [Release notes](https://github.com/colinhacks/zod/releases)
- [Commits](https://github.com/colinhacks/zod/compare/v4.3.6...v4.4.3)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 10.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
- dependency-name: globals
  dependency-version: 17.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
- dependency-name: typescript-eslint
  dependency-version: 8.59.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: zod
  dependency-version: 4.4.3
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-14 09:52:19 -04:00
Ronald E. Oribio R. 196a370a2e feat: add extra usage widgets and fix null rate-limit buckets for pay-as-you-go plans (#375)
* feat: add extra usage widgets and fix null rate-limit buckets for pay-as-you-go plans

Add two new widgets for Anthropic pay-as-you-go (extra usage) plans:
- `extra-usage-utilization` — shows overage utilization as a percentage
- `extra-usage-remaining` — shows remaining monthly overage budget in dollars

Fix a Zod schema bug that caused all usage widgets to time out on PAYG plans.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: handle disabled extra usage widgets

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-05-14 09:41:24 -04:00
Matthew Breedlove 29908c266a fix: usage API parsing for nullable cohort response buckets
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
Publish / Publish to npm (push) Has been cancelled
CI / Build (push) Has been cancelled
v2.2.17
2026-05-14 08:58:50 -04:00
Matthew Breedlove b01336b1a7 chore: scope publish workflow to this repository so forks don't try to push to the ccstatusline npm 2026-05-13 14:42:03 -04:00
Pragy Agarwal 9eccca279e fix(terminal): use stty -F/-f to read tty size in detached spawn (#377)
The TTY-width probe walked ancestor processes to find a controlling
PTY and ran `stty size < /dev/${tty}` to read its dimensions. That
form fails with ENOTTY on Linux when the calling process has no
controlling terminal — which is now the case under Claude Code
>= 2.1.139, whose changelog reads "hooks now run without terminal
access". The statusLine spawn is hardened the same way. Probe falls
back to `tput cols` (= 80), flexMode "full-minus-40" collapses to
40 columns, and the statusline truncates regardless of the real
terminal width.

GNU coreutils `stty -F <path>` and BSD `stty -f <path>` open the
device themselves (with O_NOCTTY semantics) and succeed regardless
of controlling-tty status. Try `-F` then `-f` then the historical
redirect form so we keep working on every stty variant.

Verified: on a Linux+ptyxis spawn under Claude Code 2.1.140 the probe
goes from returning null to returning the real width (159 cols here)
without restarting the session.

Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-05-13 13:47:13 -04:00
Matthew Breedlove 9ab87c3f55 Adding publishing workflow for npm provenance attestation
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
Publish / Publish to npm (push) Has been cancelled
CI / Build (push) Has been cancelled
Closes #369
v2.2.16
2026-05-13 13:28:41 -04:00
Matthew Breedlove 1739572a96 fix: merge partial usage data for widgets
Use widget-specific requirements to fetch missing usage fields and merge rate_limits data with API results.

Preserve API errors alongside available usage data so widgets with fulfilled fields still render while missing fields surface fetch failures.
2026-05-13 13:09:37 -04:00
Matthew Breedlove b8821a7d83 fix: ignore bunx statusline shims
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Build (push) Has been cancelled
v2.2.15
2026-05-12 02:24:39 -04:00
Matthew Breedlove ed3ce5ba0b feat: Version pinning install support
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Build (push) Has been cancelled
Closes #298
Closes #103
v2.2.14
2026-05-12 02:14:02 -04:00
Matthew Breedlove ec283761d4 Update demo gif
Add remotion screens for making demo gif, update demo gif
2026-05-12 00:01:05 -04:00
Matthew Breedlove f198e72a62 Version bump and doc update
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Build (push) Has been cancelled
v2.2.13
2026-05-11 03:28:05 -04:00
Sam Hopkins 29c47242a8 feat: add weekly Sonnet and Opus usage widgets (#361)
* feat: add weekly Sonnet and Opus usage widgets

* Fix per-model usage prefetch fallback

* Fix per-model usage cache handling

---------

Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-05-11 02:17:49 -04:00
Bentley(중길) 23b01a3877 docs: add AIWatch integration example (Custom Command + Related Projects) (#365)
Adds a "Integration Example: AIWatch" section to docs/USAGE.md mirroring
the existing ccusage section, plus a Related Projects link in README, per
the placement the maintainer chose in #362.

AIWatch (ai-watch.dev) monitors live status for 30+ AI APIs/apps; the
Custom Command one-liner surfaces degraded providers in the status line
and renders empty when everything's operational.

Co-authored-by: Bentley <bentley@naemomlab.com>
2026-05-11 01:48:40 -04:00
Thomas BENOIT 0ae20bea5e feat: add voice status widget showing Claude Code voice input state (#357)
* feat: add voice status widget showing Claude Code voice input state

* Fix voice status workspace config lookup

---------

Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-05-11 01:45:32 -04:00
Thomas BENOIT 456cc46de7 feat: short bar mode for timer widgets (#358) 2026-05-11 01:27:30 -04:00
dependabot[bot] a69e09a9a9 chore(deps-dev): bump the dev-dependencies group with 2 updates (#354)
* chore(deps-dev): bump the dev-dependencies group with 2 updates

Bumps the dev-dependencies group with 2 updates: [typescript](https://github.com/microsoft/TypeScript) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript` from 6.0.2 to 6.0.3
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/compare/v6.0.2...v6.0.3)

Updates `typescript-eslint` from 8.58.2 to 8.59.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 6.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: typescript-eslint
  dependency-version: 8.59.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix: satisfy updated lint rules

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-05-11 01:17:29 -04:00
Matthew Breedlove 0a749bb1ef fix(hooks): suppress no-op JSON output
Exit silently after hook side effects so Claude Code 2.1.117+ does not validate an empty JSON object.

Resolves #364
2026-05-11 00:57:25 -04:00
Sean Brandt bbd19313cc feat(jj): add Jujutsu VCS widgets (#205)
* feat(jj): add jj utility functions and shared hide-no-jj feature

Add jj VCS utility module mirroring the existing git utilities with
workspace detection, command execution, and diff stat parsing. Add
shared jj-no-jj toggle for hiding 'no jj' messages in jj widgets.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(jj): add JjChange and JjBookmark widgets

Add two new Jujutsu VCS widgets mirroring the GitBranch pattern:
- JjChange: displays current jj change ID with `jj:` prefix
- JjBookmark: displays current jj bookmark name(s) with `@` prefix,
  showing `(none)` when no bookmarks are set
- Add `runJjRaw` utility to distinguish empty output from errors

Both widgets support raw value mode, hide-no-jj configuration,
and include full test coverage (17 tests).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(jj): add JjChanges, JjInsertions, JjDeletions, JjRootDir, and JjDescription widgets

Add five new Jujutsu VCS widgets with full test coverage:
- JjChanges: combined insertions/deletions count (+ins,-del)
- JjInsertions: insertion count from jj diff --stat
- JjDeletions: deletion count from jj diff --stat
- JjRootDir: workspace root directory name extraction
- JjDescription: current change description via jj log

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(jj): add JjWorkspace widget for displaying current workspace name

Add getJjCurrentWorkspace() utility that parses `jj workspace list` output
to extract the current workspace name from the first line. Implement
JjWorkspaceWidget with blue color, W: prefix, raw value support, and
hide-no-jj toggle. Include tests for both the utility function and widget.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(jj): register all jj widgets in manifest and add shared behavior tests

Add all 8 jj widgets (JjChange, JjBookmark, JjChanges, JjInsertions,
JjDeletions, JjRootDir, JjDescription, JjWorkspace) to the widget
exports and manifest registry. Add shared behavior test suite validating
hide-no-jj keybind, metadata toggling, editor display, and Jujutsu
category across all jj widgets.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(jj): consolidate runJj/runJjRaw, fix double subprocess and hideNoJj invariant

- Merge runJjRaw into runJj with allowEmpty parameter to eliminate
  duplication while preserving semantic distinction between empty
  output and command failure
- Fix JjRootDir calling jj workspace root twice per render by
  removing redundant isInsideJjWorkspace guard
- Extract getRootDirName to module-level function (matches project
  convention of no private helper methods)
- Fix JjDescription ignoring hideNoJj flag when command fails after
  workspace check passes
- Fix JjDescription preview string inconsistency ('(no description
  set)' vs '(no description)')
- Add tests for allowEmpty behavior and JjDescription hideNoJj
  command failure case

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(git): add hideWhenJj toggle to suppress git widgets in jj workspaces

Add a new per-widget toggle that hides git widgets when a jj workspace
is detected, enabling clean colocated repo support. Users can press 'j'
in the TUI items editor to enable this on any git widget.

- Add git-hide-when-jj.ts shared module with metadata flag, keybind,
  and editor display helpers
- Update all 6 git widgets (Branch, Changes, Insertions, Deletions,
  RootDir, Worktree) with the new toggle
- Compose modifier text from both hideNoGit and hideWhenJj flags
- Chain action handlers via nullish coalescing
- Add shared behavior tests for toggle, keybind, and modifier display

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(jj): remove git widget jj hide keybind

* chore(git): restore git modifier helper usage

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-04-28 04:26:03 -04:00
Daniel Correia ad9519e1b9 feat: Jujutsu VCS (jj) widgets (#189)
* feat: add jujutsu widgets

* fix: better revset functions to improve usability

* Fix JJ widget command execution

---------

Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-04-28 03:45:39 -04:00
Matthew Breedlove af87d5594b Version bump and doc update
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Build (push) Has been cancelled
v2.2.12
2026-04-28 02:10:43 -04:00
黄黄汪 a1a47ab9c5 fix: context percentage labels reflect used/remaining state (#311)
Previously the Context % and Context % (usable) widgets always
rendered the static label "Ctx: " / "Ctx(u): ", so a user looking
at "Ctx: 9.3%" could not tell whether 9.3% was used or remaining
without opening the editor to check the inverse toggle.

Now the label reflects the current state:
- default (used):  "Ctx Used: X%"   /  "Ctx(u) Used: X%"
- inverse (left):  "Ctx Left: X%"   /  "Ctx(u) Left: X%"

The existing (u) keybind "(u)sed/remaining" and modifier text
"(remaining)" already named these states; this just surfaces the
same distinction in the rendered status line output. Tests updated
to match.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-04-28 02:06:03 -04:00
Matthew Breedlove fb0be05f53 fix(tui): allow more than three powerline caps 2026-04-28 01:53:30 -04:00
François-Pierre Bouchard de374741d0 feat: add time cursor to usage progress bars (#254)
* feat: add time cursor to usage progress bars

The old progress bar showed only how much of the usage limit had been
consumed. The new makeTimerProgressBar adds an optional cursor marker
that shows the elapsed time position within the current usage window.
Users can toggle the cursor on and off with the t keybind when in
progress display mode.

* fix: show time cursor in short usage bars

---------

Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-04-28 01:16:51 -04:00
Matthew Breedlove 1f26e52e80 Version bump and doc update
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Build (push) Has been cancelled
v2.2.11
2026-04-28 00:06:52 -04:00
CJ 3b0a26e3a9 feat: add compaction-counter widget (#282)
* feat: add compaction-counter widget

Tracks context compaction events per session. When Claude Code compacts
the conversation, used_percentage drops; this widget detects the drop
and displays ↻N.

Detection: any drop in used_percentage > 2 points between consecutive
renders counts as one compaction. The threshold filters rounding noise
on both 200K and 1M context windows. State stored per-session in
~/.cache/ccstatusline/compaction/ as JSON.

Related: #92

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: sanitize session ID in cache path and handle write failures

- Sanitize session ID to prevent path traversal via crafted StatusJSON
- Wrap cache writes in try/catch — failures no longer crash status line
- Add persistence tests: round-trip, path traversal regression, write failure
- Clarify threshold doc (drop must exceed 2 points)

Co-Authored-By: Claude <noreply@anthropic.com>

* style: align compaction files with project conventions

- Restore EOF newlines (eol-last flipped 'never' → 'always' in 9f779db)
- Use bare module names ('fs', 'os', 'path') with namespace imports
- Use safeParse for cache file parsing
- Refactor test to use a render(options) helper
- Strip @param/@returns from detectCompaction JSDoc
- Collapse trivial single-property object literals to one-line form
- Split guard clause across two lines in CompactionCounter.render

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(widget): harden compaction-counter against bad input and symlinks

Correctness:
- Pass raw used_percentage to detectCompaction; Math.round was missing
  real drops between rounded points (40.4 → 37.6 is a 2.8 drop but
  rounds to 40 → 38 = 2, failing the > 2 threshold).
- Sentinel prevCtxPct=-1 for fresh state so sessions starting at 0%
  are detected correctly (prior prevCtxPct>0 guard excluded that case).
- Guard detectCompaction against NaN/Infinity/negative input; NaN
  silently poisoned prevCtxPct and disabled detection forever.
- Always load the persisted count so the widget keeps showing the
  historical value when a status update has no used_percentage; only
  run detection+save when a current percentage is present.
- Skip the save when state is unchanged, avoiding a redundant fsync
  per refreshInterval tick.

Security:
- Atomic save via temp file + rename defeats a planted symlink at the
  cache path that would otherwise be written through. Orphan temp
  files are cleaned up if rename fails after write succeeded.
- Open with O_NOFOLLOW + fstat on the open fd: rejects symlinks and
  non-regular files on read, and closes the TOCTOU window that would
  otherwise let the path be swapped between stat and read.
- 4 KiB cache file size cap on read prevents DoS via oversized file.
- Hash session IDs that are empty or contain disallowed characters so
  distinct sessions can't collide in the same cache file.

Tests added for NaN/Infinity/negative input, non-integer drops, 0%
session start, sequential compactions, threshold 0, corrupted JSON,
oversized cache file, symlink rejection on read, atomic save replacing
a planted symlink, session-ID collision, and preview ignoring live data.
Symlink tests are skipped on Windows where fs.symlinkSync requires
elevated privileges.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(compaction): harden counter detection and display

fix(compaction): derive usage from shared context percentage metrics when raw used_percentage is missing.

fix(compaction): reset persisted baselines when context window sizes change to avoid false compaction counts.

refactor(context): reuse shared percentage metrics in the context percentage widget.

feat(compaction-counter): add format cycling for icon-space, text label, and number-only displays.

feat(compaction-counter): add Nerd Font icon support only for the icon-space format.

feat(compaction-counter): show zero by default and add an opt-in hide-when-zero toggle.

test(compaction): cover window-size changes, derived percentages, display modes, Nerd Font behavior, and zero visibility.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-04-28 00:01:59 -04:00
Andrey Golanov bd20bbb265 fix: detect effort changes from /effort command in ThinkingEffort widget (#252)
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-04-27 23:18:35 -04:00
Matthew Breedlove 78836d74f3 fix: read thinking effort from status JSON 2026-04-27 23:09:52 -04:00
dependabot[bot] a95059ba2a chore(deps-dev): bump typescript from 5.9.3 to 6.0.2 (#342)
* chore(deps-dev): bump typescript from 5.9.3 to 6.0.2

Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.9.3 to 6.0.2.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.9.3...v6.0.2)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 6.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Include Bun types for TypeScript 6

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthew Breedlove <sirmalloc@gmail.com>
2026-04-27 22:55:26 -04:00
dependabot[bot] cccf448518 chore(deps-dev): bump the dev-dependencies group with 3 updates (#341)
Bumps the dev-dependencies group with 3 updates: [@types/bun](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/bun), [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@types/bun` from 1.3.12 to 1.3.13
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/bun)

Updates `eslint-plugin-react-hooks` from 7.0.1 to 7.1.1
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/eslint-plugin-react-hooks@7.1.1/packages/eslint-plugin-react-hooks)

Updates `vitest` from 4.1.4 to 4.1.5
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.5/packages/vitest)

---
updated-dependencies:
- dependency-name: "@types/bun"
  dependency-version: 1.3.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: eslint-plugin-react-hooks
  dependency-version: 7.1.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
- dependency-name: vitest
  dependency-version: 4.1.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-27 22:44:23 -04:00
CJ 89a0a78467 fix(renderer): collapse separators around empty widgets (#344)
In layouts with explicit `{type: "separator"}` items, when a widget
between two separators renders empty, both surrounding separators
still emit — producing "A |  | B" instead of "A | B". The walkback
in renderStatusLine that gates each separator was looking for ANY
prior widget with content, not the immediately-prior one. That's
correct for hiding a leading separator (nothing before it) but
wrong when the immediate-prior widget is empty in the middle of a
line.

Fix: stop the walkback at the first non-separator widget and emit
only when that widget actually rendered content. The leading-edge
case still hides correctly (no prior widget → no orphan), and a
merge:'no-padding' chain across a collapsed separator now reaches
the next visible widget as expected. Affects any hide-capable
widget (git-changes with hideNoGit, etc.). The auto-separator
(defaultSeparator) path already filters empty widgets out of its
element chain and isn't touched.

New tests cover:
- empty widget between two separators (the canonical case)
- consecutive empty widgets between content widgets
- leading empty widget (regression — already worked, locks behavior)
- merge:'no-padding' interaction across a collapsed separator
- defaultSeparator path independence (the fix doesn't couple to it)
- all-content happy path (regression guard)

Co-authored-by: Claude <noreply@anthropic.com>
2026-04-27 22:43:45 -04:00
Matthew Breedlove 48bc4208fb Version bump and doc update
CI / Lint & Type Check (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Build (push) Has been cancelled
v2.2.10
2026-04-27 02:03:30 -04:00