@pixelspace/manifesto 2026.15.0 → 2026.15.2

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/index.js +63 -18
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixelspace/manifesto",
3
- "version": "2026.15.0",
3
+ "version": "2026.15.2",
4
4
  "description": "Design and Product Manifesto — Formal notation. A constitution for biological and digital intelligences.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/index.js CHANGED
@@ -4,10 +4,52 @@ import { readFileSync } from 'fs';
4
4
  import { dirname, join } from 'path';
5
5
  import { fileURLToPath } from 'url';
6
6
  import { skillCommand } from './skills/load-skill.js';
7
+ import { isTTY } from './detect.js';
7
8
 
8
9
  const __dirname = dirname(fileURLToPath(import.meta.url));
9
10
  const MANIFESTO_PATH = join(__dirname, '..', 'manifestos', 'Pixelspace Design Manifesto 2026 v0.5 — Formal.txt');
10
11
 
12
+ // ANSI escape codes — zero deps
13
+ const BRAND = '\x1b[38;2;255;0;90m'; // #FF005A
14
+ const WHITE = '\x1b[97m';
15
+ const DIM = '\x1b[2m';
16
+ const RESET = '\x1b[0m';
17
+
18
+ const LOGO = [
19
+ '█▀█ █ ▀▄▀ █▀▀ █ █▀▀ █▀█ █▀█ █▀▀ █▀▀',
20
+ '█▀▀ █ █ █▀▀ █ ▀▀█ █▀▀ █▀█ █ █▀▀',
21
+ '▀ ▀ ▀ ▀ ▀▀▀ ▀▀▀ ▀▀▀ ▀ ▀ ▀ ▀▀▀ ▀▀▀'
22
+ ];
23
+
24
+ const TITLE = 'Design and Product Manifesto. Letters from the Exodus.';
25
+ const DESCRIPTION = 'A constitution for biological and digital intelligences navigating the crossing. Use when brainstorming, incubating new products/features/services, making architecture decisions, evaluating tradeoffs, discussing product strategy or business models, designing AI-native experiences, or when human thinking feels shallow and needs depth.';
26
+
27
+ const SEPARATOR = '──────────────────────────────────────────────────────────────';
28
+
29
+ // Word wrap preserving indent on continuation lines
30
+ function wrapText(text, width = 62, indent = ' ') {
31
+ const words = text.split(/\s+/);
32
+ const lines = [];
33
+ let line = '';
34
+ for (const word of words) {
35
+ if (line.length + word.length + 1 <= width) {
36
+ line += (line ? ' ' : '') + word;
37
+ } else {
38
+ if (line) lines.push(line);
39
+ line = word;
40
+ }
41
+ }
42
+ if (line) lines.push(line);
43
+ return lines.map(l => indent + l).join('\n');
44
+ }
45
+
46
+ // Color mathematical/logical symbols with brand color
47
+ const SYMBOL_RE = /(:=|[∀∃∈∉∧∨¬→⟹≠≅≫≤≥∝⊂∪∘∅∞≡↑≈∵₀₁₂₃₄₅₆₇₈₉ₙ⁶{}()\[\]|=<>\\])/g;
48
+
49
+ function colorSymbols(text) {
50
+ return text.replace(SYMBOL_RE, `${BRAND}$1${RESET}`);
51
+ }
52
+
11
53
  export async function run() {
12
54
  const args = process.argv;
13
55
 
@@ -27,24 +69,27 @@ export async function run() {
27
69
  }
28
70
 
29
71
  // Default: print header + Formal.txt
30
- const content = readFileSync(MANIFESTO_PATH, 'utf-8');
31
-
32
- console.log(`
33
- █▀█ ▀▄▀ █▀▀ █ █▀▀ █▀█ █▀█ █▀▀ █▀▀
34
- █▀▀ █ █ █▀▀ █ ▀▀█ █▀▀ █▀█ █ █▀▀
35
- ▀ ▀ ▀ ▀ ▀▀▀ ▀▀▀ ▀▀▀ ▀ ▀ ▀ ▀▀▀ ▀▀▀
36
-
37
- Design and Product Manifesto. Letters from the Exodus. A
38
- constitution for biological and digital intelligences navigating
39
- the crossing. Use when brainstorming, incubating new
40
- products/features/services, making architecture decisions,
41
- evaluating tradeoffs, discussing product strategy or business
42
- models, designing AI-native experiences, or when human thinking
43
- feels shallow and needs depth.
44
-
45
- ──────────────────────────────────────────────────────────────
46
- `);
47
- console.log(content);
72
+ const raw = readFileSync(MANIFESTO_PATH, 'utf-8');
73
+
74
+ if (!isTTY()) {
75
+ console.log('Pixelspace Design and Product Manifesto\n');
76
+ console.log(raw);
77
+ return;
78
+ }
79
+
80
+ // TTY: formatted output with colors and indentation
81
+ const logo = LOGO.map(l => ` ${BRAND}${l}${RESET}`).join('\n');
82
+ const title = WHITE + wrapText(TITLE) + RESET;
83
+ const desc = DIM + wrapText(DESCRIPTION) + RESET;
84
+ const sep = DIM + ' ' + SEPARATOR + RESET;
85
+
86
+ const paragraphs = raw.trim().split('\n\n');
87
+ const body = paragraphs.map(p => {
88
+ const wrapped = wrapText(p.replace(/\n/g, ' '));
89
+ return colorSymbols(wrapped);
90
+ }).join('\n\n');
91
+
92
+ console.log(`\n${logo}\n\n${title}\n${desc}\n\n${sep}\n\n${body}\n\n${sep}\n`);
48
93
  }
49
94
 
50
95
  export default run;