chill-agent 0.0.0-stage → 1.0.0

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/src/cli.js ADDED
@@ -0,0 +1,250 @@
1
+ // src/cli.js - ChillAgent CLI Command Router
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { parseArgs } from 'node:util';
5
+ import { banner, c, select, multiselect, confirm } from './prompts.js';
6
+ import { detectAgents } from './detector.js';
7
+ import { AVAILABLE_SKILLS, copySkillsToProject, generatePointerBlock, injectPointerIntoFile } from './installer.js';
8
+ import { scanDirectory, printAuditReport } from './auditor.js';
9
+ import { DESIGN_PRESETS } from './presets.js';
10
+
11
+ export async function runCli() {
12
+ const rawArgs = process.argv.slice(2);
13
+ const command = rawArgs[0] || 'wizard';
14
+
15
+ if (command === 'help' || command === '--help' || command === '-h') {
16
+ banner();
17
+ console.log(`
18
+ ${c.bold}USAGE:${c.reset}
19
+ npx chill-agent Launch interactive setup wizard
20
+ npx chill-agent install [--all] [--agent <name>] Install anti-slop skills non-interactively
21
+ npx chill-agent audit [dir] [--json] Scan code & copy for AI slop cliches
22
+ npx chill-agent init-design [preset] Generate a high-craft DESIGN.md specification
23
+ npx chill-agent doctor Inspect detected coding agents and rule health
24
+ npx chill-agent rewind [subcommand] Run deterministic time-travel debugger & proxy
25
+
26
+ ${c.bold}PRESETS FOR init-design:${c.reset}
27
+ linear-carbon Precision carbon monochrome, 1px hairlines (Default)
28
+ swiss-brutal Stark black/white contrast, zero border radius
29
+ technical-spec Industrial data-first layout, telemetry density
30
+ editorial-paper Warm ivory paper, literary serif headings
31
+ micro-density Cyberpunk HUD, compact phosphor-green telemetry
32
+ `);
33
+ return;
34
+ }
35
+
36
+ if (command === 'doctor') {
37
+ banner();
38
+ console.log(`${c.bold}ChillAgent Environment Diagnostics${c.reset}\n`);
39
+ const agents = detectAgents();
40
+ agents.forEach((ag) => {
41
+ const statusIcon = ag.isDetected ? `${c.emerald}✔ DETECTED${c.reset}` : `${c.gray}○ NOT FOUND${c.reset}`;
42
+ console.log(` ${ag.icon} ${c.bold}${ag.name.padEnd(30)}${c.reset} ${statusIcon} ${c.dim}(${ag.matchType})${c.reset}`);
43
+ });
44
+ console.log();
45
+ return;
46
+ }
47
+
48
+ if (command === 'audit' || command === 'lint' || command === 'scan') {
49
+ const isFix = rawArgs.includes('--fix');
50
+ const targetDir = rawArgs[1] && !rawArgs[1].startsWith('--')
51
+ ? path.resolve(process.cwd(), rawArgs[1])
52
+ : process.cwd();
53
+
54
+ if (isFix) {
55
+ const { autoFixFile } = await import('./auditor.js');
56
+ let fixCount = 0;
57
+ function walkFix(dir) {
58
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
59
+ for (const e of entries) {
60
+ if (e.isDirectory() && !['node_modules', '.git', '.chillrewind', 'dist'].includes(e.name)) {
61
+ walkFix(path.join(dir, e.name));
62
+ } else if (e.isFile() && ['.js', '.jsx', '.ts', '.tsx', '.html', '.css', '.md'].some(ext => e.name.endsWith(ext))) {
63
+ if (autoFixFile(path.join(dir, e.name))) fixCount++;
64
+ }
65
+ }
66
+ }
67
+ walkFix(targetDir);
68
+ console.log(`\n${c.emerald}✔ Anti-Slop Auto-Fix Completed:${c.reset} Remedied slop patterns in ${c.bold}${fixCount}${c.reset} files.`);
69
+ }
70
+
71
+ const findings = scanDirectory(targetDir);
72
+ if (rawArgs.includes('--json')) {
73
+ console.log(JSON.stringify(findings, null, 2));
74
+ } else {
75
+ printAuditReport(findings, targetDir);
76
+ }
77
+ return;
78
+ }
79
+
80
+ if (command === 'init-design') {
81
+ const presetId = rawArgs[1];
82
+ let selectedPreset = DESIGN_PRESETS.find((p) => p.id === presetId);
83
+
84
+ if (!selectedPreset) {
85
+ banner();
86
+ const choice = await select({
87
+ message: 'Select a High-Craft Aesthetic Preset for DESIGN.md:',
88
+ choices: DESIGN_PRESETS.map((p) => ({
89
+ label: p.name,
90
+ value: p.id,
91
+ description: p.description
92
+ }))
93
+ });
94
+ selectedPreset = DESIGN_PRESETS.find((p) => p.id === choice);
95
+ }
96
+
97
+ if (selectedPreset) {
98
+ const destPath = path.join(process.cwd(), 'DESIGN.md');
99
+ fs.writeFileSync(destPath, selectedPreset.content, 'utf8');
100
+ console.log(`\n${c.emerald}✔ Generated DESIGN.md${c.reset} using '${c.bold}${selectedPreset.name}${c.reset}' preset.`);
101
+ }
102
+ return;
103
+ }
104
+
105
+ if (command === 'install') {
106
+ const { values } = parseArgs({
107
+ args: rawArgs.slice(1),
108
+ options: {
109
+ all: { type: 'boolean', default: false },
110
+ agent: { type: 'string', short: 'a' }
111
+ },
112
+ strict: false
113
+ });
114
+
115
+ const skillsToInstall = values.all
116
+ ? AVAILABLE_SKILLS.map((s) => s.id)
117
+ : ['chill-slop', 'chill-slop-ui', 'chill-slop-copywriting', 'chill-slop-code'];
118
+
119
+ copySkillsToProject(skillsToInstall);
120
+
121
+ const agents = detectAgents();
122
+ let targetAgents = agents.filter((ag) => ag.isDetected);
123
+ if (values.agent) {
124
+ targetAgents = agents.filter((ag) => ag.id === values.agent);
125
+ }
126
+ if (targetAgents.length === 0) {
127
+ targetAgents = [agents.find((ag) => ag.id === 'antigravity') || agents[0]];
128
+ }
129
+
130
+ const pointer = generatePointerBlock(skillsToInstall);
131
+ for (const ag of targetAgents) {
132
+ const targetFilePath = path.join(process.cwd(), ag.targetFile);
133
+ injectPointerIntoFile(targetFilePath, pointer);
134
+ console.log(`${c.emerald}✔ Injected Anti-Slop into ${ag.name}:${c.reset} ${ag.targetFile}`);
135
+ }
136
+ return;
137
+ }
138
+
139
+ if (command === 'rewind') {
140
+ const rewindCliPath = path.resolve(__dirname, '..', 'chillrewind', 'src', 'cli.ts');
141
+ if (!fs.existsSync(rewindCliPath)) {
142
+ console.error(`${c.coral}ChillRewind engine not found at ${rewindCliPath}${c.reset}`);
143
+ return;
144
+ }
145
+ const { spawn } = await import('node:child_process');
146
+ spawn('node', ['--experimental-strip-types', '--no-warnings', rewindCliPath, ...rawArgs.slice(1)], {
147
+ stdio: 'inherit'
148
+ });
149
+ return;
150
+ }
151
+
152
+ // Interactive Wizard (Default)
153
+ banner();
154
+ console.log(`${c.dim}Setting up ChillAgent Anti-Slop 2.0 in ${process.cwd()}${c.reset}\n`);
155
+
156
+ // Step 1: Detect Agents
157
+ const agents = detectAgents();
158
+ const detectedList = agents.filter((a) => a.isDetected);
159
+
160
+ let selectedAgents = [];
161
+ if (detectedList.length > 0) {
162
+ console.log(`${c.bold}Detected Agent Environments in Workspace:${c.reset}`);
163
+ detectedList.forEach((ag) => console.log(` ${ag.icon} ${c.cyan}${ag.name}${c.reset} ${c.dim}(${ag.matchType})${c.reset}`));
164
+ console.log();
165
+
166
+ selectedAgents = await multiselect({
167
+ message: 'Select target coding agents to configure:',
168
+ choices: agents.map((ag) => ({
169
+ label: `${ag.icon} ${ag.name}`,
170
+ value: ag.id,
171
+ description: ag.isDetected ? 'Detected' : 'Standard'
172
+ })),
173
+ defaultSelected: detectedList.map((ag) => ag.id)
174
+ });
175
+ } else {
176
+ selectedAgents = await multiselect({
177
+ message: 'Select target coding agents to configure:',
178
+ choices: agents.map((ag) => ({
179
+ label: `${ag.icon} ${ag.name}`,
180
+ value: ag.id
181
+ })),
182
+ defaultSelected: ['antigravity', 'claude']
183
+ });
184
+ }
185
+
186
+ if (selectedAgents.length === 0) {
187
+ console.log(`${c.yellow}No agents selected. Exiting.${c.reset}`);
188
+ return;
189
+ }
190
+
191
+ // Step 2: Choose Skills
192
+ console.log();
193
+ const selectedSkills = await multiselect({
194
+ message: 'Select Anti-Slop skills to install into this project:',
195
+ choices: AVAILABLE_SKILLS.map((s) => ({
196
+ label: s.label,
197
+ value: s.id,
198
+ description: s.description
199
+ })),
200
+ defaultSelected: AVAILABLE_SKILLS.map((s) => s.id) // All by default
201
+ });
202
+
203
+ // Step 3: Design Direction
204
+ console.log();
205
+ const needDesignMd = !fs.existsSync(path.join(process.cwd(), 'DESIGN.md'));
206
+ if (needDesignMd) {
207
+ const wantDesign = await confirm({
208
+ message: 'No DESIGN.md found. Initialize a High-Craft aesthetic spec to avoid sterile AI defaults?'
209
+ });
210
+ if (wantDesign) {
211
+ const presetId = await select({
212
+ message: 'Pick an aesthetic foundation for DESIGN.md:',
213
+ choices: DESIGN_PRESETS.map((p) => ({
214
+ label: p.name,
215
+ value: p.id,
216
+ description: p.description
217
+ }))
218
+ });
219
+ const chosen = DESIGN_PRESETS.find((p) => p.id === presetId);
220
+ if (chosen) {
221
+ fs.writeFileSync(path.join(process.cwd(), 'DESIGN.md'), chosen.content, 'utf8');
222
+ console.log(`${c.emerald}✔ Generated DESIGN.md${c.reset} (${chosen.name})`);
223
+ }
224
+ }
225
+ }
226
+
227
+ // Step 4: Perform Installation
228
+ console.log(`\n${c.bold}Installing selected skills & injecting agent hooks...${c.reset}`);
229
+ const copied = copySkillsToProject(selectedSkills);
230
+ console.log(`${c.emerald}✔ Copied ${copied.length} skills into:${c.reset} ./skills/`);
231
+
232
+ const pointer = generatePointerBlock(selectedSkills);
233
+ for (const agentId of selectedAgents) {
234
+ const ag = agents.find((a) => a.id === agentId);
235
+ if (ag) {
236
+ const targetFilePath = path.join(process.cwd(), ag.targetFile);
237
+ injectPointerIntoFile(targetFilePath, pointer);
238
+ console.log(`${c.emerald}✔ Configured ${ag.name}:${c.reset} ${ag.targetFile}`);
239
+ }
240
+ }
241
+
242
+ console.log(`
243
+ ${c.green}${c.bold}✔ ChillAgent Anti-Slop 2.0 Successfully Activated!${c.reset}
244
+ ${c.dim}------------------------------------------------------------${c.reset}
245
+ ${c.bold}Next Steps:${c.reset}
246
+ • Run ${c.cyan}npx chill-agent audit${c.reset} to scan existing files for AI slop cliches.
247
+ • Run ${c.cyan}npx chill-agent rewind ui${c.reset} to inspect agent time-travel timelines.
248
+ • Start coding in your agent; all anti-slop rules are now strictly enforced!
249
+ `);
250
+ }
@@ -0,0 +1,102 @@
1
+ // src/detector.js - Coding Agent Environment & Configuration Detector
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import os from 'node:os';
5
+
6
+ export function getHomeDir() {
7
+ return os.homedir();
8
+ }
9
+
10
+ export function detectAgents(projectRoot = process.cwd()) {
11
+ const home = getHomeDir();
12
+ const detected = [];
13
+
14
+ const candidates = [
15
+ {
16
+ id: 'antigravity',
17
+ name: 'Antigravity (Google / AGY)',
18
+ icon: '🌌',
19
+ projectFiles: ['GEMINI.md', 'AGENTS.md'],
20
+ globalPaths: [
21
+ path.join(home, '.gemini', 'antigravity'),
22
+ path.join(home, '.gemini', 'config', 'skills')
23
+ ],
24
+ targetFile: 'GEMINI.md'
25
+ },
26
+ {
27
+ id: 'claude',
28
+ name: 'Claude Code (Anthropic)',
29
+ icon: '🤖',
30
+ projectFiles: ['CLAUDE.md', '.claude-plugin'],
31
+ globalPaths: [path.join(home, '.claude')],
32
+ targetFile: 'CLAUDE.md'
33
+ },
34
+ {
35
+ id: 'cursor',
36
+ name: 'Cursor IDE',
37
+ icon: '⚡',
38
+ projectFiles: ['.cursorrules', '.cursor/rules'],
39
+ globalPaths: [path.join(home, '.cursor')],
40
+ targetFile: fs.existsSync(path.join(projectRoot, '.cursor', 'rules'))
41
+ ? path.join('.cursor', 'rules', 'chill-agent.mdc')
42
+ : '.cursorrules'
43
+ },
44
+ {
45
+ id: 'windsurf',
46
+ name: 'Windsurf (Codeium)',
47
+ icon: '🏄',
48
+ projectFiles: ['.windsurfrules', '.windsurf'],
49
+ globalPaths: [],
50
+ targetFile: '.windsurfrules'
51
+ },
52
+ {
53
+ id: 'codex',
54
+ name: 'OpenAI Codex / OpenCode',
55
+ icon: '🧠',
56
+ projectFiles: ['AGENTS.md', '.codex-plugin'],
57
+ globalPaths: [path.join(home, '.codex')],
58
+ targetFile: 'AGENTS.md'
59
+ },
60
+ {
61
+ id: 'copilot',
62
+ name: 'GitHub Copilot Workspace',
63
+ icon: '🐙',
64
+ projectFiles: ['.github/copilot-instructions.md'],
65
+ globalPaths: [],
66
+ targetFile: path.join('.github', 'copilot-instructions.md')
67
+ }
68
+ ];
69
+
70
+ for (const agent of candidates) {
71
+ let found = false;
72
+ let matchType = 'none';
73
+
74
+ // Check project-level existence
75
+ for (const rel of agent.projectFiles) {
76
+ if (fs.existsSync(path.join(projectRoot, rel))) {
77
+ found = true;
78
+ matchType = `project (${rel})`;
79
+ break;
80
+ }
81
+ }
82
+
83
+ // Check global installation
84
+ if (!found) {
85
+ for (const gPath of agent.globalPaths) {
86
+ if (fs.existsSync(gPath)) {
87
+ found = true;
88
+ matchType = 'global';
89
+ break;
90
+ }
91
+ }
92
+ }
93
+
94
+ detected.push({
95
+ ...agent,
96
+ isDetected: found,
97
+ matchType
98
+ });
99
+ }
100
+
101
+ return detected;
102
+ }
package/src/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // src/index.js - ChillAgent main export
2
+ export * from './auditor.js';
3
+ export * from './detector.js';
4
+ export * from './installer.js';
5
+ export * from './presets.js';
6
+ export * from './prompts.js';
@@ -0,0 +1,81 @@
1
+ // src/installer.js - Multi-Agent Skill Injector & Config Manager
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { c } from './prompts.js';
6
+
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const ROOT_DIR = path.resolve(__dirname, '..');
9
+
10
+ export const AVAILABLE_SKILLS = [
11
+ { id: 'chill-slop', label: 'ChillSlop Master Filter (Core)', description: 'Hard gates, purpose tests, craftsmanship standard' },
12
+ { id: 'chill-slop-ui', label: 'ChillSlop UI & Layout', description: 'Monochrome surfaces, typography, non-generic cards' },
13
+ { id: 'chill-slop-copywriting', label: 'ChillSlop Copywriting', description: 'Strip AI buzzwords, vague hype, fake testimonials' },
14
+ { id: 'chill-slop-code', label: 'ChillSlop Clean Code', description: 'Technical docstrings, zero emoji clutter, no obvious comments' },
15
+ { id: 'chill-slop-human', label: 'ChillSlop Ergonomics & A11y', description: 'WCAG contrast, focus rings, 44px tap targets' },
16
+ { id: 'chill-slop-mobile', label: 'ChillSlop Mobile & Fluid', description: 'Clamp scaling, thumb reach zones, zero overflow' }
17
+ ];
18
+
19
+ export function generatePointerBlock(selectedSkills = ['chill-slop']) {
20
+ const lines = [
21
+ '<!-- chill-agent:start -->',
22
+ '## ChillAgent Anti-Slop 2.0 Engine & Craftsmanship Standard',
23
+ 'Before generating or editing any code, interface, copy, or architecture in this workspace, follow these active skills:',
24
+ ...selectedSkills.map((s) => `- \`skills/${s}/SKILL.md\``),
25
+ '',
26
+ '### Core Operating Rules:',
27
+ '1. **Purpose Test:** Every visual decision, color accent, layout structure, and copy phrase must name a specific domain purpose. AI defaults (purple gradients, rounded-3xl cards, generic cards) are forbidden.',
28
+ '2. **Liveliness Bar:** Avoid sterile defaults by reading `DESIGN.md`. If `DESIGN.md` is missing, adhere strictly to Linear/Geist carbon monochromatic standards.',
29
+ '3. **Context Hygiene:** Strip conversational fluff, emojis in code comments, and redundant obvious docstrings.',
30
+ '4. **Time-Travel Debugging:** When debugging stochastic agent loops, route upstream LLM calls through `chillrewind run` (deterministic SQLite WAL replay + SlopSieve circuit breaker).',
31
+ '<!-- chill-agent:end -->'
32
+ ];
33
+ return lines.join('\n');
34
+ }
35
+
36
+ export function copySkillsToProject(selectedSkills, targetDir = process.cwd()) {
37
+ const destSkillsDir = path.join(targetDir, 'skills');
38
+ if (!fs.existsSync(destSkillsDir)) fs.mkdirSync(destSkillsDir, { recursive: true });
39
+
40
+ const copied = [];
41
+ for (const skillId of selectedSkills) {
42
+ const srcDir = path.join(ROOT_DIR, 'skills', skillId);
43
+ const destDir = path.join(destSkillsDir, skillId);
44
+
45
+ if (fs.existsSync(srcDir)) {
46
+ if (!fs.existsSync(destDir)) fs.mkdirSync(destDir, { recursive: true });
47
+ const srcSkillMd = path.join(srcDir, 'SKILL.md');
48
+ const destSkillMd = path.join(destDir, 'SKILL.md');
49
+ if (fs.existsSync(srcSkillMd)) {
50
+ fs.copyFileSync(srcSkillMd, destSkillMd);
51
+ copied.push(skillId);
52
+ }
53
+ }
54
+ }
55
+ return copied;
56
+ }
57
+
58
+ export function injectPointerIntoFile(targetFilePath, pointerBlock) {
59
+ let existingContent = '';
60
+ if (fs.existsSync(targetFilePath)) {
61
+ existingContent = fs.readFileSync(targetFilePath, 'utf8');
62
+ } else {
63
+ const parentDir = path.dirname(targetFilePath);
64
+ if (!fs.existsSync(parentDir)) fs.mkdirSync(parentDir, { recursive: true });
65
+ }
66
+
67
+ const startMarker = '<!-- chill-agent:start -->';
68
+ const endMarker = '<!-- chill-agent:end -->';
69
+
70
+ let newContent = '';
71
+ if (existingContent.includes(startMarker) && existingContent.includes(endMarker)) {
72
+ const before = existingContent.substring(0, existingContent.indexOf(startMarker));
73
+ const after = existingContent.substring(existingContent.indexOf(endMarker) + endMarker.length);
74
+ newContent = `${before.trimEnd()}\n\n${pointerBlock}\n${after.trimStart()}`.trim() + '\n';
75
+ } else {
76
+ newContent = existingContent.trim() ? `${existingContent.trim()}\n\n${pointerBlock}\n` : `${pointerBlock}\n`;
77
+ }
78
+
79
+ fs.writeFileSync(targetFilePath, newContent, 'utf8');
80
+ return true;
81
+ }
package/src/presets.js ADDED
@@ -0,0 +1,126 @@
1
+ // src/presets.js - 5 High-Craft Design System Presets for DESIGN.md
2
+ export const DESIGN_PRESETS = [
3
+ {
4
+ id: 'linear-carbon',
5
+ name: 'Linear Carbon Geist (Recommended)',
6
+ description: 'Precision carbon monochrome, 1px hairlines, JetBrains Mono, emerald accents.',
7
+ content: `# DESIGN.md — Linear Carbon Geist Spec
8
+
9
+ ## Identity & Philosophy
10
+ - **Vibe:** Precision engineering, ultra-clean desktop utility, focused zero-distraction dark canvas.
11
+ - **Aesthetic Benchmark:** Linear, Vercel Geist, Raycast.
12
+
13
+ ## Palette
14
+ - **Canvas Base:** \`#09090B\`
15
+ - **Surface Layer 1 (Panel):** \`#101014\`
16
+ - **Surface Layer 2 (Interactive):** \`#16161C\`
17
+ - **Surface Hover:** \`#1E1E26\`
18
+ - **Hairline Border:** \`1px solid #26262E\`
19
+ - **Border Focus / Hover:** \`1px solid #3F3F4E\`
20
+ - **Text Primary:** \`#F4F4F6\`
21
+ - **Text Secondary:** \`#A1A1AA\`
22
+ - **Text Muted:** \`#63636E\`
23
+ - **Semantic Accents:**
24
+ - Emerald (Replay / Success): \`#10B981\` (Badge: \`rgba(16, 185, 129, 0.12)\`)
25
+ - Amber (Sieve / Pruned): \`#F59E0B\` (Badge: \`rgba(245, 158, 11, 0.12)\`)
26
+ - Rose (Circuit Breaker): \`#F43F5E\` (Badge: \`rgba(244, 63, 94, 0.12)\`)
27
+ - Indigo (Fork / Branch): \`#818CF8\` (Badge: \`rgba(129, 140, 248, 0.14)\`)
28
+
29
+ ## Typography
30
+ - **Display & Body:** Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif
31
+ - **Code & Tabular Numbers:** 'JetBrains Mono', 'Fira Code', 'SF Mono', Consolas, ui-monospace
32
+ - **Letter Spacing:** Headers \`-0.025em\`, Uppercase Tags \`+0.05em\`
33
+
34
+ ## Radius & Elevation
35
+ - **Controls & Badges:** \`4px\` to \`6px\`
36
+ - **Cards & Modals:** \`8px\`
37
+ - **Shadows:** None or tight micro-ambient \`0 1px 2px rgba(0,0,0,0.5)\`. Rely on hairline borders.
38
+ `
39
+ },
40
+ {
41
+ id: 'swiss-brutal',
42
+ name: 'Swiss Neo-Brutal',
43
+ description: 'Stark black-and-white contrast, zero rounded corners, heavy grotesque type.',
44
+ content: `# DESIGN.md — Swiss Neo-Brutal Spec
45
+
46
+ ## Identity & Philosophy
47
+ - **Vibe:** Uncompromising graphic clarity, International Typographic Style, pure structure.
48
+ - **Aesthetic Benchmark:** Neue Haas Grotesk, Bauhaus posters, modernist archives.
49
+
50
+ ## Palette
51
+ - **Canvas Base:** \`#FFFFFF\` (or Inverted Dark: \`#0A0A0A\`)
52
+ - **Ink Primary:** \`#000000\`
53
+ - **Divider Hairline:** \`2px solid #000000\`
54
+ - **Accent Red:** \`#FF2200\` (Used sparingly for primary anchor)
55
+
56
+ ## Typography
57
+ - **Primary:** 'Space Grotesk', 'Helvetica Neue', Arial, sans-serif
58
+ - **Headers:** Tight line-height (\`0.95\`), uppercase leading sections, zero kerning slop.
59
+
60
+ ## Geometry
61
+ - **Border Radius:** \`0px\` strictly everywhere.
62
+ - **Grids:** Strict visible grid lines, bold high-contrast dividers, asymmetric block layouts.
63
+ `
64
+ },
65
+ {
66
+ id: 'technical-spec',
67
+ name: 'Industrial Technical Dossier',
68
+ description: 'Data-first layout, slate/steel tone, dense tabular views, blueprint annotations.',
69
+ content: `# DESIGN.md — Industrial Technical Dossier Spec
70
+
71
+ ## Identity & Philosophy
72
+ - **Vibe:** Mission control telemetry, NASA flight documentation, Bloomberg terminal density.
73
+ - **Aesthetic Benchmark:** Grafana, Datadog Enterprise, Flight Radar.
74
+
75
+ ## Palette
76
+ - **Canvas Base:** \`#0B0F19\`
77
+ - **Panel Surface:** \`#111827\`
78
+ - **Border Grid:** \`1px solid #1F2937\`
79
+ - **Cyan Signal:** \`#38BDF8\`
80
+ - **Amber Warning:** \`#FBBF24\`
81
+
82
+ ## Typography
83
+ - Monospace-first layout for all data cells, timestamps, and parameters.
84
+ - Micro-labels at \`10px\` with uppercase \`+0.08em\` letter-spacing.
85
+ `
86
+ },
87
+ {
88
+ id: 'editorial-paper',
89
+ name: 'Warm Analog Editorial',
90
+ description: 'Warm ivory paper, charcoal ink, literary serif headings, tactile book feel.',
91
+ content: `# DESIGN.md — Warm Analog Editorial Spec
92
+
93
+ ## Identity & Philosophy
94
+ - **Vibe:** Handcrafted print journalism, literary publication, analog warmth.
95
+ - **Aesthetic Benchmark:** The Atlantic, Kinfolk, Stripe Press.
96
+
97
+ ## Palette
98
+ - **Paper Canvas:** \`#FBFBF9\`
99
+ - **Charcoal Ink:** \`#1A1A1A\`
100
+ - **Secondary Ink:** \`#575757\`
101
+ - **Warm Border:** \`1px solid #E6E6DF\`
102
+ - **Terracotta Accent:** \`#C85A32\`
103
+
104
+ ## Typography
105
+ - **Display & Headings:** 'Newsreader', 'Playfair Display', Georgia, serif
106
+ - **Body & Microcopy:** 'Inter', -apple-system, sans-serif
107
+ `
108
+ },
109
+ {
110
+ id: 'micro-density',
111
+ name: 'Cyberpunk Micro-Density',
112
+ description: 'High-density HUD panels, emerald phosphor text, compact technical toggles.',
113
+ content: `# DESIGN.md — Cyberpunk Micro-Density Spec
114
+
115
+ ## Identity & Philosophy
116
+ - **Vibe:** Embedded systems monitor, sub-millisecond network analyzer.
117
+ - **Aesthetic Benchmark:** Rizin, IDA Pro, Bloomberg CLI.
118
+
119
+ ## Palette
120
+ - **Phosphor Green:** \`#22C55E\`
121
+ - **Deep Obsidian:** \`#050505\`
122
+ - **Surface Elevation:** \`#0D0D0D\`
123
+ - **Grid Trace:** \`1px solid #1A1A1A\`
124
+ `
125
+ }
126
+ ];