@ericrisco/rsc 0.1.10 → 0.1.11
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 -6
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/scripts/lib/ui.js +58 -29
package/README.md
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
3
|
```
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
████████ ███████ ███████
|
|
5
|
+
██ ██ ██ ██ ██
|
|
6
|
+
██ ██ ██ ██
|
|
7
|
+
██ ██ ██ ██
|
|
8
|
+
████████ ██████ ██
|
|
9
|
+
██ ██ ██ ██
|
|
10
|
+
██ ██ ██ ██
|
|
11
|
+
██ ██ ██ ██ ██
|
|
12
|
+
██ ██ ███████ ███████
|
|
10
13
|
```
|
|
11
14
|
|
|
12
15
|
# `rsc` — 231 agent skills, one CLI, zero bloat
|
package/manifest.json
CHANGED
package/package.json
CHANGED
package/scripts/lib/ui.js
CHANGED
|
@@ -36,26 +36,42 @@ const C = {
|
|
|
36
36
|
green: (s) => `\x1b[32m${s}\x1b[39m`,
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
'
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
39
|
+
// Big block RSC wordmark, built from per-letter grids so rows always align.
|
|
40
|
+
const _R = ['████████', '██ ██', '██ ██', '██ ██', '████████', '██ ██', '██ ██', '██ ██', '██ ██'];
|
|
41
|
+
const _S = [' ███████', '██', '██', '██', ' ██████', ' ██', ' ██', ' ██', '███████'];
|
|
42
|
+
const _C = [' ███████', '██ ██', '██', '██', '██', '██', '██', '██ ██', ' ███████'];
|
|
43
|
+
const _padW = 9;
|
|
44
|
+
const _pad = (s) => s + ' '.repeat(Math.max(0, _padW - [...s].length));
|
|
45
|
+
const ART = _R.map((_, i) => ` ${_pad(_R[i])} ${_pad(_S[i])} ${_pad(_C[i])}`);
|
|
46
|
+
|
|
47
|
+
// HSL → RGB (s=1, l=0.6) for a true rainbow.
|
|
48
|
+
function hsl(h, s = 1, l = 0.6) {
|
|
49
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
50
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
51
|
+
const m = l - c / 2;
|
|
52
|
+
let r = 0; let g = 0; let b = 0;
|
|
53
|
+
if (h < 60) { r = c; g = x; } else if (h < 120) { r = x; g = c; }
|
|
54
|
+
else if (h < 180) { g = c; b = x; } else if (h < 240) { g = x; b = c; }
|
|
55
|
+
else if (h < 300) { r = x; b = c; } else { r = c; b = x; }
|
|
56
|
+
return [Math.round((r + m) * 255), Math.round((g + m) * 255), Math.round((b + m) * 255)];
|
|
56
57
|
}
|
|
57
58
|
|
|
58
|
-
//
|
|
59
|
+
// One frame: rainbow per character, diagonal phase, revealed up to `cols`.
|
|
60
|
+
function frame(phase, cols) {
|
|
61
|
+
return ART.map((line, r) => {
|
|
62
|
+
const chars = [...line];
|
|
63
|
+
let out = '';
|
|
64
|
+
for (let c = 0; c < chars.length && c < cols; c++) {
|
|
65
|
+
const ch = chars[c];
|
|
66
|
+
if (ch === ' ') { out += ' '; continue; }
|
|
67
|
+
const [rr, gg, bb] = hsl((c * 5 + r * 14 + phase * 20) % 360);
|
|
68
|
+
out += `\x1b[1;38;2;${rr};${gg};${bb}m${ch}`;
|
|
69
|
+
}
|
|
70
|
+
return `\x1b[2K${out}\x1b[0m`;
|
|
71
|
+
}).join('\n') + '\n';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Animated ASCII wordmark — the exaggerated "WOW". Static plain text when not a TTY.
|
|
59
75
|
export async function banner() {
|
|
60
76
|
if (!stdout.isTTY) {
|
|
61
77
|
say('');
|
|
@@ -63,23 +79,36 @@ export async function banner() {
|
|
|
63
79
|
say(' 231 skills · one CLI · zero bloat');
|
|
64
80
|
return;
|
|
65
81
|
}
|
|
66
|
-
const
|
|
82
|
+
const rows = ART.length;
|
|
83
|
+
const W = Math.max(...ART.map((l) => [...l].length));
|
|
67
84
|
stdout.write('\x1b[?25l'); // hide cursor
|
|
68
85
|
say('');
|
|
69
|
-
// 1) letters slide in left → right
|
|
86
|
+
// 1) letters slide in left → right
|
|
70
87
|
let first = true;
|
|
71
|
-
for (let
|
|
72
|
-
if (!first) stdout.write(`\x1b[${
|
|
88
|
+
for (let cols = 2; cols <= W; cols += 2) {
|
|
89
|
+
if (!first) stdout.write(`\x1b[${rows}A`);
|
|
73
90
|
first = false;
|
|
74
|
-
stdout.write(
|
|
75
|
-
await sleep(
|
|
91
|
+
stdout.write(frame(0, cols));
|
|
92
|
+
await sleep(12);
|
|
93
|
+
}
|
|
94
|
+
// 2) flowing rainbow diagonal sweeps
|
|
95
|
+
for (let phase = 1; phase <= 30; phase++) {
|
|
96
|
+
stdout.write(`\x1b[${rows}A`);
|
|
97
|
+
stdout.write(frame(phase, W));
|
|
98
|
+
await sleep(26);
|
|
76
99
|
}
|
|
77
|
-
//
|
|
78
|
-
for (let
|
|
79
|
-
stdout.write(`\x1b[${
|
|
80
|
-
stdout.write(ART.map((l
|
|
81
|
-
await sleep(
|
|
100
|
+
// 3) double white flash — the pop
|
|
101
|
+
for (let f = 0; f < 2; f++) {
|
|
102
|
+
stdout.write(`\x1b[${rows}A`);
|
|
103
|
+
stdout.write(ART.map((l) => `\x1b[2K\x1b[1;97m${l}\x1b[0m`).join('\n') + '\n');
|
|
104
|
+
await sleep(60);
|
|
105
|
+
stdout.write(`\x1b[${rows}A`);
|
|
106
|
+
stdout.write(frame(15, W));
|
|
107
|
+
await sleep(60);
|
|
82
108
|
}
|
|
109
|
+
// settle on a final rainbow snapshot
|
|
110
|
+
stdout.write(`\x1b[${rows}A`);
|
|
111
|
+
stdout.write(frame(15, W));
|
|
83
112
|
say(C.dim(' 231 skills · one CLI · zero bloat'));
|
|
84
113
|
stdout.write('\x1b[?25h'); // show cursor
|
|
85
114
|
}
|