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 +9 -14
- package/dist/config.d.ts +7 -0
- package/dist/config.js +38 -31
- package/dist/config.js.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/installer-wizard.d.ts +21 -0
- package/dist/installer-wizard.js +74 -0
- package/dist/installer-wizard.js.map +1 -0
- package/dist/installer.d.ts +10 -0
- package/dist/installer.js +149 -16
- package/dist/installer.js.map +1 -1
- package/dist/render/index.js +2 -1
- package/dist/render/index.js.map +1 -1
- package/dist/render/line1.js +1 -1
- package/dist/render/text.js +21 -13
- package/dist/render/text.js.map +1 -1
- package/dist/tui/banner.d.ts +10 -0
- package/dist/tui/banner.js +42 -0
- package/dist/tui/banner.js.map +1 -0
- package/dist/tui/preview.d.ts +12 -0
- package/dist/tui/preview.js +115 -0
- package/dist/tui/preview.js.map +1 -0
- package/dist/tui/select.d.ts +32 -0
- package/dist/tui/select.js +107 -0
- package/dist/tui/select.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
- package/skills/lumira/SKILL.md +9 -0
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 (
|
|
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
|
|
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.
|
|
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(
|
|
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'
|
|
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
|
|
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
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
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
|
-
|
|
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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"}
|
package/dist/installer.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
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 = [
|
|
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
|
-
|
|
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
|
}
|
package/dist/installer.js.map
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAClH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEzD,uEAAuE;AACvE,MAAM,GAAG,GAAG,SAAS,CAAC;AACtB,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,GAAG,GAAG,SAAS,CAAC;AAEtB,MAAM,EAAE,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AACrD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AACxD,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,IAAI,oBAAoB,GAAG,IAAI,CAAC;AAE1D,uEAAuE;AACvE,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,SAAkB;IACxB,OAAO,EAAE,mBAAmB;IAC5B,OAAO,EAAE,CAAC;CACX,CAAC;AAgBF,SAAS,mBAAmB;IAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,QAAQ,CAAC,UAAmB;IACnC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAChE,MAAM,EAAE,GAAG,UAAqC,CAAC;IACjD,OAAO,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACzE,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YAC3C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uEAAuE;AACvE,SAAS,YAAY,CAAC,OAAkC,EAAE;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE,CAAC;IAE5C,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEvE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG;QACnB,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE;QAC/C,EAAE,KAAK,EAAE,MAAM,EAAI,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAI;KAChD,CAAC;IAEF,KAAK,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,YAAY,EAAE,CAAC;QAC1C,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,GAAG,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAyB,EAAE;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,mBAAmB,EAAE,CAAC;IAChE,MAAM,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,oEAAoE;IACpE,oEAAoE;IACpE,8DAA8D;IAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC;IAErD,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAoB,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;QAE7C,iFAAiF;QACjF,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,KAAK,EAAG,MAA2C,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3F,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;gBAC/B,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,KAAK,EAAE,cAAc,CAAC,KAAK;SAC5B,CAAC;QAEF,0BAA0B;QAC1B,IAAI,MAAoB,CAAC;QACzB,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACpE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACjC,CAAC;YACD,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,MAAM,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,uEAAuE,CAAC,CAAC,CAAC;QAC1F,CAAC;QAED,kEAAkE;QAClE,IAAI,QAAQ,GAA4B,EAAE,CAAC;QAE3C,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC,CAAC;gBAC3E,QAAQ,GAAG,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACxB,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,iDAAiD,CAAC,CAAC,CAAC;gBAClE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,GAAG,GAAG,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBAEjE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;oBAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;oBAC7E,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;gBACzF,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;gBAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACjC,CAAC;YAED,MAAM,UAAU,GAAI,QAAQ,CAAC,UAAsC,CAAC,OAAO,IAAI,SAAS,CAAC;YACzF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,MAAM,GAAG,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;gBAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACjC,CAAC;YAED,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,iCAAiC,GAAG,2BAA2B,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,QAAQ,CAAC,UAAU,GAAG,EAAE,GAAG,iBAAiB,EAAE,CAAC;QAC/C,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAElD,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,GAAG,GAAG,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAE3D,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAEjE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;YAC7E,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACzF,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjC,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAErB,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAE3C,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC,CAAC;YAC3E,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YACjE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACjC,CAAC;QAED,MAAM,OAAO,GAAI,QAAQ,CAAC,UAAsC,CAAC,OAAO,IAAI,SAAS,CAAC;QACtF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,MAAM,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACjC,CAAC;QAED,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,iCAAiC,GAAG,2BAA2B,GAAG,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,QAAQ,CAAC,UAAU,GAAG,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/C,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAElD,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,SAAS,CAAC,OAAyB,EAAE;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,mBAAmB,EAAE,CAAC;IAChE,MAAM,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAEnC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjC,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAC7C,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACvC,UAAU,CAAC,UAAU,CAAC,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,wCAAwC,CAAC,CAAC,CAAC;YAEzD,oDAAoD;YACpD,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;gBAChE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAC7D,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC;wBACH,UAAU,CAAC,SAAS,CAAC,CAAC;wBACtB,IAAI,CAAC;4BAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;wBAAC,CAAC;wBAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;oBAC1E,CAAC;oBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC;gBAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,UAAU,CAAC;QAC3B,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,yCAAyC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,oDAAoD;IACpD,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC7D,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,UAAU,CAAC,SAAS,CAAC,CAAC;gBACtB,IAAI,CAAC;oBAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;YAC1E,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC"}
|
package/dist/render/index.js
CHANGED
|
@@ -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
|
-
|
|
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 = [];
|
package/dist/render/index.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/render/line1.js
CHANGED
|
@@ -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 ?
|
|
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) {
|
package/dist/render/text.js
CHANGED
|
@@ -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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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);
|
package/dist/render/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/render/text.ts"],"names":[],"mappings":"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"}
|
|
@@ -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'
|
|
138
|
+
preset?: 'full' | 'balanced' | 'minimal';
|
|
139
139
|
theme?: string;
|
|
140
140
|
icons?: 'nerd' | 'emoji' | 'none';
|
|
141
141
|
}
|
package/package.json
CHANGED
package/skills/lumira/SKILL.md
CHANGED
|
@@ -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:
|