@rosetears/aili-pi 0.1.7 → 0.1.9

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 CHANGED
@@ -49,11 +49,15 @@ The package does not write global AILI resources during extension load. After re
49
49
 
50
50
  That command creates or updates only the AILI marker block in `~/.pi/agent/APPEND_SYSTEM.md` and installs the 19 packaged profiles at `~/.pi/agent/agents/aili/`. The marker block is a Pi-native governance derivation of the pinned `aili-workflows` global AGENTS template: it retains instruction precedence, untrusted-content handling, approval/evidence/verification discipline, bounded delegation, project-rule precedence, and user-language output, while excluding OpenCode-only control planes. It preserves unrelated prompt content, rejects malformed markers or an unowned profile collision, and reports stale profiles without pruning them.
51
51
 
52
- ## Rem Cyberdeck
52
+ ## Rose Cyberdeck
53
53
 
54
- The package supplies the dark `rem-cyberdeck` theme plus three additional Pi Extensions: a Rem header, Sakura Matrix animation, and Zentui footer/editor surface. Select it through Pi's `/settings` theme selector or set `"theme": "rem-cyberdeck"` in `~/.pi/agent/settings.json`. The visual extensions are derived from `pi-sakura-cyberdeck` at revision `165a1f8011a12a58a6409b56b8a6c0416cd9b589` under MIT; see `THIRD_PARTY_NOTICES.md` and `notices/pi-sakura-cyberdeck-NOTICE.txt`.
54
+ The package supplies the dark `rose-cyberdeck` theme plus three additional Pi Extensions: a Rose header, Rose Shimmer + four-row Rose Code Rain working surface, and Zentui footer/editor surface. Select it through Pi's `/settings` theme selector or set `"theme": "rose-cyberdeck"` in `~/.pi/agent/settings.json`. The visual extensions are adapted from `pi-sakura-cyberdeck` at revision `165a1f8011a12a58a6409b56b8a6c0416cd9b589` under MIT; see `THIRD_PARTY_NOTICES.md` and `notices/pi-sakura-cyberdeck-NOTICE.txt`.
55
55
 
56
- Matrix keeps the pinned sparse waterfall rhythm and default `density=0.65`, while bounded ultra-wide tracks are spread across the complete terminal-cell width instead of truncating to a left prefix. `/sakura-matrix status` reports its settings; use `/sakura-matrix density <0.45-0.95>` for an explicit density preference. The `✦ REASONING` trail uses the same pinned Sakura pastel gradient.
56
+ Rose Code Rain uses the original sparse, fixed-column waterfall geometry: `density` selects even-cell tracks, at most 96 tracks span ultra-wide terminals, and each track falls vertically with a randomized tail and gap. The default 12 FPS cadence and 8–16 rows/second fall speed sit between the released and dense-preview profiles. `/rose-matrix status`, `/rose-matrix fps <8-18>`, `/rose-matrix density <0.45-0.95>`, and `/rose-matrix appearance <auto|dark|light>` change active preferences. `/sakura-matrix` remains a deprecated compatibility alias. Header, rain, frames, footer, and editor use the Rose six-color system: Blue, Ice, Cyan, Violet, Rose, and Soft Rose.
57
+
58
+ ### Migrating from Rem/Sakura names
59
+
60
+ Replace an exact legacy `rem-cyberdeck` theme token with `rose-cyberdeck` through `/settings` or `~/.pi/agent/settings.json`; when using a `light/dark` pair, replace only the legacy side. Existing `sakura-cyberdeck-matrix.json` and `rem-cyberdeck-zentui.json` configuration files are read compatibly and retained. Legacy product names below appear only for migration or upstream attribution.
57
61
 
58
62
  Zentui enables its experimental fixed-bottom editor by default when the installed Pi TUI exposes the required private layout capabilities. If capability detection or installation fails, it keeps Pi's native editor and emits a warning. The feature uses the terminal alternate screen; its default mouse scrolling can interfere with terminal text selection and tmux scrollback. Use Zentui's `/zentui` settings to disable the fixed editor or mouse scrolling. Zentui hides `pi-cache-stats` by default so the one canonical Codex weekly quota remains visible; explicitly re-enabled cache stats follow quota in the bounded footer.
59
63
 
@@ -99,7 +99,7 @@ This distribution is MIT-licensed. The following adapted sources and locked deve
99
99
  - License: MIT
