lazyclaude-ai 0.1.13 โ 0.1.15
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/CHANGELOG.md +17 -0
- package/README.md +15 -6
- package/README_ko-KR.md +16 -6
- package/RELEASE_CHECKLIST.md +6 -3
- package/bin/lazyclaude-ai.js +72 -12
- package/cover.png +0 -0
- package/package.json +1 -1
- package/plugins/lazyclaude/.claude-plugin/plugin.json +1 -1
- package/plugins/lazyclaude/bin/lazyclaude-hud.js +19 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.15 - 2026-06-01
|
|
4
|
+
|
|
5
|
+
- Add an install-time LazyClaude HUD brand color picker with immediate ANSI
|
|
6
|
+
previews for each `[๐คLAZYCLAUDE vX.Y.Z]` choice.
|
|
7
|
+
- Persist the selected HUD accent in Claude `settings.json` and inject it into
|
|
8
|
+
the managed `statusLine` command through `LAZYCLAUDE_HUD_ACCENT`.
|
|
9
|
+
- Allow noninteractive installs to keep the default LazyClaude cyan accent
|
|
10
|
+
without hanging CI, postinstall, or fresh-machine smoke tests.
|
|
11
|
+
|
|
12
|
+
## 0.1.14 - 2026-06-01
|
|
13
|
+
|
|
14
|
+
- Ignore Claude Code command XML transcript packets such as
|
|
15
|
+
`<command-name>...</command-name>` when selecting the HUD's latest user prompt
|
|
16
|
+
preview, so command metadata never appears as the second HUD line.
|
|
17
|
+
- Add the sleepy LazyClaude HUD prefix `[๐คLAZYCLAUDE vX.Y.Z]` while preserving
|
|
18
|
+
the compact context, rate-limit, and git segments.
|
|
19
|
+
|
|
3
20
|
## 0.1.13 - 2026-06-01
|
|
4
21
|
|
|
5
22
|
- Fix short slash ULW routing so `/ulw-plan`, `/ulw-loop`, and `/start-work`
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</p>
|
|
10
10
|
<p align="center">
|
|
11
11
|
<img src="https://img.shields.io/badge/npm-lazyclaude--ai-cb3837" />
|
|
12
|
-
<img src="https://img.shields.io/badge/version-0.1.
|
|
12
|
+
<img src="https://img.shields.io/badge/version-0.1.15-2ea44f" />
|
|
13
13
|
<img src="https://img.shields.io/badge/Claude%20Code-plugin-blueviolet" />
|
|
14
14
|
<img src="https://img.shields.io/badge/license-MIT-blue" />
|
|
15
15
|
</p>
|
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
> `lazyclaude@lazyclaude-ai`, so normal `claude` launches can load the
|
|
23
23
|
> LazyClaude skills and hooks without a long `--plugin-dir` command.
|
|
24
24
|
|
|
25
|
-
This checkout is prepared as `lazyclaude-ai@0.1.
|
|
25
|
+
This checkout is prepared as `lazyclaude-ai@0.1.15` for personal install
|
|
26
26
|
convenience. The repo can remain private and quiet; publishing to npm here does
|
|
27
27
|
not imply public repo promotion, marketplace publication, or advertisement.
|
|
28
28
|
Future package releases still require explicit user approval.
|
|
29
|
-
The v0.1.
|
|
29
|
+
The v0.1.15 release materials are source-origin-free and describe LazyClaude in
|
|
30
30
|
its own terms.
|
|
31
31
|
|
|
32
32
|
## Features
|
|
@@ -50,7 +50,8 @@ its own terms.
|
|
|
50
50
|
- **Local marketplace registration** - Claude can resolve `claude plugin details lazyclaude@lazyclaude-ai`
|
|
51
51
|
- **MCP and LSP helpers** - plugin-local stdio MCP plus TypeScript-family LSP doctor
|
|
52
52
|
- **LazyClaude HUD** - npm install configures a compact Claude Code statusLine
|
|
53
|
-
based on `pretty-claude-hud`, branded as `[LAZYCLAUDE vX.Y.Z]
|
|
53
|
+
based on `pretty-claude-hud`, branded as `[๐คLAZYCLAUDE vX.Y.Z]`, with
|
|
54
|
+
install-time color selection and live previews
|
|
54
55
|
- **Safe uninstall** - removes only LazyClaude-managed state
|
|
55
56
|
|
|
56
57
|
## Quick Start
|
|
@@ -61,6 +62,10 @@ its own terms.
|
|
|
61
62
|
npx --yes lazyclaude-ai install
|
|
62
63
|
```
|
|
63
64
|
|
|
65
|
+
During an interactive `npx` install, LazyClaude shows every HUD brand color as
|
|
66
|
+
a live terminal preview and writes the selected accent into the managed Claude
|
|
67
|
+
`statusLine` command. Noninteractive installs keep the default cyan accent.
|
|
68
|
+
|
|
64
69
|
If you are currently inside this repository checkout, which has the same
|
|
65
70
|
package name as the registry package, older published builds such as
|
|
66
71
|
`npx --yes lazyclaude-ai@0.1.11 install` could resolve the local same-name
|
|
@@ -70,7 +75,7 @@ install command works:
|
|
|
70
75
|
|
|
71
76
|
```bash
|
|
72
77
|
cd /tmp
|
|
73
|
-
npx --yes lazyclaude-ai@0.1.
|
|
78
|
+
npx --yes lazyclaude-ai@0.1.15 install
|
|
74
79
|
```
|
|
75
80
|
|
|
76
81
|
Validate the installed plugin:
|
|
@@ -83,9 +88,13 @@ The installer also sets Claude Code's `statusLine` command to the packaged
|
|
|
83
88
|
LazyClaude HUD. A typical no-color render starts like:
|
|
84
89
|
|
|
85
90
|
```text
|
|
86
|
-
[LAZYCLAUDE v0.1.
|
|
91
|
+
[๐คLAZYCLAUDE v0.1.15] | O4.8 โ ctx โโโโโโ 9%/1000k โ 5h [โโโ]4% โ 1w [โโโ]35% โ git main +3 โ
|
|
87
92
|
```
|
|
88
93
|
|
|
94
|
+
To override the accent without the picker, set `LAZYCLAUDE_HUD_ACCENT` to one
|
|
95
|
+
of `cyan`, `blue`, `teal`, `green`, `lavender`, `rose`, `gold`, `orange`,
|
|
96
|
+
`slate`, or `gray` before installing.
|
|
97
|
+
|
|
89
98
|
Launch Claude Code normally:
|
|
90
99
|
|
|
91
100
|
```bash
|
package/README_ko-KR.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</p>
|
|
10
10
|
<p align="center">
|
|
11
11
|
<img src="https://img.shields.io/badge/npm-lazyclaude--ai-cb3837" />
|
|
12
|
-
<img src="https://img.shields.io/badge/version-0.1.
|
|
12
|
+
<img src="https://img.shields.io/badge/version-0.1.15-2ea44f" />
|
|
13
13
|
<img src="https://img.shields.io/badge/Claude%20Code-plugin-blueviolet" />
|
|
14
14
|
<img src="https://img.shields.io/badge/license-MIT-blue" />
|
|
15
15
|
</p>
|
|
@@ -26,12 +26,12 @@
|
|
|
26
26
|
> ์ค์น๋๋ฏ๋ก, ๋งค๋ฒ ๊ธด `--plugin-dir` ์์ด ์ผ๋ฐ `claude` ์คํ์์
|
|
27
27
|
> LazyClaude skill๊ณผ hook์ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
|
|
28
28
|
|
|
29
|
-
ํ์ฌ checkout์ `lazyclaude-ai@0.1.
|
|
29
|
+
ํ์ฌ checkout์ `lazyclaude-ai@0.1.15` ๋ฐฐํฌ์ฉ์ผ๋ก ์ค๋น๋์ด ์์ต๋๋ค. ๋ชฉ์ ์ ๋ค๋ฅธ PC์์๋
|
|
30
30
|
๋น ๋ฅด๊ฒ ์ค์นํ๊ธฐ ์ํ ๊ฐ์ธ์ฉ ๋ฐฐํฌ๋ฌผ์
๋๋ค. ์ ์ฅ์๋ ๋น๊ณต๊ฐ ์ ์ฅ์๋ก
|
|
31
31
|
์ ์งํ ์ ์๊ณ , npm ๋ฐฐํฌ๊ฐ ๊ณง ํ๋ณด, ๊ณต๊ฐ ์ ์ฅ์ ์ด์, Claude marketplace
|
|
32
32
|
๋ฑ๋ก์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ์ ๋ฒ์ ๋ฐฐํฌ๋ ํญ์ ๋ณ๋์ ๋ช
์์ ์น์ธ ํ์
|
|
33
33
|
์งํํฉ๋๋ค.
|
|
34
|
-
v0.1.
|
|
34
|
+
v0.1.15 release material์ source-origin-free ์ํ์ด๋ฉฐ LazyClaude ์์ฒด์
|
|
35
35
|
ํํ์ผ๋ก ์ ๋ฆฌ๋์ด ์์ต๋๋ค.
|
|
36
36
|
|
|
37
37
|
## ๊ธฐ๋ฅ
|
|
@@ -54,7 +54,8 @@ v0.1.13 release material์ source-origin-free ์ํ์ด๋ฉฐ LazyClaude ์์ฒด์
|
|
|
54
54
|
- **Local marketplace ๋ฑ๋ก** - `claude plugin details lazyclaude@lazyclaude-ai`์์ inventory ํ์ธ
|
|
55
55
|
- **MCP์ LSP helper** - plugin-local stdio MCP์ TypeScript ๊ณ์ด LSP doctor
|
|
56
56
|
- **LazyClaude HUD** - npm install ์ `pretty-claude-hud` ๊ธฐ๋ฐ์ compact
|
|
57
|
-
Claude Code statusLine์ `[LAZYCLAUDE vX.Y.Z]` ๋ธ๋๋๋ก ์๋
|
|
57
|
+
Claude Code statusLine์ `[๐คLAZYCLAUDE vX.Y.Z]` ๋ธ๋๋๋ก ์๋ ์ค์ ํ๊ณ ,
|
|
58
|
+
์ค์น ์ค ์์ ์ ํ๊ณผ ์ฆ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ ๊ณต
|
|
58
59
|
- **์์ ํ uninstall** - LazyClaude๊ฐ ๊ด๋ฆฌํ ์ํ๋ง ์ ๊ฑฐ
|
|
59
60
|
|
|
60
61
|
## ๋น ๋ฅธ ์์
|
|
@@ -65,6 +66,11 @@ v0.1.13 release material์ source-origin-free ์ํ์ด๋ฉฐ LazyClaude ์์ฒด์
|
|
|
65
66
|
npx --yes lazyclaude-ai install
|
|
66
67
|
```
|
|
67
68
|
|
|
69
|
+
interactive `npx` ์ค์น์์๋ LazyClaude๊ฐ HUD brand color ํ๋ณด๋ฅผ ์ค์
|
|
70
|
+
ํฐ๋ฏธ๋ ์์์ผ๋ก ๋ฐ๋ก ๋ณด์ฌ์ฃผ๊ณ , ์ ํํ accent๋ฅผ Claude์ managed
|
|
71
|
+
`statusLine` command์ ์ ์ฅํฉ๋๋ค. noninteractive install์ ๊ธฐ๋ณธ cyan
|
|
72
|
+
accent๋ฅผ ์ฌ์ฉํ๋ฏ๋ก CI๋ postinstall์์ ๋ฉ์ถ์ง ์์ต๋๋ค.
|
|
73
|
+
|
|
68
74
|
ํ์ฌ ์์น๊ฐ ์ด ์ ์ฅ์ checkout์ด๋ฉด, registry package์ ๊ฐ์ package name์
|
|
69
75
|
๊ฐ์ง same-name source checkout ์์ ์๋ ์ํ์
๋๋ค. ์ด ๊ฒฝ์ฐ
|
|
70
76
|
`npx --yes lazyclaude-ai@0.1.11 install` ๊ฐ์ ์ด์ published build๊ฐ local
|
|
@@ -74,7 +80,7 @@ checkout์ ๋จผ์ ํด์ํด์ `sh: lazyclaude-ai: command not found`๋ก ์คํจ
|
|
|
74
80
|
|
|
75
81
|
```bash
|
|
76
82
|
cd /tmp
|
|
77
|
-
npx --yes lazyclaude-ai@0.1.
|
|
83
|
+
npx --yes lazyclaude-ai@0.1.15 install
|
|
78
84
|
```
|
|
79
85
|
|
|
80
86
|
์ค์น ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
|
|
@@ -87,9 +93,13 @@ installer๋ Claude Code์ `statusLine` command๋ packaged LazyClaude HUD๋ก
|
|
|
87
93
|
์ค์ ํฉ๋๋ค. ์์์ ์ ๊ฑฐํ ์์๋ ๋ค์์ฒ๋ผ ์์ํฉ๋๋ค.
|
|
88
94
|
|
|
89
95
|
```text
|
|
90
|
-
[LAZYCLAUDE v0.1.
|
|
96
|
+
[๐คLAZYCLAUDE v0.1.15] | O4.8 โ ctx โโโโโโ 9%/1000k โ 5h [โโโ]4% โ 1w [โโโ]35% โ git main +3 โ
|
|
91
97
|
```
|
|
92
98
|
|
|
99
|
+
picker ์์ด ์์์ ์ง์ ํ๋ ค๋ฉด ์ค์น ์ ์ `LAZYCLAUDE_HUD_ACCENT`๋ฅผ
|
|
100
|
+
`cyan`, `blue`, `teal`, `green`, `lavender`, `rose`, `gold`, `orange`,
|
|
101
|
+
`slate`, `gray` ์ค ํ๋๋ก ์ค์ ํ์ธ์.
|
|
102
|
+
|
|
93
103
|
์ค์น ํ์๋ ์ผ๋ฐ์ ์ธ `claude` ๋ช
๋ น์ผ๋ก Claude Code๋ฅผ ์คํํฉ๋๋ค.
|
|
94
104
|
|
|
95
105
|
```bash
|
package/RELEASE_CHECKLIST.md
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
# LazyClaude Release Checklist
|
|
2
2
|
|
|
3
|
-
Status:
|
|
4
|
-
|
|
5
|
-
`
|
|
3
|
+
Status: `lazyclaude-ai@0.1.15` is the current release candidate for the
|
|
4
|
+
install-time HUD brand color picker. The picker previews each
|
|
5
|
+
`[๐คLAZYCLAUDE vX.Y.Z]` accent in the terminal and persists the selected color
|
|
6
|
+
in the managed Claude statusLine command. Versions `0.1.11`, `0.1.12`,
|
|
7
|
+
`0.1.13`, and `0.1.14` already exist on npm and cannot be published again, so
|
|
8
|
+
this patch version is the next publishable target.
|
|
6
9
|
|
|
7
10
|
DO NOT publish a new version of LazyClaude, run `npm publish`, push release
|
|
8
11
|
tags, or add a remote Claude Code marketplace entry without explicit user
|
package/bin/lazyclaude-ai.js
CHANGED
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from "node:fs";
|
|
13
13
|
import { homedir } from "node:os";
|
|
14
14
|
import { dirname, join, resolve } from "node:path";
|
|
15
|
+
import { createInterface } from "node:readline/promises";
|
|
15
16
|
import { fileURLToPath } from "node:url";
|
|
16
17
|
|
|
17
18
|
const root = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
@@ -62,6 +63,19 @@ const knownExternalLspPlugins = {
|
|
|
62
63
|
"gopls-lsp@claude-plugins-official": ["gopls"],
|
|
63
64
|
};
|
|
64
65
|
const spinnerFrames = ["โ ", "โ ", "โ น", "โ ธ", "โ ผ", "โ ด", "โ ฆ", "โ ง", "โ ", "โ "];
|
|
66
|
+
const hudAccentThemes = [
|
|
67
|
+
{ name: "cyan", code: 81, mood: "LazyClaude default" },
|
|
68
|
+
{ name: "blue", code: 74, mood: "calm terminal" },
|
|
69
|
+
{ name: "teal", code: 66, mood: "muted productivity" },
|
|
70
|
+
{ name: "green", code: 71, mood: "classic shell" },
|
|
71
|
+
{ name: "lavender", code: 139, mood: "quiet purple" },
|
|
72
|
+
{ name: "rose", code: 132, mood: "soft contrast" },
|
|
73
|
+
{ name: "gold", code: 136, mood: "warm focus" },
|
|
74
|
+
{ name: "orange", code: 173, mood: "high energy" },
|
|
75
|
+
{ name: "slate", code: 60, mood: "low saturation" },
|
|
76
|
+
{ name: "gray", code: 245, mood: "monochrome" },
|
|
77
|
+
];
|
|
78
|
+
const hudAccentNames = new Set(hudAccentThemes.map((theme) => theme.name));
|
|
65
79
|
|
|
66
80
|
const printUsage = () => {
|
|
67
81
|
process.stderr.write(usage);
|
|
@@ -132,7 +146,49 @@ const writeClaudeSettings = (settings, home = claudeHome()) => {
|
|
|
132
146
|
writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\n`);
|
|
133
147
|
};
|
|
134
148
|
|
|
135
|
-
const
|
|
149
|
+
const normalizeHudAccent = (value) => {
|
|
150
|
+
const normalized = String(value || "").trim().toLowerCase();
|
|
151
|
+
return hudAccentNames.has(normalized) ? normalized : "cyan";
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const hudAccentPreview = (theme) => `\x1b[38;5;${theme.code}m[๐คLAZYCLAUDE v${version}]\x1b[0m`;
|
|
155
|
+
|
|
156
|
+
const shouldPromptHudAccent = () => {
|
|
157
|
+
if (process.env.LAZYCLAUDE_HUD_ACCENT_PROMPT === "1") return true;
|
|
158
|
+
if (process.env.LAZYCLAUDE_HUD_ACCENT_PROMPT === "0") return false;
|
|
159
|
+
return Boolean(process.stdin.isTTY && process.stdout.isTTY && !process.env.CI);
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
const chooseHudAccent = async () => {
|
|
163
|
+
const envAccent = process.env.LAZYCLAUDE_HUD_ACCENT;
|
|
164
|
+
if (envAccent && process.env.LAZYCLAUDE_HUD_ACCENT_PROMPT !== "1") {
|
|
165
|
+
return normalizeHudAccent(envAccent);
|
|
166
|
+
}
|
|
167
|
+
if (!shouldPromptHudAccent()) return normalizeHudAccent(envAccent);
|
|
168
|
+
|
|
169
|
+
process.stdout.write("Choose LazyClaude HUD brand color:\n");
|
|
170
|
+
for (const [index, theme] of hudAccentThemes.entries()) {
|
|
171
|
+
process.stdout.write(` ${index + 1}) ${theme.name.padEnd(8)} ${hudAccentPreview(theme)} ${theme.mood}\n`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
175
|
+
try {
|
|
176
|
+
const answer = await rl.question("Color 1-10 or name [cyan]: ");
|
|
177
|
+
const trimmed = answer.trim().toLowerCase();
|
|
178
|
+
const byIndex = hudAccentThemes[Number.parseInt(trimmed, 10) - 1]?.name;
|
|
179
|
+
const selected = byIndex ?? normalizeHudAccent(trimmed);
|
|
180
|
+
if (trimmed && selected === "cyan" && trimmed !== "cyan" && byIndex === undefined) {
|
|
181
|
+
process.stdout.write("HUD_COLOR_WARNING: unknown color; using cyan\n");
|
|
182
|
+
}
|
|
183
|
+
process.stdout.write(`HUD_COLOR_SELECTED: ${selected} ${hudAccentPreview(hudAccentThemes.find((theme) => theme.name === selected))}\n`);
|
|
184
|
+
return selected;
|
|
185
|
+
} finally {
|
|
186
|
+
rl.close();
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const hudCommandForPlugin = (pluginPath, accent = "cyan") =>
|
|
191
|
+
`LAZYCLAUDE_HUD_ACCENT=${normalizeHudAccent(accent)} node "${join(pluginPath, "bin", "lazyclaude-hud.js")}"`;
|
|
136
192
|
|
|
137
193
|
const readKnownMarketplaces = (home = claudeHome()) => {
|
|
138
194
|
const path = knownMarketplacesPath(home);
|
|
@@ -210,9 +266,10 @@ const registerMarketplace = (marketplacePath, home = claudeHome()) => {
|
|
|
210
266
|
writeKnownMarketplaces(knownMarketplaces, home);
|
|
211
267
|
};
|
|
212
268
|
|
|
213
|
-
const installHudStatusLine = (pluginPath, home = claudeHome()) => {
|
|
269
|
+
const installHudStatusLine = (pluginPath, home = claudeHome(), accent = "cyan") => {
|
|
214
270
|
const settings = readClaudeSettings(home);
|
|
215
|
-
const
|
|
271
|
+
const hudAccent = normalizeHudAccent(accent);
|
|
272
|
+
const command = hudCommandForPlugin(pluginPath, hudAccent);
|
|
216
273
|
const existingLazyClaude = settings[lazyClaudeSettingsKey] ?? {};
|
|
217
274
|
const now = new Date().toISOString();
|
|
218
275
|
const previousStatusLine =
|
|
@@ -229,6 +286,7 @@ const installHudStatusLine = (pluginPath, home = claudeHome()) => {
|
|
|
229
286
|
statusLineManaged: true,
|
|
230
287
|
statusLineCommand: command,
|
|
231
288
|
statusLineVersion: version,
|
|
289
|
+
hudAccent,
|
|
232
290
|
statusLineInstalledAt: existingLazyClaude.statusLineInstalledAt ?? now,
|
|
233
291
|
statusLineUpdatedAt: now,
|
|
234
292
|
previousStatusLine: previousStatusLine ?? null,
|
|
@@ -259,6 +317,7 @@ const uninstallHudStatusLine = (home = claudeHome()) => {
|
|
|
259
317
|
"statusLineManaged",
|
|
260
318
|
"statusLineCommand",
|
|
261
319
|
"statusLineVersion",
|
|
320
|
+
"hudAccent",
|
|
262
321
|
"statusLineInstalledAt",
|
|
263
322
|
"statusLineUpdatedAt",
|
|
264
323
|
"previousStatusLine",
|
|
@@ -291,7 +350,7 @@ const unregisterMarketplace = (home = claudeHome()) => {
|
|
|
291
350
|
}
|
|
292
351
|
};
|
|
293
352
|
|
|
294
|
-
const registerClaudePlugin = (installRoot, marketplacePath, home = claudeHome()) => {
|
|
353
|
+
const registerClaudePlugin = (installRoot, marketplacePath, home = claudeHome(), hudAccent = "cyan") => {
|
|
295
354
|
const registry = readInstalledPlugins(home);
|
|
296
355
|
const now = new Date().toISOString();
|
|
297
356
|
const existing = registry.plugins[pluginKey]?.[0] ?? {};
|
|
@@ -308,7 +367,7 @@ const registerClaudePlugin = (installRoot, marketplacePath, home = claudeHome())
|
|
|
308
367
|
];
|
|
309
368
|
writeInstalledPlugins(registry, home);
|
|
310
369
|
registerMarketplace(marketplacePath, home);
|
|
311
|
-
installHudStatusLine(installRoot, home);
|
|
370
|
+
installHudStatusLine(installRoot, home, hudAccent);
|
|
312
371
|
};
|
|
313
372
|
|
|
314
373
|
const unregisterClaudePlugin = (home = claudeHome()) => {
|
|
@@ -375,7 +434,7 @@ const resetCurrentPointer = (home, target) => {
|
|
|
375
434
|
}
|
|
376
435
|
};
|
|
377
436
|
|
|
378
|
-
const install = ({ dryRun }) => {
|
|
437
|
+
const install = async ({ dryRun }) => {
|
|
379
438
|
const home = claudeHome();
|
|
380
439
|
const legacyHome = lazyHome();
|
|
381
440
|
const targetPlugin = claudePluginRoot(home);
|
|
@@ -397,6 +456,7 @@ const install = ({ dryRun }) => {
|
|
|
397
456
|
fail(`Packaged LazyClaude plugin payload is missing: ${sourcePlugin}`);
|
|
398
457
|
}
|
|
399
458
|
|
|
459
|
+
const hudAccent = await chooseHudAccent();
|
|
400
460
|
progress.step(`Installing LazyClaude ${version}`);
|
|
401
461
|
progress.step("Plugin payload: copying Claude Code plugin");
|
|
402
462
|
rmSync(targetPlugin, { recursive: true, force: true });
|
|
@@ -405,7 +465,7 @@ const install = ({ dryRun }) => {
|
|
|
405
465
|
progress.step("Marketplace: writing local Claude marketplace");
|
|
406
466
|
const localMarketplace = writeLocalMarketplace(legacyHome);
|
|
407
467
|
progress.step("Claude registry: enabling plugin and HUD");
|
|
408
|
-
registerClaudePlugin(targetPlugin, localMarketplace, home);
|
|
468
|
+
registerClaudePlugin(targetPlugin, localMarketplace, home, hudAccent);
|
|
409
469
|
|
|
410
470
|
progress.step("Compatibility cache: refreshing local current pointer");
|
|
411
471
|
const legacyRoot = versionRoot(legacyHome);
|
|
@@ -419,7 +479,7 @@ const install = ({ dryRun }) => {
|
|
|
419
479
|
process.stdout.write(`Claude plugin: ${pluginKey}\n`);
|
|
420
480
|
process.stdout.write(`Marketplace: ${localMarketplace}\n`);
|
|
421
481
|
process.stdout.write(`Plugin path: ${intendedPluginPath(home)}\n`);
|
|
422
|
-
process.stdout.write(
|
|
482
|
+
process.stdout.write(`HUD: LazyClaude statusLine installed (${hudAccent})\n`);
|
|
423
483
|
process.stdout.write("Launch with: claude\n");
|
|
424
484
|
};
|
|
425
485
|
|
|
@@ -479,7 +539,7 @@ const doctor = ({ dryRun }) => {
|
|
|
479
539
|
|
|
480
540
|
process.stdout.write(`Plugin path: ${pluginPath}\n`);
|
|
481
541
|
const settings = readClaudeSettings();
|
|
482
|
-
if (settings.statusLine?.command === hudCommandForPlugin(pluginPath)) {
|
|
542
|
+
if (settings.statusLine?.command === hudCommandForPlugin(pluginPath, settings[lazyClaudeSettingsKey]?.hudAccent)) {
|
|
483
543
|
process.stdout.write("HUD_STATUSLINE_PASS\n");
|
|
484
544
|
} else {
|
|
485
545
|
process.stdout.write("HUD_STATUSLINE_WARNING: LazyClaude HUD is not the active Claude statusLine\n");
|
|
@@ -530,7 +590,7 @@ const uninstall = ({ dryRun }) => {
|
|
|
530
590
|
process.stdout.write("UNINSTALL_PASS\n");
|
|
531
591
|
};
|
|
532
592
|
|
|
533
|
-
const main = () => {
|
|
593
|
+
const main = async () => {
|
|
534
594
|
const parsed = parseArgs(process.argv.slice(2));
|
|
535
595
|
const { command } = parsed;
|
|
536
596
|
|
|
@@ -542,7 +602,7 @@ const main = () => {
|
|
|
542
602
|
switch (command) {
|
|
543
603
|
case "install":
|
|
544
604
|
case "update":
|
|
545
|
-
install(parsed);
|
|
605
|
+
await install(parsed);
|
|
546
606
|
break;
|
|
547
607
|
case "doctor":
|
|
548
608
|
doctor(parsed);
|
|
@@ -565,4 +625,4 @@ const main = () => {
|
|
|
565
625
|
}
|
|
566
626
|
};
|
|
567
627
|
|
|
568
|
-
main();
|
|
628
|
+
main().catch((error) => fail(error.message));
|
package/cover.png
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -9,6 +9,20 @@ const pluginRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
|
9
9
|
const pluginManifestPath = join(pluginRoot, ".claude-plugin", "plugin.json");
|
|
10
10
|
const noColor = process.env.NO_COLOR || process.env.LAZYCLAUDE_HUD_NO_COLOR === "1";
|
|
11
11
|
const sep = process.env.LAZYCLAUDE_HUD_SEP || "โ";
|
|
12
|
+
const accentCodes = {
|
|
13
|
+
cyan: 81,
|
|
14
|
+
blue: 74,
|
|
15
|
+
teal: 66,
|
|
16
|
+
green: 71,
|
|
17
|
+
lavender: 139,
|
|
18
|
+
rose: 132,
|
|
19
|
+
gold: 136,
|
|
20
|
+
orange: 173,
|
|
21
|
+
slate: 60,
|
|
22
|
+
gray: 245,
|
|
23
|
+
};
|
|
24
|
+
const configuredAccent = String(process.env.LAZYCLAUDE_HUD_ACCENT || "cyan").toLowerCase();
|
|
25
|
+
const accentCode = accentCodes[configuredAccent] ?? accentCodes.cyan;
|
|
12
26
|
|
|
13
27
|
const colors = noColor
|
|
14
28
|
? { reset: "", bold: "", dim: "", accent: "", empty: "", green: "", yellow: "", red: "" }
|
|
@@ -16,7 +30,7 @@ const colors = noColor
|
|
|
16
30
|
reset: "\x1b[0m",
|
|
17
31
|
bold: "\x1b[1m",
|
|
18
32
|
dim: "\x1b[38;5;245m",
|
|
19
|
-
accent:
|
|
33
|
+
accent: `\x1b[38;5;${accentCode}m`,
|
|
20
34
|
empty: "\x1b[38;5;238m",
|
|
21
35
|
green: "\x1b[38;5;71m",
|
|
22
36
|
yellow: "\x1b[38;5;178m",
|
|
@@ -103,6 +117,7 @@ const latestUserMessage = (transcriptPath) => {
|
|
|
103
117
|
if (!transcriptPath || !existsSync(transcriptPath)) return "";
|
|
104
118
|
const lines = readFileSync(transcriptPath, "utf8").split(/\r?\n/u).filter(Boolean);
|
|
105
119
|
const ignoredPrefixes = ["[Request interrupted", "[Request cancelled", "<local-command-stdout>", "<local-command-stderr>"];
|
|
120
|
+
const hasCommandXml = (text) => /<(?:command-name|command-message|command-args)\b[^>]*>/u.test(text);
|
|
106
121
|
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
107
122
|
try {
|
|
108
123
|
const event = JSON.parse(lines[index]);
|
|
@@ -112,7 +127,7 @@ const latestUserMessage = (transcriptPath) => {
|
|
|
112
127
|
? content.filter((part) => part?.type === "text").map((part) => part.text).join(" ")
|
|
113
128
|
: content;
|
|
114
129
|
const normalized = String(text || "").replace(/\s+/gu, " ").trim();
|
|
115
|
-
if (normalized && !ignoredPrefixes.some((prefix) => normalized.startsWith(prefix))) {
|
|
130
|
+
if (normalized && !ignoredPrefixes.some((prefix) => normalized.startsWith(prefix)) && !hasCommandXml(normalized)) {
|
|
116
131
|
return normalized;
|
|
117
132
|
}
|
|
118
133
|
} catch {
|
|
@@ -216,7 +231,7 @@ const main = async () => {
|
|
|
216
231
|
const usage = parseUsage(status);
|
|
217
232
|
const usageText = ` ${sep} ${formatUsageSegment("5h", usage.fiveHour, usage.fiveHourReset)} ${sep} ${formatUsageSegment("1w", usage.weekly, usage.weeklyReset)}`;
|
|
218
233
|
const git = gitStatus(status.cwd);
|
|
219
|
-
const prefix = `${colors.bold}${colors.accent}[LAZYCLAUDE v${version}]${colors.reset}`;
|
|
234
|
+
const prefix = `${colors.bold}${colors.accent}[๐คLAZYCLAUDE v${version}]${colors.reset}`;
|
|
220
235
|
const line = `${prefix} | ${colors.accent}${model}${colors.dim} ${sep} ctx ${makeContextBar(contextPct)} ${contextPct}%/${maxK}k${colors.reset}${usageText}${git ? ` ${sep} git ${git}` : ""}`;
|
|
221
236
|
process.stdout.write(`${line}\n`);
|
|
222
237
|
|
|
@@ -228,6 +243,6 @@ const main = async () => {
|
|
|
228
243
|
};
|
|
229
244
|
|
|
230
245
|
main().catch((error) => {
|
|
231
|
-
process.stdout.write(`[LAZYCLAUDE v${readVersion()}] | HUD unavailable: ${error.message}\n`);
|
|
246
|
+
process.stdout.write(`[๐คLAZYCLAUDE v${readVersion()}] | HUD unavailable: ${error.message}\n`);
|
|
232
247
|
process.exit(0);
|
|
233
248
|
});
|