atomsystem 0.5.0 → 0.6.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/atom.design.md CHANGED
@@ -112,6 +112,38 @@ Impeccable 디자인 철학에 기반하여 LLM이 양산하는 클리셰적 디
112
112
 
113
113
  ---
114
114
 
115
+ ### 08. AI 운영 원칙: 4단계 레고 조립 파이프라인 (AI Agent Pipeline)
116
+ > **토큰(Tokens) ➔ 컴포넌트(Components) ➔ 블록(Blocks) ➔ UX패턴(Patterns)**
117
+
118
+ 모든 AI 어시스턴트(Cursor, Claude Code, Antigravity, Copilot)는 복잡한 화면을 생성할 때 한 번에 거대한 코드를 작성하지 않고, 반드시 검증된 4단계 조립 파이프라인을 순차적으로 거쳐야 합니다. 새 UI 요소가 필요하면 기초 원자 컴포넌트부터 생성한 후 블록으로 합성하는 [컴포넌트 우선 원칙(Component-First)]을 엄수합니다.
119
+
120
+ * **권장 실천 (DO)**:
121
+ - ✅ 새 UI를 만들 때 components/ui/에 원자 컴포넌트를 먼저 정의하고, 이를 import하여 조립합니다.
122
+ - ✅ 모든 스타일은 반드시 CSS 변수(var(--atom-*), var(--text-primary))를 사용합니다.
123
+ - ✅ 빈 데이터(Empty), 로딩(Skeleton), 에러, 키보드 접근성(A11y) 4대 상태를 필수로 구현합니다.
124
+ * **지양 안티패턴 (DON'T)**:
125
+ - ❌ 컴포넌트 단계를 건너뛰고 블록이나 페이지에 임의의 원시 태그(<button>, <div class="rounded-lg...">)를 날림으로 하드코딩하지 않습니다.
126
+ - ❌ Tailwind 임의 컬러(text-blue-500, bg-gray-100 등)를 인라인으로 직접 작성하지 않습니다.
127
+ * **표준 참조**: `AGENTS.md & W3C DTCG Component Composition Spec`
128
+
129
+ ---
130
+
131
+ ### 09. 4대 AI 전문 역할 & 에이전트 스킬 활용 체계 (AI Roles & Skills)
132
+ > **token-guardian, component-architect, block-designer, docs-curator 협업 시스템**
133
+
134
+ AtomSystem은 단일 모델의 환각을 방지하기 위해 4대 전문 역할로 책임을 분리합니다: 1) token-guardian(W3C 토큰 무결성 감시 및 하드코딩 차단), 2) component-architect(순수 원자 컴포넌트 설계), 3) block-designer(컴포넌트 조립 및 완성형 UX 블록 구축), 4) docs-curator(레고 조립 문서화 및 E2E 검증). `npx atomsystem init` 시 `.agents/skills/atomsystem/SKILL.md`가 자동 설치되어 AI가 이 모든 역할을 자율적으로 수행합니다.
135
+
136
+ * **권장 실천 (DO)**:
137
+ - ✅ AI에게 작업 지시 시 "컴포넌트 우선 원칙으로 조립해줘" 또는 "atom.design.md 토큰을 준수해줘"라고 명시합니다.
138
+ - ✅ 코드 변경 후 `npm run audit:recursive` 및 `npm run lint:design`을 통해 AI 작업물의 무결성을 검증합니다.
139
+ - ✅ AI가 디자인 가이드 Markdown(토스, 당근, 커스텀)을 읽어 W3C tokens.json으로 빌드하도록 스킬을 호출합니다.
140
+ * **지양 안티패턴 (DON'T)**:
141
+ - ❌ 500줄 이상의 거대한 모놀리식 단일 컴포넌트 작성을 AI에게 요구하거나 방치하지 않습니다.
142
+ - ❌ 도메인 데이터를 페이지 컴포넌트 내부에 직접 인라인으로 하드코딩하게 두지 않습니다.
143
+ * **표준 참조**: `Universal AI Agent Guidelines (GEMINI.md & CLAUDE.md)`
144
+
145
+ ---
146
+
115
147
  ## 2. 디자인 토큰 사양 (Design Token Specifications)
116
148
 
117
149
  ### 🎨 시맨틱 컬러 토큰
@@ -37,7 +37,7 @@ export function BlocksSidebar({ activeId }: BlocksSidebarProps) {
37
37
  <Layers className="w-3.5 h-3.5" />
38
38
  <span>디자인 블록 카탈로그</span>
39
39
  </Link>
40
- <span className="font-mono text-[10px] px-1.5 py-0.5 rounded-(--radius-sm) bg-(--bg-secondary) text-(--text-secondary) border border-(--border-subtle)">
40
+ <span className="font-mono text-[11px] px-1.5 py-0.5 rounded-(--radius-sm) bg-(--bg-secondary) text-(--text-secondary) border border-(--border-subtle)">
41
41
  {BLOCKS_COLLECTION.length}
42
42
  </span>
43
43
  </div>
package/dist/cli.cjs CHANGED
@@ -660,7 +660,7 @@ function showVersion() {
660
660
  const pkg = JSON.parse(fs2__default.default.readFileSync(pkgPath, "utf-8"));
661
661
  console.log(`atomsystem v${pkg.version}`);
662
662
  } else {
663
- console.log("atomsystem v0.5.0");
663
+ console.log("atomsystem v0.6.0");
664
664
  }
665
665
  }
666
666
  switch (command) {
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tokenCompiler.ts","../src/studioServer.ts","../src/cli.ts"],"names":["path","http","fs","fileURLToPath"],"mappings":"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","file":"cli.cjs","sourcesContent":["/**\n * W3C DTCG Token JSON -> CSS Custom Properties 변환 유틸리티\n */\nexport function compileTokensToCss(tokenJson: Record<string, any>): string {\n const cssVars: string[] = [];\n\n function traverse(obj: any) {\n if (!obj || typeof obj !== 'object') return;\n\n if (obj.variable && obj.$value !== undefined) {\n cssVars.push(` ${obj.variable}: ${obj.$value};`);\n return;\n }\n\n for (const key of Object.keys(obj)) {\n if (key.startsWith('$')) continue;\n traverse(obj[key]);\n }\n }\n\n traverse(tokenJson);\n\n return `:root {\\n${cssVars.join('\\n')}\\n}\\n`;\n}\n","import http from 'http';\nimport fs from 'fs';\nimport path from 'path';\nimport { compileTokensToCss } from './tokenCompiler';\n\nexport function startLocalTokenStudio(options: { port?: number; cwd?: string } = {}) {\n const port = options.port || 4000;\n const cwd = options.cwd || process.cwd();\n\n // Find token files\n const tokenJsonPath = path.join(cwd, 'tokens', 'token.json');\n const cssPath = path.join(cwd, 'css', 'atom-ui.css');\n const designMdPath = path.join(cwd, 'atom.design.md');\n\n const server = http.createServer((req, res) => {\n // CORS headers for local usage\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(200);\n res.end();\n return;\n }\n\n const url = new URL(req.url || '/', `http://localhost:${port}`);\n\n // API: GET tokens\n if (url.pathname === '/api/tokens' && req.method === 'GET') {\n let data: any = {};\n if (fs.existsSync(tokenJsonPath)) {\n try {\n data = JSON.parse(fs.readFileSync(tokenJsonPath, 'utf-8'));\n } catch (e) {\n data = { error: 'Failed to parse tokens/token.json' };\n }\n }\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(data));\n return;\n }\n\n // API: POST update tokens\n if (url.pathname === '/api/tokens' && req.method === 'POST') {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk;\n });\n req.on('end', () => {\n try {\n const newTokens = JSON.parse(body);\n\n // 1. Save tokens/token.json\n const tokensDir = path.dirname(tokenJsonPath);\n if (!fs.existsSync(tokensDir)) fs.mkdirSync(tokensDir, { recursive: true });\n fs.writeFileSync(tokenJsonPath, JSON.stringify(newTokens, null, 2), 'utf-8');\n\n // 2. Compile and save to css/atom-ui.css\n const compiledCss = compileTokensToCss(newTokens);\n const cssDir = path.dirname(cssPath);\n if (!fs.existsSync(cssDir)) fs.mkdirSync(cssDir, { recursive: true });\n fs.writeFileSync(cssPath, compiledCss, 'utf-8');\n\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ success: true, message: 'Tokens and CSS compiled successfully!' }));\n } catch (err: any) {\n res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ success: false, error: err.message }));\n }\n });\n return;\n }\n\n // Serve Local Token Studio Web UI\n if (url.pathname === '/' || url.pathname === '/index.html') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(getStudioHtml());\n return;\n }\n\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Not Found');\n });\n\n server.listen(port, () => {\n console.log(`\\n🎨 AtomSystem Local Token Studio running at:`);\n console.log(` 👉 http://localhost:${port}\\n`);\n console.log(` Tokens file: ${path.relative(cwd, tokenJsonPath)}`);\n console.log(` Compiled CSS: ${path.relative(cwd, cssPath)}`);\n console.log(`\\nPress Ctrl+C to stop the studio server.\\n`);\n });\n\n return server;\n}\n\nfunction getStudioHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>AtomSystem Local Token Studio</title>\n <style>\n :root {\n --bg: #0a0a0a;\n --card-bg: #141414;\n --border: #262626;\n --text: #ededed;\n --muted: #888888;\n --accent: #3182f6;\n --radius: 8px;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n background: var(--bg);\n color: var(--text);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Pretendard, sans-serif;\n padding: 32px 20px;\n line-height: 1.5;\n }\n .container { max-width: 1100px; margin: 0 auto; }\n header {\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n padding-bottom: 24px;\n border-bottom: 1px solid var(--border);\n margin-bottom: 32px;\n }\n h1 { font-size: 24px; font-weight: 700; letter-spacing: -0.02em; }\n p.desc { font-size: 13px; color: var(--muted); margin-top: 4px; }\n .badge {\n font-size: 11px;\n font-family: monospace;\n padding: 3px 8px;\n background: #1a1a1a;\n border: 1px solid var(--border);\n border-radius: 4px;\n color: var(--muted);\n }\n .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }\n @media (max-width: 860px) { .grid { grid-template-columns: 1fr; } }\n .card {\n background: var(--card-bg);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n padding: 20px;\n }\n h2 { font-size: 15px; font-weight: 600; margin-bottom: 16px; display: flex; align-items: center; justify-content: space-between; }\n .field { margin-bottom: 16px; }\n label { display: block; font-size: 12px; font-weight: 500; margin-bottom: 6px; color: var(--text); }\n .meta { font-size: 11px; color: var(--muted); font-family: monospace; margin-top: 4px; }\n .input-row { display: flex; gap: 8px; align-items: center; }\n input[type=\"text\"], select {\n flex: 1;\n background: #1e1e1e;\n border: 1px solid var(--border);\n color: var(--text);\n padding: 8px 12px;\n font-size: 13px;\n border-radius: 6px;\n outline: none;\n }\n input[type=\"color\"] {\n -webkit-appearance: none;\n border: 1px solid var(--border);\n width: 38px;\n height: 38px;\n border-radius: 6px;\n background: none;\n cursor: pointer;\n padding: 2px;\n }\n .btn-save {\n background: var(--text);\n color: var(--bg);\n border: none;\n padding: 10px 20px;\n font-size: 13px;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n transition: opacity 0.2s;\n }\n .btn-save:hover { opacity: 0.9; }\n .preview-box {\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 20px;\n background: #0f0f0f;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .preview-btn {\n padding: 10px 18px;\n border-radius: var(--sample-radius, 8px);\n background: var(--sample-primary, #3182f6);\n color: #ffffff;\n border: none;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n }\n .preview-card {\n padding: 16px;\n border-radius: var(--sample-radius, 8px);\n background: var(--sample-surface, #18181b);\n border: 1px solid var(--border);\n color: var(--text);\n font-size: 13px;\n }\n .toast {\n position: fixed;\n bottom: 24px;\n right: 24px;\n background: #10b981;\n color: #000;\n padding: 10px 18px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: 0 4px 12px rgba(0,0,0,0.5);\n display: none;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <header>\n <div>\n <div class=\"badge\" style=\"margin-bottom: 8px; display: inline-block;\">W3C DTCG Zero-Runtime</div>\n <h1>AtomSystem Local Token Studio</h1>\n <p class=\"desc\">로컬 환경(tokens/token.json)의 토큰을 GUI로 직접 수정하고 실시간으로 css/atom-ui.css로 재컴파일합니다.</p>\n </div>\n <button class=\"btn-save\" onclick=\"saveTokens()\">저장 및 CSS 재컴파일</button>\n </header>\n\n <div class=\"grid\">\n <!-- 1. Color Tokens -->\n <div class=\"card\">\n <h2>🎨 시맨틱 브랜드 & 서피스 토큰</h2>\n \n <div class=\"field\">\n <label>브랜드 대표 색상 (Primary Color)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-primary\" oninput=\"onColorChange('primary', this.value)\">\n <input type=\"text\" id=\"val-primary\" oninput=\"onColorChange('primary', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-color-primary)</div>\n </div>\n\n <div class=\"field\">\n <label>호버 상태 색상 (Primary Hover)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-primary-hover\" oninput=\"onColorChange('primary-hover', this.value)\">\n <input type=\"text\" id=\"val-primary-hover\" oninput=\"onColorChange('primary-hover', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-color-primary-hover)</div>\n </div>\n\n <div class=\"field\">\n <label>서피스 배경 (Surface Background)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-bg-surface\" oninput=\"onColorChange('bg-surface', this.value)\">\n <input type=\"text\" id=\"val-bg-surface\" oninput=\"onColorChange('bg-surface', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-bg-surface)</div>\n </div>\n\n <div class=\"field\">\n <label>기본 모서리 곡률 (Border Radius)</label>\n <select id=\"val-radius\" onchange=\"onRadiusChange(this.value)\">\n <option value=\"4px\">4px (Sharp Minimal)</option>\n <option value=\"6px\">6px (Swiss Modern)</option>\n <option value=\"8px\">8px (Standard Clean)</option>\n <option value=\"12px\">12px (Rounded Friendly)</option>\n <option value=\"16px\">16px (Toss Soft)</option>\n </select>\n <div class=\"meta\">var(--atom-radius-md)</div>\n </div>\n </div>\n\n <!-- 2. Live Previewer -->\n <div class=\"card\">\n <h2>⚡ 실시간 토큰 반영 프리뷰</h2>\n <div class=\"preview-box\" id=\"preview-box\">\n <div class=\"preview-card\" id=\"sample-card\">\n <div style=\"font-weight: 600; margin-bottom: 4px;\">대시보드 위젯 컴포넌트</div>\n <div style=\"color: var(--muted); font-size: 12px; margin-bottom: 14px;\">\n 토큰 변경 시 실시간으로 디자인이 반영되며 즉시 CSS 파일에 동기화됩니다.\n </div>\n <button class=\"preview-btn\" id=\"sample-btn\">확인 및 승인</button>\n </div>\n\n <div style=\"font-size: 11px; font-family: monospace; color: var(--muted); background: #161616; padding: 12px; border-radius: 6px; border: 1px solid var(--border);\">\n <div>// 컴파일 대상 파일</div>\n <div style=\"color: #60a5fa; margin-top: 4px;\">tokens/token.json (W3C DTCG)</div>\n <div style=\"color: #34d399; margin-top: 2px;\">css/atom-ui.css (0KB Pure CSS)</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div id=\"toast\" class=\"toast\">✓ 토큰 및 CSS가 성공적으로 재컴파일되었습니다!</div>\n\n <script>\n let currentTokens = {};\n\n async function loadTokens() {\n try {\n const res = await fetch('/api/tokens');\n currentTokens = await res.json();\n populateFields();\n updatePreview();\n } catch (e) {\n console.error('Failed to fetch tokens', e);\n }\n }\n\n function populateFields() {\n const primary = currentTokens?.color?.brand?.['color-primary']?.$value || '#3182f6';\n const hover = currentTokens?.color?.brand?.['color-primary-hover']?.$value || '#1b64da';\n const surface = currentTokens?.color?.surface?.['bg-surface']?.$value || '#18181b';\n const radius = currentTokens?.borderRadius?.md?.$value || '8px';\n\n document.getElementById('picker-primary').value = primary.startsWith('#') ? primary : '#3182f6';\n document.getElementById('val-primary').value = primary;\n\n document.getElementById('picker-primary-hover').value = hover.startsWith('#') ? hover : '#1b64da';\n document.getElementById('val-primary-hover').value = hover;\n\n document.getElementById('picker-bg-surface').value = surface.startsWith('#') ? surface : '#18181b';\n document.getElementById('val-bg-surface').value = surface;\n\n document.getElementById('val-radius').value = radius;\n }\n\n function onColorChange(key, val) {\n if (!currentTokens.color) currentTokens.color = {};\n if (key === 'primary') {\n document.getElementById('picker-primary').value = val.startsWith('#') ? val : '#3182f6';\n document.getElementById('val-primary').value = val;\n if (!currentTokens.color.brand) currentTokens.color.brand = {};\n if (!currentTokens.color.brand['color-primary']) currentTokens.color.brand['color-primary'] = { variable: '--atom-color-primary' };\n currentTokens.color.brand['color-primary'].$value = val;\n }\n if (key === 'primary-hover') {\n document.getElementById('picker-primary-hover').value = val.startsWith('#') ? val : '#1b64da';\n document.getElementById('val-primary-hover').value = val;\n if (!currentTokens.color.brand) currentTokens.color.brand = {};\n if (!currentTokens.color.brand['color-primary-hover']) currentTokens.color.brand['color-primary-hover'] = { variable: '--atom-color-primary-hover' };\n currentTokens.color.brand['color-primary-hover'].$value = val;\n }\n if (key === 'bg-surface') {\n document.getElementById('picker-bg-surface').value = val.startsWith('#') ? val : '#18181b';\n document.getElementById('val-bg-surface').value = val;\n if (!currentTokens.color.surface) currentTokens.color.surface = {};\n if (!currentTokens.color.surface['bg-surface']) currentTokens.color.surface['bg-surface'] = { variable: '--atom-bg-surface' };\n currentTokens.color.surface['bg-surface'].$value = val;\n }\n updatePreview();\n }\n\n function onRadiusChange(val) {\n if (!currentTokens.borderRadius) currentTokens.borderRadius = {};\n if (!currentTokens.borderRadius.md) currentTokens.borderRadius.md = { variable: '--atom-radius-md' };\n currentTokens.borderRadius.md.$value = val;\n updatePreview();\n }\n\n function updatePreview() {\n const primary = document.getElementById('val-primary').value;\n const surface = document.getElementById('val-bg-surface').value;\n const radius = document.getElementById('val-radius').value;\n\n const btn = document.getElementById('sample-btn');\n const card = document.getElementById('sample-card');\n\n btn.style.backgroundColor = primary;\n btn.style.borderRadius = radius;\n card.style.backgroundColor = surface;\n card.style.borderRadius = radius;\n }\n\n async function saveTokens() {\n try {\n const res = await fetch('/api/tokens', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(currentTokens)\n });\n const result = await res.json();\n if (result.success) {\n showToast();\n } else {\n alert('저장 실패: ' + result.error);\n }\n } catch (e) {\n alert('서버 통신 오류: ' + e.message);\n }\n }\n\n function showToast() {\n const toast = document.getElementById('toast');\n toast.style.display = 'block';\n setTimeout(() => { toast.style.display = 'none'; }, 2500);\n }\n\n loadTokens();\n </script>\n</body>\n</html>`;\n}\n","#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { startLocalTokenStudio } from './studioServer';\nimport { compileTokensToCss } from './tokenCompiler';\n\nfunction getPkgRoot(): string {\n try {\n if (typeof __dirname !== 'undefined') {\n return path.resolve(__dirname, '..');\n }\n const currentFile = fileURLToPath(import.meta.url);\n return path.resolve(path.dirname(currentFile), '..');\n } catch {\n return process.cwd();\n }\n}\n\nconst PKG_ROOT = getPkgRoot();\nconst args = process.argv.slice(2);\nconst command = args[0] || 'help';\nconst targetName = args[1];\n\nfunction copyFileSafe(src: string, dest: string, label: string) {\n const targetDir = path.dirname(dest);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n fs.copyFileSync(src, dest);\n console.log(` ✓ ${label} -> ${path.relative(process.cwd(), dest)}`);\n}\n\nfunction handleInit() {\n const cwd = process.cwd();\n console.log('\\n🚀 Initializing AtomSystem Universal Design System...\\n');\n\n // 1. AI Assistant Master Guidelines (Multi-agent SSOT)\n const srcAgentGuide = path.join(PKG_ROOT, 'presets', 'agents.guide.md');\n if (fs.existsSync(srcAgentGuide)) {\n // AGENTS.md (Universal)\n copyFileSafe(srcAgentGuide, path.join(cwd, 'AGENTS.md'), 'Universal AI Guide (AGENTS.md)');\n // CLAUDE.md (Claude Code)\n copyFileSafe(srcAgentGuide, path.join(cwd, 'CLAUDE.md'), 'Claude Code Guidelines (CLAUDE.md)');\n // .cursorrules (Cursor IDE)\n copyFileSafe(srcAgentGuide, path.join(cwd, '.cursorrules'), 'Cursor Rules (.cursorrules)');\n }\n\n // 2. Install AI Agent Skill\n const srcSkill = path.join(PKG_ROOT, 'skills', 'atomsystem.skill.md');\n if (fs.existsSync(srcSkill)) {\n copyFileSafe(srcSkill, path.join(cwd, '.agents', 'skills', 'atomsystem', 'SKILL.md'), 'Agent Skill (.agents/skills/atomsystem/SKILL.md)');\n }\n\n // 3. Install 4-Tier Specifications\n const specs = [\n { src: path.join(PKG_ROOT, 'presets', 'default.design.md'), dest: path.join(cwd, 'atom.design.md'), label: 'Design Tokens (atom.design.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'components.md'), dest: path.join(cwd, 'atom.components.md'), label: 'Components Spec (atom.components.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'blocks.md'), dest: path.join(cwd, 'atom.blocks.md'), label: 'Design Blocks Spec (atom.blocks.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'uxPattern.md'), dest: path.join(cwd, 'atom.uxPattern.md'), label: 'UX Patterns (atom.uxPattern.md)' },\n ];\n\n specs.forEach((s) => {\n if (fs.existsSync(s.src)) {\n copyFileSafe(s.src, s.dest, s.label);\n }\n });\n\n // 4. Install Token JSON & Zero-Runtime CSS\n const srcToken = path.join(PKG_ROOT, 'tokens', 'token.json');\n if (fs.existsSync(srcToken)) {\n copyFileSafe(srcToken, path.join(cwd, 'tokens', 'token.json'), 'W3C DTCG Token JSON (tokens/token.json)');\n }\n\n const srcCss = path.join(PKG_ROOT, 'css', 'atom-ui.css');\n if (fs.existsSync(srcCss)) {\n copyFileSafe(srcCss, path.join(cwd, 'css', 'atom-ui.css'), 'Zero-Runtime Semantic CSS (css/atom-ui.css)');\n }\n\n console.log('\\n✨ AtomSystem initialization completed successfully!');\n console.log('\\n🎨 Local Token Studio Available:');\n console.log(' Run \"npx atomsystem studio\" to launch the local web customizer GUI.');\n console.log(' You can visually edit tokens and immediately recompile css/atom-ui.css.');\n console.log('\\n📌 How AI Coding Works Now:');\n console.log(' Any AI assistant (Claude Code, Cursor, Copilot, Antigravity) will now');\n console.log(' AUTOMATICALLY detect the design tokens, components, and UX patterns.');\n console.log('\\n📌 You can now ask your AI:');\n console.log(' \"대시보드 화면에 실시간 차트와 가격 정책 블록을 레고처럼 조립해줘.\"');\n console.log(' \"atom.design.md의 색상 토큰을 바탕으로 결제 확인 모달을 만들어줘.\"\\n');\n}\n\nconst COMPONENT_MAP: Record<string, string> = {\n button: 'Button.tsx',\n card: 'Card.tsx',\n badge: 'Badge.tsx',\n input: 'Input.tsx',\n table: 'Table.tsx',\n tabs: 'Tabs.tsx',\n switch: 'Switch.tsx',\n modal: 'Modal.tsx',\n container: 'Container.tsx',\n layout: 'Layout.tsx',\n};\n\nconst BLOCK_MAP: Record<string, { file: string; deps: string[] }> = {\n 'realtime-chart': { file: 'RealtimeChartBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'interactive-chat': { file: 'InteractiveChatBlock.tsx', deps: ['card', 'input', 'button', 'badge'] },\n 'pricing-table': { file: 'PricingPlanBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'card-list': { file: 'CardListBlock.tsx', deps: ['card', 'input', 'button', 'badge'] },\n 'interactive-slider': { file: 'SliderShowcaseBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'metric-stats': { file: 'MetricStatsBlock.tsx', deps: ['card', 'badge'] },\n 'file-explorer': { file: 'FileExplorerBlock.tsx', deps: ['card', 'button', 'badge'] },\n};\n\nfunction handleAdd(name?: string) {\n if (!name) {\n console.error('\\n❌ Please specify an item to add. Example: npx atomsystem add button\\n');\n handleList();\n return;\n }\n\n const cwd = process.cwd();\n const normalized = name.toLowerCase().trim();\n\n // 1. Check if it's a component\n if (COMPONENT_MAP[normalized]) {\n const fileName = COMPONENT_MAP[normalized];\n const src = path.join(PKG_ROOT, 'components', 'ui', fileName);\n const dest = path.join(cwd, 'components', 'ui', fileName);\n if (fs.existsSync(src)) {\n copyFileSafe(src, dest, `Component (${fileName})`);\n console.log(`\\n✅ Added ${normalized} component to components/ui/${fileName}\\n`);\n } else {\n console.error(`\\n❌ Source component file not found: ${src}\\n`);\n }\n return;\n }\n\n // 2. Check if it's a block\n if (BLOCK_MAP[normalized]) {\n const { file, deps } = BLOCK_MAP[normalized];\n console.log(`\\n📦 Adding block \"${normalized}\" and its dependent components...\\n`);\n\n // Copy dependencies first (Component-First rule)\n deps.forEach((dep) => {\n const depFile = COMPONENT_MAP[dep];\n if (depFile) {\n const srcDep = path.join(PKG_ROOT, 'components', 'ui', depFile);\n const destDep = path.join(cwd, 'components', 'ui', depFile);\n if (fs.existsSync(srcDep)) {\n copyFileSafe(srcDep, destDep, `Dependent Component (${depFile})`);\n }\n }\n });\n\n // Copy block file\n const srcBlock = path.join(PKG_ROOT, 'components', 'blocks', file);\n const destBlock = path.join(cwd, 'components', 'blocks', file);\n if (fs.existsSync(srcBlock)) {\n copyFileSafe(srcBlock, destBlock, `Block (${file})`);\n console.log(`\\n✅ Block \"${normalized}\" successfully added to components/blocks/${file}\\n`);\n } else {\n console.error(`\\n❌ Source block file not found: ${srcBlock}\\n`);\n }\n return;\n }\n\n console.error(`\\n❌ Unknown item: \"${name}\".`);\n handleList();\n}\n\nfunction handleList() {\n console.log(`\nAvailable Components:\n - button (Button, ButtonVariants)\n - card (Card container)\n - badge (Status badge)\n - input (Input with status)\n - table (Table, Header, Row, Cell)\n - tabs (TabsList, TabsTrigger)\n - switch (A11y Switch toggle)\n - modal (Dialog with Esc key support)\n\nAvailable Design Blocks:\n - realtime-chart (Live streaming candlestick/line chart)\n - interactive-chat (AI chatbot feed with suggestions)\n - pricing-table (Monthly/annual tier pricing table)\n - card-list (Responsive grid & list filter)\n - interactive-slider (Cost simulation calculator & carousel)\n - metric-stats (4 KPI executive metric cards)\n - file-explorer (Hierarchical directory tree explorer)\n\nInstall any item:\n npx atomsystem add <item-name>\n`);\n}\n\nfunction handleBuildTokens() {\n const cwd = process.cwd();\n const tokenJsonPath = path.join(cwd, 'tokens', 'token.json');\n const cssPath = path.join(cwd, 'css', 'atom-ui.css');\n\n if (!fs.existsSync(tokenJsonPath)) {\n console.error(`\\n❌ tokens/token.json not found at ${tokenJsonPath}. Run 'npx atomsystem init' first.\\n`);\n return;\n }\n\n try {\n const tokens = JSON.parse(fs.readFileSync(tokenJsonPath, 'utf-8'));\n const css = compileTokensToCss(tokens);\n const cssDir = path.dirname(cssPath);\n if (!fs.existsSync(cssDir)) fs.mkdirSync(cssDir, { recursive: true });\n fs.writeFileSync(cssPath, css, 'utf-8');\n console.log(`\\n✨ Successfully compiled tokens to ${path.relative(cwd, cssPath)}!\\n`);\n } catch (err: any) {\n console.error(`\\n❌ Failed to compile tokens: ${err.message}\\n`);\n }\n}\n\nfunction handleStudio() {\n const portArg = args.find((a) => a.startsWith('--port='));\n const port = portArg ? parseInt(portArg.split('=')[1], 10) : 4000;\n startLocalTokenStudio({ port, cwd: process.cwd() });\n}\n\nfunction showHelp() {\n console.log(`\nAtomSystem CLI - Universal Design Token & Agentic UI System\n\nUsage:\n npx atomsystem <command> [options]\n\nCommands:\n init Initialize AI guidelines, tokens, specs, and CSS in your project\n studio Launch Local Web Token Studio GUI (interactive token customizer)\n build:tokens Compile tokens/token.json into zero-runtime css/atom-ui.css\n add <name> Add a component or block directly to your project\n list List all available components and blocks\n help Display this help message\n version Print version info\n\nOptions for studio:\n --port=<port> Port for the local studio server (default: 4000)\n`);\n}\n\nfunction showVersion() {\n const pkgPath = path.join(PKG_ROOT, 'package.json');\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n console.log(`atomsystem v${pkg.version}`);\n } else {\n console.log('atomsystem v0.5.0');\n }\n}\n\nswitch (command) {\n case 'init':\n handleInit();\n break;\n case 'studio':\n case 'editor':\n handleStudio();\n break;\n case 'build:tokens':\n case 'compile':\n handleBuildTokens();\n break;\n case 'add':\n handleAdd(targetName);\n break;\n case 'list':\n handleList();\n break;\n case 'version':\n case '-v':\n case '--version':\n showVersion();\n break;\n case 'help':\n case '-h':\n case '--help':\n default:\n showHelp();\n break;\n}\n"]}
1
+ {"version":3,"sources":["../src/tokenCompiler.ts","../src/studioServer.ts","../src/cli.ts"],"names":["path","http","fs","fileURLToPath"],"mappings":"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","file":"cli.cjs","sourcesContent":["/**\n * W3C DTCG Token JSON -> CSS Custom Properties 변환 유틸리티\n */\nexport function compileTokensToCss(tokenJson: Record<string, any>): string {\n const cssVars: string[] = [];\n\n function traverse(obj: any) {\n if (!obj || typeof obj !== 'object') return;\n\n if (obj.variable && obj.$value !== undefined) {\n cssVars.push(` ${obj.variable}: ${obj.$value};`);\n return;\n }\n\n for (const key of Object.keys(obj)) {\n if (key.startsWith('$')) continue;\n traverse(obj[key]);\n }\n }\n\n traverse(tokenJson);\n\n return `:root {\\n${cssVars.join('\\n')}\\n}\\n`;\n}\n","import http from 'http';\nimport fs from 'fs';\nimport path from 'path';\nimport { compileTokensToCss } from './tokenCompiler';\n\nexport function startLocalTokenStudio(options: { port?: number; cwd?: string } = {}) {\n const port = options.port || 4000;\n const cwd = options.cwd || process.cwd();\n\n // Find token files\n const tokenJsonPath = path.join(cwd, 'tokens', 'token.json');\n const cssPath = path.join(cwd, 'css', 'atom-ui.css');\n const designMdPath = path.join(cwd, 'atom.design.md');\n\n const server = http.createServer((req, res) => {\n // CORS headers for local usage\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(200);\n res.end();\n return;\n }\n\n const url = new URL(req.url || '/', `http://localhost:${port}`);\n\n // API: GET tokens\n if (url.pathname === '/api/tokens' && req.method === 'GET') {\n let data: any = {};\n if (fs.existsSync(tokenJsonPath)) {\n try {\n data = JSON.parse(fs.readFileSync(tokenJsonPath, 'utf-8'));\n } catch (e) {\n data = { error: 'Failed to parse tokens/token.json' };\n }\n }\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(data));\n return;\n }\n\n // API: POST update tokens\n if (url.pathname === '/api/tokens' && req.method === 'POST') {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk;\n });\n req.on('end', () => {\n try {\n const newTokens = JSON.parse(body);\n\n // 1. Save tokens/token.json\n const tokensDir = path.dirname(tokenJsonPath);\n if (!fs.existsSync(tokensDir)) fs.mkdirSync(tokensDir, { recursive: true });\n fs.writeFileSync(tokenJsonPath, JSON.stringify(newTokens, null, 2), 'utf-8');\n\n // 2. Compile and save to css/atom-ui.css\n const compiledCss = compileTokensToCss(newTokens);\n const cssDir = path.dirname(cssPath);\n if (!fs.existsSync(cssDir)) fs.mkdirSync(cssDir, { recursive: true });\n fs.writeFileSync(cssPath, compiledCss, 'utf-8');\n\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ success: true, message: 'Tokens and CSS compiled successfully!' }));\n } catch (err: any) {\n res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ success: false, error: err.message }));\n }\n });\n return;\n }\n\n // Serve Local Token Studio Web UI\n if (url.pathname === '/' || url.pathname === '/index.html') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(getStudioHtml());\n return;\n }\n\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Not Found');\n });\n\n server.listen(port, () => {\n console.log(`\\n🎨 AtomSystem Local Token Studio running at:`);\n console.log(` 👉 http://localhost:${port}\\n`);\n console.log(` Tokens file: ${path.relative(cwd, tokenJsonPath)}`);\n console.log(` Compiled CSS: ${path.relative(cwd, cssPath)}`);\n console.log(`\\nPress Ctrl+C to stop the studio server.\\n`);\n });\n\n return server;\n}\n\nfunction getStudioHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>AtomSystem Local Token Studio</title>\n <style>\n :root {\n --bg: #0a0a0a;\n --card-bg: #141414;\n --border: #262626;\n --text: #ededed;\n --muted: #888888;\n --accent: #3182f6;\n --radius: 8px;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n background: var(--bg);\n color: var(--text);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Pretendard, sans-serif;\n padding: 32px 20px;\n line-height: 1.5;\n }\n .container { max-width: 1100px; margin: 0 auto; }\n header {\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n padding-bottom: 24px;\n border-bottom: 1px solid var(--border);\n margin-bottom: 32px;\n }\n h1 { font-size: 24px; font-weight: 700; letter-spacing: -0.02em; }\n p.desc { font-size: 13px; color: var(--muted); margin-top: 4px; }\n .badge {\n font-size: 11px;\n font-family: monospace;\n padding: 3px 8px;\n background: #1a1a1a;\n border: 1px solid var(--border);\n border-radius: 4px;\n color: var(--muted);\n }\n .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }\n @media (max-width: 860px) { .grid { grid-template-columns: 1fr; } }\n .card {\n background: var(--card-bg);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n padding: 20px;\n }\n h2 { font-size: 15px; font-weight: 600; margin-bottom: 16px; display: flex; align-items: center; justify-content: space-between; }\n .field { margin-bottom: 16px; }\n label { display: block; font-size: 12px; font-weight: 500; margin-bottom: 6px; color: var(--text); }\n .meta { font-size: 11px; color: var(--muted); font-family: monospace; margin-top: 4px; }\n .input-row { display: flex; gap: 8px; align-items: center; }\n input[type=\"text\"], select {\n flex: 1;\n background: #1e1e1e;\n border: 1px solid var(--border);\n color: var(--text);\n padding: 8px 12px;\n font-size: 13px;\n border-radius: 6px;\n outline: none;\n }\n input[type=\"color\"] {\n -webkit-appearance: none;\n border: 1px solid var(--border);\n width: 38px;\n height: 38px;\n border-radius: 6px;\n background: none;\n cursor: pointer;\n padding: 2px;\n }\n .btn-save {\n background: var(--text);\n color: var(--bg);\n border: none;\n padding: 10px 20px;\n font-size: 13px;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n transition: opacity 0.2s;\n }\n .btn-save:hover { opacity: 0.9; }\n .preview-box {\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 20px;\n background: #0f0f0f;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .preview-btn {\n padding: 10px 18px;\n border-radius: var(--sample-radius, 8px);\n background: var(--sample-primary, #3182f6);\n color: #ffffff;\n border: none;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n }\n .preview-card {\n padding: 16px;\n border-radius: var(--sample-radius, 8px);\n background: var(--sample-surface, #18181b);\n border: 1px solid var(--border);\n color: var(--text);\n font-size: 13px;\n }\n .toast {\n position: fixed;\n bottom: 24px;\n right: 24px;\n background: #10b981;\n color: #000;\n padding: 10px 18px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: 0 4px 12px rgba(0,0,0,0.5);\n display: none;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <header>\n <div>\n <div class=\"badge\" style=\"margin-bottom: 8px; display: inline-block;\">W3C DTCG Zero-Runtime</div>\n <h1>AtomSystem Local Token Studio</h1>\n <p class=\"desc\">로컬 환경(tokens/token.json)의 토큰을 GUI로 직접 수정하고 실시간으로 css/atom-ui.css로 재컴파일합니다.</p>\n </div>\n <button class=\"btn-save\" onclick=\"saveTokens()\">저장 및 CSS 재컴파일</button>\n </header>\n\n <div class=\"grid\">\n <!-- 1. Color Tokens -->\n <div class=\"card\">\n <h2>🎨 시맨틱 브랜드 & 서피스 토큰</h2>\n \n <div class=\"field\">\n <label>브랜드 대표 색상 (Primary Color)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-primary\" oninput=\"onColorChange('primary', this.value)\">\n <input type=\"text\" id=\"val-primary\" oninput=\"onColorChange('primary', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-color-primary)</div>\n </div>\n\n <div class=\"field\">\n <label>호버 상태 색상 (Primary Hover)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-primary-hover\" oninput=\"onColorChange('primary-hover', this.value)\">\n <input type=\"text\" id=\"val-primary-hover\" oninput=\"onColorChange('primary-hover', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-color-primary-hover)</div>\n </div>\n\n <div class=\"field\">\n <label>서피스 배경 (Surface Background)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-bg-surface\" oninput=\"onColorChange('bg-surface', this.value)\">\n <input type=\"text\" id=\"val-bg-surface\" oninput=\"onColorChange('bg-surface', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-bg-surface)</div>\n </div>\n\n <div class=\"field\">\n <label>기본 모서리 곡률 (Border Radius)</label>\n <select id=\"val-radius\" onchange=\"onRadiusChange(this.value)\">\n <option value=\"4px\">4px (Sharp Minimal)</option>\n <option value=\"6px\">6px (Swiss Modern)</option>\n <option value=\"8px\">8px (Standard Clean)</option>\n <option value=\"12px\">12px (Rounded Friendly)</option>\n <option value=\"16px\">16px (Toss Soft)</option>\n </select>\n <div class=\"meta\">var(--atom-radius-md)</div>\n </div>\n </div>\n\n <!-- 2. Live Previewer -->\n <div class=\"card\">\n <h2>⚡ 실시간 토큰 반영 프리뷰</h2>\n <div class=\"preview-box\" id=\"preview-box\">\n <div class=\"preview-card\" id=\"sample-card\">\n <div style=\"font-weight: 600; margin-bottom: 4px;\">대시보드 위젯 컴포넌트</div>\n <div style=\"color: var(--muted); font-size: 12px; margin-bottom: 14px;\">\n 토큰 변경 시 실시간으로 디자인이 반영되며 즉시 CSS 파일에 동기화됩니다.\n </div>\n <button class=\"preview-btn\" id=\"sample-btn\">확인 및 승인</button>\n </div>\n\n <div style=\"font-size: 11px; font-family: monospace; color: var(--muted); background: #161616; padding: 12px; border-radius: 6px; border: 1px solid var(--border);\">\n <div>// 컴파일 대상 파일</div>\n <div style=\"color: #60a5fa; margin-top: 4px;\">tokens/token.json (W3C DTCG)</div>\n <div style=\"color: #34d399; margin-top: 2px;\">css/atom-ui.css (0KB Pure CSS)</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div id=\"toast\" class=\"toast\">✓ 토큰 및 CSS가 성공적으로 재컴파일되었습니다!</div>\n\n <script>\n let currentTokens = {};\n\n async function loadTokens() {\n try {\n const res = await fetch('/api/tokens');\n currentTokens = await res.json();\n populateFields();\n updatePreview();\n } catch (e) {\n console.error('Failed to fetch tokens', e);\n }\n }\n\n function populateFields() {\n const primary = currentTokens?.color?.brand?.['color-primary']?.$value || '#3182f6';\n const hover = currentTokens?.color?.brand?.['color-primary-hover']?.$value || '#1b64da';\n const surface = currentTokens?.color?.surface?.['bg-surface']?.$value || '#18181b';\n const radius = currentTokens?.borderRadius?.md?.$value || '8px';\n\n document.getElementById('picker-primary').value = primary.startsWith('#') ? primary : '#3182f6';\n document.getElementById('val-primary').value = primary;\n\n document.getElementById('picker-primary-hover').value = hover.startsWith('#') ? hover : '#1b64da';\n document.getElementById('val-primary-hover').value = hover;\n\n document.getElementById('picker-bg-surface').value = surface.startsWith('#') ? surface : '#18181b';\n document.getElementById('val-bg-surface').value = surface;\n\n document.getElementById('val-radius').value = radius;\n }\n\n function onColorChange(key, val) {\n if (!currentTokens.color) currentTokens.color = {};\n if (key === 'primary') {\n document.getElementById('picker-primary').value = val.startsWith('#') ? val : '#3182f6';\n document.getElementById('val-primary').value = val;\n if (!currentTokens.color.brand) currentTokens.color.brand = {};\n if (!currentTokens.color.brand['color-primary']) currentTokens.color.brand['color-primary'] = { variable: '--atom-color-primary' };\n currentTokens.color.brand['color-primary'].$value = val;\n }\n if (key === 'primary-hover') {\n document.getElementById('picker-primary-hover').value = val.startsWith('#') ? val : '#1b64da';\n document.getElementById('val-primary-hover').value = val;\n if (!currentTokens.color.brand) currentTokens.color.brand = {};\n if (!currentTokens.color.brand['color-primary-hover']) currentTokens.color.brand['color-primary-hover'] = { variable: '--atom-color-primary-hover' };\n currentTokens.color.brand['color-primary-hover'].$value = val;\n }\n if (key === 'bg-surface') {\n document.getElementById('picker-bg-surface').value = val.startsWith('#') ? val : '#18181b';\n document.getElementById('val-bg-surface').value = val;\n if (!currentTokens.color.surface) currentTokens.color.surface = {};\n if (!currentTokens.color.surface['bg-surface']) currentTokens.color.surface['bg-surface'] = { variable: '--atom-bg-surface' };\n currentTokens.color.surface['bg-surface'].$value = val;\n }\n updatePreview();\n }\n\n function onRadiusChange(val) {\n if (!currentTokens.borderRadius) currentTokens.borderRadius = {};\n if (!currentTokens.borderRadius.md) currentTokens.borderRadius.md = { variable: '--atom-radius-md' };\n currentTokens.borderRadius.md.$value = val;\n updatePreview();\n }\n\n function updatePreview() {\n const primary = document.getElementById('val-primary').value;\n const surface = document.getElementById('val-bg-surface').value;\n const radius = document.getElementById('val-radius').value;\n\n const btn = document.getElementById('sample-btn');\n const card = document.getElementById('sample-card');\n\n btn.style.backgroundColor = primary;\n btn.style.borderRadius = radius;\n card.style.backgroundColor = surface;\n card.style.borderRadius = radius;\n }\n\n async function saveTokens() {\n try {\n const res = await fetch('/api/tokens', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(currentTokens)\n });\n const result = await res.json();\n if (result.success) {\n showToast();\n } else {\n alert('저장 실패: ' + result.error);\n }\n } catch (e) {\n alert('서버 통신 오류: ' + e.message);\n }\n }\n\n function showToast() {\n const toast = document.getElementById('toast');\n toast.style.display = 'block';\n setTimeout(() => { toast.style.display = 'none'; }, 2500);\n }\n\n loadTokens();\n </script>\n</body>\n</html>`;\n}\n","#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { startLocalTokenStudio } from './studioServer';\nimport { compileTokensToCss } from './tokenCompiler';\n\nfunction getPkgRoot(): string {\n try {\n if (typeof __dirname !== 'undefined') {\n return path.resolve(__dirname, '..');\n }\n const currentFile = fileURLToPath(import.meta.url);\n return path.resolve(path.dirname(currentFile), '..');\n } catch {\n return process.cwd();\n }\n}\n\nconst PKG_ROOT = getPkgRoot();\nconst args = process.argv.slice(2);\nconst command = args[0] || 'help';\nconst targetName = args[1];\n\nfunction copyFileSafe(src: string, dest: string, label: string) {\n const targetDir = path.dirname(dest);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n fs.copyFileSync(src, dest);\n console.log(` ✓ ${label} -> ${path.relative(process.cwd(), dest)}`);\n}\n\nfunction handleInit() {\n const cwd = process.cwd();\n console.log('\\n🚀 Initializing AtomSystem Universal Design System...\\n');\n\n // 1. AI Assistant Master Guidelines (Multi-agent SSOT)\n const srcAgentGuide = path.join(PKG_ROOT, 'presets', 'agents.guide.md');\n if (fs.existsSync(srcAgentGuide)) {\n // AGENTS.md (Universal)\n copyFileSafe(srcAgentGuide, path.join(cwd, 'AGENTS.md'), 'Universal AI Guide (AGENTS.md)');\n // CLAUDE.md (Claude Code)\n copyFileSafe(srcAgentGuide, path.join(cwd, 'CLAUDE.md'), 'Claude Code Guidelines (CLAUDE.md)');\n // .cursorrules (Cursor IDE)\n copyFileSafe(srcAgentGuide, path.join(cwd, '.cursorrules'), 'Cursor Rules (.cursorrules)');\n }\n\n // 2. Install AI Agent Skill\n const srcSkill = path.join(PKG_ROOT, 'skills', 'atomsystem.skill.md');\n if (fs.existsSync(srcSkill)) {\n copyFileSafe(srcSkill, path.join(cwd, '.agents', 'skills', 'atomsystem', 'SKILL.md'), 'Agent Skill (.agents/skills/atomsystem/SKILL.md)');\n }\n\n // 3. Install 4-Tier Specifications\n const specs = [\n { src: path.join(PKG_ROOT, 'presets', 'default.design.md'), dest: path.join(cwd, 'atom.design.md'), label: 'Design Tokens (atom.design.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'components.md'), dest: path.join(cwd, 'atom.components.md'), label: 'Components Spec (atom.components.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'blocks.md'), dest: path.join(cwd, 'atom.blocks.md'), label: 'Design Blocks Spec (atom.blocks.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'uxPattern.md'), dest: path.join(cwd, 'atom.uxPattern.md'), label: 'UX Patterns (atom.uxPattern.md)' },\n ];\n\n specs.forEach((s) => {\n if (fs.existsSync(s.src)) {\n copyFileSafe(s.src, s.dest, s.label);\n }\n });\n\n // 4. Install Token JSON & Zero-Runtime CSS\n const srcToken = path.join(PKG_ROOT, 'tokens', 'token.json');\n if (fs.existsSync(srcToken)) {\n copyFileSafe(srcToken, path.join(cwd, 'tokens', 'token.json'), 'W3C DTCG Token JSON (tokens/token.json)');\n }\n\n const srcCss = path.join(PKG_ROOT, 'css', 'atom-ui.css');\n if (fs.existsSync(srcCss)) {\n copyFileSafe(srcCss, path.join(cwd, 'css', 'atom-ui.css'), 'Zero-Runtime Semantic CSS (css/atom-ui.css)');\n }\n\n console.log('\\n✨ AtomSystem initialization completed successfully!');\n console.log('\\n🎨 Local Token Studio Available:');\n console.log(' Run \"npx atomsystem studio\" to launch the local web customizer GUI.');\n console.log(' You can visually edit tokens and immediately recompile css/atom-ui.css.');\n console.log('\\n📌 How AI Coding Works Now:');\n console.log(' Any AI assistant (Claude Code, Cursor, Copilot, Antigravity) will now');\n console.log(' AUTOMATICALLY detect the design tokens, components, and UX patterns.');\n console.log('\\n📌 You can now ask your AI:');\n console.log(' \"대시보드 화면에 실시간 차트와 가격 정책 블록을 레고처럼 조립해줘.\"');\n console.log(' \"atom.design.md의 색상 토큰을 바탕으로 결제 확인 모달을 만들어줘.\"\\n');\n}\n\nconst COMPONENT_MAP: Record<string, string> = {\n button: 'Button.tsx',\n card: 'Card.tsx',\n badge: 'Badge.tsx',\n input: 'Input.tsx',\n table: 'Table.tsx',\n tabs: 'Tabs.tsx',\n switch: 'Switch.tsx',\n modal: 'Modal.tsx',\n container: 'Container.tsx',\n layout: 'Layout.tsx',\n};\n\nconst BLOCK_MAP: Record<string, { file: string; deps: string[] }> = {\n 'realtime-chart': { file: 'RealtimeChartBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'interactive-chat': { file: 'InteractiveChatBlock.tsx', deps: ['card', 'input', 'button', 'badge'] },\n 'pricing-table': { file: 'PricingPlanBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'card-list': { file: 'CardListBlock.tsx', deps: ['card', 'input', 'button', 'badge'] },\n 'interactive-slider': { file: 'SliderShowcaseBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'metric-stats': { file: 'MetricStatsBlock.tsx', deps: ['card', 'badge'] },\n 'file-explorer': { file: 'FileExplorerBlock.tsx', deps: ['card', 'button', 'badge'] },\n};\n\nfunction handleAdd(name?: string) {\n if (!name) {\n console.error('\\n❌ Please specify an item to add. Example: npx atomsystem add button\\n');\n handleList();\n return;\n }\n\n const cwd = process.cwd();\n const normalized = name.toLowerCase().trim();\n\n // 1. Check if it's a component\n if (COMPONENT_MAP[normalized]) {\n const fileName = COMPONENT_MAP[normalized];\n const src = path.join(PKG_ROOT, 'components', 'ui', fileName);\n const dest = path.join(cwd, 'components', 'ui', fileName);\n if (fs.existsSync(src)) {\n copyFileSafe(src, dest, `Component (${fileName})`);\n console.log(`\\n✅ Added ${normalized} component to components/ui/${fileName}\\n`);\n } else {\n console.error(`\\n❌ Source component file not found: ${src}\\n`);\n }\n return;\n }\n\n // 2. Check if it's a block\n if (BLOCK_MAP[normalized]) {\n const { file, deps } = BLOCK_MAP[normalized];\n console.log(`\\n📦 Adding block \"${normalized}\" and its dependent components...\\n`);\n\n // Copy dependencies first (Component-First rule)\n deps.forEach((dep) => {\n const depFile = COMPONENT_MAP[dep];\n if (depFile) {\n const srcDep = path.join(PKG_ROOT, 'components', 'ui', depFile);\n const destDep = path.join(cwd, 'components', 'ui', depFile);\n if (fs.existsSync(srcDep)) {\n copyFileSafe(srcDep, destDep, `Dependent Component (${depFile})`);\n }\n }\n });\n\n // Copy block file\n const srcBlock = path.join(PKG_ROOT, 'components', 'blocks', file);\n const destBlock = path.join(cwd, 'components', 'blocks', file);\n if (fs.existsSync(srcBlock)) {\n copyFileSafe(srcBlock, destBlock, `Block (${file})`);\n console.log(`\\n✅ Block \"${normalized}\" successfully added to components/blocks/${file}\\n`);\n } else {\n console.error(`\\n❌ Source block file not found: ${srcBlock}\\n`);\n }\n return;\n }\n\n console.error(`\\n❌ Unknown item: \"${name}\".`);\n handleList();\n}\n\nfunction handleList() {\n console.log(`\nAvailable Components:\n - button (Button, ButtonVariants)\n - card (Card container)\n - badge (Status badge)\n - input (Input with status)\n - table (Table, Header, Row, Cell)\n - tabs (TabsList, TabsTrigger)\n - switch (A11y Switch toggle)\n - modal (Dialog with Esc key support)\n\nAvailable Design Blocks:\n - realtime-chart (Live streaming candlestick/line chart)\n - interactive-chat (AI chatbot feed with suggestions)\n - pricing-table (Monthly/annual tier pricing table)\n - card-list (Responsive grid & list filter)\n - interactive-slider (Cost simulation calculator & carousel)\n - metric-stats (4 KPI executive metric cards)\n - file-explorer (Hierarchical directory tree explorer)\n\nInstall any item:\n npx atomsystem add <item-name>\n`);\n}\n\nfunction handleBuildTokens() {\n const cwd = process.cwd();\n const tokenJsonPath = path.join(cwd, 'tokens', 'token.json');\n const cssPath = path.join(cwd, 'css', 'atom-ui.css');\n\n if (!fs.existsSync(tokenJsonPath)) {\n console.error(`\\n❌ tokens/token.json not found at ${tokenJsonPath}. Run 'npx atomsystem init' first.\\n`);\n return;\n }\n\n try {\n const tokens = JSON.parse(fs.readFileSync(tokenJsonPath, 'utf-8'));\n const css = compileTokensToCss(tokens);\n const cssDir = path.dirname(cssPath);\n if (!fs.existsSync(cssDir)) fs.mkdirSync(cssDir, { recursive: true });\n fs.writeFileSync(cssPath, css, 'utf-8');\n console.log(`\\n✨ Successfully compiled tokens to ${path.relative(cwd, cssPath)}!\\n`);\n } catch (err: any) {\n console.error(`\\n❌ Failed to compile tokens: ${err.message}\\n`);\n }\n}\n\nfunction handleStudio() {\n const portArg = args.find((a) => a.startsWith('--port='));\n const port = portArg ? parseInt(portArg.split('=')[1], 10) : 4000;\n startLocalTokenStudio({ port, cwd: process.cwd() });\n}\n\nfunction showHelp() {\n console.log(`\nAtomSystem CLI - Universal Design Token & Agentic UI System\n\nUsage:\n npx atomsystem <command> [options]\n\nCommands:\n init Initialize AI guidelines, tokens, specs, and CSS in your project\n studio Launch Local Web Token Studio GUI (interactive token customizer)\n build:tokens Compile tokens/token.json into zero-runtime css/atom-ui.css\n add <name> Add a component or block directly to your project\n list List all available components and blocks\n help Display this help message\n version Print version info\n\nOptions for studio:\n --port=<port> Port for the local studio server (default: 4000)\n`);\n}\n\nfunction showVersion() {\n const pkgPath = path.join(PKG_ROOT, 'package.json');\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n console.log(`atomsystem v${pkg.version}`);\n } else {\n console.log('atomsystem v0.6.0');\n }\n}\n\nswitch (command) {\n case 'init':\n handleInit();\n break;\n case 'studio':\n case 'editor':\n handleStudio();\n break;\n case 'build:tokens':\n case 'compile':\n handleBuildTokens();\n break;\n case 'add':\n handleAdd(targetName);\n break;\n case 'list':\n handleList();\n break;\n case 'version':\n case '-v':\n case '--version':\n showVersion();\n break;\n case 'help':\n case '-h':\n case '--help':\n default:\n showHelp();\n break;\n}\n"]}
package/dist/cli.js CHANGED
@@ -651,7 +651,7 @@ function showVersion() {
651
651
  const pkg = JSON.parse(fs2.readFileSync(pkgPath, "utf-8"));
652
652
  console.log(`atomsystem v${pkg.version}`);
653
653
  } else {
654
- console.log("atomsystem v0.5.0");
654
+ console.log("atomsystem v0.6.0");
655
655
  }
656
656
  }
657
657
  switch (command) {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tokenCompiler.ts","../src/studioServer.ts","../src/cli.ts"],"names":["path","fs"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * W3C DTCG Token JSON -> CSS Custom Properties 변환 유틸리티\n */\nexport function compileTokensToCss(tokenJson: Record<string, any>): string {\n const cssVars: string[] = [];\n\n function traverse(obj: any) {\n if (!obj || typeof obj !== 'object') return;\n\n if (obj.variable && obj.$value !== undefined) {\n cssVars.push(` ${obj.variable}: ${obj.$value};`);\n return;\n }\n\n for (const key of Object.keys(obj)) {\n if (key.startsWith('$')) continue;\n traverse(obj[key]);\n }\n }\n\n traverse(tokenJson);\n\n return `:root {\\n${cssVars.join('\\n')}\\n}\\n`;\n}\n","import http from 'http';\nimport fs from 'fs';\nimport path from 'path';\nimport { compileTokensToCss } from './tokenCompiler';\n\nexport function startLocalTokenStudio(options: { port?: number; cwd?: string } = {}) {\n const port = options.port || 4000;\n const cwd = options.cwd || process.cwd();\n\n // Find token files\n const tokenJsonPath = path.join(cwd, 'tokens', 'token.json');\n const cssPath = path.join(cwd, 'css', 'atom-ui.css');\n const designMdPath = path.join(cwd, 'atom.design.md');\n\n const server = http.createServer((req, res) => {\n // CORS headers for local usage\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(200);\n res.end();\n return;\n }\n\n const url = new URL(req.url || '/', `http://localhost:${port}`);\n\n // API: GET tokens\n if (url.pathname === '/api/tokens' && req.method === 'GET') {\n let data: any = {};\n if (fs.existsSync(tokenJsonPath)) {\n try {\n data = JSON.parse(fs.readFileSync(tokenJsonPath, 'utf-8'));\n } catch (e) {\n data = { error: 'Failed to parse tokens/token.json' };\n }\n }\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(data));\n return;\n }\n\n // API: POST update tokens\n if (url.pathname === '/api/tokens' && req.method === 'POST') {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk;\n });\n req.on('end', () => {\n try {\n const newTokens = JSON.parse(body);\n\n // 1. Save tokens/token.json\n const tokensDir = path.dirname(tokenJsonPath);\n if (!fs.existsSync(tokensDir)) fs.mkdirSync(tokensDir, { recursive: true });\n fs.writeFileSync(tokenJsonPath, JSON.stringify(newTokens, null, 2), 'utf-8');\n\n // 2. Compile and save to css/atom-ui.css\n const compiledCss = compileTokensToCss(newTokens);\n const cssDir = path.dirname(cssPath);\n if (!fs.existsSync(cssDir)) fs.mkdirSync(cssDir, { recursive: true });\n fs.writeFileSync(cssPath, compiledCss, 'utf-8');\n\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ success: true, message: 'Tokens and CSS compiled successfully!' }));\n } catch (err: any) {\n res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ success: false, error: err.message }));\n }\n });\n return;\n }\n\n // Serve Local Token Studio Web UI\n if (url.pathname === '/' || url.pathname === '/index.html') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(getStudioHtml());\n return;\n }\n\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Not Found');\n });\n\n server.listen(port, () => {\n console.log(`\\n🎨 AtomSystem Local Token Studio running at:`);\n console.log(` 👉 http://localhost:${port}\\n`);\n console.log(` Tokens file: ${path.relative(cwd, tokenJsonPath)}`);\n console.log(` Compiled CSS: ${path.relative(cwd, cssPath)}`);\n console.log(`\\nPress Ctrl+C to stop the studio server.\\n`);\n });\n\n return server;\n}\n\nfunction getStudioHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>AtomSystem Local Token Studio</title>\n <style>\n :root {\n --bg: #0a0a0a;\n --card-bg: #141414;\n --border: #262626;\n --text: #ededed;\n --muted: #888888;\n --accent: #3182f6;\n --radius: 8px;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n background: var(--bg);\n color: var(--text);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Pretendard, sans-serif;\n padding: 32px 20px;\n line-height: 1.5;\n }\n .container { max-width: 1100px; margin: 0 auto; }\n header {\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n padding-bottom: 24px;\n border-bottom: 1px solid var(--border);\n margin-bottom: 32px;\n }\n h1 { font-size: 24px; font-weight: 700; letter-spacing: -0.02em; }\n p.desc { font-size: 13px; color: var(--muted); margin-top: 4px; }\n .badge {\n font-size: 11px;\n font-family: monospace;\n padding: 3px 8px;\n background: #1a1a1a;\n border: 1px solid var(--border);\n border-radius: 4px;\n color: var(--muted);\n }\n .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }\n @media (max-width: 860px) { .grid { grid-template-columns: 1fr; } }\n .card {\n background: var(--card-bg);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n padding: 20px;\n }\n h2 { font-size: 15px; font-weight: 600; margin-bottom: 16px; display: flex; align-items: center; justify-content: space-between; }\n .field { margin-bottom: 16px; }\n label { display: block; font-size: 12px; font-weight: 500; margin-bottom: 6px; color: var(--text); }\n .meta { font-size: 11px; color: var(--muted); font-family: monospace; margin-top: 4px; }\n .input-row { display: flex; gap: 8px; align-items: center; }\n input[type=\"text\"], select {\n flex: 1;\n background: #1e1e1e;\n border: 1px solid var(--border);\n color: var(--text);\n padding: 8px 12px;\n font-size: 13px;\n border-radius: 6px;\n outline: none;\n }\n input[type=\"color\"] {\n -webkit-appearance: none;\n border: 1px solid var(--border);\n width: 38px;\n height: 38px;\n border-radius: 6px;\n background: none;\n cursor: pointer;\n padding: 2px;\n }\n .btn-save {\n background: var(--text);\n color: var(--bg);\n border: none;\n padding: 10px 20px;\n font-size: 13px;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n transition: opacity 0.2s;\n }\n .btn-save:hover { opacity: 0.9; }\n .preview-box {\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 20px;\n background: #0f0f0f;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .preview-btn {\n padding: 10px 18px;\n border-radius: var(--sample-radius, 8px);\n background: var(--sample-primary, #3182f6);\n color: #ffffff;\n border: none;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n }\n .preview-card {\n padding: 16px;\n border-radius: var(--sample-radius, 8px);\n background: var(--sample-surface, #18181b);\n border: 1px solid var(--border);\n color: var(--text);\n font-size: 13px;\n }\n .toast {\n position: fixed;\n bottom: 24px;\n right: 24px;\n background: #10b981;\n color: #000;\n padding: 10px 18px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: 0 4px 12px rgba(0,0,0,0.5);\n display: none;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <header>\n <div>\n <div class=\"badge\" style=\"margin-bottom: 8px; display: inline-block;\">W3C DTCG Zero-Runtime</div>\n <h1>AtomSystem Local Token Studio</h1>\n <p class=\"desc\">로컬 환경(tokens/token.json)의 토큰을 GUI로 직접 수정하고 실시간으로 css/atom-ui.css로 재컴파일합니다.</p>\n </div>\n <button class=\"btn-save\" onclick=\"saveTokens()\">저장 및 CSS 재컴파일</button>\n </header>\n\n <div class=\"grid\">\n <!-- 1. Color Tokens -->\n <div class=\"card\">\n <h2>🎨 시맨틱 브랜드 & 서피스 토큰</h2>\n \n <div class=\"field\">\n <label>브랜드 대표 색상 (Primary Color)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-primary\" oninput=\"onColorChange('primary', this.value)\">\n <input type=\"text\" id=\"val-primary\" oninput=\"onColorChange('primary', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-color-primary)</div>\n </div>\n\n <div class=\"field\">\n <label>호버 상태 색상 (Primary Hover)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-primary-hover\" oninput=\"onColorChange('primary-hover', this.value)\">\n <input type=\"text\" id=\"val-primary-hover\" oninput=\"onColorChange('primary-hover', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-color-primary-hover)</div>\n </div>\n\n <div class=\"field\">\n <label>서피스 배경 (Surface Background)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-bg-surface\" oninput=\"onColorChange('bg-surface', this.value)\">\n <input type=\"text\" id=\"val-bg-surface\" oninput=\"onColorChange('bg-surface', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-bg-surface)</div>\n </div>\n\n <div class=\"field\">\n <label>기본 모서리 곡률 (Border Radius)</label>\n <select id=\"val-radius\" onchange=\"onRadiusChange(this.value)\">\n <option value=\"4px\">4px (Sharp Minimal)</option>\n <option value=\"6px\">6px (Swiss Modern)</option>\n <option value=\"8px\">8px (Standard Clean)</option>\n <option value=\"12px\">12px (Rounded Friendly)</option>\n <option value=\"16px\">16px (Toss Soft)</option>\n </select>\n <div class=\"meta\">var(--atom-radius-md)</div>\n </div>\n </div>\n\n <!-- 2. Live Previewer -->\n <div class=\"card\">\n <h2>⚡ 실시간 토큰 반영 프리뷰</h2>\n <div class=\"preview-box\" id=\"preview-box\">\n <div class=\"preview-card\" id=\"sample-card\">\n <div style=\"font-weight: 600; margin-bottom: 4px;\">대시보드 위젯 컴포넌트</div>\n <div style=\"color: var(--muted); font-size: 12px; margin-bottom: 14px;\">\n 토큰 변경 시 실시간으로 디자인이 반영되며 즉시 CSS 파일에 동기화됩니다.\n </div>\n <button class=\"preview-btn\" id=\"sample-btn\">확인 및 승인</button>\n </div>\n\n <div style=\"font-size: 11px; font-family: monospace; color: var(--muted); background: #161616; padding: 12px; border-radius: 6px; border: 1px solid var(--border);\">\n <div>// 컴파일 대상 파일</div>\n <div style=\"color: #60a5fa; margin-top: 4px;\">tokens/token.json (W3C DTCG)</div>\n <div style=\"color: #34d399; margin-top: 2px;\">css/atom-ui.css (0KB Pure CSS)</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div id=\"toast\" class=\"toast\">✓ 토큰 및 CSS가 성공적으로 재컴파일되었습니다!</div>\n\n <script>\n let currentTokens = {};\n\n async function loadTokens() {\n try {\n const res = await fetch('/api/tokens');\n currentTokens = await res.json();\n populateFields();\n updatePreview();\n } catch (e) {\n console.error('Failed to fetch tokens', e);\n }\n }\n\n function populateFields() {\n const primary = currentTokens?.color?.brand?.['color-primary']?.$value || '#3182f6';\n const hover = currentTokens?.color?.brand?.['color-primary-hover']?.$value || '#1b64da';\n const surface = currentTokens?.color?.surface?.['bg-surface']?.$value || '#18181b';\n const radius = currentTokens?.borderRadius?.md?.$value || '8px';\n\n document.getElementById('picker-primary').value = primary.startsWith('#') ? primary : '#3182f6';\n document.getElementById('val-primary').value = primary;\n\n document.getElementById('picker-primary-hover').value = hover.startsWith('#') ? hover : '#1b64da';\n document.getElementById('val-primary-hover').value = hover;\n\n document.getElementById('picker-bg-surface').value = surface.startsWith('#') ? surface : '#18181b';\n document.getElementById('val-bg-surface').value = surface;\n\n document.getElementById('val-radius').value = radius;\n }\n\n function onColorChange(key, val) {\n if (!currentTokens.color) currentTokens.color = {};\n if (key === 'primary') {\n document.getElementById('picker-primary').value = val.startsWith('#') ? val : '#3182f6';\n document.getElementById('val-primary').value = val;\n if (!currentTokens.color.brand) currentTokens.color.brand = {};\n if (!currentTokens.color.brand['color-primary']) currentTokens.color.brand['color-primary'] = { variable: '--atom-color-primary' };\n currentTokens.color.brand['color-primary'].$value = val;\n }\n if (key === 'primary-hover') {\n document.getElementById('picker-primary-hover').value = val.startsWith('#') ? val : '#1b64da';\n document.getElementById('val-primary-hover').value = val;\n if (!currentTokens.color.brand) currentTokens.color.brand = {};\n if (!currentTokens.color.brand['color-primary-hover']) currentTokens.color.brand['color-primary-hover'] = { variable: '--atom-color-primary-hover' };\n currentTokens.color.brand['color-primary-hover'].$value = val;\n }\n if (key === 'bg-surface') {\n document.getElementById('picker-bg-surface').value = val.startsWith('#') ? val : '#18181b';\n document.getElementById('val-bg-surface').value = val;\n if (!currentTokens.color.surface) currentTokens.color.surface = {};\n if (!currentTokens.color.surface['bg-surface']) currentTokens.color.surface['bg-surface'] = { variable: '--atom-bg-surface' };\n currentTokens.color.surface['bg-surface'].$value = val;\n }\n updatePreview();\n }\n\n function onRadiusChange(val) {\n if (!currentTokens.borderRadius) currentTokens.borderRadius = {};\n if (!currentTokens.borderRadius.md) currentTokens.borderRadius.md = { variable: '--atom-radius-md' };\n currentTokens.borderRadius.md.$value = val;\n updatePreview();\n }\n\n function updatePreview() {\n const primary = document.getElementById('val-primary').value;\n const surface = document.getElementById('val-bg-surface').value;\n const radius = document.getElementById('val-radius').value;\n\n const btn = document.getElementById('sample-btn');\n const card = document.getElementById('sample-card');\n\n btn.style.backgroundColor = primary;\n btn.style.borderRadius = radius;\n card.style.backgroundColor = surface;\n card.style.borderRadius = radius;\n }\n\n async function saveTokens() {\n try {\n const res = await fetch('/api/tokens', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(currentTokens)\n });\n const result = await res.json();\n if (result.success) {\n showToast();\n } else {\n alert('저장 실패: ' + result.error);\n }\n } catch (e) {\n alert('서버 통신 오류: ' + e.message);\n }\n }\n\n function showToast() {\n const toast = document.getElementById('toast');\n toast.style.display = 'block';\n setTimeout(() => { toast.style.display = 'none'; }, 2500);\n }\n\n loadTokens();\n </script>\n</body>\n</html>`;\n}\n","#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { startLocalTokenStudio } from './studioServer';\nimport { compileTokensToCss } from './tokenCompiler';\n\nfunction getPkgRoot(): string {\n try {\n if (typeof __dirname !== 'undefined') {\n return path.resolve(__dirname, '..');\n }\n const currentFile = fileURLToPath(import.meta.url);\n return path.resolve(path.dirname(currentFile), '..');\n } catch {\n return process.cwd();\n }\n}\n\nconst PKG_ROOT = getPkgRoot();\nconst args = process.argv.slice(2);\nconst command = args[0] || 'help';\nconst targetName = args[1];\n\nfunction copyFileSafe(src: string, dest: string, label: string) {\n const targetDir = path.dirname(dest);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n fs.copyFileSync(src, dest);\n console.log(` ✓ ${label} -> ${path.relative(process.cwd(), dest)}`);\n}\n\nfunction handleInit() {\n const cwd = process.cwd();\n console.log('\\n🚀 Initializing AtomSystem Universal Design System...\\n');\n\n // 1. AI Assistant Master Guidelines (Multi-agent SSOT)\n const srcAgentGuide = path.join(PKG_ROOT, 'presets', 'agents.guide.md');\n if (fs.existsSync(srcAgentGuide)) {\n // AGENTS.md (Universal)\n copyFileSafe(srcAgentGuide, path.join(cwd, 'AGENTS.md'), 'Universal AI Guide (AGENTS.md)');\n // CLAUDE.md (Claude Code)\n copyFileSafe(srcAgentGuide, path.join(cwd, 'CLAUDE.md'), 'Claude Code Guidelines (CLAUDE.md)');\n // .cursorrules (Cursor IDE)\n copyFileSafe(srcAgentGuide, path.join(cwd, '.cursorrules'), 'Cursor Rules (.cursorrules)');\n }\n\n // 2. Install AI Agent Skill\n const srcSkill = path.join(PKG_ROOT, 'skills', 'atomsystem.skill.md');\n if (fs.existsSync(srcSkill)) {\n copyFileSafe(srcSkill, path.join(cwd, '.agents', 'skills', 'atomsystem', 'SKILL.md'), 'Agent Skill (.agents/skills/atomsystem/SKILL.md)');\n }\n\n // 3. Install 4-Tier Specifications\n const specs = [\n { src: path.join(PKG_ROOT, 'presets', 'default.design.md'), dest: path.join(cwd, 'atom.design.md'), label: 'Design Tokens (atom.design.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'components.md'), dest: path.join(cwd, 'atom.components.md'), label: 'Components Spec (atom.components.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'blocks.md'), dest: path.join(cwd, 'atom.blocks.md'), label: 'Design Blocks Spec (atom.blocks.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'uxPattern.md'), dest: path.join(cwd, 'atom.uxPattern.md'), label: 'UX Patterns (atom.uxPattern.md)' },\n ];\n\n specs.forEach((s) => {\n if (fs.existsSync(s.src)) {\n copyFileSafe(s.src, s.dest, s.label);\n }\n });\n\n // 4. Install Token JSON & Zero-Runtime CSS\n const srcToken = path.join(PKG_ROOT, 'tokens', 'token.json');\n if (fs.existsSync(srcToken)) {\n copyFileSafe(srcToken, path.join(cwd, 'tokens', 'token.json'), 'W3C DTCG Token JSON (tokens/token.json)');\n }\n\n const srcCss = path.join(PKG_ROOT, 'css', 'atom-ui.css');\n if (fs.existsSync(srcCss)) {\n copyFileSafe(srcCss, path.join(cwd, 'css', 'atom-ui.css'), 'Zero-Runtime Semantic CSS (css/atom-ui.css)');\n }\n\n console.log('\\n✨ AtomSystem initialization completed successfully!');\n console.log('\\n🎨 Local Token Studio Available:');\n console.log(' Run \"npx atomsystem studio\" to launch the local web customizer GUI.');\n console.log(' You can visually edit tokens and immediately recompile css/atom-ui.css.');\n console.log('\\n📌 How AI Coding Works Now:');\n console.log(' Any AI assistant (Claude Code, Cursor, Copilot, Antigravity) will now');\n console.log(' AUTOMATICALLY detect the design tokens, components, and UX patterns.');\n console.log('\\n📌 You can now ask your AI:');\n console.log(' \"대시보드 화면에 실시간 차트와 가격 정책 블록을 레고처럼 조립해줘.\"');\n console.log(' \"atom.design.md의 색상 토큰을 바탕으로 결제 확인 모달을 만들어줘.\"\\n');\n}\n\nconst COMPONENT_MAP: Record<string, string> = {\n button: 'Button.tsx',\n card: 'Card.tsx',\n badge: 'Badge.tsx',\n input: 'Input.tsx',\n table: 'Table.tsx',\n tabs: 'Tabs.tsx',\n switch: 'Switch.tsx',\n modal: 'Modal.tsx',\n container: 'Container.tsx',\n layout: 'Layout.tsx',\n};\n\nconst BLOCK_MAP: Record<string, { file: string; deps: string[] }> = {\n 'realtime-chart': { file: 'RealtimeChartBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'interactive-chat': { file: 'InteractiveChatBlock.tsx', deps: ['card', 'input', 'button', 'badge'] },\n 'pricing-table': { file: 'PricingPlanBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'card-list': { file: 'CardListBlock.tsx', deps: ['card', 'input', 'button', 'badge'] },\n 'interactive-slider': { file: 'SliderShowcaseBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'metric-stats': { file: 'MetricStatsBlock.tsx', deps: ['card', 'badge'] },\n 'file-explorer': { file: 'FileExplorerBlock.tsx', deps: ['card', 'button', 'badge'] },\n};\n\nfunction handleAdd(name?: string) {\n if (!name) {\n console.error('\\n❌ Please specify an item to add. Example: npx atomsystem add button\\n');\n handleList();\n return;\n }\n\n const cwd = process.cwd();\n const normalized = name.toLowerCase().trim();\n\n // 1. Check if it's a component\n if (COMPONENT_MAP[normalized]) {\n const fileName = COMPONENT_MAP[normalized];\n const src = path.join(PKG_ROOT, 'components', 'ui', fileName);\n const dest = path.join(cwd, 'components', 'ui', fileName);\n if (fs.existsSync(src)) {\n copyFileSafe(src, dest, `Component (${fileName})`);\n console.log(`\\n✅ Added ${normalized} component to components/ui/${fileName}\\n`);\n } else {\n console.error(`\\n❌ Source component file not found: ${src}\\n`);\n }\n return;\n }\n\n // 2. Check if it's a block\n if (BLOCK_MAP[normalized]) {\n const { file, deps } = BLOCK_MAP[normalized];\n console.log(`\\n📦 Adding block \"${normalized}\" and its dependent components...\\n`);\n\n // Copy dependencies first (Component-First rule)\n deps.forEach((dep) => {\n const depFile = COMPONENT_MAP[dep];\n if (depFile) {\n const srcDep = path.join(PKG_ROOT, 'components', 'ui', depFile);\n const destDep = path.join(cwd, 'components', 'ui', depFile);\n if (fs.existsSync(srcDep)) {\n copyFileSafe(srcDep, destDep, `Dependent Component (${depFile})`);\n }\n }\n });\n\n // Copy block file\n const srcBlock = path.join(PKG_ROOT, 'components', 'blocks', file);\n const destBlock = path.join(cwd, 'components', 'blocks', file);\n if (fs.existsSync(srcBlock)) {\n copyFileSafe(srcBlock, destBlock, `Block (${file})`);\n console.log(`\\n✅ Block \"${normalized}\" successfully added to components/blocks/${file}\\n`);\n } else {\n console.error(`\\n❌ Source block file not found: ${srcBlock}\\n`);\n }\n return;\n }\n\n console.error(`\\n❌ Unknown item: \"${name}\".`);\n handleList();\n}\n\nfunction handleList() {\n console.log(`\nAvailable Components:\n - button (Button, ButtonVariants)\n - card (Card container)\n - badge (Status badge)\n - input (Input with status)\n - table (Table, Header, Row, Cell)\n - tabs (TabsList, TabsTrigger)\n - switch (A11y Switch toggle)\n - modal (Dialog with Esc key support)\n\nAvailable Design Blocks:\n - realtime-chart (Live streaming candlestick/line chart)\n - interactive-chat (AI chatbot feed with suggestions)\n - pricing-table (Monthly/annual tier pricing table)\n - card-list (Responsive grid & list filter)\n - interactive-slider (Cost simulation calculator & carousel)\n - metric-stats (4 KPI executive metric cards)\n - file-explorer (Hierarchical directory tree explorer)\n\nInstall any item:\n npx atomsystem add <item-name>\n`);\n}\n\nfunction handleBuildTokens() {\n const cwd = process.cwd();\n const tokenJsonPath = path.join(cwd, 'tokens', 'token.json');\n const cssPath = path.join(cwd, 'css', 'atom-ui.css');\n\n if (!fs.existsSync(tokenJsonPath)) {\n console.error(`\\n❌ tokens/token.json not found at ${tokenJsonPath}. Run 'npx atomsystem init' first.\\n`);\n return;\n }\n\n try {\n const tokens = JSON.parse(fs.readFileSync(tokenJsonPath, 'utf-8'));\n const css = compileTokensToCss(tokens);\n const cssDir = path.dirname(cssPath);\n if (!fs.existsSync(cssDir)) fs.mkdirSync(cssDir, { recursive: true });\n fs.writeFileSync(cssPath, css, 'utf-8');\n console.log(`\\n✨ Successfully compiled tokens to ${path.relative(cwd, cssPath)}!\\n`);\n } catch (err: any) {\n console.error(`\\n❌ Failed to compile tokens: ${err.message}\\n`);\n }\n}\n\nfunction handleStudio() {\n const portArg = args.find((a) => a.startsWith('--port='));\n const port = portArg ? parseInt(portArg.split('=')[1], 10) : 4000;\n startLocalTokenStudio({ port, cwd: process.cwd() });\n}\n\nfunction showHelp() {\n console.log(`\nAtomSystem CLI - Universal Design Token & Agentic UI System\n\nUsage:\n npx atomsystem <command> [options]\n\nCommands:\n init Initialize AI guidelines, tokens, specs, and CSS in your project\n studio Launch Local Web Token Studio GUI (interactive token customizer)\n build:tokens Compile tokens/token.json into zero-runtime css/atom-ui.css\n add <name> Add a component or block directly to your project\n list List all available components and blocks\n help Display this help message\n version Print version info\n\nOptions for studio:\n --port=<port> Port for the local studio server (default: 4000)\n`);\n}\n\nfunction showVersion() {\n const pkgPath = path.join(PKG_ROOT, 'package.json');\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n console.log(`atomsystem v${pkg.version}`);\n } else {\n console.log('atomsystem v0.5.0');\n }\n}\n\nswitch (command) {\n case 'init':\n handleInit();\n break;\n case 'studio':\n case 'editor':\n handleStudio();\n break;\n case 'build:tokens':\n case 'compile':\n handleBuildTokens();\n break;\n case 'add':\n handleAdd(targetName);\n break;\n case 'list':\n handleList();\n break;\n case 'version':\n case '-v':\n case '--version':\n showVersion();\n break;\n case 'help':\n case '-h':\n case '--help':\n default:\n showHelp();\n break;\n}\n"]}
1
+ {"version":3,"sources":["../src/tokenCompiler.ts","../src/studioServer.ts","../src/cli.ts"],"names":["path","fs"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * W3C DTCG Token JSON -> CSS Custom Properties 변환 유틸리티\n */\nexport function compileTokensToCss(tokenJson: Record<string, any>): string {\n const cssVars: string[] = [];\n\n function traverse(obj: any) {\n if (!obj || typeof obj !== 'object') return;\n\n if (obj.variable && obj.$value !== undefined) {\n cssVars.push(` ${obj.variable}: ${obj.$value};`);\n return;\n }\n\n for (const key of Object.keys(obj)) {\n if (key.startsWith('$')) continue;\n traverse(obj[key]);\n }\n }\n\n traverse(tokenJson);\n\n return `:root {\\n${cssVars.join('\\n')}\\n}\\n`;\n}\n","import http from 'http';\nimport fs from 'fs';\nimport path from 'path';\nimport { compileTokensToCss } from './tokenCompiler';\n\nexport function startLocalTokenStudio(options: { port?: number; cwd?: string } = {}) {\n const port = options.port || 4000;\n const cwd = options.cwd || process.cwd();\n\n // Find token files\n const tokenJsonPath = path.join(cwd, 'tokens', 'token.json');\n const cssPath = path.join(cwd, 'css', 'atom-ui.css');\n const designMdPath = path.join(cwd, 'atom.design.md');\n\n const server = http.createServer((req, res) => {\n // CORS headers for local usage\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(200);\n res.end();\n return;\n }\n\n const url = new URL(req.url || '/', `http://localhost:${port}`);\n\n // API: GET tokens\n if (url.pathname === '/api/tokens' && req.method === 'GET') {\n let data: any = {};\n if (fs.existsSync(tokenJsonPath)) {\n try {\n data = JSON.parse(fs.readFileSync(tokenJsonPath, 'utf-8'));\n } catch (e) {\n data = { error: 'Failed to parse tokens/token.json' };\n }\n }\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify(data));\n return;\n }\n\n // API: POST update tokens\n if (url.pathname === '/api/tokens' && req.method === 'POST') {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk;\n });\n req.on('end', () => {\n try {\n const newTokens = JSON.parse(body);\n\n // 1. Save tokens/token.json\n const tokensDir = path.dirname(tokenJsonPath);\n if (!fs.existsSync(tokensDir)) fs.mkdirSync(tokensDir, { recursive: true });\n fs.writeFileSync(tokenJsonPath, JSON.stringify(newTokens, null, 2), 'utf-8');\n\n // 2. Compile and save to css/atom-ui.css\n const compiledCss = compileTokensToCss(newTokens);\n const cssDir = path.dirname(cssPath);\n if (!fs.existsSync(cssDir)) fs.mkdirSync(cssDir, { recursive: true });\n fs.writeFileSync(cssPath, compiledCss, 'utf-8');\n\n res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ success: true, message: 'Tokens and CSS compiled successfully!' }));\n } catch (err: any) {\n res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });\n res.end(JSON.stringify({ success: false, error: err.message }));\n }\n });\n return;\n }\n\n // Serve Local Token Studio Web UI\n if (url.pathname === '/' || url.pathname === '/index.html') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(getStudioHtml());\n return;\n }\n\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Not Found');\n });\n\n server.listen(port, () => {\n console.log(`\\n🎨 AtomSystem Local Token Studio running at:`);\n console.log(` 👉 http://localhost:${port}\\n`);\n console.log(` Tokens file: ${path.relative(cwd, tokenJsonPath)}`);\n console.log(` Compiled CSS: ${path.relative(cwd, cssPath)}`);\n console.log(`\\nPress Ctrl+C to stop the studio server.\\n`);\n });\n\n return server;\n}\n\nfunction getStudioHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>AtomSystem Local Token Studio</title>\n <style>\n :root {\n --bg: #0a0a0a;\n --card-bg: #141414;\n --border: #262626;\n --text: #ededed;\n --muted: #888888;\n --accent: #3182f6;\n --radius: 8px;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n background: var(--bg);\n color: var(--text);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Pretendard, sans-serif;\n padding: 32px 20px;\n line-height: 1.5;\n }\n .container { max-width: 1100px; margin: 0 auto; }\n header {\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n padding-bottom: 24px;\n border-bottom: 1px solid var(--border);\n margin-bottom: 32px;\n }\n h1 { font-size: 24px; font-weight: 700; letter-spacing: -0.02em; }\n p.desc { font-size: 13px; color: var(--muted); margin-top: 4px; }\n .badge {\n font-size: 11px;\n font-family: monospace;\n padding: 3px 8px;\n background: #1a1a1a;\n border: 1px solid var(--border);\n border-radius: 4px;\n color: var(--muted);\n }\n .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }\n @media (max-width: 860px) { .grid { grid-template-columns: 1fr; } }\n .card {\n background: var(--card-bg);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n padding: 20px;\n }\n h2 { font-size: 15px; font-weight: 600; margin-bottom: 16px; display: flex; align-items: center; justify-content: space-between; }\n .field { margin-bottom: 16px; }\n label { display: block; font-size: 12px; font-weight: 500; margin-bottom: 6px; color: var(--text); }\n .meta { font-size: 11px; color: var(--muted); font-family: monospace; margin-top: 4px; }\n .input-row { display: flex; gap: 8px; align-items: center; }\n input[type=\"text\"], select {\n flex: 1;\n background: #1e1e1e;\n border: 1px solid var(--border);\n color: var(--text);\n padding: 8px 12px;\n font-size: 13px;\n border-radius: 6px;\n outline: none;\n }\n input[type=\"color\"] {\n -webkit-appearance: none;\n border: 1px solid var(--border);\n width: 38px;\n height: 38px;\n border-radius: 6px;\n background: none;\n cursor: pointer;\n padding: 2px;\n }\n .btn-save {\n background: var(--text);\n color: var(--bg);\n border: none;\n padding: 10px 20px;\n font-size: 13px;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n transition: opacity 0.2s;\n }\n .btn-save:hover { opacity: 0.9; }\n .preview-box {\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 20px;\n background: #0f0f0f;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .preview-btn {\n padding: 10px 18px;\n border-radius: var(--sample-radius, 8px);\n background: var(--sample-primary, #3182f6);\n color: #ffffff;\n border: none;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n }\n .preview-card {\n padding: 16px;\n border-radius: var(--sample-radius, 8px);\n background: var(--sample-surface, #18181b);\n border: 1px solid var(--border);\n color: var(--text);\n font-size: 13px;\n }\n .toast {\n position: fixed;\n bottom: 24px;\n right: 24px;\n background: #10b981;\n color: #000;\n padding: 10px 18px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: 0 4px 12px rgba(0,0,0,0.5);\n display: none;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <header>\n <div>\n <div class=\"badge\" style=\"margin-bottom: 8px; display: inline-block;\">W3C DTCG Zero-Runtime</div>\n <h1>AtomSystem Local Token Studio</h1>\n <p class=\"desc\">로컬 환경(tokens/token.json)의 토큰을 GUI로 직접 수정하고 실시간으로 css/atom-ui.css로 재컴파일합니다.</p>\n </div>\n <button class=\"btn-save\" onclick=\"saveTokens()\">저장 및 CSS 재컴파일</button>\n </header>\n\n <div class=\"grid\">\n <!-- 1. Color Tokens -->\n <div class=\"card\">\n <h2>🎨 시맨틱 브랜드 & 서피스 토큰</h2>\n \n <div class=\"field\">\n <label>브랜드 대표 색상 (Primary Color)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-primary\" oninput=\"onColorChange('primary', this.value)\">\n <input type=\"text\" id=\"val-primary\" oninput=\"onColorChange('primary', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-color-primary)</div>\n </div>\n\n <div class=\"field\">\n <label>호버 상태 색상 (Primary Hover)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-primary-hover\" oninput=\"onColorChange('primary-hover', this.value)\">\n <input type=\"text\" id=\"val-primary-hover\" oninput=\"onColorChange('primary-hover', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-color-primary-hover)</div>\n </div>\n\n <div class=\"field\">\n <label>서피스 배경 (Surface Background)</label>\n <div class=\"input-row\">\n <input type=\"color\" id=\"picker-bg-surface\" oninput=\"onColorChange('bg-surface', this.value)\">\n <input type=\"text\" id=\"val-bg-surface\" oninput=\"onColorChange('bg-surface', this.value)\">\n </div>\n <div class=\"meta\">var(--atom-bg-surface)</div>\n </div>\n\n <div class=\"field\">\n <label>기본 모서리 곡률 (Border Radius)</label>\n <select id=\"val-radius\" onchange=\"onRadiusChange(this.value)\">\n <option value=\"4px\">4px (Sharp Minimal)</option>\n <option value=\"6px\">6px (Swiss Modern)</option>\n <option value=\"8px\">8px (Standard Clean)</option>\n <option value=\"12px\">12px (Rounded Friendly)</option>\n <option value=\"16px\">16px (Toss Soft)</option>\n </select>\n <div class=\"meta\">var(--atom-radius-md)</div>\n </div>\n </div>\n\n <!-- 2. Live Previewer -->\n <div class=\"card\">\n <h2>⚡ 실시간 토큰 반영 프리뷰</h2>\n <div class=\"preview-box\" id=\"preview-box\">\n <div class=\"preview-card\" id=\"sample-card\">\n <div style=\"font-weight: 600; margin-bottom: 4px;\">대시보드 위젯 컴포넌트</div>\n <div style=\"color: var(--muted); font-size: 12px; margin-bottom: 14px;\">\n 토큰 변경 시 실시간으로 디자인이 반영되며 즉시 CSS 파일에 동기화됩니다.\n </div>\n <button class=\"preview-btn\" id=\"sample-btn\">확인 및 승인</button>\n </div>\n\n <div style=\"font-size: 11px; font-family: monospace; color: var(--muted); background: #161616; padding: 12px; border-radius: 6px; border: 1px solid var(--border);\">\n <div>// 컴파일 대상 파일</div>\n <div style=\"color: #60a5fa; margin-top: 4px;\">tokens/token.json (W3C DTCG)</div>\n <div style=\"color: #34d399; margin-top: 2px;\">css/atom-ui.css (0KB Pure CSS)</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div id=\"toast\" class=\"toast\">✓ 토큰 및 CSS가 성공적으로 재컴파일되었습니다!</div>\n\n <script>\n let currentTokens = {};\n\n async function loadTokens() {\n try {\n const res = await fetch('/api/tokens');\n currentTokens = await res.json();\n populateFields();\n updatePreview();\n } catch (e) {\n console.error('Failed to fetch tokens', e);\n }\n }\n\n function populateFields() {\n const primary = currentTokens?.color?.brand?.['color-primary']?.$value || '#3182f6';\n const hover = currentTokens?.color?.brand?.['color-primary-hover']?.$value || '#1b64da';\n const surface = currentTokens?.color?.surface?.['bg-surface']?.$value || '#18181b';\n const radius = currentTokens?.borderRadius?.md?.$value || '8px';\n\n document.getElementById('picker-primary').value = primary.startsWith('#') ? primary : '#3182f6';\n document.getElementById('val-primary').value = primary;\n\n document.getElementById('picker-primary-hover').value = hover.startsWith('#') ? hover : '#1b64da';\n document.getElementById('val-primary-hover').value = hover;\n\n document.getElementById('picker-bg-surface').value = surface.startsWith('#') ? surface : '#18181b';\n document.getElementById('val-bg-surface').value = surface;\n\n document.getElementById('val-radius').value = radius;\n }\n\n function onColorChange(key, val) {\n if (!currentTokens.color) currentTokens.color = {};\n if (key === 'primary') {\n document.getElementById('picker-primary').value = val.startsWith('#') ? val : '#3182f6';\n document.getElementById('val-primary').value = val;\n if (!currentTokens.color.brand) currentTokens.color.brand = {};\n if (!currentTokens.color.brand['color-primary']) currentTokens.color.brand['color-primary'] = { variable: '--atom-color-primary' };\n currentTokens.color.brand['color-primary'].$value = val;\n }\n if (key === 'primary-hover') {\n document.getElementById('picker-primary-hover').value = val.startsWith('#') ? val : '#1b64da';\n document.getElementById('val-primary-hover').value = val;\n if (!currentTokens.color.brand) currentTokens.color.brand = {};\n if (!currentTokens.color.brand['color-primary-hover']) currentTokens.color.brand['color-primary-hover'] = { variable: '--atom-color-primary-hover' };\n currentTokens.color.brand['color-primary-hover'].$value = val;\n }\n if (key === 'bg-surface') {\n document.getElementById('picker-bg-surface').value = val.startsWith('#') ? val : '#18181b';\n document.getElementById('val-bg-surface').value = val;\n if (!currentTokens.color.surface) currentTokens.color.surface = {};\n if (!currentTokens.color.surface['bg-surface']) currentTokens.color.surface['bg-surface'] = { variable: '--atom-bg-surface' };\n currentTokens.color.surface['bg-surface'].$value = val;\n }\n updatePreview();\n }\n\n function onRadiusChange(val) {\n if (!currentTokens.borderRadius) currentTokens.borderRadius = {};\n if (!currentTokens.borderRadius.md) currentTokens.borderRadius.md = { variable: '--atom-radius-md' };\n currentTokens.borderRadius.md.$value = val;\n updatePreview();\n }\n\n function updatePreview() {\n const primary = document.getElementById('val-primary').value;\n const surface = document.getElementById('val-bg-surface').value;\n const radius = document.getElementById('val-radius').value;\n\n const btn = document.getElementById('sample-btn');\n const card = document.getElementById('sample-card');\n\n btn.style.backgroundColor = primary;\n btn.style.borderRadius = radius;\n card.style.backgroundColor = surface;\n card.style.borderRadius = radius;\n }\n\n async function saveTokens() {\n try {\n const res = await fetch('/api/tokens', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(currentTokens)\n });\n const result = await res.json();\n if (result.success) {\n showToast();\n } else {\n alert('저장 실패: ' + result.error);\n }\n } catch (e) {\n alert('서버 통신 오류: ' + e.message);\n }\n }\n\n function showToast() {\n const toast = document.getElementById('toast');\n toast.style.display = 'block';\n setTimeout(() => { toast.style.display = 'none'; }, 2500);\n }\n\n loadTokens();\n </script>\n</body>\n</html>`;\n}\n","#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { startLocalTokenStudio } from './studioServer';\nimport { compileTokensToCss } from './tokenCompiler';\n\nfunction getPkgRoot(): string {\n try {\n if (typeof __dirname !== 'undefined') {\n return path.resolve(__dirname, '..');\n }\n const currentFile = fileURLToPath(import.meta.url);\n return path.resolve(path.dirname(currentFile), '..');\n } catch {\n return process.cwd();\n }\n}\n\nconst PKG_ROOT = getPkgRoot();\nconst args = process.argv.slice(2);\nconst command = args[0] || 'help';\nconst targetName = args[1];\n\nfunction copyFileSafe(src: string, dest: string, label: string) {\n const targetDir = path.dirname(dest);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n fs.copyFileSync(src, dest);\n console.log(` ✓ ${label} -> ${path.relative(process.cwd(), dest)}`);\n}\n\nfunction handleInit() {\n const cwd = process.cwd();\n console.log('\\n🚀 Initializing AtomSystem Universal Design System...\\n');\n\n // 1. AI Assistant Master Guidelines (Multi-agent SSOT)\n const srcAgentGuide = path.join(PKG_ROOT, 'presets', 'agents.guide.md');\n if (fs.existsSync(srcAgentGuide)) {\n // AGENTS.md (Universal)\n copyFileSafe(srcAgentGuide, path.join(cwd, 'AGENTS.md'), 'Universal AI Guide (AGENTS.md)');\n // CLAUDE.md (Claude Code)\n copyFileSafe(srcAgentGuide, path.join(cwd, 'CLAUDE.md'), 'Claude Code Guidelines (CLAUDE.md)');\n // .cursorrules (Cursor IDE)\n copyFileSafe(srcAgentGuide, path.join(cwd, '.cursorrules'), 'Cursor Rules (.cursorrules)');\n }\n\n // 2. Install AI Agent Skill\n const srcSkill = path.join(PKG_ROOT, 'skills', 'atomsystem.skill.md');\n if (fs.existsSync(srcSkill)) {\n copyFileSafe(srcSkill, path.join(cwd, '.agents', 'skills', 'atomsystem', 'SKILL.md'), 'Agent Skill (.agents/skills/atomsystem/SKILL.md)');\n }\n\n // 3. Install 4-Tier Specifications\n const specs = [\n { src: path.join(PKG_ROOT, 'presets', 'default.design.md'), dest: path.join(cwd, 'atom.design.md'), label: 'Design Tokens (atom.design.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'components.md'), dest: path.join(cwd, 'atom.components.md'), label: 'Components Spec (atom.components.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'blocks.md'), dest: path.join(cwd, 'atom.blocks.md'), label: 'Design Blocks Spec (atom.blocks.md)' },\n { src: path.join(PKG_ROOT, 'presets', 'uxPattern.md'), dest: path.join(cwd, 'atom.uxPattern.md'), label: 'UX Patterns (atom.uxPattern.md)' },\n ];\n\n specs.forEach((s) => {\n if (fs.existsSync(s.src)) {\n copyFileSafe(s.src, s.dest, s.label);\n }\n });\n\n // 4. Install Token JSON & Zero-Runtime CSS\n const srcToken = path.join(PKG_ROOT, 'tokens', 'token.json');\n if (fs.existsSync(srcToken)) {\n copyFileSafe(srcToken, path.join(cwd, 'tokens', 'token.json'), 'W3C DTCG Token JSON (tokens/token.json)');\n }\n\n const srcCss = path.join(PKG_ROOT, 'css', 'atom-ui.css');\n if (fs.existsSync(srcCss)) {\n copyFileSafe(srcCss, path.join(cwd, 'css', 'atom-ui.css'), 'Zero-Runtime Semantic CSS (css/atom-ui.css)');\n }\n\n console.log('\\n✨ AtomSystem initialization completed successfully!');\n console.log('\\n🎨 Local Token Studio Available:');\n console.log(' Run \"npx atomsystem studio\" to launch the local web customizer GUI.');\n console.log(' You can visually edit tokens and immediately recompile css/atom-ui.css.');\n console.log('\\n📌 How AI Coding Works Now:');\n console.log(' Any AI assistant (Claude Code, Cursor, Copilot, Antigravity) will now');\n console.log(' AUTOMATICALLY detect the design tokens, components, and UX patterns.');\n console.log('\\n📌 You can now ask your AI:');\n console.log(' \"대시보드 화면에 실시간 차트와 가격 정책 블록을 레고처럼 조립해줘.\"');\n console.log(' \"atom.design.md의 색상 토큰을 바탕으로 결제 확인 모달을 만들어줘.\"\\n');\n}\n\nconst COMPONENT_MAP: Record<string, string> = {\n button: 'Button.tsx',\n card: 'Card.tsx',\n badge: 'Badge.tsx',\n input: 'Input.tsx',\n table: 'Table.tsx',\n tabs: 'Tabs.tsx',\n switch: 'Switch.tsx',\n modal: 'Modal.tsx',\n container: 'Container.tsx',\n layout: 'Layout.tsx',\n};\n\nconst BLOCK_MAP: Record<string, { file: string; deps: string[] }> = {\n 'realtime-chart': { file: 'RealtimeChartBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'interactive-chat': { file: 'InteractiveChatBlock.tsx', deps: ['card', 'input', 'button', 'badge'] },\n 'pricing-table': { file: 'PricingPlanBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'card-list': { file: 'CardListBlock.tsx', deps: ['card', 'input', 'button', 'badge'] },\n 'interactive-slider': { file: 'SliderShowcaseBlock.tsx', deps: ['card', 'button', 'badge'] },\n 'metric-stats': { file: 'MetricStatsBlock.tsx', deps: ['card', 'badge'] },\n 'file-explorer': { file: 'FileExplorerBlock.tsx', deps: ['card', 'button', 'badge'] },\n};\n\nfunction handleAdd(name?: string) {\n if (!name) {\n console.error('\\n❌ Please specify an item to add. Example: npx atomsystem add button\\n');\n handleList();\n return;\n }\n\n const cwd = process.cwd();\n const normalized = name.toLowerCase().trim();\n\n // 1. Check if it's a component\n if (COMPONENT_MAP[normalized]) {\n const fileName = COMPONENT_MAP[normalized];\n const src = path.join(PKG_ROOT, 'components', 'ui', fileName);\n const dest = path.join(cwd, 'components', 'ui', fileName);\n if (fs.existsSync(src)) {\n copyFileSafe(src, dest, `Component (${fileName})`);\n console.log(`\\n✅ Added ${normalized} component to components/ui/${fileName}\\n`);\n } else {\n console.error(`\\n❌ Source component file not found: ${src}\\n`);\n }\n return;\n }\n\n // 2. Check if it's a block\n if (BLOCK_MAP[normalized]) {\n const { file, deps } = BLOCK_MAP[normalized];\n console.log(`\\n📦 Adding block \"${normalized}\" and its dependent components...\\n`);\n\n // Copy dependencies first (Component-First rule)\n deps.forEach((dep) => {\n const depFile = COMPONENT_MAP[dep];\n if (depFile) {\n const srcDep = path.join(PKG_ROOT, 'components', 'ui', depFile);\n const destDep = path.join(cwd, 'components', 'ui', depFile);\n if (fs.existsSync(srcDep)) {\n copyFileSafe(srcDep, destDep, `Dependent Component (${depFile})`);\n }\n }\n });\n\n // Copy block file\n const srcBlock = path.join(PKG_ROOT, 'components', 'blocks', file);\n const destBlock = path.join(cwd, 'components', 'blocks', file);\n if (fs.existsSync(srcBlock)) {\n copyFileSafe(srcBlock, destBlock, `Block (${file})`);\n console.log(`\\n✅ Block \"${normalized}\" successfully added to components/blocks/${file}\\n`);\n } else {\n console.error(`\\n❌ Source block file not found: ${srcBlock}\\n`);\n }\n return;\n }\n\n console.error(`\\n❌ Unknown item: \"${name}\".`);\n handleList();\n}\n\nfunction handleList() {\n console.log(`\nAvailable Components:\n - button (Button, ButtonVariants)\n - card (Card container)\n - badge (Status badge)\n - input (Input with status)\n - table (Table, Header, Row, Cell)\n - tabs (TabsList, TabsTrigger)\n - switch (A11y Switch toggle)\n - modal (Dialog with Esc key support)\n\nAvailable Design Blocks:\n - realtime-chart (Live streaming candlestick/line chart)\n - interactive-chat (AI chatbot feed with suggestions)\n - pricing-table (Monthly/annual tier pricing table)\n - card-list (Responsive grid & list filter)\n - interactive-slider (Cost simulation calculator & carousel)\n - metric-stats (4 KPI executive metric cards)\n - file-explorer (Hierarchical directory tree explorer)\n\nInstall any item:\n npx atomsystem add <item-name>\n`);\n}\n\nfunction handleBuildTokens() {\n const cwd = process.cwd();\n const tokenJsonPath = path.join(cwd, 'tokens', 'token.json');\n const cssPath = path.join(cwd, 'css', 'atom-ui.css');\n\n if (!fs.existsSync(tokenJsonPath)) {\n console.error(`\\n❌ tokens/token.json not found at ${tokenJsonPath}. Run 'npx atomsystem init' first.\\n`);\n return;\n }\n\n try {\n const tokens = JSON.parse(fs.readFileSync(tokenJsonPath, 'utf-8'));\n const css = compileTokensToCss(tokens);\n const cssDir = path.dirname(cssPath);\n if (!fs.existsSync(cssDir)) fs.mkdirSync(cssDir, { recursive: true });\n fs.writeFileSync(cssPath, css, 'utf-8');\n console.log(`\\n✨ Successfully compiled tokens to ${path.relative(cwd, cssPath)}!\\n`);\n } catch (err: any) {\n console.error(`\\n❌ Failed to compile tokens: ${err.message}\\n`);\n }\n}\n\nfunction handleStudio() {\n const portArg = args.find((a) => a.startsWith('--port='));\n const port = portArg ? parseInt(portArg.split('=')[1], 10) : 4000;\n startLocalTokenStudio({ port, cwd: process.cwd() });\n}\n\nfunction showHelp() {\n console.log(`\nAtomSystem CLI - Universal Design Token & Agentic UI System\n\nUsage:\n npx atomsystem <command> [options]\n\nCommands:\n init Initialize AI guidelines, tokens, specs, and CSS in your project\n studio Launch Local Web Token Studio GUI (interactive token customizer)\n build:tokens Compile tokens/token.json into zero-runtime css/atom-ui.css\n add <name> Add a component or block directly to your project\n list List all available components and blocks\n help Display this help message\n version Print version info\n\nOptions for studio:\n --port=<port> Port for the local studio server (default: 4000)\n`);\n}\n\nfunction showVersion() {\n const pkgPath = path.join(PKG_ROOT, 'package.json');\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n console.log(`atomsystem v${pkg.version}`);\n } else {\n console.log('atomsystem v0.6.0');\n }\n}\n\nswitch (command) {\n case 'init':\n handleInit();\n break;\n case 'studio':\n case 'editor':\n handleStudio();\n break;\n case 'build:tokens':\n case 'compile':\n handleBuildTokens();\n break;\n case 'add':\n handleAdd(targetName);\n break;\n case 'list':\n handleList();\n break;\n case 'version':\n case '-v':\n case '--version':\n showVersion();\n break;\n case 'help':\n case '-h':\n case '--help':\n default:\n showHelp();\n break;\n}\n"]}
package/dist/index.cjs CHANGED
@@ -8907,7 +8907,7 @@ function cn(...inputs) {
8907
8907
 
8908
8908
  // src/index.ts
8909
8909
  var ATOM_UI_CSS_PATH = "atomsystem/css/atom-ui.css";
8910
- var ATOM_VERSION = "0.5.0";
8910
+ var ATOM_VERSION = "0.6.0";
8911
8911
  var ATOM_LIB_NAME = "atomsystem";
8912
8912
 
8913
8913
  exports.ATOM_LIB_NAME = ATOM_LIB_NAME;