100
100
  - Source files: extensions/header/index.ts, extensions/matrix/index.ts, extensions/zentui/**
101
101
  - Reused symbols/patterns: header, matrix animation, Zentui footer, fixed editor compositor
102
- - Local changes: registered as three additional Pi Package Extensions; header avatar loads the supplied Rem asset; Zentui shell palette uses Rem while Matrix and the reasoning trail retain the upstream Sakura palette; overflowing Matrix tracks are sampled deterministically across the complete terminal width while retaining the 96-track budget and ordinary-width behavior; relative import specifiers and session lifecycle event are adapted for this package's NodeNext TypeScript contract
102
+ - Local changes: registered as three additional Pi Package Extensions; Rose header loads a package-owned renamed artwork asset without changing upstream identity; Rose Shimmer, Rose Code Rain, and Zentui use the Rose-owned palette and gradient; overflowing Matrix tracks remain deterministic across the complete terminal width with the 96-track budget, while each rain row receives a structural blank-row repair; relative import specifiers and session lifecycle event are adapted for this package's NodeNext TypeScript contract
103
103
 
104
104
  ## npm dependency inventory
105
105
 
@@ -1,6 +1,8 @@
1
1
  import { readFileSync } from "node:fs";
2
+ import { getAgentDir, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
3
  import { fileURLToPath } from "node:url";
3
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
4
+ import { join } from "node:path";
5
+ import { legacyRoseThemeGuidanceFromSettings } from "../../src/runtime/rose-theme.js";
4
6
 
5
7
  const RESET = "\x1b[0m";
6
8
  const BOLD = "\x1b[1m";
@@ -26,7 +28,7 @@ function gradient(text: string, from: RGB, to: RGB, bold = false): string {
26
28
  }).join("");
27
29
  }
28
30
 
29
- const ANIME_ART = readFileSync(fileURLToPath(new URL("../../src/runtime/rem-head.txt", import.meta.url)), "utf8").trimEnd().split("\n") as readonly string[];
31
+ const ROSE_ART = readFileSync(fileURLToPath(new URL("../../src/runtime/rose-head.txt", import.meta.url)), "utf8").trimEnd().split("\n") as readonly string[];
30
32
 
31
33
  function getAvailableRows(tui: unknown): number {
32
34
  try {
@@ -38,15 +40,15 @@ function getAvailableRows(tui: unknown): number {
38
40
  }
39
41
  }
40
42
 
41
- function renderHeader(width: number, availableRows = 0): string[] {
43
+ export function renderRoseHeader(width: number, availableRows = 0): string[] {
42
44
  if (width <= 0) return [];
43
45
 
44
- const sakura: RGB = [136, 184, 255];
45
- const peach: RGB = [125, 228, 255];
46
- const lavender: RGB = [188, 167, 255];
47
- const sky: RGB = [214, 244, 255];
48
- const telemetry = "◈ REM CYBERDECK ◈";
49
- const artWidth = Math.max(...ANIME_ART.map((line) => [...line].length));
46
+ const blue: RGB = [136, 184, 255];
47
+ const cyan: RGB = [125, 228, 255];
48
+ const violet: RGB = [188, 167, 255];
49
+ const ice: RGB = [214, 244, 255];
50
+ const telemetry = "◈ ROSE CYBERDECK ◈";
51
+ const artWidth = Math.max(...ROSE_ART.map((line) => [...line].length));
50
52
  const visibleArtWidth = Math.min(width, artWidth);
51
53
  const artPad = " ".repeat(Math.max(0, Math.floor((width - visibleArtWidth) / 2) - 2));
52
54
  // Keep the divider visually subordinate: inset it symmetrically from the artwork.
@@ -58,12 +60,12 @@ function renderHeader(width: number, availableRows = 0): string[] {
58
60
  const telemetryWidth = [...visibleTelemetry].length;
59
61
  const telemetryPad = " ".repeat(Math.max(0, Math.min(width - telemetryWidth, Math.floor((width - telemetryWidth) / 2) + 1)));
60
62
 
61
- const art = ANIME_ART.map((line) => {
63
+ const art = ROSE_ART.map((line) => {
62
64
  const clipped = [...line].slice(0, visibleArtWidth).join("");
63
- return `${artPad}${gradient(clipped, sakura, sky)}`;
65
+ return `${artPad}${gradient(clipped, blue, ice)}`;
64
66
  });
65
67
 
66
- const visualHeight = ANIME_ART.length + 3; // artwork + gap + divider + label
68
+ const visualHeight = ROSE_ART.length + 3; // artwork + gap + divider + label
67
69
  const extraTopPadding = Math.max(0, Math.floor((availableRows - visualHeight) / 2) - 1);
68
70
 
69
71
  return [
@@ -71,17 +73,25 @@ function renderHeader(width: number, availableRows = 0): string[] {
71
73
  "",
72
74
  ...art,
73
75
  "",
74
- `${railPad}${gradient(rail, sakura, sky)}`,
75
- `${telemetryPad}${gradient(visibleTelemetry, lavender, peach, true)}`,
76
+ `${railPad}${gradient(rail, blue, ice)}`,
77
+ `${telemetryPad}${gradient(visibleTelemetry, violet, cyan, true)}`,
76
78
  "",
77
79
  ];
78
80
  }
79
81
 
80
- export default function sakuraCyberdeckHeader(pi: ExtensionAPI): void {
82
+ export default function roseCyberdeckHeader(pi: ExtensionAPI): void {
83
+ let legacyThemeNoticeSent = false;
81
84
  pi.on("session_start", (_event, ctx) => {
82
85
  if (!ctx.hasUI) return;
86
+ if (!legacyThemeNoticeSent) {
87
+ const guidance = legacyRoseThemeGuidanceFromSettings(join(getAgentDir(), "settings.json"));
88
+ if (guidance) {
89
+ legacyThemeNoticeSent = true;
90
+ ctx.ui.notify(guidance, "warning");
91
+ }
92
+ }
83
93
  ctx.ui.setHeader((tui) => ({
84
- render: (width) => renderHeader(width, getAvailableRows(tui)),
94
+ render: (width) => renderRoseHeader(width, getAvailableRows(tui)),
85
95
  invalidate() {},
86
96
  }));
87
97
  });