lumira 0.3.0 → 0.3.2
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 +8 -0
- package/dist/config.js +42 -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 +124 -24
- package/dist/installer.js.map +1 -1
- package/dist/parsers/gsd.js +2 -1
- package/dist/parsers/gsd.js.map +1 -1
- package/dist/parsers/transcript.js +29 -18
- package/dist/parsers/transcript.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 +22 -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 +116 -0
- package/dist/tui/preview.js.map +1 -0
- package/dist/tui/select.d.ts +32 -0
- package/dist/tui/select.js +110 -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,11 @@
|
|
|
1
1
|
import { type HudConfig } from './types.js';
|
|
2
|
+
/** Test-only — resets the process-scoped qwenWarningShown flag. Do not call in production. */
|
|
3
|
+
export declare function _resetMigrationFlags(): void;
|
|
2
4
|
export declare function loadConfig(configDir?: string): HudConfig;
|
|
3
5
|
export declare function mergeCliFlags(config: HudConfig, argv: string[]): HudConfig;
|
|
6
|
+
export interface WizardResult {
|
|
7
|
+
preset: 'full' | 'balanced' | 'minimal';
|
|
8
|
+
theme?: string;
|
|
9
|
+
icons: 'nerd' | 'emoji' | 'none';
|
|
10
|
+
}
|
|
11
|
+
export declare function saveConfig(wizard: WizardResult, configPath: string): void;
|
package/dist/config.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
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
|
+
// Module-level flag: fires the qwen→minimal deprecation warning once per
|
|
6
|
+
// Node process. Process-scoped by design — tests must run in forked workers
|
|
7
|
+
// (see vitest.config.ts `pool: 'forks'`). Issue #20.
|
|
8
|
+
let qwenWarningShown = false;
|
|
9
|
+
/** Test-only — resets the process-scoped qwenWarningShown flag. Do not call in production. */
|
|
10
|
+
export function _resetMigrationFlags() { qwenWarningShown = false; }
|
|
5
11
|
export function loadConfig(configDir = join(homedir(), '.config', 'lumira')) {
|
|
6
12
|
const p = join(configDir, 'config.json');
|
|
7
13
|
if (!existsSync(p))
|
|
@@ -14,7 +20,15 @@ export function loadConfig(configDir = join(homedir(), '.config', 'lumira')) {
|
|
|
14
20
|
return { ...DEFAULT_CONFIG, display: { ...DEFAULT_DISPLAY } };
|
|
15
21
|
}
|
|
16
22
|
}
|
|
17
|
-
function mergeConfig(
|
|
23
|
+
function mergeConfig(rawIn) {
|
|
24
|
+
let raw = rawIn;
|
|
25
|
+
if (raw.preset === 'qwen') {
|
|
26
|
+
if (!qwenWarningShown) {
|
|
27
|
+
process.stderr.write("[lumira] 'qwen' preset is removed — using 'minimal' instead\n");
|
|
28
|
+
qwenWarningShown = true;
|
|
29
|
+
}
|
|
30
|
+
raw = { ...raw, preset: 'minimal' };
|
|
31
|
+
}
|
|
18
32
|
const layout = ['multiline', 'singleline', 'auto'].includes(raw.layout) ? raw.layout : DEFAULT_CONFIG.layout;
|
|
19
33
|
const colors = { ...DEFAULT_CONFIG.colors };
|
|
20
34
|
if (raw.colors && typeof raw.colors === 'object') {
|
|
@@ -24,7 +38,7 @@ function mergeConfig(raw) {
|
|
|
24
38
|
}
|
|
25
39
|
const result = { layout, gsd: typeof raw.gsd === 'boolean' ? raw.gsd : DEFAULT_CONFIG.gsd, display: { ...DEFAULT_DISPLAY }, colors };
|
|
26
40
|
// Apply preset FIRST (sets layout + display defaults)
|
|
27
|
-
const validPresets = ['full', 'balanced', 'minimal'
|
|
41
|
+
const validPresets = ['full', 'balanced', 'minimal'];
|
|
28
42
|
if (validPresets.includes(raw.preset))
|
|
29
43
|
applyPreset(result, raw.preset);
|
|
30
44
|
// Then overlay user's explicit display toggles (user wins over preset)
|
|
@@ -61,30 +75,6 @@ const PRESET_DEFS = {
|
|
|
61
75
|
cacheMetrics: false,
|
|
62
76
|
},
|
|
63
77
|
},
|
|
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
78
|
minimal: {
|
|
89
79
|
layout: 'singleline',
|
|
90
80
|
display: {
|
|
@@ -127,12 +117,10 @@ export function mergeCliFlags(config, argv) {
|
|
|
127
117
|
applyPreset(r, 'minimal');
|
|
128
118
|
if (argv.includes('--balanced'))
|
|
129
119
|
applyPreset(r, 'balanced');
|
|
130
|
-
if (argv.includes('--qwen'))
|
|
131
|
-
applyPreset(r, 'qwen');
|
|
132
120
|
if (argv.includes('--full'))
|
|
133
121
|
applyPreset(r, 'full');
|
|
134
122
|
for (const arg of argv) {
|
|
135
|
-
const presetMatch = arg.match(/^--preset[= ]?(full|balanced|minimal
|
|
123
|
+
const presetMatch = arg.match(/^--preset[= ]?(full|balanced|minimal)$/);
|
|
136
124
|
if (presetMatch) {
|
|
137
125
|
applyPreset(r, presetMatch[1]);
|
|
138
126
|
continue;
|
|
@@ -145,4 +133,27 @@ export function mergeCliFlags(config, argv) {
|
|
|
145
133
|
}
|
|
146
134
|
return r;
|
|
147
135
|
}
|
|
136
|
+
export function saveConfig(wizard, configPath) {
|
|
137
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
138
|
+
let existing = {};
|
|
139
|
+
if (existsSync(configPath)) {
|
|
140
|
+
try {
|
|
141
|
+
const parsed = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
142
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
143
|
+
existing = parsed;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
existing = {};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const merged = { ...existing, preset: wizard.preset, icons: wizard.icons };
|
|
151
|
+
if (wizard.theme !== undefined)
|
|
152
|
+
merged.theme = wizard.theme;
|
|
153
|
+
else
|
|
154
|
+
delete merged.theme;
|
|
155
|
+
const tmp = configPath + '.tmp';
|
|
156
|
+
writeFileSync(tmp, JSON.stringify(merged, null, 2) + '\n', { mode: 0o600 });
|
|
157
|
+
renameSync(tmp, configPath);
|
|
158
|
+
}
|
|
148
159
|
//# 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":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,GAAiB;IAChC,SAAS,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;IAChD,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC;IACtC,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;IAChD,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC;IAC1C,aAAa,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE;IACpC,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;IAC5C,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;IACpC,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE;CACjC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,YAAmC,EAAE;IAC9D,MAAM,IAAI,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,SAAS,EAAE,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC;IACnD,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvE,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAClB,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;KACxG,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAEjC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAChH,CAAC;AAED,6BAA6B;AAC7B,mDAAmD;AACnD,SAAS,WAAW;IAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,KAAK,OAAO,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,WAAW,EAAE,EAAE,CAAC;IAClB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;
|
|
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,33 +44,69 @@ 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
|
}
|
|
76
|
+
// Shared footer emitted at the end of every successful install path:
|
|
77
|
+
// skill install + Qwen-detected notice + restart message. Keeps the two
|
|
78
|
+
// success branches (already-configured vs fresh-install) from drifting.
|
|
79
|
+
function emitFooter(lines, homeOverride) {
|
|
80
|
+
lines.push(...installSkill({ homeOverride }));
|
|
81
|
+
if (existsSync(join(homeOverride ?? homedir(), '.qwen'))) {
|
|
82
|
+
lines.push('');
|
|
83
|
+
lines.push(' ℹ Qwen Code detected — in Qwen sessions, lumira renders');
|
|
84
|
+
lines.push(' single-line automatically. Your preset above applies to Claude Code.');
|
|
85
|
+
}
|
|
86
|
+
lines.push(`\n Restart Claude Code to see your statusline.\n`);
|
|
87
|
+
}
|
|
62
88
|
// ── Install ─────────────────────────────────────────────────────────
|
|
63
89
|
export async function install(opts = {}) {
|
|
64
90
|
const settingsPath = opts.settingsPath ?? defaultSettingsPath();
|
|
91
|
+
const configPath = opts.configPath ?? defaultConfigPath();
|
|
65
92
|
const backupPath = settingsPath + '.lumira.bak';
|
|
66
93
|
const confirm = opts.confirm ?? promptYN;
|
|
67
|
-
const
|
|
94
|
+
const stdin = opts.stdin ?? process.stdin;
|
|
95
|
+
const stdout = opts.stdout ?? process.stdout;
|
|
96
|
+
const lines = [];
|
|
97
|
+
// Build banner prelude (shown on each wizard frame so it survives screen clears)
|
|
98
|
+
let prelude = '';
|
|
99
|
+
if (stdin?.isTTY) {
|
|
100
|
+
const banner = getBanner({ width: stdout?.columns });
|
|
101
|
+
if (banner) {
|
|
102
|
+
const subtitle = getSubtitle();
|
|
103
|
+
prelude = banner + '\n ' + subtitle + '\n\n';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ── settings.json read + early replacement confirmation ───────
|
|
107
|
+
// Read settings and confirm before running the wizard, so the user
|
|
108
|
+
// doesn't waste time configuring preset/theme/icons only to decline
|
|
109
|
+
// the replacement at the end.
|
|
68
110
|
let settings = {};
|
|
69
111
|
if (existsSync(settingsPath)) {
|
|
70
112
|
try {
|
|
@@ -75,19 +117,48 @@ export async function install(opts = {}) {
|
|
|
75
117
|
settings = {};
|
|
76
118
|
}
|
|
77
119
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
return lines.join('\n') + '\n';
|
|
83
|
-
}
|
|
84
|
-
const current = settings.statusLine.command ?? 'unknown';
|
|
85
|
-
lines.push(warn(`Current statusline: ${YELLOW}${current}${RST}`));
|
|
120
|
+
const hasForeignStatusLine = settings.statusLine && !isLumira(settings.statusLine);
|
|
121
|
+
if (hasForeignStatusLine) {
|
|
122
|
+
const currentCmd = settings.statusLine.command ?? 'unknown';
|
|
123
|
+
lines.push(warn(`Current statusline: ${YELLOW}${currentCmd}${RST}`));
|
|
86
124
|
const accepted = await confirm('Replace with lumira?');
|
|
87
125
|
if (!accepted) {
|
|
88
126
|
lines.push(`\n Aborted. No changes made.\n`);
|
|
89
127
|
return lines.join('\n') + '\n';
|
|
90
128
|
}
|
|
129
|
+
}
|
|
130
|
+
// Load existing config to pre-populate wizard selections
|
|
131
|
+
const existingConfig = loadConfig(dirname(configPath));
|
|
132
|
+
const current = {
|
|
133
|
+
preset: existingConfig.preset,
|
|
134
|
+
theme: existingConfig.theme,
|
|
135
|
+
icons: existingConfig.icons,
|
|
136
|
+
};
|
|
137
|
+
// Determine wizard result
|
|
138
|
+
let wizard;
|
|
139
|
+
if (stdin?.isTTY) {
|
|
140
|
+
const result = await runWizard({ current, prelude, stdin, stdout });
|
|
141
|
+
if (result === null) {
|
|
142
|
+
lines.push(`\n Installation cancelled.\n`);
|
|
143
|
+
return lines.join('\n') + '\n';
|
|
144
|
+
}
|
|
145
|
+
wizard = result;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// Non-TTY: use defaults
|
|
149
|
+
wizard = { preset: 'balanced', icons: 'nerd' };
|
|
150
|
+
lines.push(ok('Non-interactive mode — using defaults (preset: balanced, icons: nerd)'));
|
|
151
|
+
}
|
|
152
|
+
// ── settings.json replace/backup ───────────────────────────────
|
|
153
|
+
if (settings.statusLine) {
|
|
154
|
+
if (isLumira(settings.statusLine)) {
|
|
155
|
+
lines.push(ok('lumira is already configured as your statusline'));
|
|
156
|
+
saveConfig(wizard, configPath);
|
|
157
|
+
lines.push(ok(`Saved config → ${DIM}${configPath}${RST}`));
|
|
158
|
+
emitFooter(lines, opts.homeOverride);
|
|
159
|
+
return lines.join('\n') + '\n';
|
|
160
|
+
}
|
|
161
|
+
// Foreign statusLine already confirmed above — back it up and replace.
|
|
91
162
|
copyFileSync(settingsPath, backupPath);
|
|
92
163
|
lines.push(ok(`Backed up existing settings → ${DIM}settings.json.lumira.bak${RST}`));
|
|
93
164
|
}
|
|
@@ -95,15 +166,16 @@ export async function install(opts = {}) {
|
|
|
95
166
|
mkdirSync(dirname(settingsPath), { recursive: true });
|
|
96
167
|
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', { mode: 0o600 });
|
|
97
168
|
lines.push(ok('Configured lumira as statusline'));
|
|
98
|
-
|
|
99
|
-
lines.push(
|
|
100
|
-
lines.
|
|
169
|
+
saveConfig(wizard, configPath);
|
|
170
|
+
lines.push(ok(`Saved config → ${DIM}${configPath}${RST}`));
|
|
171
|
+
emitFooter(lines, opts.homeOverride);
|
|
101
172
|
return lines.join('\n') + '\n';
|
|
102
173
|
}
|
|
103
174
|
// ── Uninstall ───────────────────────────────────────────────────────
|
|
104
175
|
export function uninstall(opts = {}) {
|
|
105
176
|
const settingsPath = opts.settingsPath ?? defaultSettingsPath();
|
|
106
177
|
const backupPath = settingsPath + '.lumira.bak';
|
|
178
|
+
const home = opts.homeOverride ?? homedir();
|
|
107
179
|
const lines = [header()];
|
|
108
180
|
if (!existsSync(settingsPath)) {
|
|
109
181
|
lines.push(ok('Nothing to uninstall — no settings.json found'));
|
|
@@ -115,6 +187,20 @@ export function uninstall(opts = {}) {
|
|
|
115
187
|
copyFileSync(backupPath, settingsPath);
|
|
116
188
|
unlinkSync(backupPath);
|
|
117
189
|
lines.push(ok('Restored previous settings from backup'));
|
|
190
|
+
// Remove skill from both destinations (best effort)
|
|
191
|
+
for (const root of [join(home, '.claude'), join(home, '.qwen')]) {
|
|
192
|
+
const skillFile = join(root, 'skills', 'lumira', 'SKILL.md');
|
|
193
|
+
if (existsSync(skillFile)) {
|
|
194
|
+
try {
|
|
195
|
+
unlinkSync(skillFile);
|
|
196
|
+
try {
|
|
197
|
+
rmdirSync(dirname(skillFile));
|
|
198
|
+
}
|
|
199
|
+
catch { /* dir not empty, ok */ }
|
|
200
|
+
}
|
|
201
|
+
catch { /* best effort */ }
|
|
202
|
+
}
|
|
203
|
+
}
|
|
118
204
|
lines.push(`\n Restart Claude Code to apply changes.\n`);
|
|
119
205
|
return lines.join('\n') + '\n';
|
|
120
206
|
}
|
|
@@ -135,6 +221,20 @@ export function uninstall(opts = {}) {
|
|
|
135
221
|
catch {
|
|
136
222
|
lines.push(warn('Could not parse settings.json'));
|
|
137
223
|
}
|
|
224
|
+
// Remove skill from both destinations (best effort)
|
|
225
|
+
for (const root of [join(home, '.claude'), join(home, '.qwen')]) {
|
|
226
|
+
const skillFile = join(root, 'skills', 'lumira', 'SKILL.md');
|
|
227
|
+
if (existsSync(skillFile)) {
|
|
228
|
+
try {
|
|
229
|
+
unlinkSync(skillFile);
|
|
230
|
+
try {
|
|
231
|
+
rmdirSync(dirname(skillFile));
|
|
232
|
+
}
|
|
233
|
+
catch { /* dir not empty, ok */ }
|
|
234
|
+
}
|
|
235
|
+
catch { /* best effort */ }
|
|
236
|
+
}
|
|
237
|
+
}
|
|
138
238
|
lines.push(`\n Restart Claude Code to apply changes.\n`);
|
|
139
239
|
return lines.join('\n') + '\n';
|
|
140
240
|
}
|
package/dist/installer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
|