From a77213f933e916a734c146362bae2edb9b766660 Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 12:49:29 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .github/FUNDING.yml | 1 + .github/dependabot.yml | 32 + .github/workflows/ci.yml | 36 + .github/workflows/publish.yml | 36 + .gitignore | 35 + .npmignore | 36 + .vscode/settings.json | 28 + AGENTS.md | 151 + AUTHORS | 6 + CLAUDE.md | 1 + LICENSE | 21 + NOTICE | 8 + README.md | 427 +++ README.wehub.md | 7 + bun.lock | 1433 +++++++++ docs/DEVELOPMENT.md | 140 + docs/USAGE.md | 308 ++ docs/WINDOWS.md | 205 ++ eslint.config.js | 147 + package.json | 94 + patches/ink@6.2.0.patch | 17 + remotion/index.ts | 5 + remotion/root.tsx | 16 + remotion/tuiDemo.tsx | 2724 +++++++++++++++++ screenshots/autoAlign.png | Bin 0 -> 24511 bytes screenshots/blockTimer.png | Bin 0 -> 255698 bytes screenshots/blockTimerSmall.png | Bin 0 -> 20658 bytes screenshots/ccusage.png | Bin 0 -> 25368 bytes screenshots/cwdAndSessionCost.png | Bin 0 -> 28241 bytes screenshots/demo.gif | Bin 0 -> 5234775 bytes screenshots/emojiSupport.png | Bin 0 -> 49045 bytes screenshots/global.png | Bin 0 -> 319655 bytes screenshots/powerline-flex.png | Bin 0 -> 29344 bytes scripts/.gitignore | 2 + scripts/payload.example.json | 53 + scripts/replace-version.ts | 28 + src/ccstatusline.ts | 332 ++ src/tui/App.tsx | 1356 ++++++++ src/tui/__tests__/App.test.ts | 290 ++ src/tui/__tests__/claude-status.test.ts | 69 + src/tui/claude-status.ts | 24 + src/tui/components/ColorMenu.tsx | 665 ++++ src/tui/components/ConfirmDialog.tsx | 74 + src/tui/components/GlobalOverridesMenu.tsx | 462 +++ src/tui/components/InstallMenu.tsx | 239 ++ src/tui/components/ItemsEditor.tsx | 591 ++++ src/tui/components/LineSelector.tsx | 312 ++ src/tui/components/List.tsx | 170 + src/tui/components/MainMenu.tsx | 241 ++ src/tui/components/ManageInstallationMenu.tsx | 226 ++ .../components/PowerlineSeparatorEditor.tsx | 324 ++ src/tui/components/PowerlineSetup.tsx | 472 +++ src/tui/components/PowerlineThemeSelector.tsx | 235 ++ src/tui/components/RefreshIntervalMenu.tsx | 265 ++ src/tui/components/StatusLinePreview.tsx | 145 + src/tui/components/TerminalOptionsMenu.tsx | 174 ++ src/tui/components/TerminalWidthMenu.tsx | 177 ++ src/tui/components/UpdateCheckerMenu.tsx | 233 ++ .../components/__tests__/ColorMenu.test.tsx | 122 + .../__tests__/GlobalOverridesMenu.test.ts | 299 ++ .../components/__tests__/InstallMenu.test.tsx | 270 ++ .../__tests__/ManageInstallationMenu.test.ts | 64 + .../__tests__/PowerlineSetup.test.ts | 292 ++ .../__tests__/PowerlineThemeSelector.test.ts | 160 + .../__tests__/RefreshIntervalMenu.test.ts | 241 ++ .../__tests__/StatusLinePreview.test.ts | 156 + .../__tests__/TerminalOptionsMenu.test.ts | 44 + .../__tests__/TerminalWidthMenu.test.ts | 169 + .../color-menu/__tests__/mutations.test.ts | 155 + src/tui/components/color-menu/mutations.ts | 175 ++ src/tui/components/index.ts | 15 + .../__tests__/input-handlers.test.ts | 1006 ++++++ .../components/items-editor/input-handlers.ts | 502 +++ src/tui/index.tsx | 1 + src/types/BlockMetrics.ts | 4 + src/types/ClaudeSettings.ts | 16 + src/types/ColorEntry.ts | 10 + src/types/ColorLevel.ts | 29 + src/types/FlexMode.ts | 7 + src/types/PowerlineConfig.ts | 16 + src/types/PowerlineFontStatus.ts | 4 + src/types/RenderContext.ts | 58 + src/types/Settings.ts | 98 + src/types/SkillsMetrics.ts | 12 + src/types/SpeedMetrics.ts | 20 + src/types/StatusJSON.ts | 80 + src/types/TokenMetrics.ts | 26 + src/types/Widget.ts | 63 + src/types/__tests__/StatusJSON.test.ts | 114 + src/types/index.ts | 22 + src/utils/__tests__/block-cache.test.ts | 291 ++ src/utils/__tests__/claude-settings.test.ts | 814 +++++ src/utils/__tests__/clone-settings.test.ts | 40 + src/utils/__tests__/color-sanitize.test.ts | 86 + src/utils/__tests__/colors-gradient.test.ts | 68 + src/utils/__tests__/compaction.test.ts | 159 + src/utils/__tests__/config-dir.test.ts | 48 + src/utils/__tests__/config.test.ts | 414 +++ .../__tests__/context-percentage.test.ts | 259 ++ src/utils/__tests__/context-window.test.ts | 75 + src/utils/__tests__/git-remote.test.ts | 412 +++ src/utils/__tests__/git-review-cache.test.ts | 598 ++++ src/utils/__tests__/git-test-helpers.ts | 15 + src/utils/__tests__/git.test.ts | 663 ++++ .../global-command-resolution.test.ts | 157 + .../__tests__/global-package-manager.test.ts | 194 ++ src/utils/__tests__/gradient.test.ts | 352 +++ src/utils/__tests__/hook-handler.test.ts | 85 + src/utils/__tests__/hooks.test.ts | 247 ++ src/utils/__tests__/hyperlink.test.ts | 30 + src/utils/__tests__/input-guards.test.ts | 31 + src/utils/__tests__/jj.test.ts | 132 + src/utils/__tests__/jsonl-blocks.test.ts | 88 + src/utils/__tests__/jsonl-metrics.test.ts | 1101 +++++++ src/utils/__tests__/jsonl.test.ts | 264 ++ src/utils/__tests__/locales.test.ts | 83 + src/utils/__tests__/migrations.test.ts | 87 + src/utils/__tests__/model-context.test.ts | 204 ++ src/utils/__tests__/open-url.test.ts | 148 + .../__tests__/powerline-settings.test.ts | 73 + .../__tests__/powerline-theme-index.test.ts | 73 + src/utils/__tests__/renderer-ansi.test.ts | 236 ++ .../__tests__/renderer-config-warning.test.ts | 35 + src/utils/__tests__/renderer-dim.test.ts | 322 ++ .../renderer-exclude-auto-align.test.ts | 105 + .../__tests__/renderer-flex-width.test.ts | 632 ++++ .../__tests__/renderer-format-tokens.test.ts | 43 + .../renderer-powerline-theme.test.ts | 65 + .../renderer-separator-collapse.test.ts | 150 + src/utils/__tests__/separator-index.test.ts | 162 + src/utils/__tests__/skills.test.ts | 59 + src/utils/__tests__/speed-metrics.test.ts | 74 + src/utils/__tests__/speed-window.test.ts | 55 + src/utils/__tests__/terminal.test.ts | 282 ++ src/utils/__tests__/timezones.test.ts | 61 + src/utils/__tests__/update-checker.test.ts | 243 ++ src/utils/__tests__/usage-fetch.test.ts | 1258 ++++++++ src/utils/__tests__/usage-prefetch.test.ts | 607 ++++ .../__tests__/usage-token-buffer.test.ts | 76 + src/utils/__tests__/usage-token.test.ts | 226 ++ src/utils/__tests__/usage-windows.test.ts | 13 + src/utils/__tests__/usage.test.ts | 274 ++ src/utils/__tests__/widgets.test.ts | 298 ++ src/utils/ansi.ts | 562 ++++ src/utils/claude-settings.ts | 653 ++++ src/utils/clone-settings.ts | 10 + src/utils/color-sanitize.ts | 66 + src/utils/colors.ts | 503 +++ src/utils/compaction.ts | 83 + src/utils/config.ts | 277 ++ src/utils/context-percentage.ts | 46 + src/utils/context-window.ts | 174 ++ src/utils/format-tokens.ts | 12 + src/utils/fuzzy.ts | 281 ++ src/utils/git-remote.ts | 190 ++ src/utils/git-review-cache.ts | 418 +++ src/utils/git.ts | 506 +++ src/utils/global-command-resolution.ts | 234 ++ src/utils/global-package-manager.ts | 382 +++ src/utils/gradient.ts | 417 +++ src/utils/guid.ts | 11 + src/utils/hook-handler.ts | 50 + src/utils/hooks.ts | 142 + src/utils/hyperlink.ts | 42 + src/utils/input-guards.ts | 20 + src/utils/jj.ts | 44 + src/utils/jsonl-blocks.ts | 233 ++ src/utils/jsonl-cache.ts | 133 + src/utils/jsonl-lines.ts | 27 + src/utils/jsonl-metadata.ts | 81 + src/utils/jsonl-metrics.ts | 573 ++++ src/utils/jsonl.ts | 21 + src/utils/locales.ts | 175 ++ src/utils/migrations.ts | 220 ++ src/utils/model-context.ts | 123 + src/utils/open-url.ts | 109 + src/utils/package-manager-executable.ts | 19 + src/utils/powerline-settings.ts | 32 + src/utils/powerline-theme-index.ts | 34 + src/utils/powerline.ts | 342 +++ src/utils/renderer.ts | 1251 ++++++++ src/utils/separator-index.ts | 62 + src/utils/skills.ts | 58 + src/utils/speed-metrics.ts | 62 + src/utils/speed-window.ts | 49 + src/utils/terminal.ts | 179 ++ src/utils/timezones.ts | 125 + src/utils/update-checker.ts | 329 ++ src/utils/usage-fetch.ts | 687 +++++ src/utils/usage-prefetch.ts | 222 ++ src/utils/usage-types.ts | 32 + src/utils/usage-windows.ts | 295 ++ src/utils/usage.ts | 21 + src/utils/widget-manifest.ts | 118 + src/utils/widgets.ts | 133 + src/widgets/BlockResetTimer.ts | 197 ++ src/widgets/BlockTimer.ts | 139 + src/widgets/CacheHitRate.ts | 65 + src/widgets/CacheRead.ts | 62 + src/widgets/CacheWrite.ts | 62 + src/widgets/ClaudeAccountEmail.ts | 45 + src/widgets/ClaudeSessionId.ts | 32 + src/widgets/CompactionCounter.ts | 338 ++ src/widgets/ContextBar.ts | 137 + src/widgets/ContextLength.ts | 38 + src/widgets/ContextPercentage.ts | 80 + src/widgets/ContextPercentageUsable.ts | 92 + src/widgets/ContextWindow.ts | 45 + src/widgets/CurrentWorkingDir.tsx | 305 ++ src/widgets/CustomCommand.tsx | 249 ++ src/widgets/CustomSymbol.tsx | 97 + src/widgets/CustomText.tsx | 172 ++ src/widgets/ExtraUsageRemaining.ts | 69 + src/widgets/ExtraUsageUsed.ts | 67 + src/widgets/ExtraUsageUtilization.ts | 125 + src/widgets/FreeMemory.ts | 96 + src/widgets/GitAheadBehind.ts | 115 + src/widgets/GitBranch.ts | 161 + src/widgets/GitChanges.ts | 58 + src/widgets/GitCleanStatus.ts | 67 + src/widgets/GitConflicts.ts | 94 + src/widgets/GitDeletions.ts | 58 + src/widgets/GitInsertions.ts | 58 + src/widgets/GitIsFork.ts | 76 + src/widgets/GitOriginOwner.ts | 70 + src/widgets/GitOriginOwnerRepo.ts | 99 + src/widgets/GitOriginRepo.ts | 70 + src/widgets/GitPr.ts | 174 ++ src/widgets/GitRootDir.ts | 165 + src/widgets/GitSha.ts | 59 + src/widgets/GitStaged.ts | 92 + src/widgets/GitStagedFiles.ts | 64 + src/widgets/GitStatus.ts | 104 + src/widgets/GitUnstaged.ts | 92 + src/widgets/GitUnstagedFiles.ts | 64 + src/widgets/GitUntracked.ts | 92 + src/widgets/GitUntrackedFiles.ts | 64 + src/widgets/GitUpstreamOwner.ts | 70 + src/widgets/GitUpstreamOwnerRepo.ts | 70 + src/widgets/GitUpstreamRepo.ts | 70 + src/widgets/GitWorktree.ts | 104 + src/widgets/GitWorktreeBranch.ts | 30 + src/widgets/GitWorktreeMode.ts | 55 + src/widgets/GitWorktreeName.ts | 30 + src/widgets/GitWorktreeOriginalBranch.ts | 30 + src/widgets/InputSpeed.ts | 44 + src/widgets/JjBookmarks.ts | 110 + src/widgets/JjChanges.ts | 94 + src/widgets/JjDeletions.ts | 70 + src/widgets/JjDescription.ts | 81 + src/widgets/JjInsertions.ts | 70 + src/widgets/JjRevision.ts | 85 + src/widgets/JjRootDir.ts | 82 + src/widgets/JjWorkspace.ts | 104 + src/widgets/Link.tsx | 218 ++ src/widgets/Model.ts | 37 + src/widgets/OutputSpeed.ts | 44 + src/widgets/OutputStyle.ts | 29 + src/widgets/RemoteControlStatus.ts | 166 + src/widgets/SessionClock.ts | 55 + src/widgets/SessionCost.ts | 36 + src/widgets/SessionName.ts | 58 + src/widgets/SessionUsage.ts | 126 + src/widgets/Skills.tsx | 212 ++ src/widgets/TerminalWidth.ts | 32 + src/widgets/ThinkingEffort.ts | 76 + src/widgets/TokensCached.ts | 34 + src/widgets/TokensInput.ts | 40 + src/widgets/TokensOutput.ts | 40 + src/widgets/TokensTotal.ts | 34 + src/widgets/TotalSpeed.ts | 44 + src/widgets/Version.ts | 29 + src/widgets/VimMode.ts | 137 + src/widgets/VoiceStatus.ts | 168 + src/widgets/WeeklyOpusUsage.ts | 128 + src/widgets/WeeklyResetTimer.ts | 290 ++ src/widgets/WeeklySonnetUsage.ts | 128 + src/widgets/WeeklyUsage.ts | 126 + src/widgets/__tests__/BlockResetTimer.test.ts | 290 ++ src/widgets/__tests__/BlockTimer.test.ts | 217 ++ src/widgets/__tests__/CacheWidgets.test.ts | 228 ++ .../__tests__/ClaudeAccountEmail.test.ts | 153 + .../__tests__/CompactionCounter.test.ts | 512 ++++ src/widgets/__tests__/ContextBar.test.ts | 168 + .../__tests__/ContextPercentage.test.ts | 173 ++ .../__tests__/ContextPercentageUsable.test.ts | 152 + .../__tests__/CurrentWorkingDir.test.ts | 260 ++ src/widgets/__tests__/CustomCommand.test.ts | 74 + .../__tests__/ExtraUsageRemaining.test.ts | 144 + src/widgets/__tests__/ExtraUsageUsed.test.ts | 134 + .../__tests__/ExtraUsageUtilization.test.ts | 192 ++ src/widgets/__tests__/FreeMemory.test.ts | 195 ++ src/widgets/__tests__/GitBranch.test.ts | 255 ++ src/widgets/__tests__/GitChanges.test.ts | 95 + src/widgets/__tests__/GitCleanStatus.test.ts | 112 + src/widgets/__tests__/GitConflicts.test.ts | 110 + src/widgets/__tests__/GitDeletions.test.ts | 101 + src/widgets/__tests__/GitInsertions.test.ts | 101 + src/widgets/__tests__/GitPr.test.ts | 246 ++ src/widgets/__tests__/GitRootDir.test.ts | 257 ++ src/widgets/__tests__/GitStagedFiles.test.ts | 106 + src/widgets/__tests__/GitStatus.test.ts | 32 + .../__tests__/GitUnstagedFiles.test.ts | 105 + .../__tests__/GitUntrackedFiles.test.ts | 105 + .../__tests__/GitWidgetSharedBehavior.test.ts | 68 + src/widgets/__tests__/GitWorktree.test.ts | 145 + src/widgets/__tests__/JjBookmarks.test.ts | 120 + src/widgets/__tests__/JjChanges.test.ts | 107 + src/widgets/__tests__/JjDeletions.test.ts | 79 + src/widgets/__tests__/JjDescription.test.ts | 99 + src/widgets/__tests__/JjInsertions.test.ts | 85 + src/widgets/__tests__/JjRevision.test.ts | 113 + src/widgets/__tests__/JjRootDir.test.ts | 93 + .../__tests__/JjWidgetSharedBehavior.test.ts | 62 + src/widgets/__tests__/JjWorkspace.test.ts | 118 + src/widgets/__tests__/Link.test.ts | 152 + src/widgets/__tests__/Model.test.ts | 69 + .../__tests__/RemoteControlStatus.test.ts | 270 ++ src/widgets/__tests__/SessionClock.test.ts | 40 + src/widgets/__tests__/SessionName.test.ts | 107 + src/widgets/__tests__/SessionUsage.test.ts | 104 + src/widgets/__tests__/Skills.test.ts | 150 + src/widgets/__tests__/SpeedWidgets.test.ts | 153 + src/widgets/__tests__/SymbolOverride.test.ts | 148 + src/widgets/__tests__/ThinkingEffort.test.ts | 377 +++ src/widgets/__tests__/TokensWidgets.test.ts | 154 + src/widgets/__tests__/VimMode.test.ts | 147 + src/widgets/__tests__/VoiceStatus.test.ts | 263 ++ src/widgets/__tests__/WeeklyOpusUsage.test.ts | 108 + .../__tests__/WeeklyResetTimer.test.ts | 442 +++ .../__tests__/WeeklySonnetUsage.test.ts | 108 + src/widgets/__tests__/WeeklyUsage.test.ts | 104 + .../__tests__/helpers/usage-widget-suites.ts | 347 +++ src/widgets/__tests__/shared/currency.test.ts | 23 + .../__tests__/shared/progress-bar.test.ts | 77 + src/widgets/index.ts | 83 + .../shared/__tests__/locale-editor.test.tsx | 201 ++ .../__tests__/symbol-override-editor.test.tsx | 151 + .../shared/__tests__/timezone-editor.test.tsx | 179 ++ .../shared/__tests__/usage-display.test.ts | 92 + src/widgets/shared/cache-metrics.ts | 52 + src/widgets/shared/cache-scope.ts | 72 + src/widgets/shared/context-inverse.ts | 26 + src/widgets/shared/context-slider.ts | 70 + src/widgets/shared/currency.ts | 23 + src/widgets/shared/editor-display.ts | 3 + src/widgets/shared/extra-usage-disabled.ts | 46 + src/widgets/shared/git-no-git.ts | 39 + src/widgets/shared/git-remote.ts | 68 + src/widgets/shared/locale-editor.tsx | 184 ++ src/widgets/shared/max-width.tsx | 76 + src/widgets/shared/metadata.ts | 26 + src/widgets/shared/progress-bar.ts | 27 + src/widgets/shared/raw-or-labeled.ts | 5 + src/widgets/shared/speed-widget.tsx | 199 ++ src/widgets/shared/symbol-override.tsx | 170 + src/widgets/shared/timezone-editor.tsx | 182 ++ src/widgets/shared/usage-display.ts | 326 ++ tsconfig.json | 31 + typedoc.json | 58 + vitest.config.ts | 4 + 361 files changed, 59994 insertions(+) create mode 100644 .github/FUNDING.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 .vscode/settings.json create mode 100644 AGENTS.md create mode 100644 AUTHORS create mode 120000 CLAUDE.md create mode 100644 LICENSE create mode 100644 NOTICE create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 bun.lock create mode 100644 docs/DEVELOPMENT.md create mode 100644 docs/USAGE.md create mode 100644 docs/WINDOWS.md create mode 100644 eslint.config.js create mode 100644 package.json create mode 100644 patches/ink@6.2.0.patch create mode 100644 remotion/index.ts create mode 100644 remotion/root.tsx create mode 100644 remotion/tuiDemo.tsx create mode 100644 screenshots/autoAlign.png create mode 100644 screenshots/blockTimer.png create mode 100644 screenshots/blockTimerSmall.png create mode 100644 screenshots/ccusage.png create mode 100644 screenshots/cwdAndSessionCost.png create mode 100644 screenshots/demo.gif create mode 100644 screenshots/emojiSupport.png create mode 100644 screenshots/global.png create mode 100644 screenshots/powerline-flex.png create mode 100644 scripts/.gitignore create mode 100644 scripts/payload.example.json create mode 100755 scripts/replace-version.ts create mode 100644 src/ccstatusline.ts create mode 100644 src/tui/App.tsx create mode 100644 src/tui/__tests__/App.test.ts create mode 100644 src/tui/__tests__/claude-status.test.ts create mode 100644 src/tui/claude-status.ts create mode 100644 src/tui/components/ColorMenu.tsx create mode 100644 src/tui/components/ConfirmDialog.tsx create mode 100644 src/tui/components/GlobalOverridesMenu.tsx create mode 100644 src/tui/components/InstallMenu.tsx create mode 100644 src/tui/components/ItemsEditor.tsx create mode 100644 src/tui/components/LineSelector.tsx create mode 100644 src/tui/components/List.tsx create mode 100644 src/tui/components/MainMenu.tsx create mode 100644 src/tui/components/ManageInstallationMenu.tsx create mode 100644 src/tui/components/PowerlineSeparatorEditor.tsx create mode 100644 src/tui/components/PowerlineSetup.tsx create mode 100644 src/tui/components/PowerlineThemeSelector.tsx create mode 100644 src/tui/components/RefreshIntervalMenu.tsx create mode 100644 src/tui/components/StatusLinePreview.tsx create mode 100644 src/tui/components/TerminalOptionsMenu.tsx create mode 100644 src/tui/components/TerminalWidthMenu.tsx create mode 100644 src/tui/components/UpdateCheckerMenu.tsx create mode 100644 src/tui/components/__tests__/ColorMenu.test.tsx create mode 100644 src/tui/components/__tests__/GlobalOverridesMenu.test.ts create mode 100644 src/tui/components/__tests__/InstallMenu.test.tsx create mode 100644 src/tui/components/__tests__/ManageInstallationMenu.test.ts create mode 100644 src/tui/components/__tests__/PowerlineSetup.test.ts create mode 100644 src/tui/components/__tests__/PowerlineThemeSelector.test.ts create mode 100644 src/tui/components/__tests__/RefreshIntervalMenu.test.ts create mode 100644 src/tui/components/__tests__/StatusLinePreview.test.ts create mode 100644 src/tui/components/__tests__/TerminalOptionsMenu.test.ts create mode 100644 src/tui/components/__tests__/TerminalWidthMenu.test.ts create mode 100644 src/tui/components/color-menu/__tests__/mutations.test.ts create mode 100644 src/tui/components/color-menu/mutations.ts create mode 100644 src/tui/components/index.ts create mode 100644 src/tui/components/items-editor/__tests__/input-handlers.test.ts create mode 100644 src/tui/components/items-editor/input-handlers.ts create mode 100644 src/tui/index.tsx create mode 100644 src/types/BlockMetrics.ts create mode 100644 src/types/ClaudeSettings.ts create mode 100644 src/types/ColorEntry.ts create mode 100644 src/types/ColorLevel.ts create mode 100644 src/types/FlexMode.ts create mode 100644 src/types/PowerlineConfig.ts create mode 100644 src/types/PowerlineFontStatus.ts create mode 100644 src/types/RenderContext.ts create mode 100644 src/types/Settings.ts create mode 100644 src/types/SkillsMetrics.ts create mode 100644 src/types/SpeedMetrics.ts create mode 100644 src/types/StatusJSON.ts create mode 100644 src/types/TokenMetrics.ts create mode 100644 src/types/Widget.ts create mode 100644 src/types/__tests__/StatusJSON.test.ts create mode 100644 src/types/index.ts create mode 100644 src/utils/__tests__/block-cache.test.ts create mode 100644 src/utils/__tests__/claude-settings.test.ts create mode 100644 src/utils/__tests__/clone-settings.test.ts create mode 100644 src/utils/__tests__/color-sanitize.test.ts create mode 100644 src/utils/__tests__/colors-gradient.test.ts create mode 100644 src/utils/__tests__/compaction.test.ts create mode 100644 src/utils/__tests__/config-dir.test.ts create mode 100644 src/utils/__tests__/config.test.ts create mode 100644 src/utils/__tests__/context-percentage.test.ts create mode 100644 src/utils/__tests__/context-window.test.ts create mode 100644 src/utils/__tests__/git-remote.test.ts create mode 100644 src/utils/__tests__/git-review-cache.test.ts create mode 100644 src/utils/__tests__/git-test-helpers.ts create mode 100644 src/utils/__tests__/git.test.ts create mode 100644 src/utils/__tests__/global-command-resolution.test.ts create mode 100644 src/utils/__tests__/global-package-manager.test.ts create mode 100644 src/utils/__tests__/gradient.test.ts create mode 100644 src/utils/__tests__/hook-handler.test.ts create mode 100644 src/utils/__tests__/hooks.test.ts create mode 100644 src/utils/__tests__/hyperlink.test.ts create mode 100644 src/utils/__tests__/input-guards.test.ts create mode 100644 src/utils/__tests__/jj.test.ts create mode 100644 src/utils/__tests__/jsonl-blocks.test.ts create mode 100644 src/utils/__tests__/jsonl-metrics.test.ts create mode 100644 src/utils/__tests__/jsonl.test.ts create mode 100644 src/utils/__tests__/locales.test.ts create mode 100644 src/utils/__tests__/migrations.test.ts create mode 100644 src/utils/__tests__/model-context.test.ts create mode 100644 src/utils/__tests__/open-url.test.ts create mode 100644 src/utils/__tests__/powerline-settings.test.ts create mode 100644 src/utils/__tests__/powerline-theme-index.test.ts create mode 100644 src/utils/__tests__/renderer-ansi.test.ts create mode 100644 src/utils/__tests__/renderer-config-warning.test.ts create mode 100644 src/utils/__tests__/renderer-dim.test.ts create mode 100644 src/utils/__tests__/renderer-exclude-auto-align.test.ts create mode 100644 src/utils/__tests__/renderer-flex-width.test.ts create mode 100644 src/utils/__tests__/renderer-format-tokens.test.ts create mode 100644 src/utils/__tests__/renderer-powerline-theme.test.ts create mode 100644 src/utils/__tests__/renderer-separator-collapse.test.ts create mode 100644 src/utils/__tests__/separator-index.test.ts create mode 100644 src/utils/__tests__/skills.test.ts create mode 100644 src/utils/__tests__/speed-metrics.test.ts create mode 100644 src/utils/__tests__/speed-window.test.ts create mode 100644 src/utils/__tests__/terminal.test.ts create mode 100644 src/utils/__tests__/timezones.test.ts create mode 100644 src/utils/__tests__/update-checker.test.ts create mode 100644 src/utils/__tests__/usage-fetch.test.ts create mode 100644 src/utils/__tests__/usage-prefetch.test.ts create mode 100644 src/utils/__tests__/usage-token-buffer.test.ts create mode 100644 src/utils/__tests__/usage-token.test.ts create mode 100644 src/utils/__tests__/usage-windows.test.ts create mode 100644 src/utils/__tests__/usage.test.ts create mode 100644 src/utils/__tests__/widgets.test.ts create mode 100644 src/utils/ansi.ts create mode 100644 src/utils/claude-settings.ts create mode 100644 src/utils/clone-settings.ts create mode 100644 src/utils/color-sanitize.ts create mode 100644 src/utils/colors.ts create mode 100644 src/utils/compaction.ts create mode 100644 src/utils/config.ts create mode 100644 src/utils/context-percentage.ts create mode 100644 src/utils/context-window.ts create mode 100644 src/utils/format-tokens.ts create mode 100644 src/utils/fuzzy.ts create mode 100644 src/utils/git-remote.ts create mode 100644 src/utils/git-review-cache.ts create mode 100644 src/utils/git.ts create mode 100644 src/utils/global-command-resolution.ts create mode 100644 src/utils/global-package-manager.ts create mode 100644 src/utils/gradient.ts create mode 100644 src/utils/guid.ts create mode 100644 src/utils/hook-handler.ts create mode 100644 src/utils/hooks.ts create mode 100644 src/utils/hyperlink.ts create mode 100644 src/utils/input-guards.ts create mode 100644 src/utils/jj.ts create mode 100644 src/utils/jsonl-blocks.ts create mode 100644 src/utils/jsonl-cache.ts create mode 100644 src/utils/jsonl-lines.ts create mode 100644 src/utils/jsonl-metadata.ts create mode 100644 src/utils/jsonl-metrics.ts create mode 100644 src/utils/jsonl.ts create mode 100644 src/utils/locales.ts create mode 100644 src/utils/migrations.ts create mode 100644 src/utils/model-context.ts create mode 100644 src/utils/open-url.ts create mode 100644 src/utils/package-manager-executable.ts create mode 100644 src/utils/powerline-settings.ts create mode 100644 src/utils/powerline-theme-index.ts create mode 100644 src/utils/powerline.ts create mode 100644 src/utils/renderer.ts create mode 100644 src/utils/separator-index.ts create mode 100644 src/utils/skills.ts create mode 100644 src/utils/speed-metrics.ts create mode 100644 src/utils/speed-window.ts create mode 100644 src/utils/terminal.ts create mode 100644 src/utils/timezones.ts create mode 100644 src/utils/update-checker.ts create mode 100644 src/utils/usage-fetch.ts create mode 100644 src/utils/usage-prefetch.ts create mode 100644 src/utils/usage-types.ts create mode 100644 src/utils/usage-windows.ts create mode 100644 src/utils/usage.ts create mode 100644 src/utils/widget-manifest.ts create mode 100644 src/utils/widgets.ts create mode 100644 src/widgets/BlockResetTimer.ts create mode 100644 src/widgets/BlockTimer.ts create mode 100644 src/widgets/CacheHitRate.ts create mode 100644 src/widgets/CacheRead.ts create mode 100644 src/widgets/CacheWrite.ts create mode 100644 src/widgets/ClaudeAccountEmail.ts create mode 100644 src/widgets/ClaudeSessionId.ts create mode 100644 src/widgets/CompactionCounter.ts create mode 100644 src/widgets/ContextBar.ts create mode 100644 src/widgets/ContextLength.ts create mode 100644 src/widgets/ContextPercentage.ts create mode 100644 src/widgets/ContextPercentageUsable.ts create mode 100644 src/widgets/ContextWindow.ts create mode 100644 src/widgets/CurrentWorkingDir.tsx create mode 100644 src/widgets/CustomCommand.tsx create mode 100644 src/widgets/CustomSymbol.tsx create mode 100644 src/widgets/CustomText.tsx create mode 100644 src/widgets/ExtraUsageRemaining.ts create mode 100644 src/widgets/ExtraUsageUsed.ts create mode 100644 src/widgets/ExtraUsageUtilization.ts create mode 100644 src/widgets/FreeMemory.ts create mode 100644 src/widgets/GitAheadBehind.ts create mode 100644 src/widgets/GitBranch.ts create mode 100644 src/widgets/GitChanges.ts create mode 100644 src/widgets/GitCleanStatus.ts create mode 100644 src/widgets/GitConflicts.ts create mode 100644 src/widgets/GitDeletions.ts create mode 100644 src/widgets/GitInsertions.ts create mode 100644 src/widgets/GitIsFork.ts create mode 100644 src/widgets/GitOriginOwner.ts create mode 100644 src/widgets/GitOriginOwnerRepo.ts create mode 100644 src/widgets/GitOriginRepo.ts create mode 100644 src/widgets/GitPr.ts create mode 100644 src/widgets/GitRootDir.ts create mode 100644 src/widgets/GitSha.ts create mode 100644 src/widgets/GitStaged.ts create mode 100644 src/widgets/GitStagedFiles.ts create mode 100644 src/widgets/GitStatus.ts create mode 100644 src/widgets/GitUnstaged.ts create mode 100644 src/widgets/GitUnstagedFiles.ts create mode 100644 src/widgets/GitUntracked.ts create mode 100644 src/widgets/GitUntrackedFiles.ts create mode 100644 src/widgets/GitUpstreamOwner.ts create mode 100644 src/widgets/GitUpstreamOwnerRepo.ts create mode 100644 src/widgets/GitUpstreamRepo.ts create mode 100644 src/widgets/GitWorktree.ts create mode 100644 src/widgets/GitWorktreeBranch.ts create mode 100644 src/widgets/GitWorktreeMode.ts create mode 100644 src/widgets/GitWorktreeName.ts create mode 100644 src/widgets/GitWorktreeOriginalBranch.ts create mode 100644 src/widgets/InputSpeed.ts create mode 100644 src/widgets/JjBookmarks.ts create mode 100644 src/widgets/JjChanges.ts create mode 100644 src/widgets/JjDeletions.ts create mode 100644 src/widgets/JjDescription.ts create mode 100644 src/widgets/JjInsertions.ts create mode 100644 src/widgets/JjRevision.ts create mode 100644 src/widgets/JjRootDir.ts create mode 100644 src/widgets/JjWorkspace.ts create mode 100644 src/widgets/Link.tsx create mode 100644 src/widgets/Model.ts create mode 100644 src/widgets/OutputSpeed.ts create mode 100644 src/widgets/OutputStyle.ts create mode 100644 src/widgets/RemoteControlStatus.ts create mode 100644 src/widgets/SessionClock.ts create mode 100644 src/widgets/SessionCost.ts create mode 100644 src/widgets/SessionName.ts create mode 100644 src/widgets/SessionUsage.ts create mode 100644 src/widgets/Skills.tsx create mode 100644 src/widgets/TerminalWidth.ts create mode 100644 src/widgets/ThinkingEffort.ts create mode 100644 src/widgets/TokensCached.ts create mode 100644 src/widgets/TokensInput.ts create mode 100644 src/widgets/TokensOutput.ts create mode 100644 src/widgets/TokensTotal.ts create mode 100644 src/widgets/TotalSpeed.ts create mode 100644 src/widgets/Version.ts create mode 100644 src/widgets/VimMode.ts create mode 100644 src/widgets/VoiceStatus.ts create mode 100644 src/widgets/WeeklyOpusUsage.ts create mode 100644 src/widgets/WeeklyResetTimer.ts create mode 100644 src/widgets/WeeklySonnetUsage.ts create mode 100644 src/widgets/WeeklyUsage.ts create mode 100644 src/widgets/__tests__/BlockResetTimer.test.ts create mode 100644 src/widgets/__tests__/BlockTimer.test.ts create mode 100644 src/widgets/__tests__/CacheWidgets.test.ts create mode 100644 src/widgets/__tests__/ClaudeAccountEmail.test.ts create mode 100644 src/widgets/__tests__/CompactionCounter.test.ts create mode 100644 src/widgets/__tests__/ContextBar.test.ts create mode 100644 src/widgets/__tests__/ContextPercentage.test.ts create mode 100644 src/widgets/__tests__/ContextPercentageUsable.test.ts create mode 100644 src/widgets/__tests__/CurrentWorkingDir.test.ts create mode 100644 src/widgets/__tests__/CustomCommand.test.ts create mode 100644 src/widgets/__tests__/ExtraUsageRemaining.test.ts create mode 100644 src/widgets/__tests__/ExtraUsageUsed.test.ts create mode 100644 src/widgets/__tests__/ExtraUsageUtilization.test.ts create mode 100644 src/widgets/__tests__/FreeMemory.test.ts create mode 100644 src/widgets/__tests__/GitBranch.test.ts create mode 100644 src/widgets/__tests__/GitChanges.test.ts create mode 100644 src/widgets/__tests__/GitCleanStatus.test.ts create mode 100644 src/widgets/__tests__/GitConflicts.test.ts create mode 100644 src/widgets/__tests__/GitDeletions.test.ts create mode 100644 src/widgets/__tests__/GitInsertions.test.ts create mode 100644 src/widgets/__tests__/GitPr.test.ts create mode 100644 src/widgets/__tests__/GitRootDir.test.ts create mode 100644 src/widgets/__tests__/GitStagedFiles.test.ts create mode 100644 src/widgets/__tests__/GitStatus.test.ts create mode 100644 src/widgets/__tests__/GitUnstagedFiles.test.ts create mode 100644 src/widgets/__tests__/GitUntrackedFiles.test.ts create mode 100644 src/widgets/__tests__/GitWidgetSharedBehavior.test.ts create mode 100644 src/widgets/__tests__/GitWorktree.test.ts create mode 100644 src/widgets/__tests__/JjBookmarks.test.ts create mode 100644 src/widgets/__tests__/JjChanges.test.ts create mode 100644 src/widgets/__tests__/JjDeletions.test.ts create mode 100644 src/widgets/__tests__/JjDescription.test.ts create mode 100644 src/widgets/__tests__/JjInsertions.test.ts create mode 100644 src/widgets/__tests__/JjRevision.test.ts create mode 100644 src/widgets/__tests__/JjRootDir.test.ts create mode 100644 src/widgets/__tests__/JjWidgetSharedBehavior.test.ts create mode 100644 src/widgets/__tests__/JjWorkspace.test.ts create mode 100644 src/widgets/__tests__/Link.test.ts create mode 100644 src/widgets/__tests__/Model.test.ts create mode 100644 src/widgets/__tests__/RemoteControlStatus.test.ts create mode 100644 src/widgets/__tests__/SessionClock.test.ts create mode 100644 src/widgets/__tests__/SessionName.test.ts create mode 100644 src/widgets/__tests__/SessionUsage.test.ts create mode 100644 src/widgets/__tests__/Skills.test.ts create mode 100644 src/widgets/__tests__/SpeedWidgets.test.ts create mode 100644 src/widgets/__tests__/SymbolOverride.test.ts create mode 100644 src/widgets/__tests__/ThinkingEffort.test.ts create mode 100644 src/widgets/__tests__/TokensWidgets.test.ts create mode 100644 src/widgets/__tests__/VimMode.test.ts create mode 100644 src/widgets/__tests__/VoiceStatus.test.ts create mode 100644 src/widgets/__tests__/WeeklyOpusUsage.test.ts create mode 100644 src/widgets/__tests__/WeeklyResetTimer.test.ts create mode 100644 src/widgets/__tests__/WeeklySonnetUsage.test.ts create mode 100644 src/widgets/__tests__/WeeklyUsage.test.ts create mode 100644 src/widgets/__tests__/helpers/usage-widget-suites.ts create mode 100644 src/widgets/__tests__/shared/currency.test.ts create mode 100644 src/widgets/__tests__/shared/progress-bar.test.ts create mode 100644 src/widgets/index.ts create mode 100644 src/widgets/shared/__tests__/locale-editor.test.tsx create mode 100644 src/widgets/shared/__tests__/symbol-override-editor.test.tsx create mode 100644 src/widgets/shared/__tests__/timezone-editor.test.tsx create mode 100644 src/widgets/shared/__tests__/usage-display.test.ts create mode 100644 src/widgets/shared/cache-metrics.ts create mode 100644 src/widgets/shared/cache-scope.ts create mode 100644 src/widgets/shared/context-inverse.ts create mode 100644 src/widgets/shared/context-slider.ts create mode 100644 src/widgets/shared/currency.ts create mode 100644 src/widgets/shared/editor-display.ts create mode 100644 src/widgets/shared/extra-usage-disabled.ts create mode 100644 src/widgets/shared/git-no-git.ts create mode 100644 src/widgets/shared/git-remote.ts create mode 100644 src/widgets/shared/locale-editor.tsx create mode 100644 src/widgets/shared/max-width.tsx create mode 100644 src/widgets/shared/metadata.ts create mode 100644 src/widgets/shared/progress-bar.ts create mode 100644 src/widgets/shared/raw-or-labeled.ts create mode 100644 src/widgets/shared/speed-widget.tsx create mode 100644 src/widgets/shared/symbol-override.tsx create mode 100644 src/widgets/shared/timezone-editor.tsx create mode 100644 src/widgets/shared/usage-display.ts create mode 100644 tsconfig.json create mode 100644 typedoc.json create mode 100644 vitest.config.ts diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..0bbeeeb --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +buy_me_a_coffee: sirmalloc diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..6360c1f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,32 @@ +version: 2 +updates: + - package-ecosystem: bun + directory: / + schedule: + interval: weekly + day: monday + ignore: + - dependency-name: "ink" + open-pull-requests-limit: 10 + cooldown: + semver-major-days: 30 + semver-minor-days: 7 + semver-patch-days: 3 + groups: + dev-dependencies: + dependency-type: development + update-types: + - minor + - patch + production-dependencies: + dependency-type: production + update-types: + - minor + - patch + + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + day: monday + open-pull-requests-limit: 5 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d94b2d2 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,36 @@ +name: CI + +on: + push: + pull_request: + branches: [main] + +jobs: + lint: + name: Lint & Type Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: oven-sh/setup-bun@v2 + - run: bun install + - run: bun run lint + + test: + name: Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: oven-sh/setup-bun@v2 + - run: bun install + - run: bun test + + build: + name: Build + runs-on: ubuntu-latest + needs: [lint, test] + steps: + - uses: actions/checkout@v7 + - uses: oven-sh/setup-bun@v2 + - run: bun install + - run: bun run build + - run: test -f dist/ccstatusline.js diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..cf01504 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,36 @@ +name: Publish + +on: + push: + tags: + - "v*" + +permissions: + contents: write + id-token: write + +jobs: + publish: + if: github.repository == 'sirmalloc/ccstatusline' + name: Publish to npm + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: oven-sh/setup-bun@v2 + - uses: actions/setup-node@v6 + with: + node-version: 24 + registry-url: "https://registry.npmjs.org" + package-manager-cache: false + - run: bun install + - run: bun run lint + - run: bun test + - run: npm publish + - name: Create GitHub release + run: > + gh release create "$GITHUB_REF_NAME" + --title "$GITHUB_REF_NAME" + --generate-notes + --notes "Published to npm: https://www.npmjs.com/package/ccstatusline" + env: + GH_TOKEN: ${{ github.token }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ece75eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# dependencies (bun install) +node_modules + +# output +out +dist +typedoc +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..2f8df85 --- /dev/null +++ b/.npmignore @@ -0,0 +1,36 @@ +# Source files +src/ +scripts/ +*.ts +*.tsx + +# Development files +bun.lock +CLAUDE.md +.claude/ +test-settings.json + +# Build files +tsconfig.json + +# Test and example files +*.test.* +*.spec.* + +# Git files +.git/ +.gitignore + +# Editor files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS files +.DS_Store +Thumbs.db + +# Node modules (in case someone uses npm instead of bun) +node_modules/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6ffce5e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,28 @@ +{ + // Disable trimming trailing whitespace for markdown files to preserve ASCII art + "[markdown]": { + "files.trimTrailingWhitespace": false + }, + + // Keep trimming enabled for other file types + "[typescript]": { + "files.trimTrailingWhitespace": true + }, + "[typescriptreact]": { + "files.trimTrailingWhitespace": true + }, + "[json]": { + "files.trimTrailingWhitespace": true + }, + "[javascript]": { + "files.trimTrailingWhitespace": true + }, + "cSpell.words": [ + "ccstatusline", + "Powerline", + "statusline", + "sublabel", + "Worktree", + "worktrees" + ] +} \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..663d9c0 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,151 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +ccstatusline is a customizable status line formatter for Claude Code CLI that displays model info, git branch, token usage, and other metrics. It functions as both: +1. A piped command processor for Claude Code status lines +2. An interactive TUI configuration tool when run without input + +## Development Commands + +```bash +# Install dependencies +bun install + +# Run in interactive TUI mode +bun run start + +# Test with piped input (use [1m] suffix for 1M context models) +echo '{"model":{"id":"claude-sonnet-4-5-20250929[1m]"},"transcript_path":"test.jsonl"}' | bun run src/ccstatusline.ts + +# Or use example payload +bun run example + +# Build for npm distribution +bun run build # Creates dist/ccstatusline.js with Node.js 14+ compatibility + +# Run tests +bun test + +# Run tests in watch mode +bun test --watch + +# Lint and type check +bun run lint # Runs TypeScript type checking and ESLint without modifying files + +# Apply ESLint auto-fixes intentionally +bun run lint:fix +``` + +## Architecture + +The project has dual runtime compatibility - works with both Bun and Node.js: + +### Core Structure +- **src/ccstatusline.ts**: Main entry point that detects piped vs interactive mode + - Piped mode: Parses JSON from stdin and renders formatted status line + - Interactive mode: Launches React/Ink TUI for configuration + +### TUI Components (src/tui/) +- **index.tsx**: Main TUI entry point that handles React/Ink initialization +- **App.tsx**: Root component managing navigation and state +- **components/**: Modular UI components for different configuration screens + - MainMenu, LineSelector, ItemsEditor, ColorMenu, GlobalOverridesMenu + - PowerlineSetup, TerminalOptionsMenu, StatusLinePreview + +### Utilities (src/utils/) +- **config.ts**: Settings management + - Loads from `~/.config/ccstatusline/settings.json` + - Handles migration from old settings format + - Default configuration if no settings exist +- **renderer.ts**: Core rendering logic for status lines + - Handles terminal width detection and truncation + - Applies colors, padding, and separators + - Manages flex separator expansion +- **powerline.ts**: Powerline font detection and installation +- **claude-settings.ts**: Integration with Claude Code settings.json + - Respects `CLAUDE_CONFIG_DIR` environment variable with fallback to `~/.claude` + - Provides installation command constants (NPM, BUNX, self-managed) + - Detects installation status and manages settings.json updates + - Validates config directory paths with proper error handling +- **colors.ts**: Color definitions and ANSI code mapping +- **model-context.ts**: Model-to-context-window mapping + - Maps model IDs to their context window sizes based on [1m] suffix + - Sonnet 4.5 WITH [1m] suffix: 1M tokens (800k usable at 80%) - requires long context beta access + - Sonnet 4.5 WITHOUT [1m] suffix: 200k tokens (160k usable at 80%) + - Legacy models: 200k tokens (160k usable at 80%) + +### Widgets (src/widgets/) +Custom widgets implementing the Widget interface defined in src/types/Widget.ts: + +**Widget Interface:** +All widgets must implement: +- `getDefaultColor()`: Default color for the widget +- `getDescription()`: Description shown in TUI +- `getDisplayName()`: Display name shown in TUI +- `getEditorDisplay()`: How the widget appears in the editor +- `render()`: Core rendering logic that produces the widget output +- `supportsRawValue()`: Whether widget supports raw value mode +- `supportsColors()`: Whether widget supports color customization +- Optional: `renderEditor()`, `getCustomKeybinds()`, `handleEditorAction()` + +**Widget Registry Pattern:** +- Located in src/utils/widgets.ts +- Uses a Map-based registry (`widgetRegistry`) that maps widget type strings to widget instances +- `getWidget(type)`: Retrieves widget instance by type +- `getAllWidgetTypes()`: Returns all available widget types +- `isKnownWidgetType()`: Validates if a type is registered + +**Available Widgets:** +- Model, Version, OutputStyle, VoiceStatus - Claude Code metadata display +- GitBranch, GitChanges, GitInsertions, GitDeletions, GitWorktree - Git repository status +- TokensInput, TokensOutput, TokensCached, TokensTotal - Token usage metrics +- ContextLength, ContextPercentage, ContextPercentageUsable - Context window metrics (uses dynamic model-based context windows: 1M for Sonnet 4.5 with [1m] suffix, 200k for all other models) +- BlockTimer, SessionClock, SessionCost - Time and cost tracking +- CurrentWorkingDir, TerminalWidth - Environment info +- CustomText, CustomCommand - User-defined widgets + +## Key Implementation Details + +- **Cross-platform stdin reading**: Detects Bun vs Node.js environment and uses appropriate stdin API +- **Token metrics**: Parses Claude Code transcript files (JSONL format) to calculate token usage +- **Git integration**: Uses child_process.execSync to get current branch and changes +- **Terminal width management**: Three modes for handling width (full, full-minus-40, full-until-compact) +- **Flex separators**: Special separator type that expands to fill available space +- **Powerline mode**: Optional Powerline-style rendering with arrow separators +- **Custom commands**: Execute shell commands and display output in status line +- **Mergeable items**: Items can be merged together with or without padding + +## Bun Usage Preferences + +Default to using Bun instead of Node.js: +- Use `bun ` instead of `node ` or `ts-node ` +- Use `bun install` instead of `npm install` +- Use `bun run