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 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.13-2ea44f" />
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.13` for personal install
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.13 release materials are source-origin-free and describe LazyClaude in
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.13 install
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.13] | O4.8 โ”‚ ctx โ–„โ–‘โ–‘โ–‘โ–‘โ–‘ 9%/1000k โ”‚ 5h [โ–‘โ–‘โ–‘]4% โ”‚ 1w [โ–ˆโ–‘โ–‘]35% โ”‚ git main +3 โœ“
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.13-2ea44f" />
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.13` ๋ฐฐํฌ์šฉ์œผ๋กœ ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉ์ ์€ ๋‹ค๋ฅธ PC์—์„œ๋„
29
+ ํ˜„์žฌ checkout์€ `lazyclaude-ai@0.1.15` ๋ฐฐํฌ์šฉ์œผ๋กœ ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉ์ ์€ ๋‹ค๋ฅธ PC์—์„œ๋„
30
30
  ๋น ๋ฅด๊ฒŒ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ์ธ์šฉ ๋ฐฐํฌ๋ฌผ์ž…๋‹ˆ๋‹ค. ์ €์žฅ์†Œ๋Š” ๋น„๊ณต๊ฐœ ์ €์žฅ์†Œ๋กœ
31
31
  ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , npm ๋ฐฐํฌ๊ฐ€ ๊ณง ํ™๋ณด, ๊ณต๊ฐœ ์ €์žฅ์†Œ ์šด์˜, Claude marketplace
32
32
  ๋“ฑ๋ก์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „ ๋ฐฐํฌ๋Š” ํ•ญ์ƒ ๋ณ„๋„์˜ ๋ช…์‹œ์  ์Šน์ธ ํ›„์—
33
33
  ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
34
- v0.1.13 release material์€ source-origin-free ์ƒํƒœ์ด๋ฉฐ LazyClaude ์ž์ฒด์˜
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.13 install
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.13] | O4.8 โ”‚ ctx โ–„โ–‘โ–‘โ–‘โ–‘โ–‘ 9%/1000k โ”‚ 5h [โ–‘โ–‘โ–‘]4% โ”‚ 1w [โ–ˆโ–‘โ–‘]35% โ”‚ git main +3 โœ“
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
@@ -1,8 +1,11 @@
1
1
  # LazyClaude Release Checklist
2
2
 
3
- Status: this checkout is prepared for quiet public npm package
4
- `lazyclaude-ai@0.1.13` after explicit user approval. Versions `0.1.11` and
5
- `0.1.12` already exist on npm and cannot be published again.
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
@@ -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 hudCommandForPlugin = (pluginPath) => `node "${join(pluginPath, "bin", "lazyclaude-hud.js")}"`;
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 command = hudCommandForPlugin(pluginPath);
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("HUD: LazyClaude statusLine installed\n");
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazyclaude-ai",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "Claude Code-native workflow distribution.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lazyclaude",
3
3
  "description": "Claude Code-native workflow plugin.",
4
- "version": "0.1.13",
4
+ "version": "0.1.15",
5
5
  "author": {
6
6
  "name": "LazyClaude contributors"
7
7
  },
@@ -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: "\x1b[38;5;81m",
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
  });