lumira 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,12 +26,14 @@ Real-time statusline plugin for [Claude Code](https://code.claude.com) and Qwen
26
26
 
27
27
  ## Install
28
28
 
29
- Quick setup (auto-configures Claude Code):
29
+ Quick setup with interactive wizard (arrow-key navigation + live preview):
30
30
 
31
31
  ```bash
32
32
  npx lumira install
33
33
  ```
34
34
 
35
+ The installer walks you through three choices — **preset** (`full` / `balanced` / `minimal`), **theme**, and **icons** — showing a live preview of how your statusline will render at each step. Press `Esc` at any time to abort without writing anything. In non-interactive shells (piped stdin, CI), the installer skips the wizard and writes sensible defaults (`preset: balanced`, `icons: nerd`). If Qwen Code is detected (`~/.qwen/` exists), the `/lumira` skill is installed for both CLIs.
36
+
35
37
  Or install globally:
36
38
 
37
39
  ```bash
@@ -45,6 +47,8 @@ To uninstall:
45
47
  npx lumira uninstall
46
48
  ```
47
49
 
50
+ Your preferences are saved to `~/.config/lumira/config.json` — hand-edited keys (e.g. custom `display` toggles) are preserved on re-install.
51
+
48
52
  ### Manual setup
49
53
 
50
54
  Add to `~/.claude/settings.json`:
@@ -130,24 +134,15 @@ All fields are optional — defaults are shown above.
130
134
  ### CLI Flags
131
135
 
132
136
  ```bash
133
- lumira --minimal # Force minimal mode
137
+ lumira --minimal # Force single-line mode
138
+ lumira --balanced # Force balanced preset
139
+ lumira --full # Force full multi-line preset
134
140
  lumira --gsd # Enable GSD integration
135
- lumira --qwen # Force Qwen Code single-line output
136
141
  ```
137
142
 
138
143
  ### Qwen Code
139
144
 
140
- Lumira auto-detects the platform. For Qwen Code, use the `--qwen` preset for a single-line output with model, context bar, requests, cached tokens, and thoughts:
141
-
142
- ```json
143
- {
144
- "statusLine": {
145
- "type": "command",
146
- "command": "npx lumira@latest --qwen",
147
- "padding": 0
148
- }
149
- }
150
- ```
145
+ Lumira auto-detects the platform. In Qwen Code sessions, the renderer automatically switches to single-line output regardless of your configured layout — Qwen only displays the first statusline row, so lumira fits everything (model, branch, context bar, cost, cached tokens, thoughts) into one line. **No configuration needed:** the same `config.json` serves both Claude Code and Qwen Code.
151
146
 
152
147
  ## Architecture
153
148
 
package/dist/config.d.ts CHANGED
@@ -1,3 +1,10 @@
1
1
  import { type HudConfig } from './types.js';
2
+ export declare function _resetMigrationFlags(): void;
2
3
  export declare function loadConfig(configDir?: string): HudConfig;
3
4
  export declare function mergeCliFlags(config: HudConfig, argv: string[]): HudConfig;
5
+ export interface WizardResult {
6
+ preset: 'full' | 'balanced' | 'minimal';
7
+ theme?: string;
8
+ icons: 'nerd' | 'emoji' | 'none';
9
+ }
10
+ export declare function saveConfig(wizard: WizardResult, configPath: string): void;
package/dist/config.js CHANGED
@@ -1,7 +1,9 @@
1
- import { readFileSync, existsSync } from 'node:fs';
2
- import { join } from 'node:path';
1
+ import { readFileSync, existsSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
3
  import { homedir } from 'node:os';
4
4
  import { DEFAULT_CONFIG, DEFAULT_DISPLAY } from './types.js';
5
+ let qwenWarningShown = false;
6
+ export function _resetMigrationFlags() { qwenWarningShown = false; }
5
7
  export function loadConfig(configDir = join(homedir(), '.config', 'lumira')) {
6
8
  const p = join(configDir, 'config.json');
7
9
  if (!existsSync(p))
@@ -14,7 +16,15 @@ export function loadConfig(configDir = join(homedir(), '.config', 'lumira')) {
14
16
  return { ...DEFAULT_CONFIG, display: { ...DEFAULT_DISPLAY } };
15
17
  }
16
18
  }
17
- function mergeConfig(raw) {
19
+ function mergeConfig(rawIn) {
20
+ let raw = rawIn;
21
+ if (raw.preset === 'qwen') {
22
+ if (!qwenWarningShown) {
23
+ process.stderr.write("[lumira] 'qwen' preset is removed — using 'minimal' instead\n");
24
+ qwenWarningShown = true;
25
+ }
26
+ raw = { ...raw, preset: 'minimal' };
27
+ }
18
28
  const layout = ['multiline', 'singleline', 'auto'].includes(raw.layout) ? raw.layout : DEFAULT_CONFIG.layout;
19
29
  const colors = { ...DEFAULT_CONFIG.colors };
20
30
  if (raw.colors && typeof raw.colors === 'object') {
@@ -24,7 +34,7 @@ function mergeConfig(raw) {
24
34
  }
25
35
  const result = { layout, gsd: typeof raw.gsd === 'boolean' ? raw.gsd : DEFAULT_CONFIG.gsd, display: { ...DEFAULT_DISPLAY }, colors };
26
36
  // Apply preset FIRST (sets layout + display defaults)
27
- const validPresets = ['full', 'balanced', 'minimal', 'qwen'];
37
+ const validPresets = ['full', 'balanced', 'minimal'];
28
38
  if (validPresets.includes(raw.preset))
29
39
  applyPreset(result, raw.preset);
30
40
  // Then overlay user's explicit display toggles (user wins over preset)
@@ -61,30 +71,6 @@ const PRESET_DEFS = {
61
71
  cacheMetrics: false,
62
72
  },
63
73
  },
64
- qwen: {
65
- layout: 'singleline',
66
- display: {
67
- tokens: false,
68
- burnRate: false,
69
- duration: false,
70
- tokenSpeed: false,
71
- rateLimits: false,
72
- tools: false,
73
- todos: false,
74
- vim: false,
75
- effort: false,
76
- worktree: false,
77
- agent: false,
78
- sessionName: false,
79
- style: false,
80
- version: false,
81
- linesChanged: false,
82
- memory: false,
83
- contextTokens: false,
84
- cacheMetrics: false,
85
- mcp: false,
86
- },
87
- },
88
74
  minimal: {
89
75
  layout: 'singleline',
90
76
  display: {
@@ -127,12 +113,10 @@ export function mergeCliFlags(config, argv) {
127
113
  applyPreset(r, 'minimal');
128
114
  if (argv.includes('--balanced'))
129
115
  applyPreset(r, 'balanced');
130
- if (argv.includes('--qwen'))
131
- applyPreset(r, 'qwen');
132
116
  if (argv.includes('--full'))
133
117
  applyPreset(r, 'full');
134
118
  for (const arg of argv) {
135
- const presetMatch = arg.match(/^--preset[= ]?(full|balanced|minimal|qwen)$/);
119
+ const presetMatch = arg.match(/^--preset[= ]?(full|balanced|minimal)$/);
136
120
  if (presetMatch) {
137
121
  applyPreset(r, presetMatch[1]);
138
122
  continue;
@@ -145,4 +129,27 @@ export function mergeCliFlags(config, argv) {
145
129
  }
146
130
  return r;
147
131
  }
132
+ export function saveConfig(wizard, configPath) {
133
+ mkdirSync(dirname(configPath), { recursive: true });
134
+ let existing = {};
135
+ if (existsSync(configPath)) {
136
+ try {
137
+ const parsed = JSON.parse(readFileSync(configPath, 'utf8'));
138
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
139
+ existing = parsed;
140
+ }
141
+ }
142
+ catch {
143
+ existing = {};
144
+ }
145
+ }
146
+ const merged = { ...existing, preset: wizard.preset, icons: wizard.icons };
147
+ if (wizard.theme !== undefined)
148
+ merged.theme = wizard.theme;
149
+ else
150
+ delete merged.theme;
151
+ const tmp = configPath + '.tmp';
152
+ writeFileSync(tmp, JSON.stringify(merged, null, 2) + '\n', { mode: 0o600 });
153
+ renameSync(tmp, configPath);
154
+ }
148
155
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { realpathSync } from 'node:fs';
4
+ import { homedir } from 'node:os';
5
+ import { join } from 'node:path';
4
6
  import { readStdin as defaultReadStdin } from './stdin.js';
5
7
  import { parseGitStatus } from './parsers/git.js';
6
8
  import { parseTranscript } from './parsers/transcript.js';
@@ -63,7 +65,8 @@ function isDirectRun() {
63
65
  if (isDirectRun()) {
64
66
  const cmd = process.argv[2];
65
67
  if (cmd === 'install') {
66
- install().then(o => process.stdout.write(o)).catch(e => process.stderr.write(`Install error: ${e.message}\n`));
68
+ const configPath = join(homedir(), '.config', 'lumira', 'config.json');
69
+ install({ configPath }).then(o => process.stdout.write(o)).catch(e => process.stderr.write(`Install error: ${e.message}\n`));
67
70
  }
68
71
  else if (cmd === 'uninstall') {
69
72
  const o = uninstall();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ import type { WizardResult } from './config.js';
3
+ export interface WizardCurrent {
4
+ preset?: 'full' | 'balanced' | 'minimal';
5
+ theme?: string;
6
+ icons?: 'nerd' | 'emoji' | 'none';
7
+ }
8
+ export interface RunWizardOpts {
9
+ current: WizardCurrent;
10
+ /** Optional string rendered above each step's title (e.g. an ASCII banner). */
11
+ prelude?: string;
12
+ stdin?: NodeJS.ReadStream | (Readable & {
13
+ isTTY?: boolean;
14
+ isRaw?: boolean;
15
+ setRawMode?: (flag: boolean) => unknown;
16
+ });
17
+ stdout?: NodeJS.WriteStream | (Writable & {
18
+ columns?: number;
19
+ });
20
+ }
21
+ export declare function runWizard(opts: RunWizardOpts): Promise<WizardResult | null>;
@@ -0,0 +1,74 @@
1
+ import { interactiveSelect } from './tui/select.js';
2
+ import { buildPreview } from './tui/preview.js';
3
+ import { THEMES } from './themes.js';
4
+ const PRESET_OPTIONS = [
5
+ { label: 'full', value: 'full', description: '▸ everything on, 4 lines' },
6
+ { label: 'balanced', value: 'balanced', description: '▸ essentials, auto-compact' },
7
+ { label: 'minimal', value: 'minimal', description: '▸ single line, just the basics' },
8
+ ];
9
+ const ICON_OPTIONS = [
10
+ { label: 'nerd', value: 'nerd', description: '▸ Nerd Font icons (default)' },
11
+ { label: 'emoji', value: 'emoji', description: '▸ Unicode emoji icons' },
12
+ { label: 'none', value: 'none', description: '▸ no icons, ASCII fallbacks' },
13
+ ];
14
+ const NONE_THEME = '__none__';
15
+ function themeOptions() {
16
+ const names = Object.keys(THEMES);
17
+ return [
18
+ { label: '(none)', value: NONE_THEME },
19
+ ...names.map((n) => ({ label: n, value: n })),
20
+ ];
21
+ }
22
+ export async function runWizard(opts) {
23
+ const { current } = opts;
24
+ // Build a partial opts spread so unused keys don't get passed as undefined
25
+ const streams = {};
26
+ if (opts.stdin)
27
+ streams.stdin = opts.stdin;
28
+ if (opts.stdout)
29
+ streams.stdout = opts.stdout;
30
+ // Step 1: preset
31
+ const preset = await interactiveSelect({
32
+ title: 'lumira setup · step 1/3 — preset',
33
+ options: PRESET_OPTIONS,
34
+ initial: current.preset ?? 'balanced',
35
+ preview: (v) => buildPreview({ preset: v, theme: current.theme, icons: current.icons ?? 'nerd' }),
36
+ prelude: opts.prelude,
37
+ ...streams,
38
+ });
39
+ if (preset === null)
40
+ return null;
41
+ // Step 2: theme
42
+ const themeValue = await interactiveSelect({
43
+ title: 'lumira setup · step 2/3 — theme',
44
+ options: themeOptions(),
45
+ initial: current.theme ?? NONE_THEME,
46
+ preview: (v) => buildPreview({
47
+ preset,
48
+ theme: v === NONE_THEME ? undefined : v,
49
+ icons: current.icons ?? 'nerd',
50
+ }),
51
+ prelude: opts.prelude,
52
+ ...streams,
53
+ });
54
+ if (themeValue === null)
55
+ return null;
56
+ const theme = themeValue === NONE_THEME ? undefined : themeValue;
57
+ // Step 3: icons
58
+ const icons = await interactiveSelect({
59
+ title: 'lumira setup · step 3/3 — icons',
60
+ options: ICON_OPTIONS,
61
+ initial: current.icons ?? 'nerd',
62
+ preview: (v) => buildPreview({ preset, theme, icons: v }),
63
+ prelude: opts.prelude,
64
+ ...streams,
65
+ });
66
+ if (icons === null)
67
+ return null;
68
+ // Build result — omit theme key entirely when none was chosen
69
+ const result = { preset, icons };
70
+ if (theme !== undefined)
71
+ result.theme = theme;
72
+ return result;
73
+ }
74
+ //# sourceMappingURL=installer-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer-wizard.js","sourceRoot":"","sources":["../src/installer-wizard.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,16 @@
1
1
  export interface InstallerOptions {
2
2
  settingsPath?: string;
3
+ configPath?: string;
3
4
  confirm?: (prompt: string) => Promise<boolean>;
5
+ stdin?: NodeJS.ReadStream | (import('node:stream').Readable & {
6
+ isTTY?: boolean;
7
+ isRaw?: boolean;
8
+ setRawMode?: (flag: boolean) => unknown;
9
+ });
10
+ stdout?: NodeJS.WriteStream | (import('node:stream').Writable & {
11
+ columns?: number;
12
+ });
13
+ homeOverride?: string;
4
14
  }
5
15
  export declare function promptYN(question: string): Promise<boolean>;
6
16
  export declare function install(opts?: InstallerOptions): Promise<string>;
package/dist/installer.js CHANGED
@@ -1,8 +1,11 @@
1
- import { readFileSync, writeFileSync, existsSync, copyFileSync, unlinkSync, mkdirSync } from 'node:fs';
1
+ import { readFileSync, writeFileSync, existsSync, copyFileSync, unlinkSync, mkdirSync, rmdirSync } from 'node:fs';
2
2
  import { join, dirname, resolve } from 'node:path';
3
3
  import { homedir } from 'node:os';
4
4
  import { fileURLToPath } from 'node:url';
5
5
  import { createInterface } from 'node:readline';
6
+ import { runWizard } from './installer-wizard.js';
7
+ import { saveConfig, loadConfig } from './config.js';
8
+ import { getBanner, getSubtitle } from './tui/banner.js';
6
9
  // ── ANSI helpers ────────────────────────────────────────────────────
7
10
  const RST = '\x1b[0m';
8
11
  const GREEN = '\x1b[32m';
@@ -21,6 +24,9 @@ const LUMIRA_STATUSLINE = {
21
24
  function defaultSettingsPath() {
22
25
  return join(homedir(), '.claude', 'settings.json');
23
26
  }
27
+ function defaultConfigPath() {
28
+ return join(homedir(), '.config', 'lumira', 'config.json');
29
+ }
24
30
  function isLumira(statusLine) {
25
31
  if (!statusLine || typeof statusLine !== 'object')
26
32
  return false;
@@ -38,24 +44,32 @@ export function promptYN(question) {
38
44
  });
39
45
  }
40
46
  // ── Skill installer ─────────────────────────────────────────────────
41
- function installSkill() {
47
+ function installSkill(opts = {}) {
42
48
  const lines = [];
43
- const destDir = join(homedir(), '.claude', 'skills', 'lumira');
44
- const destFile = join(destDir, 'SKILL.md');
45
- // Resolve skill source: dist/../skills/lumira/SKILL.md
49
+ const home = opts.homeOverride ?? homedir();
46
50
  const thisDir = dirname(fileURLToPath(import.meta.url));
47
51
  const srcFile = resolve(thisDir, '..', 'skills', 'lumira', 'SKILL.md');
48
52
  if (!existsSync(srcFile)) {
49
53
  lines.push(warn('Skill file not found in package — skipping /lumira skill'));
50
54
  return lines;
51
55
  }
52
- try {
53
- mkdirSync(destDir, { recursive: true });
54
- copyFileSync(srcFile, destFile);
55
- lines.push(ok(`Installed ${DIM}/lumira${RST} skill → ${DIM}~/.claude/skills/lumira/${RST}`));
56
- }
57
- catch {
58
- lines.push(warn('Could not install /lumira skill — copy manually from skills/lumira/SKILL.md'));
56
+ const destinations = [
57
+ { label: 'claude', dir: join(home, '.claude') },
58
+ { label: 'qwen', dir: join(home, '.qwen') },
59
+ ];
60
+ for (const { label, dir } of destinations) {
61
+ if (label === 'qwen' && !existsSync(dir))
62
+ continue;
63
+ const destDir = join(dir, 'skills', 'lumira');
64
+ const destFile = join(destDir, 'SKILL.md');
65
+ try {
66
+ mkdirSync(destDir, { recursive: true });
67
+ copyFileSync(srcFile, destFile);
68
+ lines.push(ok(`Installed ${DIM}/lumira${RST} skill → ${DIM}${destDir}/${RST}`));
69
+ }
70
+ catch {
71
+ lines.push(warn(`Could not install /lumira skill to ${destDir}`));
72
+ }
59
73
  }
60
74
  return lines;
61
75
  }
@@ -64,7 +78,98 @@ export async function install(opts = {}) {
64
78
  const settingsPath = opts.settingsPath ?? defaultSettingsPath();
65
79
  const backupPath = settingsPath + '.lumira.bak';
66
80
  const confirm = opts.confirm ?? promptYN;
67
- const lines = [header()];
81
+ const lines = [];
82
+ // ── Wizard / config path ─────────────────────────────────────────
83
+ // When configPath is not provided, skip the wizard and config write
84
+ // entirely (legacy path — preserves existing test behaviour).
85
+ const runInteractive = opts.configPath !== undefined;
86
+ if (runInteractive) {
87
+ const configPath = opts.configPath;
88
+ const stdin = opts.stdin ?? process.stdin;
89
+ const stdout = opts.stdout ?? process.stdout;
90
+ // Build banner prelude (shown on each wizard frame so it survives screen clears)
91
+ let prelude = '';
92
+ if (stdin?.isTTY) {
93
+ const banner = getBanner({ width: stdout?.columns });
94
+ if (banner) {
95
+ const subtitle = getSubtitle();
96
+ prelude = banner + '\n ' + subtitle + '\n\n';
97
+ }
98
+ }
99
+ // Load existing config to pre-populate wizard selections
100
+ const existingConfig = loadConfig(dirname(configPath));
101
+ const current = {
102
+ preset: existingConfig.preset,
103
+ theme: existingConfig.theme,
104
+ icons: existingConfig.icons,
105
+ };
106
+ // Determine wizard result
107
+ let wizard;
108
+ if (stdin?.isTTY) {
109
+ const result = await runWizard({ current, prelude, stdin, stdout });
110
+ if (result === null) {
111
+ lines.push(`\n Installation cancelled.\n`);
112
+ return lines.join('\n') + '\n';
113
+ }
114
+ wizard = result;
115
+ }
116
+ else {
117
+ // Non-TTY: use defaults
118
+ wizard = { preset: 'balanced', icons: 'nerd' };
119
+ lines.push(ok('Non-interactive mode — using defaults (preset: balanced, icons: nerd)'));
120
+ }
121
+ // ── settings.json read/replace/backup ──────────────────────────
122
+ let settings = {};
123
+ if (existsSync(settingsPath)) {
124
+ try {
125
+ settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
126
+ }
127
+ catch {
128
+ lines.push(warn('Could not parse existing settings.json, creating fresh'));
129
+ settings = {};
130
+ }
131
+ }
132
+ if (settings.statusLine) {
133
+ if (isLumira(settings.statusLine)) {
134
+ lines.push(ok('lumira is already configured as your statusline'));
135
+ saveConfig(wizard, configPath);
136
+ lines.push(ok(`Saved config → ${DIM}${configPath}${RST}`));
137
+ lines.push(...installSkill({ homeOverride: opts.homeOverride }));
138
+ if (existsSync(join(opts.homeOverride ?? homedir(), '.qwen'))) {
139
+ lines.push('');
140
+ lines.push(' \u2139 Qwen Code detected — in Qwen sessions, lumira renders');
141
+ lines.push(' single-line automatically. Your preset above applies to Claude Code.');
142
+ }
143
+ lines.push(`\n Restart Claude Code to see your statusline.\n`);
144
+ return lines.join('\n') + '\n';
145
+ }
146
+ const currentCmd = settings.statusLine.command ?? 'unknown';
147
+ lines.push(warn(`Current statusline: ${YELLOW}${currentCmd}${RST}`));
148
+ const accepted = await confirm('Replace with lumira?');
149
+ if (!accepted) {
150
+ lines.push(`\n Aborted. No changes made.\n`);
151
+ return lines.join('\n') + '\n';
152
+ }
153
+ copyFileSync(settingsPath, backupPath);
154
+ lines.push(ok(`Backed up existing settings → ${DIM}settings.json.lumira.bak${RST}`));
155
+ }
156
+ settings.statusLine = { ...LUMIRA_STATUSLINE };
157
+ mkdirSync(dirname(settingsPath), { recursive: true });
158
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', { mode: 0o600 });
159
+ lines.push(ok('Configured lumira as statusline'));
160
+ saveConfig(wizard, configPath);
161
+ lines.push(ok(`Saved config → ${DIM}${configPath}${RST}`));
162
+ lines.push(...installSkill({ homeOverride: opts.homeOverride }));
163
+ if (existsSync(join(opts.homeOverride ?? homedir(), '.qwen'))) {
164
+ lines.push('');
165
+ lines.push(' \u2139 Qwen Code detected — in Qwen sessions, lumira renders');
166
+ lines.push(' single-line automatically. Your preset above applies to Claude Code.');
167
+ }
168
+ lines.push(`\n Restart Claude Code to see your statusline.\n`);
169
+ return lines.join('\n') + '\n';
170
+ }
171
+ // ── Legacy path (no configPath) — original behaviour ─────────────
172
+ lines.push(header());
68
173
  let settings = {};
69
174
  if (existsSync(settingsPath)) {
70
175
  try {
@@ -78,7 +183,7 @@ export async function install(opts = {}) {
78
183
  if (settings.statusLine) {
79
184
  if (isLumira(settings.statusLine)) {
80
185
  lines.push(ok('lumira is already configured as your statusline'));
81
- lines.push(...installSkill());
186
+ lines.push(...installSkill({ homeOverride: opts.homeOverride }));
82
187
  return lines.join('\n') + '\n';
83
188
  }
84
189
  const current = settings.statusLine.command ?? 'unknown';
@@ -95,8 +200,7 @@ export async function install(opts = {}) {
95
200
  mkdirSync(dirname(settingsPath), { recursive: true });
96
201
  writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', { mode: 0o600 });
97
202
  lines.push(ok('Configured lumira as statusline'));
98
- // Install /lumira skill
99
- lines.push(...installSkill());
203
+ lines.push(...installSkill({ homeOverride: opts.homeOverride }));
100
204
  lines.push(`\n Restart Claude Code to see your statusline.\n`);
101
205
  return lines.join('\n') + '\n';
102
206
  }
@@ -104,6 +208,7 @@ export async function install(opts = {}) {
104
208
  export function uninstall(opts = {}) {
105
209
  const settingsPath = opts.settingsPath ?? defaultSettingsPath();
106
210
  const backupPath = settingsPath + '.lumira.bak';
211
+ const home = opts.homeOverride ?? homedir();
107
212
  const lines = [header()];
108
213
  if (!existsSync(settingsPath)) {
109
214
  lines.push(ok('Nothing to uninstall — no settings.json found'));
@@ -115,6 +220,20 @@ export function uninstall(opts = {}) {
115
220
  copyFileSync(backupPath, settingsPath);
116
221
  unlinkSync(backupPath);
117
222
  lines.push(ok('Restored previous settings from backup'));
223
+ // Remove skill from both destinations (best effort)
224
+ for (const root of [join(home, '.claude'), join(home, '.qwen')]) {
225
+ const skillFile = join(root, 'skills', 'lumira', 'SKILL.md');
226
+ if (existsSync(skillFile)) {
227
+ try {
228
+ unlinkSync(skillFile);
229
+ try {
230
+ rmdirSync(dirname(skillFile));
231
+ }
232
+ catch { /* dir not empty, ok */ }
233
+ }
234
+ catch { /* best effort */ }
235
+ }
236
+ }
118
237
  lines.push(`\n Restart Claude Code to apply changes.\n`);
119
238
  return lines.join('\n') + '\n';
120
239
  }
@@ -135,6 +254,20 @@ export function uninstall(opts = {}) {
135
254
  catch {
136
255
  lines.push(warn('Could not parse settings.json'));
137
256
  }
257
+ // Remove skill from both destinations (best effort)
258
+ for (const root of [join(home, '.claude'), join(home, '.qwen')]) {
259
+ const skillFile = join(root, 'skills', 'lumira', 'SKILL.md');
260
+ if (existsSync(skillFile)) {
261
+ try {
262
+ unlinkSync(skillFile);
263
+ try {
264
+ rmdirSync(dirname(skillFile));
265
+ }
266
+ catch { /* dir not empty, ok */ }
267
+ }
268
+ catch { /* best effort */ }
269
+ }
270
+ }
138
271
  lines.push(`\n Restart Claude Code to apply changes.\n`);
139
272
  return lines.join('\n') + '\n';
140
273
  }
@@ -1 +1 @@
1
- {"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,8 @@ export function render(ctx) {
9
9
  const colorMode = ctx.config.colors.mode === 'auto' ? detectColorMode() : ctx.config.colors.mode;
10
10
  const theme = resolveTheme(ctx.config.theme, colorMode);
11
11
  const c = createColors(colorMode, theme);
12
- if (ctx.config.layout === 'singleline' || (ctx.config.layout === 'auto' && ctx.cols < 70)) {
12
+ const isQwen = ctx.input.platform === 'qwen-code';
13
+ if (isQwen || ctx.config.layout === 'singleline' || (ctx.config.layout === 'auto' && ctx.cols < 70)) {
13
14
  return renderMinimal(ctx, c);
14
15
  }
15
16
  const lines = [];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,UAAU,MAAM,CAAC,GAAkB;IACvC,MAAM,SAAS,GAAc,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAC5G,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAEzC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;QAC1F,OAAO,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAAC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAC,IAAI,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAC/E,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,UAAU,MAAM,CAAC,GAAkB;IACvC,MAAM,SAAS,GAAc,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAC5G,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,WAAW,CAAC;IAClD,IAAI,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;QACpG,OAAO,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAAC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAC,IAAI,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAC/E,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
@@ -18,7 +18,7 @@ export function renderLine1(ctx, c) {
18
18
  // Branch + git changes (prefer Qwen's native git.branch, fallback to external git)
19
19
  const branchName = input.gitBranch || git.branch;
20
20
  if (display.branch && branchName) {
21
- const branchLen = cols < 60 ? 12 : cols < 80 ? 20 : cols < 100 ? 30 : cols < 120 ? 40 : 60;
21
+ const branchLen = cols < 60 ? 20 : cols < 80 ? 35 : cols < 100 ? 50 : cols < 120 ? 70 : 80;
22
22
  const bName = truncField(branchName, branchLen);
23
23
  let branchStr = c.magenta(`${icons.branch} ${bName}`);
24
24
  if (display.gitChanges) {
@@ -45,21 +45,29 @@ export function truncatePath(str, maxLen = 20) {
45
45
  return '.../' + filename;
46
46
  }
47
47
  export function fitSegments(left, right, sep, cols) {
48
- const safeCols = cols - 4;
49
- const leftStr = left.join(sep);
50
- const leftW = displayWidth(leftStr);
51
- for (let r = right.length; r >= 0; r--) {
52
- const rSlice = right.slice(0, r);
53
- if (rSlice.length === 0)
54
- return leftStr;
55
- const rightStr = rSlice.join(sep);
56
- const rightW = displayWidth(rightStr);
57
- if (leftW + 1 + rightW <= safeCols) {
58
- const gap = Math.max(1, safeCols - leftW - rightW);
59
- return leftStr + ' '.repeat(gap) + rightStr;
48
+ const safeCols = Math.max(1, cols - 4);
49
+ for (let l = left.length; l >= 1; l--) {
50
+ const lSlice = left.slice(0, l);
51
+ const leftStr = lSlice.join(sep);
52
+ const leftW = displayWidth(leftStr);
53
+ if (leftW > safeCols)
54
+ continue;
55
+ for (let r = right.length; r >= 0; r--) {
56
+ const rSlice = right.slice(0, r);
57
+ if (rSlice.length === 0)
58
+ return leftStr;
59
+ const rightStr = rSlice.join(sep);
60
+ const rightW = displayWidth(rightStr);
61
+ if (leftW + 1 + rightW <= safeCols) {
62
+ const gap = Math.max(1, safeCols - leftW - rightW);
63
+ return leftStr + ' '.repeat(gap) + rightStr;
64
+ }
60
65
  }
66
+ return leftStr;
61
67
  }
62
- return leftStr;
68
+ // Last resort: even the first left segment alone exceeds safeCols.
69
+ // Strip ANSI before hard-truncating to avoid cutting mid-escape-sequence.
70
+ return truncField(stripAnsi(left[0] ?? ''), safeCols);
63
71
  }
64
72
  export function padLine(left, right, cols) {
65
73
  const leftW = displayWidth(left);
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/render/text.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/render/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QAC9B,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;YAAE,SAAS;QAChG,IAAI,EAAE,IAAI,OAAO,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;YACjF,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;YAChE,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC;YACvG,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;IACpB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,GAAW;IACjD,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACzC,oEAAoE;IACpE,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG;YAAE,MAAM,CAAC,kBAAkB;QAC/C,MAAM,IAAI,EAAE,CAAC;QACb,CAAC,IAAI,EAAE,CAAC;IACV,CAAC;IACD,OAAO,MAAM,GAAG,QAAQ,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,SAAiB,EAAE;IAC3D,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,UAAU,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC;IAC3C,IAAI,QAAQ,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAC5E,OAAO,MAAM,GAAG,QAAQ,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAc,EAAE,KAAe,EAAE,GAAW,EAAE,IAAY;IACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAEpC,IAAI,KAAK,GAAG,QAAQ;YAAE,SAAS;QAE/B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC;YACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,KAAK,GAAG,CAAC,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;gBACnD,OAAO,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,mEAAmE;IACnE,0EAA0E;IAC1E,OAAO,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,IAAY;IAC/D,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;IAC/C,OAAO,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACxC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface BannerOpts {
2
+ /** Terminal width in columns. Banner hides when width < 50. Defaults to process.stdout.columns. */
3
+ width?: number;
4
+ }
5
+ export declare function getBanner(opts?: BannerOpts): string;
6
+ export interface SubtitleOpts {
7
+ /** Injection point for tests. Returns the raw package.json contents as a string. */
8
+ readPackageJson?: () => string;
9
+ }
10
+ export declare function getSubtitle(opts?: SubtitleOpts): string;
@@ -0,0 +1,42 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const LOGO = [
5
+ '██╗ ██╗ ██╗███╗ ███╗██╗██████╗ █████╗ ',
6
+ '██║ ██║ ██║████╗ ████║██║██╔══██╗██╔══██╗',
7
+ '██║ ██║ ██║██╔████╔██║██║██████╔╝███████║',
8
+ '██║ ██║ ██║██║╚██╔╝██║██║██╔══██╗██╔══██║',
9
+ '███████╗╚██████╔╝██║ ╚═╝ ██║██║██║ ██║██║ ██║',
10
+ '╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝╚═╝ ╚═╝',
11
+ ].join('\n');
12
+ const CYAN = '\x1b[36m';
13
+ const RST = '\x1b[0m';
14
+ export function getBanner(opts = {}) {
15
+ const width = opts.width ?? (process.stdout.columns ?? 80);
16
+ if (width < 50)
17
+ return '';
18
+ return `${CYAN}\n${LOGO}\n${RST}`;
19
+ }
20
+ function defaultReadPackageJson() {
21
+ const here = dirname(fileURLToPath(import.meta.url));
22
+ // Built file lives at dist/tui/banner.js; package.json is at dist/../package.json.
23
+ // Source file lives at src/tui/banner.ts; package.json is at src/../package.json.
24
+ // Either way: two levels up.
25
+ const p = resolve(here, '..', '..', 'package.json');
26
+ return readFileSync(p, 'utf8');
27
+ }
28
+ const BASE_SUBTITLE = 'real-time statusline for claude code & qwen code';
29
+ export function getSubtitle(opts = {}) {
30
+ const read = opts.readPackageJson ?? defaultReadPackageJson;
31
+ try {
32
+ const pkg = JSON.parse(read());
33
+ if (typeof pkg.version === 'string' && pkg.version.length > 0) {
34
+ return `${BASE_SUBTITLE} · v${pkg.version}`;
35
+ }
36
+ return BASE_SUBTITLE;
37
+ }
38
+ catch {
39
+ return BASE_SUBTITLE;
40
+ }
41
+ }
42
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/tui/banner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,IAAI,GAAG;IACX,iDAAiD;IACjD,iDAAiD;IACjD,iDAAiD;IACjD,iDAAiD;IACjD,iDAAiD;IACjD,iDAAiD;CAClD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,GAAG,GAAG,SAAS,CAAC;AAOtB,MAAM,UAAU,SAAS,CAAC,OAAmB,EAAE;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,EAAE,CAAC;IAC1B,OAAO,GAAG,IAAI,KAAK,IAAI,KAAK,GAAG,EAAE,CAAC;AACpC,CAAC;AAOD,SAAS,sBAAsB;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,mFAAmF;IACnF,kFAAkF;IAClF,6BAA6B;IAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACpD,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,aAAa,GAAG,kDAAkD,CAAC;AAEzE,MAAM,UAAU,WAAW,CAAC,OAAqB,EAAE;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,IAAI,sBAAsB,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/B,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,OAAO,GAAG,aAAa,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9C,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type HudConfig, type RenderContext } from '../types.js';
2
+ import type { ColorMode } from '../render/colors.js';
3
+ export interface PreviewOpts {
4
+ preset: NonNullable<HudConfig['preset']>;
5
+ theme?: string;
6
+ icons: 'nerd' | 'emoji' | 'none';
7
+ colorMode?: ColorMode;
8
+ }
9
+ export interface BuildPreviewDeps {
10
+ render?: (ctx: RenderContext) => string;
11
+ }
12
+ export declare function buildPreview(opts: PreviewOpts, deps?: BuildPreviewDeps): string;
@@ -0,0 +1,115 @@
1
+ import { render as defaultRender } from '../render/index.js';
2
+ import { resolveIcons } from '../render/icons.js';
3
+ import { normalize } from '../normalize.js';
4
+ import { DEFAULT_CONFIG, DEFAULT_DISPLAY, EMPTY_GIT, EMPTY_TRANSCRIPT, } from '../types.js';
5
+ function buildMockContext(opts) {
6
+ // Determine layout from preset (mirrors applyPreset logic without importing it)
7
+ let layout = 'auto';
8
+ if (opts.preset === 'minimal')
9
+ layout = 'singleline';
10
+ else if (opts.preset === 'full')
11
+ layout = 'multiline';
12
+ else if (opts.preset === 'balanced')
13
+ layout = 'auto';
14
+ const config = {
15
+ ...DEFAULT_CONFIG,
16
+ layout,
17
+ preset: opts.preset,
18
+ icons: opts.icons,
19
+ theme: opts.theme,
20
+ display: { ...DEFAULT_DISPLAY },
21
+ colors: { mode: opts.colorMode ?? 'truecolor' },
22
+ };
23
+ // Build a realistic raw Claude Code input that normalize() can consume.
24
+ // Fill every field that renderers access via ctx.input.* or ctx.input.raw.*
25
+ const rawInput = {
26
+ model: 'Claude Sonnet 4.6',
27
+ session_id: 'preview-session',
28
+ session_name: 'install-wizard preview',
29
+ cwd: '/home/carlos/projects/lumira',
30
+ context_window: {
31
+ context_window_size: 200000,
32
+ used_percentage: 42,
33
+ remaining_percentage: 58,
34
+ current_usage: 84000,
35
+ total_input_tokens: 12000,
36
+ total_output_tokens: 1800,
37
+ cache_read_input_tokens: 3500,
38
+ cache_creation_input_tokens: 0,
39
+ },
40
+ cost: {
41
+ total_cost_usd: 0.42,
42
+ total_duration_ms: 185000,
43
+ total_lines_added: 47,
44
+ total_lines_removed: 12,
45
+ },
46
+ version: '1.2.3',
47
+ output_style: { name: 'auto' },
48
+ vim: undefined,
49
+ agent: undefined,
50
+ worktree: undefined,
51
+ rate_limits: {
52
+ five_hour: { used_percentage: 65, resets_at: Math.floor(Date.now() / 1000) + 3600 },
53
+ seven_day: { used_percentage: 30 },
54
+ },
55
+ exceeds_200k_tokens: false,
56
+ };
57
+ const input = normalize(rawInput);
58
+ const git = {
59
+ ...EMPTY_GIT,
60
+ branch: 'main',
61
+ staged: 2,
62
+ modified: 3,
63
+ untracked: 1,
64
+ };
65
+ const transcript = {
66
+ ...EMPTY_TRANSCRIPT,
67
+ tools: [
68
+ {
69
+ id: '1',
70
+ name: 'Read',
71
+ target: 'src/types.ts',
72
+ status: 'completed',
73
+ startTime: new Date(),
74
+ endTime: new Date(),
75
+ },
76
+ {
77
+ id: '2',
78
+ name: 'Edit',
79
+ target: 'src/tui/preview.ts',
80
+ status: 'completed',
81
+ startTime: new Date(),
82
+ endTime: new Date(),
83
+ },
84
+ ],
85
+ todos: [
86
+ { id: '1', content: 'Implement preview generator', status: 'completed' },
87
+ { id: '2', content: 'Write tests', status: 'in_progress' },
88
+ ],
89
+ thinkingEffort: '',
90
+ sessionStart: new Date(Date.now() - 185000),
91
+ };
92
+ return {
93
+ input,
94
+ git,
95
+ transcript,
96
+ tokenSpeed: 45,
97
+ memory: { usedBytes: 512 * 1024 * 1024, totalBytes: 16 * 1024 * 1024 * 1024, percentage: 3 },
98
+ gsd: null,
99
+ mcp: null,
100
+ cols: 120,
101
+ config,
102
+ icons: resolveIcons(opts.icons),
103
+ };
104
+ }
105
+ export function buildPreview(opts, deps = {}) {
106
+ const render = deps.render ?? defaultRender;
107
+ try {
108
+ const ctx = buildMockContext(opts);
109
+ return render(ctx);
110
+ }
111
+ catch {
112
+ return '(preview unavailable)';
113
+ }
114
+ }
115
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/tui/preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ export interface SelectOption<T> {
3
+ label: string;
4
+ value: T;
5
+ description?: string;
6
+ hint?: string;
7
+ disabled?: boolean;
8
+ }
9
+ /**
10
+ * Streams used by `interactiveSelect`. In production these default to
11
+ * `process.stdin` / `process.stdout`; tests inject fakes.
12
+ */
13
+ type SelectStdin = NodeJS.ReadStream | (Readable & {
14
+ isTTY?: boolean;
15
+ isRaw?: boolean;
16
+ setRawMode?: (flag: boolean) => unknown;
17
+ });
18
+ type SelectStdout = NodeJS.WriteStream | (Writable & {
19
+ columns?: number;
20
+ });
21
+ export interface SelectOpts<T> {
22
+ title: string;
23
+ options: SelectOption<T>[];
24
+ initial?: T;
25
+ preview: (focused: T) => string;
26
+ /** Optional string rendered above the title on each frame (e.g. an ASCII banner). */
27
+ prelude?: string;
28
+ stdin?: SelectStdin;
29
+ stdout?: SelectStdout;
30
+ }
31
+ export declare function interactiveSelect<T>(opts: SelectOpts<T>): Promise<T | null>;
32
+ export {};
@@ -0,0 +1,107 @@
1
+ import readline from 'node:readline';
2
+ const SHOW_CURSOR = '\x1b[?25h';
3
+ const HIDE_CURSOR = '\x1b[?25l';
4
+ const CLEAR_SCREEN = '\x1b[2J\x1b[H';
5
+ let exitHandlerInstalled = false;
6
+ function installExitHandler(stdin, stdout) {
7
+ if (exitHandlerInstalled)
8
+ return;
9
+ exitHandlerInstalled = true;
10
+ process.once('exit', () => {
11
+ try {
12
+ if (typeof stdin.setRawMode === 'function' && stdin.isRaw)
13
+ stdin.setRawMode(false);
14
+ stdout.write?.(SHOW_CURSOR);
15
+ }
16
+ catch { /* best effort */ }
17
+ });
18
+ }
19
+ export async function interactiveSelect(opts) {
20
+ const stdin = (opts.stdin ?? process.stdin);
21
+ const stdout = (opts.stdout ?? process.stdout);
22
+ if (!stdin.isTTY)
23
+ return null;
24
+ installExitHandler(stdin, stdout);
25
+ const options = opts.options;
26
+ const initialIdx = options.findIndex((o) => o.value === opts.initial);
27
+ let focus = initialIdx >= 0 ? initialIdx : 0;
28
+ let keypressListener = null;
29
+ let resizeListener = null;
30
+ let endListener = null;
31
+ const cleanup = () => {
32
+ if (keypressListener)
33
+ stdin.removeListener?.('keypress', keypressListener);
34
+ if (resizeListener && typeof stdout.removeListener === 'function') {
35
+ stdout.removeListener('resize', resizeListener);
36
+ }
37
+ if (endListener)
38
+ stdin.removeListener?.('end', endListener);
39
+ if (typeof stdin.setRawMode === 'function')
40
+ stdin.setRawMode(false);
41
+ stdin.pause?.();
42
+ stdout.write?.(SHOW_CURSOR);
43
+ };
44
+ const render = () => {
45
+ stdout.write?.(CLEAR_SCREEN);
46
+ if (opts.prelude)
47
+ stdout.write?.(opts.prelude);
48
+ stdout.write?.(` ${opts.title}\n\n`);
49
+ for (let i = 0; i < options.length; i++) {
50
+ const o = options[i];
51
+ const marker = i === focus ? ' ❯ ' : ' ';
52
+ const desc = o.description ? ' ' + o.description : '';
53
+ stdout.write?.(`${marker}${o.label}${desc}\n`);
54
+ }
55
+ stdout.write?.('\n');
56
+ stdout.write?.(opts.preview(options[focus].value));
57
+ stdout.write?.('\n');
58
+ };
59
+ try {
60
+ readline.emitKeypressEvents(stdin);
61
+ if (typeof stdin.setRawMode === 'function')
62
+ stdin.setRawMode(true);
63
+ stdin.resume?.();
64
+ stdout.write?.(HIDE_CURSOR);
65
+ render();
66
+ return await new Promise((resolve) => {
67
+ const finish = (v) => resolve(v);
68
+ keypressListener = (_str, key) => {
69
+ if (!key || !key.name)
70
+ return;
71
+ if (key.name === 'down' || key.name === 'j') {
72
+ focus = (focus + 1) % options.length;
73
+ render();
74
+ return;
75
+ }
76
+ if (key.name === 'up' || key.name === 'k') {
77
+ focus = (focus - 1 + options.length) % options.length;
78
+ render();
79
+ return;
80
+ }
81
+ if (key.name === 'return') {
82
+ finish(options[focus].value);
83
+ return;
84
+ }
85
+ if (key.name === 'escape' || key.name === 'q') {
86
+ finish(null);
87
+ return;
88
+ }
89
+ if (key.name === 'c' && key.ctrl) {
90
+ finish(null);
91
+ return;
92
+ }
93
+ };
94
+ stdin.on('keypress', keypressListener);
95
+ endListener = () => finish(null);
96
+ stdin.on('end', endListener);
97
+ resizeListener = () => render();
98
+ if (typeof stdout.on === 'function') {
99
+ stdout.on('resize', resizeListener);
100
+ }
101
+ });
102
+ }
103
+ finally {
104
+ cleanup();
105
+ }
106
+ }
107
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/tui/select.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -135,7 +135,7 @@ export interface HudConfig {
135
135
  * User-facing preset — drives layout + display toggles (Phase 3).
136
136
  * CLI: --full | --balanced | --minimal | --preset=<value>
137
137
  */
138
- preset?: 'full' | 'balanced' | 'minimal' | 'qwen';
138
+ preset?: 'full' | 'balanced' | 'minimal';
139
139
  theme?: string;
140
140
  icons?: 'nerd' | 'emoji' | 'none';
141
141
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lumira",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "lumira — real-time statusline for Claude Code",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -49,6 +49,15 @@ Each is a boolean (`true`/`false`):
49
49
  - `true` — show GSD task info
50
50
  - `false` — hide GSD section
51
51
 
52
+ ## Platform Support
53
+
54
+ Lumira auto-detects the caller's platform:
55
+
56
+ - **Claude Code** — renders per your configured `layout` / `preset`.
57
+ - **Qwen Code** — renders compact single-line output automatically, regardless of `layout`. Qwen Code only displays the first line of statusline commands, so lumira always uses the single-line renderer (which fits model, branch, context bar, cost, cached tokens, and thoughts into one line).
58
+
59
+ No configuration needed. One `config.json` serves both CLIs.
60
+
52
61
  ## Example Configs
53
62
 
54
63
  Minimal with emoji icons: