@litfamily/litopencode 1.0.22 β†’ 1.0.24

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
@@ -5,6 +5,14 @@ are tracked separately from this product history.
5
5
 
6
6
  ## Unreleased
7
7
 
8
+ ## 1.0.24 - 2026-10-14
9
+
10
+ - The LIT card, the chip beside the prompt, the sidebar panel and the home line now wear the LIT colours in every OpenCode theme: the `πŸ”₯ LIT` pill runs from pink to flame, the workflow map ramps from flame through pink to the LIT accent, the running stage and the current skills are accent pills, and warnings and the finished state use LIT amber and green. Text, panels and borders still follow your theme, and on a light theme the LIT colours deepen so they stay readable. The README pictures of the card show the new look.
11
+
12
+ ## 1.0.23 - 2026-10-13
13
+
14
+ - The README demo on GitHub is a new film of one real OpenCode turn with the workflow map. A numbered label names each part as it appears: the `lit` word, the LIT IGNITED toast, the card's map skipping interview and plan to light WORK, the new test, the running tool and its time beside the map (`bash Β· 0:00` while `npm test` runs), the passing test run and the card settling to IDLE when the turn ends. It still plays without music.
15
+
8
16
  ## 1.0.22 - 2026-10-13
9
17
 
10
18
  - The LIT card, the chip beside the prompt and the sidebar now show where you are in the workflow, not only which skill ran. A map runs `interview β€Ί plan β€Ί work β€Ί review β€Ί done` and lights the step you are on with its count, such as `WORK 3/7` while `/start-work` works through a saved plan. A lit-loop goal counts its criteria instead (`CRITERION 1/3`), and a litresearch run follows its own steps from `decompose` through each `wave` to `synthesis`. A step the request went past without doing shows `–`. The sidebar draws the map top to bottom with a line that fills as you move forward.
package/README-Ko-KR.md CHANGED
@@ -1,13 +1,13 @@
1
- <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/assets/cover-motion.webp" width="100%" alt="LitFamily λͺ¨μ…˜ 컀버: λ‹€μ„― λ‘œλ΄‡ νŒ¨λ„μ΄ μ°¨λ‘€λ‘œ μΌœμ§€κ³ , LitOpenCode λ‘œλ΄‡μ˜ 눈과 ν…Œλ‘λ¦¬κ°€ λΉ›λ‚œ λ’€ LITFAMILY와 KEEP THE WORK LIT. 문ꡬ가 λ°μ•„μ§€λŠ” μ˜μƒ" /></picture></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/assets/cover-motion.webp" width="100%" alt="LitFamily λͺ¨μ…˜ 컀버: λ‹€μ„― λ‘œλ΄‡ νŒ¨λ„μ΄ μ°¨λ‘€λ‘œ μΌœμ§€κ³ , LitOpenCode λ‘œλ΄‡μ˜ 눈과 ν…Œλ‘λ¦¬κ°€ λΉ›λ‚œ λ’€ LITFAMILY와 KEEP THE WORK LIT. 문ꡬ가 λ°μ•„μ§€λŠ” μ˜μƒ" /></picture></p>
2
2
 
3
3
  # LitOpenCode
4
4
 
5
5
  **LitOpenCodeλŠ” OpenCode용 μ›Œν¬ν”Œλ‘œ ν”ŒλŸ¬κ·ΈμΈμž…λ‹ˆλ‹€. ν”„λ‘¬ν”„νŠΈμ— `lit`만 뢙이면 κ³„νšν•˜κ³ , λ§Œλ“€κ³ , ν™•μΈν•˜κ³ , κΈ°λ‘κΉŒμ§€ λ‚¨κ²¨μ„œ λ‹€μŒ μ„Έμ…˜μ΄ μ–΄λ””μ„œ λ©ˆμ·„λŠ”μ§€ λ°”λ‘œ μ••λ‹ˆλ‹€.**
6
6
 
7
7
  <p align="center">
8
- <a href="https://www.npmjs.com/package/@litfamily/litopencode"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/assets/readme/badge-version.svg" alt="1.0.22" /></a>
8
+ <a href="https://www.npmjs.com/package/@litfamily/litopencode"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/assets/readme/badge-version.svg" alt="1.0.24" /></a>
9
9
  <a href="https://www.npmjs.com/package/@litfamily/litopencode"><img src="https://img.shields.io/npm/dm/@litfamily/litopencode?label=downloads&color=D7F75B" alt="μ›”κ°„ npm λ‹€μš΄λ‘œλ“œ 수" /></a>
10
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/assets/readme/badge-license.svg" alt="MIT λΌμ΄μ„ μŠ€" /></a>
10
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/assets/readme/badge-license.svg" alt="MIT λΌμ΄μ„ μŠ€" /></a>
11
11
  <a href="https://github.com/wjgoarxiv/litopencode"><img src="https://img.shields.io/github/stars/wjgoarxiv/litopencode?style=social" alt="GitHub μŠ€νƒ€" /></a>
12
12
  </p>
13
13
 
@@ -57,9 +57,9 @@ npm uninstall -g @litfamily/litopencode
57
57
  ## 더 보기
58
58
 
59
59
  - [GitHub의 μ‚¬μš© μ•ˆλ‚΄](https://github.com/wjgoarxiv/litopencode/blob/main/docs/guide-Ko-KR.md): μ„€μΉ˜ μ˜΅μ…˜, μžλ™ μΈμˆ˜μΈκ³„, 문제 ν•΄κ²°, 제거
60
- - [μ›Œν¬ν”Œλ‘œ 상세 μ•ˆλ‚΄](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/reference-Ko-KR.md) Β· [English reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/reference.md)
61
- - [λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ•ˆλ‚΄](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/migration.md) Β· [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/CHANGELOG.md) Β· [κ°œμΈμ •λ³΄μ™€ λ„€νŠΈμ›Œν¬ λ™μž‘](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/privacy.md)
62
- - [LitFamily ν—ˆλΈŒ](https://github.com/wjgoarxiv/litfamily) Β· [MIT λΌμ΄μ„ μŠ€](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/LICENSE) Β· [ASCII κΈ€κΌ΄ λΌμ΄μ„ μŠ€](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/assets/readme/JetBrainsMono-OFL.txt)
60
+ - [μ›Œν¬ν”Œλ‘œ 상세 μ•ˆλ‚΄](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/reference-Ko-KR.md) Β· [English reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/reference.md)
61
+ - [λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ•ˆλ‚΄](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/migration.md) Β· [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/CHANGELOG.md) Β· [κ°œμΈμ •λ³΄μ™€ λ„€νŠΈμ›Œν¬ λ™μž‘](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/privacy.md)
62
+ - [LitFamily ν—ˆλΈŒ](https://github.com/wjgoarxiv/litfamily) Β· [MIT λΌμ΄μ„ μŠ€](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/LICENSE) Β· [ASCII κΈ€κΌ΄ λΌμ΄μ„ μŠ€](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/assets/readme/JetBrainsMono-OFL.txt)
63
63
 
64
64
  <details>
65
65
  <summary>ASCII 둜고 볡사</summary>
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
- <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitOpenCode robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
1
+ <p align="center"><picture><source media="(prefers-reduced-motion: reduce)" srcset="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/assets/cover-motion-still.webp" /><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/assets/cover-motion.webp" width="100%" alt="LitFamily motion cover: five armored robots power on one by one, the LitOpenCode robot wakes with glowing eyes and a lit frame, then LITFAMILY and KEEP THE WORK LIT. light up." /></picture></p>
2
2
 
3
3
  # LitOpenCode
4
4
 
5
5
  **LitOpenCode is a workflow plugin for OpenCode. Add `lit` to a prompt and the work gets planned, built, checked and written down, so the next session knows where you stopped.**
6
6
 
7
7
  <p align="center">
8
- <a href="https://www.npmjs.com/package/@litfamily/litopencode"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/assets/readme/badge-version.svg" alt="1.0.22" /></a>
8
+ <a href="https://www.npmjs.com/package/@litfamily/litopencode"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/assets/readme/badge-version.svg" alt="1.0.24" /></a>
9
9
  <a href="https://www.npmjs.com/package/@litfamily/litopencode"><img src="https://img.shields.io/npm/dm/@litfamily/litopencode?label=downloads&color=D7F75B" alt="npm downloads per month" /></a>
10
- <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
10
+ <a href="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/LICENSE"><img src="https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/assets/readme/badge-license.svg" alt="MIT license" /></a>
11
11
  <a href="https://github.com/wjgoarxiv/litopencode"><img src="https://img.shields.io/github/stars/wjgoarxiv/litopencode?style=social" alt="GitHub stars" /></a>
12
12
  </p>
13
13
 
@@ -57,9 +57,9 @@ npm uninstall -g @litfamily/litopencode
57
57
  ## More
58
58
 
59
59
  - [Guide on GitHub](https://github.com/wjgoarxiv/litopencode/blob/main/docs/guide.md): install options, automatic handoff, troubleshooting and removal.
60
- - [Workflow reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/reference.md)
61
- - [Migration notes](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/migration.md) Β· [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/CHANGELOG.md) Β· [Privacy and network behavior](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/privacy.md)
62
- - [LitFamily hub](https://github.com/wjgoarxiv/litfamily) Β· [MIT license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/LICENSE) Β· [ASCII font license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.22/docs/assets/readme/JetBrainsMono-OFL.txt)
60
+ - [Workflow reference](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/reference.md)
61
+ - [Migration notes](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/migration.md) Β· [Changelog](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/CHANGELOG.md) Β· [Privacy and network behavior](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/privacy.md)
62
+ - [LitFamily hub](https://github.com/wjgoarxiv/litfamily) Β· [MIT license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/LICENSE) Β· [ASCII font license](https://cdn.jsdelivr.net/npm/@litfamily/litopencode@1.0.24/docs/assets/readme/JetBrainsMono-OFL.txt)
63
63
 
64
64
  <details>
65
65
  <summary>Copy ASCII logo</summary>
@@ -23,7 +23,7 @@ export type NotifyOptions = {
23
23
  */
24
24
  export declare function readNotifyOptions(options: unknown): NotifyOptions;
25
25
  /**
26
- * The skill chips row, exactly `width` cells: bright accent pills for the current request first, then
26
+ * The skill chips row, exactly `width` cells: bright LIT accent pills for the current request first, then
27
27
  * dim recent names, and `+N` for the ones that do not fit. The label goes before any chip does.
28
28
  */
29
29
  export declare function skillRow(chips: readonly SkillChip[], shimmer: ChipShimmer | undefined, palette: MissionPalette, width: number): Line;
@@ -130,7 +130,7 @@ function phaseLabel(view, frame, palette, rest) {
130
130
  return { text: `● ${stepName(view.phase, view).toUpperCase()}`, fg: palette.info, bold: true };
131
131
  }
132
132
  function topLine(view, frame, palette, width, border, rest) {
133
- const brand = [{ text: "πŸ”₯ ", fg: palette.text }, { text: "LIT", fg: shine(palette.primary, palette, 0.5, shimmerAt(frame), 0.6), bold: true }];
133
+ const brand = [{ text: "πŸ”₯ ", fg: palette.text }, { text: "LIT", fg: shine(palette.secondary, palette, 0.5, shimmerAt(frame), 0.6), bold: true }];
134
134
  const name = view.active ? view.discipline : "ready";
135
135
  const right = [phaseLabel(view, frame, palette, rest)];
136
136
  const withName = (room) => [...brand, { text: " Β· ", fg: palette.muted }, { text: truncateCells(name, room), fg: view.active ? palette.text : palette.muted }];
@@ -237,12 +237,12 @@ function chipSegments(chip, shimmer, palette) {
237
237
  return [{ text, fg: palette.muted, ...(palette.element === undefined ? {} : { bg: palette.element }) }];
238
238
  const sweep = shimmer?.names.includes(chip.name) === true ? shimmer.sweep : -1;
239
239
  if (sweep < 0)
240
- return [{ text, fg: palette.onFill, bg: palette.accent, bold: true }];
240
+ return [{ text, fg: palette.onFill, bg: palette.fill, bold: true }];
241
241
  const chars = [...text];
242
- return chars.map((char, index) => ({ text: char, fg: palette.onFill, bg: shine(palette.accent, palette, index / (chars.length - 1), sweep, 0.3), bold: true }));
242
+ return chars.map((char, index) => ({ text: char, fg: palette.onFill, bg: shine(palette.fill, palette, index / (chars.length - 1), sweep, 0.3), bold: true }));
243
243
  }
244
244
  /**
245
- * The skill chips row, exactly `width` cells: bright accent pills for the current request first, then
245
+ * The skill chips row, exactly `width` cells: bright LIT accent pills for the current request first, then
246
246
  * dim recent names, and `+N` for the ones that do not fit. The label goes before any chip does.
247
247
  */
248
248
  export function skillRow(chips, shimmer, palette, width) {
@@ -25,6 +25,9 @@ export type MissionPalette = {
25
25
  readonly element?: string;
26
26
  /** What fades and tints mix toward: the panel, else the background, else a neutral for the mode. */
27
27
  readonly mixBase: string;
28
+ /** The running stage's pill and the current skill chip, and that pill on a warning: bright in every mode. */
29
+ readonly fill: string;
30
+ readonly fillWarn: string;
28
31
  /** Text drawn on a filled pill. */
29
32
  readonly onFill: string;
30
33
  };
@@ -34,8 +37,9 @@ export declare const panelInnerWidth: number;
34
37
  /** Theme tokens arrive as RGBA objects; plain hex strings pass through. Alpha is ignored here. */
35
38
  export declare function colorToHex(value: unknown, fallback: string): string;
36
39
  /**
37
- * Builds the palette from `api.theme.current`. A surface token with alpha 0 (the system and
38
- * lucent-orng themes) means "draw no background", never black.
40
+ * Builds the palette from `api.theme.current`: the LIT signature colours for the brand, the map ramp,
41
+ * the pills, the bar and the state colours, over the theme's text, muted text, fills and borders.
42
+ * A surface token with alpha 0 (the system and lucent-orng themes) means "draw no background", never black.
39
43
  */
40
44
  export declare function paletteFromTheme(theme: Record<string, unknown> | undefined, mode?: "dark" | "light"): MissionPalette;
41
45
  /**
@@ -62,7 +66,7 @@ export declare function shimmerAt(frame: MotionFrame): number;
62
66
  * primary-to-accent gradient. The empty track is a thin muted rule, never a dither.
63
67
  */
64
68
  export declare function progressBar(ratio: number, cells: number, palette: MissionPalette, sweep?: number): Segment[];
65
- /** The stage colour ramp: the theme's primary through secondary to accent, so every theme keeps its own feel. */
69
+ /** The stage colour ramp: LIT flame through pink to the LIT accent. */
66
70
  export declare function stageColor(index: number, count: number, palette: MissionPalette): string;
67
71
  /** A light pass over the running stage: once when the map moves forward, and during the completion moment. */
68
72
  export declare function stageFlash(frame: MotionFrame): number;
@@ -3,6 +3,16 @@
3
3
  // renders as spans. Every frame of motion is drawn from a MotionFrame, so all of it is testable here.
4
4
  import { ease, mixHex, rowEntryStart, seg, slideIn, motionTiming } from "./mission-motion.js";
5
5
  import { currentStepIndex, missionRowKeys, missionStatus, stepName } from "./mission-model.js";
6
+ /**
7
+ * The LIT signature colours. Dark themes use them as they are; light themes deepen the colours drawn
8
+ * as text within the same hue so words stay readable, while pill fills keep the bright signature with
9
+ * dark ink in both modes.
10
+ */
11
+ const litColors = {
12
+ dark: { flame: "#ff6337", pink: "#ff2d95", accent: "#5fd7ff", green: "#6bdb8f", amber: "#ffaf3c", red: "#ff5f5f" },
13
+ light: { flame: "#e2521f", pink: "#d81b78", accent: "#0a87b8", green: "#1f9d55", amber: "#b86e00", red: "#d93a3a" },
14
+ ink: "#0b0f14"
15
+ };
6
16
  /** Panel box width in cells, and the content width inside its border and one cell of padding per side. */
7
17
  export const panelWidth = 36;
8
18
  export const panelInnerWidth = panelWidth - 4;
@@ -34,8 +44,9 @@ export function colorToHex(value, fallback) {
34
44
  return readColor(value)?.hex ?? fallback;
35
45
  }
36
46
  /**
37
- * Builds the palette from `api.theme.current`. A surface token with alpha 0 (the system and
38
- * lucent-orng themes) means "draw no background", never black.
47
+ * Builds the palette from `api.theme.current`: the LIT signature colours for the brand, the map ramp,
48
+ * the pills, the bar and the state colours, over the theme's text, muted text, fills and borders.
49
+ * A surface token with alpha 0 (the system and lucent-orng themes) means "draw no background", never black.
39
50
  */
40
51
  export function paletteFromTheme(theme, mode = "dark") {
41
52
  const pick = (key, fallback) => colorToHex(theme?.[key], fallback);
@@ -47,14 +58,15 @@ export function paletteFromTheme(theme, mode = "dark") {
47
58
  const panel = surface("backgroundPanel");
48
59
  const element = surface("backgroundElement");
49
60
  const neutral = mode === "light" ? "#f2f2f2" : "#1c1c1c";
61
+ const lit = litColors[mode];
50
62
  return {
51
- primary: pick("primary", "#ff6337"),
52
- secondary: pick("secondary", "#ff2d95"),
53
- accent: pick("accent", "#b48cff"),
54
- info: pick("info", "#0aa6c2"),
55
- warning: pick("warning", "#ffaf3c"),
56
- success: pick("success", "#6bdb8f"),
57
- error: pick("error", "#ff5f5f"),
63
+ primary: lit.flame,
64
+ secondary: lit.pink,
65
+ accent: lit.accent,
66
+ info: lit.accent,
67
+ warning: lit.amber,
68
+ success: lit.green,
69
+ error: lit.red,
58
70
  text: pick("text", "#e6edf3"),
59
71
  muted: pick("textMuted", "#7d8590"),
60
72
  borderActive: pick("borderActive", "#484f58"),
@@ -63,7 +75,9 @@ export function paletteFromTheme(theme, mode = "dark") {
63
75
  ...(panel === undefined ? {} : { panel }),
64
76
  ...(element === undefined ? {} : { element }),
65
77
  mixBase: panel ?? background ?? neutral,
66
- onFill: background ?? panel ?? (mode === "light" ? "#ffffff" : "#0b0b0b")
78
+ fill: litColors.dark.accent,
79
+ fillWarn: litColors.dark.amber,
80
+ onFill: litColors.ink
67
81
  };
68
82
  }
69
83
  /**
@@ -183,7 +197,7 @@ export function progressBar(ratio, cells, palette, sweep = -1) {
183
197
  segments.push({ text: "─".repeat(cells - used), fg: palette.borderSubtle });
184
198
  return segments;
185
199
  }
186
- /** The stage colour ramp: the theme's primary through secondary to accent, so every theme keeps its own feel. */
200
+ /** The stage colour ramp: LIT flame through pink to the LIT accent. */
187
201
  export function stageColor(index, count, palette) {
188
202
  return gradientAt([palette.primary, palette.secondary, palette.accent], count <= 1 ? 0 : index / (count - 1));
189
203
  }
@@ -218,7 +232,7 @@ function pillStyle(state, palette, warn) {
218
232
  if (state === "todo" || state === "skip")
219
233
  return { fg: palette.muted, ...(palette.panel === undefined ? {} : { bg: palette.panel }), bold: false };
220
234
  const level = state === "warn" ? Math.max(warn, 0.5) : warn;
221
- return { fg: palette.onFill, bg: mixHex(palette.info, palette.warning, level), bold: true };
235
+ return { fg: palette.onFill, bg: mixHex(palette.fill, palette.fillWarn, level), bold: true };
222
236
  }
223
237
  /** A light pass over the running stage: once when the map moves forward, and during the completion moment. */
224
238
  export function stageFlash(frame) {
@@ -265,7 +279,7 @@ export function crumb(view, index, frame, palette, bar, flash = -1) {
265
279
  const chars = [...label];
266
280
  const pill = flash < 0
267
281
  ? [{ text: label, fg: style.fg, ...(style.bg === undefined ? {} : { bg: style.bg }), bold: style.bold }]
268
- : chars.map((char, position) => ({ text: char, fg: style.fg, bg: shine(style.bg ?? palette.info, palette, position / (chars.length - 1), flash, 0.3), bold: true }));
282
+ : chars.map((char, position) => ({ text: char, fg: style.fg, bg: shine(style.bg ?? palette.fill, palette, position / (chars.length - 1), flash, 0.3), bold: true }));
269
283
  if (!counted)
270
284
  return pill;
271
285
  return [...pill, ...(bar > 0 ? [{ text: " ", fg: palette.muted }, ...microBar(frame.barRatio, palette, bar)] : []), { text: ` ${countText(view)}`, fg: palette.text, bold: true }];
@@ -292,9 +306,13 @@ export function liveSegments(view, frame, palette, room) {
292
306
  { text: time, fg: palette.muted }
293
307
  ];
294
308
  }
309
+ /** The `πŸ”₯ LIT` pill: LIT pink to flame across its cells with dark ink, bright on light themes too. */
295
310
  function brandPill(palette, sweep) {
296
311
  const chars = [" ", "πŸ”₯", " ", "L", "I", "T", " "];
297
- return chars.map((char, index) => ({ text: char, fg: palette.onFill, bg: shine(palette.primary, palette, index / (chars.length - 1), sweep, 0.3), bold: true }));
312
+ return chars.map((char, index) => {
313
+ const position = index / (chars.length - 1);
314
+ return { text: char, fg: palette.onFill, bg: shine(mixHex(litColors.dark.pink, litColors.dark.flame, position), palette, position, sweep, 0.3), bold: true };
315
+ });
298
316
  }
299
317
  /**
300
318
  * The chip's groups for a tier. The full tier is the brand and the breadcrumb around the running stage
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="release: 1.0.22"><title>release: 1.0.22</title><g shape-rendering="crispEdges"><rect width="49" height="20" fill="#080d14"/><rect x="49" width="97" height="20" fill="#ff6337"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="255" y="140" textLength="390" transform="scale(.1)">release</text><text x="965" y="140" textLength="870" transform="scale(.1)" fill="#080D14">1.0.22</text></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="release: 1.0.24"><title>release: 1.0.24</title><g shape-rendering="crispEdges"><rect width="49" height="20" fill="#080d14"/><rect x="49" width="97" height="20" fill="#ff6337"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text x="255" y="140" textLength="390" transform="scale(.1)">release</text><text x="965" y="140" textLength="870" transform="scale(.1)" fill="#080D14">1.0.24</text></g></svg>
@@ -269,8 +269,8 @@ OpenCode 1.18은 `tui.json`μ΄λ‚˜ `tui.jsonc`의 `plugin` 배열에 적힌 TUI
269
269
  단계λ₯Ό κ±΄λ„ˆλ›΄ κ²ƒμœΌλ‘œ 보여 μ£Όκ³ , ν–ˆλ‹€κ³  ν‘œμ‹œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. `review-work` 없이 ν•  일만 λͺ¨λ‘ 끝내도
270
270
  reviewλŠ” `–`둜 λ‚¨μŠ΅λ‹ˆλ‹€. 리뷰 λͺ…λ Ή, 리뷰 λ§‰νž˜, ledger CLI둜 끝낸 λͺ©ν‘œ(μ™„λ£Œ 관문이 리뷰λ₯Ό 포함함)κ°€ μžˆμ–΄μ•Ό
271
271
  μ™„λ£Œλ‘œ λ°”λ€λ‹ˆλ‹€. μ—μ΄μ „νŠΈκ°€ 직접 μ“΄ `goals.json`μ—μ„œ 끝났닀고 ν‘œμ‹œν•œ λͺ©ν‘œλŠ” 관문을 κ±°μΉ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ
272
- reviewλ₯Ό `–`둜 λ‘‘λ‹ˆλ‹€. μ§€λ‚˜μ˜¨ λ‹¨κ³„λŠ” ν…Œλ§ˆμ˜ primaryμ—μ„œ
273
- secondaryλ₯Ό 거쳐 accent둜 κ°€λŠ” 색을 μ°¨λ‘€λ‘œ λ°›κ³ , μ•žμœΌλ‘œ ν•  λ‹¨κ³„λŠ” 흐리게 κ·Έλ¦½λ‹ˆλ‹€.
272
+ reviewλ₯Ό `–`둜 λ‘‘λ‹ˆλ‹€. μ§€λ‚˜μ˜¨ λ‹¨κ³„λŠ” LIT λΆˆκ½ƒμƒ‰μ—μ„œ
273
+ 뢄홍색을 거쳐 LIT accent둜 κ°€λŠ” 색을 μ°¨λ‘€λ‘œ λ°›κ³ , μ•žμœΌλ‘œ ν•  λ‹¨κ³„λŠ” 흐리게 κ·Έλ¦½λ‹ˆλ‹€.
274
274
  - μž…λ ₯μ°½ μ•„λž˜ agent/model 쀄 였λ₯Έμͺ½μ˜ 지도 μΉ©: `πŸ”₯ LIT` μ•Œμ•½ 뒀에 μ§€κΈˆ 단계 μ•žλ’€λ₯Ό 이어 μ“΄
275
275
  `plan βœ“ β€Ί WORK β–°β–°β–°β–±β–±β–±β–± 3/7 β€Ί review`κ°€ λΆ™μŠ΅λ‹ˆλ‹€. μ§€κΈˆ λ‹¨κ³„λŠ” μ±„μš΄ μ•Œμ•½κ³Ό 일곱 μΉΈ λ§‰λŒ€λ‘œ λ³΄μž…λ‹ˆλ‹€.
276
276
  μžλ¦¬κ°€ λ„‰λ„‰ν•˜λ©΄ μ§€κΈˆ ν•˜λŠ” 일(`β Ή bash Β· 0:48`)이 λ’€λ”°λ¦…λ‹ˆλ‹€. μžλ¦¬κ°€ 쒁으면 μ§€κΈˆ ν•˜λŠ” 일을 λ¨Όμ € λΉΌκ³ ,
@@ -278,8 +278,8 @@ OpenCode 1.18은 `tui.json`μ΄λ‚˜ `tui.jsonc`의 `plugin` 배열에 적힌 TUI
278
278
  개수만 λ‚¨κΉλ‹ˆλ‹€. μžλ¦¬λŠ” OpenCode에 μ €μž₯된 μ‚¬μ΄λ“œλ°” μ„€μ •κ³Ό μ„Έμ…˜ μ’…λ₯˜(ν•˜μœ„ μ„Έμ…˜μ—λŠ” μ‚¬μ΄λ“œλ°”κ°€
279
279
  μ—†μŒ)둜 κ³„μ‚°ν•©λ‹ˆλ‹€. 섀정을 아직 읽을 수 μ—†μœΌλ©΄ μ‚¬μ΄λ“œλ°”κ°€ μ—΄λ € μžˆλ‹€κ³  보고 쒁게 μž‘μŠ΅λ‹ˆλ‹€.
280
280
  - μ„Έμ…˜ μ‚¬μ΄λ“œλ°” 맨 μœ„μ˜ λ―Έμ…˜ νŒ¨λ„: 36칸짜리 λ‘₯κ·Ό μƒμžμ΄κ³ , μœ„ ν…Œλ‘λ¦¬μ— `πŸ”₯ LIT β–Έ <단계>`, μ•„λž˜
281
- ν…Œλ‘λ¦¬μ— `n/m criteria`κ°€ λΆ™μŠ΅λ‹ˆλ‹€. ν…Œλ‘λ¦¬ 색이 μƒνƒœλ₯Ό 보여 μ€λ‹ˆλ‹€. μΌν•˜λŠ” μ€‘μ—λŠ” ν…Œλ§ˆ accent,
282
- κ²½κ³ κ°€ 있으면 warning, λλ‚˜λ©΄ success μƒ‰μž…λ‹ˆλ‹€. μ•ˆμ—λŠ” 두 μ€„μ§œλ¦¬ `LIT`κ³Ό κ·Έ μ˜†μ˜ μž‘μ—… μ΄λ¦„Β·μƒνƒœ,
281
+ ν…Œλ‘λ¦¬μ— `n/m criteria`κ°€ λΆ™μŠ΅λ‹ˆλ‹€. ν…Œλ‘λ¦¬ 색이 μƒνƒœλ₯Ό 보여 μ€λ‹ˆλ‹€. μΌν•˜λŠ” μ€‘μ—λŠ” LIT accent,
282
+ κ²½κ³ κ°€ 있으면 LIT ν˜Έλ°•μƒ‰, λλ‚˜λ©΄ LIT μ΄ˆλ‘μƒ‰μž…λ‹ˆλ‹€. μ•ˆμ—λŠ” 두 μ€„μ§œλ¦¬ `LIT`κ³Ό κ·Έ μ˜†μ˜ μž‘μ—… μ΄λ¦„Β·μƒνƒœ,
283
283
  ꡡ은 λͺ©ν‘œ 제λͺ©, μ„Έλ‘œ 단계 지도가 λ“€μ–΄κ°‘λ‹ˆλ‹€. μ§€λ„μ—μ„œ μ§€λ‚œ λ‹¨κ³„λŠ” `β—†`, μ§€κΈˆ λ‹¨κ³„λŠ” ꡡ은 `β—‰`,
284
284
  κ²½κ³ κ°€ κ±Έλ¦° λ‹¨κ³„λŠ” `βš‘`, 남은 λ‹¨κ³„λŠ” `β—‡`μž…λ‹ˆλ‹€. μ§€κΈˆ λ‹¨κ³„κΉŒμ§€λŠ” 단계 μƒ‰μ˜ `┃`둜, κ·Έ λ’€λ‘œλŠ” 점선
285
285
  `┆`둜 μž‡κ³ , plan μ˜†μ—λŠ” μ €μž₯된 κ³„νšμ˜ ν•  일 수, work μ˜†μ—λŠ” `iter k`λ₯Ό μ μŠ΅λ‹ˆλ‹€. κ·Έ μ•„λž˜λ‘œ 1/8μΉΈ
@@ -298,7 +298,7 @@ OpenCode 1.18은 `tui.json`μ΄λ‚˜ `tui.jsonc`의 `plugin` 배열에 적힌 TUI
298
298
  일과 `β–Έ λ‹€μŒ 일` μžλ¦¬μ— `βš‘ <λ‚΄μš©>`이 λ“€μ–΄κ°‘λ‹ˆλ‹€. μ‰¬λŠ” μ„Έμ…˜μ—μ„œλŠ” 흐린 지도 μ˜†μ— ν”„λ‘œμ νŠΈμ˜
299
299
  λ§ˆμ§€λ§‰ λͺ©ν‘œλ₯Ό, λͺ©ν‘œκ°€ μ—†μœΌλ©΄ `add lit to a prompt to start`λ₯Ό 보여 μ€λ‹ˆλ‹€.
300
300
  - λ‘˜μ§Έ 쀄은 μŠ€ν‚¬ μΉ©μž…λ‹ˆλ‹€. μ„Έμ…˜μ—μ„œ μ‹€ν–‰λœ LitOpenCode μŠ€ν‚¬μ΄ μ—¬λŸ¬ 개 ν•¨κ»˜ λ³΄μž…λ‹ˆλ‹€. μ§€κΈˆ μš”μ²­μ—μ„œ
301
- μ‹€ν–‰λœ μŠ€ν‚¬μ€ μš”μ²­μ΄ λ„λŠ” λ™μ•ˆ accent 색 μ•Œμ•½μœΌλ‘œ 밝게 보이고, μƒˆλ‘œ λ“€μ–΄μ˜¨ μΉ©μ—λŠ” 빛이 짧게 ν•œ 번
301
+ μ‹€ν–‰λœ μŠ€ν‚¬μ€ μš”μ²­μ΄ λ„λŠ” λ™μ•ˆ LIT accent 색 μ•Œμ•½μœΌλ‘œ 밝게 보이고, μƒˆλ‘œ λ“€μ–΄μ˜¨ μΉ©μ—λŠ” 빛이 짧게 ν•œ 번
302
302
  μ§€λ‚˜κ°‘λ‹ˆλ‹€. 턴이 λλ‚˜λ©΄ 흐렀져 졜근 λͺ©λ‘μœΌλ‘œ 남고(졜근 것이 μ•ž), λ‹€μ‹œ μ‹€ν–‰λ˜λ©΄ λ‹€μ‹œ λ°μ•„μ§‘λ‹ˆλ‹€.
303
303
  μžλ¦¬κ°€ λͺ¨μžλΌλ©΄ 남은 칩을 `+N`으둜 μ ‘μŠ΅λ‹ˆλ‹€.
304
304
  - μ•„λž˜ ν…Œλ‘λ¦¬μ—λŠ” context μ‚¬μš©λŸ‰(75%λΆ€ν„° μ£Όν™©), 첫 lit ν„΄λΆ€ν„° μ§€λ‚œ μ‹œκ°„(`⟳ 7m`), git λΈŒλžœμΉ˜κ°€
@@ -310,8 +310,8 @@ OpenCode 1.18은 `tui.json`μ΄λ‚˜ `tui.jsonc`의 `plugin` 배열에 적힌 TUI
310
310
  λ„˜κΈ°μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. μ™„λ£Œ μˆœκ°„λ„ μ—¬κΈ°μ„œ ν•¨κ»˜ λ³΄μž…λ‹ˆλ‹€.
311
311
  - ν™ˆ ν™”λ©΄ μž…λ ₯μ°½ μ•„λž˜, OpenCode 팁 λ‹€μŒ 쀄: `πŸ”₯ lit ready Β· last: <λͺ©ν‘œ> βœ“ n/m`. ν”„λ‘œμ νŠΈ ledger에
312
312
  λͺ©ν‘œκ°€ μžˆμ„ λ•Œλ§Œ λ³΄μž…λ‹ˆλ‹€.
313
- - κ²½κ³ λŠ” μƒ‰λ§Œ λ°”κΎΈμ§€ μ•Šκ³  늘 `βš‘`와 κΈ€μžλ₯Ό ν•¨κ»˜ λΆ™μž…λ‹ˆλ‹€. accent와 warning이 같은 색인 ν…Œλ§ˆκ°€ 있기
314
- λ•Œλ¬Έμž…λ‹ˆλ‹€. μ•ŒνŒŒκ°€ 0인 ν…Œλ§ˆ 바탕(system, lucent-orng)은 κ²€κ²Œ μΉ ν•˜μ§€ μ•Šκ³  λΉ„μ›Œ λ‘‘λ‹ˆλ‹€.
313
+ - κ²½κ³ λŠ” μƒ‰λ§Œ λ°”κΎΈμ§€ μ•Šκ³  늘 `βš‘`와 κΈ€μžλ₯Ό ν•¨κ»˜ λΆ™μž…λ‹ˆλ‹€. 색이 없어도 λ˜‘κ°™μ΄ 읽히게 ν•˜λ €λŠ”
314
+ κ²ƒμž…λ‹ˆλ‹€. μ•ŒνŒŒκ°€ 0인 ν…Œλ§ˆ 바탕(system, lucent-orng)은 κ²€κ²Œ μΉ ν•˜μ§€ μ•Šκ³  λΉ„μ›Œ λ‘‘λ‹ˆλ‹€.
315
315
  - κ΄€λ¬Έ μ‚¬κ±΄λ§ˆλ‹€ ν† μŠ€νŠΈ ν•˜λ‚˜: κ³„νš μ €μž₯ λ˜λŠ” μ €μž₯ μ‹€νŒ¨, λͺ©ν‘œ μ„€μ •, κΈ°μ€€ 톡과, 리뷰 λ§‰νž˜κ³Ό ν•΄κ²°, μ™„λ£Œ.
316
316
  ν•œ λ²ˆμ— μ—¬λŸ¬ 사건이 생기면 κ°€μž₯ κΈ‰ν•œ 것 ν•˜λ‚˜λ‘œ ν•©μΉ©λ‹ˆλ‹€.
317
317
  - λͺ©ν‘œκ°€ λλ‚˜κ±°λ‚˜, ν•  일이 λͺ¨λ‘ λλ‚˜κ±°λ‚˜, 쑰사 싀행이 λ³΄κ³ μ„œλ₯Ό μ“°λ©΄ 1.2초 μ•ˆμ— λλ‚˜λŠ” μ™„λ£Œ μˆœκ°„μ„
@@ -361,8 +361,15 @@ ease-out-back으둜 160msμ”©, 60ms κ°„κ²©μœΌλ‘œ λ“€μ–΄μ˜€κ³ , λ§‰λŒ€λŠ” 300ms에
361
361
  ν•œ 번 λΉ›λ‚©λ‹ˆλ‹€. 계속 λ„λŠ” μ›€μ§μž„μ€ μ—†μŠ΅λ‹ˆλ‹€. μ§€κΈˆ ν•˜λŠ” 일은 λ―Έλ„λŸ¬μ Έ λ“€μ–΄μ˜€μ§€ μ•Šκ³  μ œμžλ¦¬μ—μ„œ
362
362
  λ°”λ€Œλ©°, 도ꡬ가 λ„λŠ” λ™μ•ˆμ—λ§Œ κ±Έλ¦° μ‹œκ°„μ΄ 1μ΄ˆμ— ν•œ 번 λ°”λ€λ‹ˆλ‹€. λ„λŠ” 도ꡬ가 μ—†μœΌλ©΄ 타이머도
363
363
  μ—†μŠ΅λ‹ˆλ‹€. lit μ„Έμ…˜μ΄ μ—΄λ € μžˆλŠ” λ™μ•ˆλ§Œ 2μ΄ˆλ§ˆλ‹€ λͺ©ν‘œ ledger, λ²”μœ„ μž‘μ—… 기둝, 쑰사 폴더λ₯Ό λ‹€μ‹œ 읽고,
364
- μ‰¬λŠ” μ„Έμ…˜μ€ 읽지 μ•ŠμŠ΅λ‹ˆλ‹€. 색은 μ§€κΈˆ OpenCode
365
- ν…Œλ§ˆμ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€. μ›€μ§μž„μ„ 끄렀면 `tui.json`에 `["@litfamily/litopencode@<version>", { "motion": false }]`
364
+ μ‰¬λŠ” μ„Έμ…˜μ€ 읽지 μ•ŠμŠ΅λ‹ˆλ‹€.
365
+
366
+ LIT 뢀뢄은 μ–΄λ–€ ν…Œλ§ˆμ—μ„œλ“  LIT 색을 μ”λ‹ˆλ‹€. `πŸ”₯ LIT` μ•Œμ•½μ€ 뢄홍(`#ff2d95`)μ—μ„œ λΆˆκ½ƒμƒ‰(`#ff6337`)으둜
367
+ λ„˜μ–΄κ°€κ³ , 단계 색은 λΆˆκ½ƒμƒ‰, 뢄홍, LIT accent(`#5fd7ff`) μˆœμ„œλ‘œ μ΄μ–΄μ§‘λ‹ˆλ‹€. μ§€κΈˆ 단계와 μ§€κΈˆ μš”μ²­μ˜
368
+ μŠ€ν‚¬ 칩은 accent μ•Œμ•½μ΄κ³ , λ§‰λŒ€λŠ” λΆˆκ½ƒμƒ‰μ—μ„œ accent둜 κ°€λ©°, μƒνƒœ 색은 LIT ν˜Έλ°•μƒ‰(`#ffaf3c`),
369
+ μ΄ˆλ‘μƒ‰(`#6bdb8f`), 빨간색(`#ff5f5f`)μž…λ‹ˆλ‹€. μ•Œμ•½ κΈ€μžλŠ” 늘 μ–΄λ‘μš΄ 색(`#0b0f14`)μž…λ‹ˆλ‹€. κΈ€μž, 흐린 κΈ€μž, νŒ¨λ„κ³Ό
370
+ μš”μ†Œ 바탕, ν…Œλ‘λ¦¬, 투λͺ…ν•œ 바탕은 μ§€κΈˆ OpenCode ν…Œλ§ˆμ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€. 밝은 ν…Œλ§ˆμ—μ„œλŠ” μ•Œμ•½ 바탕을
371
+ 밝게 κ·ΈλŒ€λ‘œ 두고, κΈ€μžλ‘œ μ“°λŠ” LIT μƒ‰λ§Œ 같은 색쑰 μ•ˆμ—μ„œ μ§„ν•˜κ²Œ λ°”κΏ”(λΆˆκ½ƒμƒ‰ `#e2521f`, 뢄홍
372
+ `#d81b78`, accent `#0a87b8`, 초둝 `#1f9d55`, ν˜Έλ°•μƒ‰ `#b86e00`, λΉ¨κ°• `#d93a3a`) 흰 λ°”νƒ•μ—μ„œλ„ 읽히게 ν•©λ‹ˆλ‹€. μ›€μ§μž„μ„ 끄렀면 `tui.json`에 `["@litfamily/litopencode@<version>", { "motion": false }]`
366
373
  처럼 적고, ν”ŒλŸ¬κ·ΈμΈ 자체λ₯Ό 끄렀면 OpenCode ν”ŒλŸ¬κ·ΈμΈ κ΄€λ¦¬μžλ‚˜ `plugin_enabled`μ—μ„œ id `litopencode`λ₯Ό λ•λ‹ˆλ‹€.
367
374
 
368
375
  띠 섀정도 같은 μ˜΅μ…˜ 객체에 μ μŠ΅λ‹ˆλ‹€.
package/docs/reference.md CHANGED
@@ -372,7 +372,7 @@ What it draws:
372
372
  at `–`. A review command, a review blocker or a goal completed through the ledger CLI (whose gate
373
373
  includes review) marks it done; a goal the agent marks complete in a hand-written `goals.json`
374
374
  passed no gate and leaves review at `–`. Stages behind the running one take their place on a colour
375
- ramp from the theme's primary through secondary to accent; stages ahead are muted.
375
+ ramp from LIT flame through pink to the LIT accent; stages ahead are muted.
376
376
  - A map chip on the right of the prompt's agent/model row: a `πŸ”₯ LIT` pill and the breadcrumb around
377
377
  the running stage, `plan βœ“ β€Ί WORK β–°β–°β–°β–±β–±β–±β–± 3/7 β€Ί review`, with the running stage as a filled pill and a
378
378
  seven-cell bar. When the row has room the live step follows (`β Ή bash Β· 0:48`). Narrower, it drops
@@ -382,7 +382,7 @@ What it draws:
382
382
  read yet, the chip assumes the sidebar is open and stays narrower.
383
383
  - A mission panel at the top of the session sidebar, in a 36-cell rounded box titled
384
384
  `πŸ”₯ LIT β–Έ <STAGE>` with `n/m criteria` in the bottom border. The border carries the state: the
385
- theme accent while working, the warning colour on a warning, the success colour when complete.
385
+ LIT accent while working, LIT amber on a warning, LIT green when complete.
386
386
  Inside: a two-row `LIT` with the discipline and a status beside it, the goal title in bold, the
387
387
  vertical stage map (`β—†` behind, `β—‰` running in bold, `βš‘` flagged, `β—‡` ahead, joined by `┃`
388
388
  connectors in the ramp colour up to the running stage and dotted `┆` after it, with the saved
@@ -405,7 +405,7 @@ What it draws:
405
405
  warning is open, `βš‘ <text>` takes the place of the live step and `β–Έ next`. An idle session shows
406
406
  the dim map with the project's last goal, or `add lit to a prompt to start`;
407
407
  - row two holds the skill chips: every LitOpenCode skill that fired in the session, several at
408
- once. Skills fired by the current request are bright accent pills while it runs, and a new one
408
+ once. Skills fired by the current request are bright LIT accent pills while it runs, and a new one
409
409
  gets a short light sweep as it arrives; when the turn ends they dim and stay as the recent list,
410
410
  newest first, and firing one again brightens it. Chips that do not fit collapse into `+N`;
411
411
  - the bottom border holds the context use (amber from 75%), the time since the first lit turn
@@ -417,8 +417,8 @@ What it draws:
417
417
  then the time, then the context use. It never wraps. The completion moment plays here too.
418
418
  - A line under the home prompt, after OpenCode's tips: `πŸ”₯ lit ready Β· last: <goal> βœ“ n/m`. It
419
419
  appears only when the project ledger holds a goal.
420
- - Warnings always carry `βš‘` and words, not colour alone, because some themes use one colour for
421
- both accent and warning. Theme surfaces with alpha 0 (the system and lucent-orng themes) are left
420
+ - Warnings always carry `βš‘` and words, not colour alone, so they read the same without colour.
421
+ Theme surfaces with alpha 0 (the system and lucent-orng themes) are left
422
422
  unfilled rather than painted black.
423
423
  - One toast per refresh for a gate event: plan saved or not saved, goal set, criterion passed,
424
424
  review blocker opened or resolved, and completion. Several events at once collapse into the most
@@ -475,8 +475,16 @@ apart and the running pill flashes once; nothing loops. The live step changes in
475
475
  slide-in, and while a tool runs its elapsed time ticks once a second; with no tool running there is
476
476
  no timer at all. While a lit session is open the panel re-reads the goal ledger, the bounded work
477
477
  record and the research folder every two seconds; an idle session does not.
478
- Colours come from the active OpenCode theme. Set `["@litfamily/litopencode@<version>", { "motion": false }]`
479
- in `tui.json` to keep it static, or turn the plugin off by id `litopencode` in OpenCode's plugin
478
+
479
+ The LIT parts wear the LIT colours in every theme: the `πŸ”₯ LIT` pill runs from pink (`#ff2d95`) to
480
+ flame (`#ff6337`), the stage ramp runs flame, pink, then the LIT accent (`#5fd7ff`), the running stage
481
+ and the current skill chips are accent pills, the bar runs flame to accent, and the state colours are
482
+ LIT amber (`#ffaf3c`), green (`#6bdb8f`) and red (`#ff5f5f`). Pills always use dark ink (`#0b0f14`). Text, muted
483
+ text, the panel and element fills, the borders and transparent surfaces still come from the active
484
+ OpenCode theme. On a light theme the pill fills stay bright, and the LIT colours drawn as text
485
+ deepen within the same hue (flame `#e2521f`, pink `#d81b78`, accent `#0a87b8`, green `#1f9d55`, amber
486
+ `#b86e00`, red `#d93a3a`) so they stay readable on a white background. Set
487
+ `["@litfamily/litopencode@<version>", { "motion": false }]` in `tui.json` to turn the motion off, or turn the plugin off by id `litopencode` in OpenCode's plugin
480
488
  manager or with `plugin_enabled`.
481
489
 
482
490
  Band options go in the same options object:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litfamily/litopencode",
3
- "version": "1.0.22",
3
+ "version": "1.0.24",
4
4
  "description": "Workflow plugin for OpenCode: add lit to a prompt and the work is planned, built, checked and written down so the next session can pick it up.",
5
5
  "keywords": [
6
6
  "opencode",