atomsystem 0.3.0 → 0.4.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/README.md CHANGED
@@ -134,7 +134,7 @@ AI Agent는 자동으로 디자인 토큰과 UX 표준을 적용하여 일관된
134
134
  | :--- | :--- |
135
135
  | `atomsystem` | 토큰 데이터 모델, 테마 엔진, 색상/타이포 유틸리티 |
136
136
  | `atomsystem/css/atom-ui.css` | 전역 스타일 및 시멘틱 UI 클래스 (`.atom-btn`, `.atom-card` 등) |
137
- | `atomsystem/components/*` | React UI 컴포넌트 (`Button`, `Card`, `Modal`, `Input`, `Badge`) |
137
+ | `atomsystem/components/*` | React UI 컴포넌트 풀세트 (`Button`, `Input`, `Card`, `Badge`, `Modal`, `Calendar`, `Select`, `Accordion`, `Radio`, `Slider`, `Avatar`, `Progress`, `Skeleton`, `Breadcrumb`, `Separator`, `Textarea`, `Pagination`, `Tooltip`) |
138
138
  | `atomsystem/token.json` | W3C DTCG 포맷 단일 진실 공급원 토큰 파일 |
139
139
  | `atomsystem/design.md` | 마크다운 기반 디자인 시스템 가이드 규격 |
140
140
  | `atomsystem/uxPattern.md` | 마크다운 기반 UX 인터랙션 패턴 가이드 |
@@ -0,0 +1,32 @@
1
+ import React, { useState } from 'react';
2
+
3
+ export interface AvatarProps {
4
+ src?: string;
5
+ alt?: string;
6
+ fallback?: string;
7
+ size?: 'sm' | 'md' | 'lg';
8
+ status?: 'online' | 'offline' | 'busy';
9
+ className?: string;
10
+ }
11
+
12
+ export const Avatar: React.FC<AvatarProps> = ({
13
+ src,
14
+ alt = 'Avatar',
15
+ fallback,
16
+ size = 'md',
17
+ status,
18
+ className = '',
19
+ }) => {
20
+ const [hasError, setHasError] = useState(!src);
21
+
22
+ return (
23
+ <div className={`atom-avatar atom-avatar-${size} ${className}`}>
24
+ {src && !hasError ? (
25
+ <img src={src} alt={alt} onError={() => setHasError(true)} className="atom-avatar-img" />
26
+ ) : (
27
+ <span className="atom-avatar-fallback">{fallback || alt.slice(0, 2).toUpperCase()}</span>
28
+ )}
29
+ {status && <span className={`atom-avatar-status atom-avatar-status-${status}`} />}
30
+ </div>
31
+ );
32
+ };
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+
3
+ export interface BreadcrumbItem {
4
+ label: string;
5
+ href?: string;
6
+ }
7
+
8
+ export interface BreadcrumbProps {
9
+ items: BreadcrumbItem[];
10
+ separator?: string;
11
+ className?: string;
12
+ }
13
+
14
+ export const Breadcrumb: React.FC<BreadcrumbProps> = ({
15
+ items,
16
+ separator = '/',
17
+ className = '',
18
+ }) => {
19
+ return (
20
+ <nav className={`atom-breadcrumb ${className}`} aria-label="Breadcrumb">
21
+ <ol className="atom-breadcrumb-list">
22
+ {items.map((item, idx) => {
23
+ const isLast = idx === items.length - 1;
24
+ return (
25
+ <React.Fragment key={idx}>
26
+ <li className={`atom-breadcrumb-item ${isLast ? 'atom-breadcrumb-current' : ''}`}>
27
+ {isLast || !item.href ? (
28
+ <span aria-current={isLast ? 'page' : undefined}>{item.label}</span>
29
+ ) : (
30
+ <a href={item.href}>{item.label}</a>
31
+ )}
32
+ </li>
33
+ {!isLast && <li className="atom-breadcrumb-separator">{separator}</li>}
34
+ </React.Fragment>
35
+ );
36
+ })}
37
+ </ol>
38
+ </nav>
39
+ );
40
+ };
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+
3
+ export interface ProgressProps {
4
+ value: number;
5
+ max?: number;
6
+ variant?: 'primary' | 'success';
7
+ className?: string;
8
+ }
9
+
10
+ export const Progress: React.FC<ProgressProps> = ({
11
+ value,
12
+ max = 100,
13
+ variant = 'primary',
14
+ className = '',
15
+ }) => {
16
+ const percent = Math.min(100, Math.max(0, (value / max) * 100));
17
+
18
+ return (
19
+ <div
20
+ className={`atom-progress ${className}`}
21
+ role="progressbar"
22
+ aria-valuenow={value}
23
+ aria-valuemin={0}
24
+ aria-valuemax={max}
25
+ >
26
+ <div
27
+ className={`atom-progress-bar atom-progress-${variant}`}
28
+ style={{ width: `${percent}%` }}
29
+ />
30
+ </div>
31
+ );
32
+ };
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+
3
+ export interface RadioOption {
4
+ value: string;
5
+ label: string;
6
+ description?: string;
7
+ }
8
+
9
+ export interface RadioGroupProps {
10
+ name?: string;
11
+ value?: string;
12
+ options: RadioOption[];
13
+ onChange?: (val: string) => void;
14
+ className?: string;
15
+ }
16
+
17
+ export const RadioGroup: React.FC<RadioGroupProps> = ({
18
+ name = 'atom-radio-group',
19
+ value,
20
+ options,
21
+ onChange,
22
+ className = '',
23
+ }) => {
24
+ return (
25
+ <div className={`atom-radio-group ${className}`} role="radiogroup">
26
+ {options.map((opt) => (
27
+ <label key={opt.value} className="atom-radio-label">
28
+ <input
29
+ type="radio"
30
+ name={name}
31
+ value={opt.value}
32
+ checked={value === opt.value}
33
+ onChange={() => onChange?.(opt.value)}
34
+ className="atom-radio"
35
+ />
36
+ <div className="flex flex-col">
37
+ <span className="font-semibold">{opt.label}</span>
38
+ {opt.description && <span className="text-xs text-neutral-500">{opt.description}</span>}
39
+ </div>
40
+ </label>
41
+ ))}
42
+ </div>
43
+ );
44
+ };
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+
3
+ export interface SeparatorProps {
4
+ orientation?: 'horizontal' | 'vertical';
5
+ label?: string;
6
+ className?: string;
7
+ }
8
+
9
+ export const Separator: React.FC<SeparatorProps> = ({
10
+ orientation = 'horizontal',
11
+ label,
12
+ className = '',
13
+ }) => {
14
+ if (label && orientation === 'horizontal') {
15
+ return (
16
+ <div className={`atom-separator-with-label ${className}`}>
17
+ <span>{label}</span>
18
+ </div>
19
+ );
20
+ }
21
+
22
+ return (
23
+ <div
24
+ role="separator"
25
+ aria-orientation={orientation}
26
+ className={`atom-separator atom-separator-${orientation} ${className}`}
27
+ />
28
+ );
29
+ };
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+
3
+ export interface SkeletonProps {
4
+ width?: string | number;
5
+ height?: string | number;
6
+ circle?: boolean;
7
+ className?: string;
8
+ }
9
+
10
+ export const Skeleton: React.FC<SkeletonProps> = ({
11
+ width = '100%',
12
+ height = '1rem',
13
+ circle = false,
14
+ className = '',
15
+ }) => {
16
+ return (
17
+ <div
18
+ className={`atom-skeleton ${circle ? '!rounded-full' : ''} ${className}`}
19
+ style={{
20
+ width: typeof width === 'number' ? `${width}px` : width,
21
+ height: typeof height === 'number' ? `${height}px` : height,
22
+ }}
23
+ />
24
+ );
25
+ };
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+
3
+ export interface SliderProps {
4
+ value: number;
5
+ min?: number;
6
+ max?: number;
7
+ step?: number;
8
+ onChange?: (val: number) => void;
9
+ className?: string;
10
+ }
11
+
12
+ export const Slider: React.FC<SliderProps> = ({
13
+ value,
14
+ min = 0,
15
+ max = 100,
16
+ step = 1,
17
+ onChange,
18
+ className = '',
19
+ }) => {
20
+ return (
21
+ <div className={`atom-slider ${className}`}>
22
+ <input
23
+ type="range"
24
+ min={min}
25
+ max={max}
26
+ step={step}
27
+ value={value}
28
+ onChange={(e) => onChange?.(Number(e.target.value))}
29
+ className="atom-slider-input"
30
+ />
31
+ </div>
32
+ );
33
+ };
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+
3
+ export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
4
+ maxLength?: number;
5
+ label?: string;
6
+ }
7
+
8
+ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
9
+ ({ maxLength, label, value, className = '', ...props }, ref) => {
10
+ const currentLength = typeof value === 'string' ? value.length : 0;
11
+
12
+ return (
13
+ <div className="atom-textarea-group">
14
+ {label && <label className="text-xs font-semibold text-neutral-600 dark:text-neutral-400">{label}</label>}
15
+ <textarea ref={ref} value={value} maxLength={maxLength} className={`atom-textarea ${className}`} {...props} />
16
+ {maxLength && (
17
+ <div className="atom-textarea-counter">
18
+ {currentLength} / {maxLength}자
19
+ </div>
20
+ )}
21
+ </div>
22
+ );
23
+ }
24
+ );
25
+ Textarea.displayName = 'Textarea';
@@ -8,3 +8,11 @@ export * from './Select';
8
8
  export * from './Accordion';
9
9
  export * from './Tooltip';
10
10
  export * from './Pagination';
11
+ export * from './Radio';
12
+ export * from './Slider';
13
+ export * from './Avatar';
14
+ export * from './Progress';
15
+ export * from './Skeleton';
16
+ export * from './Breadcrumb';
17
+ export * from './Separator';
18
+ export * from './Textarea';
package/css/atom-ui.css CHANGED
@@ -483,3 +483,217 @@
483
483
  opacity: 0.4;
484
484
  cursor: not-allowed;
485
485
  }
486
+
487
+ /* Radio Group & Cards */
488
+ .atom-radio-group {
489
+ display: flex;
490
+ flex-direction: column;
491
+ gap: 0.5rem;
492
+ }
493
+ .atom-radio-label {
494
+ display: inline-flex;
495
+ align-items: center;
496
+ gap: 0.5rem;
497
+ font-size: 0.875rem;
498
+ color: var(--atom-text-primary);
499
+ cursor: pointer;
500
+ user-select: none;
501
+ }
502
+ .atom-radio {
503
+ appearance: none;
504
+ width: 1.125rem;
505
+ height: 1.125rem;
506
+ border-radius: 50%;
507
+ border: 2px solid var(--atom-border-strong);
508
+ background-color: var(--atom-bg-surface);
509
+ cursor: pointer;
510
+ outline: none;
511
+ transition: all 0.15s ease;
512
+ position: relative;
513
+ }
514
+ .atom-radio:checked {
515
+ border-color: var(--atom-primary);
516
+ background-color: var(--atom-primary);
517
+ box-shadow: inset 0 0 0 3px var(--atom-bg-surface);
518
+ }
519
+
520
+ /* Slider */
521
+ .atom-slider {
522
+ width: 100%;
523
+ display: flex;
524
+ align-items: center;
525
+ }
526
+ .atom-slider-input {
527
+ width: 100%;
528
+ accent-color: var(--atom-primary);
529
+ cursor: pointer;
530
+ }
531
+
532
+ /* Avatar */
533
+ .atom-avatar {
534
+ position: relative;
535
+ display: inline-flex;
536
+ align-items: center;
537
+ justify-content: center;
538
+ border-radius: 50%;
539
+ overflow: hidden;
540
+ background-color: var(--atom-bg-secondary);
541
+ color: var(--atom-text-primary);
542
+ font-weight: 700;
543
+ flex-shrink: 0;
544
+ user-select: none;
545
+ }
546
+ .atom-avatar-sm { width: 2rem; height: 2rem; font-size: 0.75rem; }
547
+ .atom-avatar-md { width: 2.5rem; height: 2.5rem; font-size: 0.875rem; }
548
+ .atom-avatar-lg { width: 3.5rem; height: 3.5rem; font-size: 1.25rem; }
549
+ .atom-avatar-img {
550
+ width: 100%;
551
+ height: 100%;
552
+ object-fit: cover;
553
+ }
554
+ .atom-avatar-fallback {
555
+ display: flex;
556
+ align-items: center;
557
+ justify-content: center;
558
+ width: 100%;
559
+ height: 100%;
560
+ background-color: var(--atom-primary-light);
561
+ color: var(--atom-primary);
562
+ }
563
+ .atom-avatar-status {
564
+ position: absolute;
565
+ bottom: 0;
566
+ right: 0;
567
+ width: 0.65rem;
568
+ height: 0.65rem;
569
+ border-radius: 50%;
570
+ border: 2px solid var(--atom-bg-surface);
571
+ }
572
+ .atom-avatar-status-online { background-color: #10b981; }
573
+ .atom-avatar-status-busy { background-color: #f43f5e; }
574
+
575
+ /* Progress */
576
+ .atom-progress {
577
+ width: 100%;
578
+ height: 0.5rem;
579
+ background-color: var(--atom-bg-secondary);
580
+ border-radius: var(--atom-radius-full);
581
+ overflow: hidden;
582
+ position: relative;
583
+ }
584
+ .atom-progress-bar {
585
+ height: 100%;
586
+ border-radius: var(--atom-radius-full);
587
+ transition: width 0.3s ease;
588
+ }
589
+ .atom-progress-primary { background-color: var(--atom-primary); }
590
+ .atom-progress-success { background-color: #10b981; }
591
+
592
+ /* Skeleton */
593
+ .atom-skeleton {
594
+ background: linear-gradient(
595
+ 90deg,
596
+ var(--atom-bg-secondary) 25%,
597
+ var(--atom-border-subtle) 50%,
598
+ var(--atom-bg-secondary) 75%
599
+ );
600
+ background-size: 200% 100%;
601
+ animation: atom-shimmer 1.5s infinite;
602
+ border-radius: var(--atom-radius-md);
603
+ }
604
+ @keyframes atom-shimmer {
605
+ 0% { background-position: 200% 0; }
606
+ 100% { background-position: -200% 0; }
607
+ }
608
+
609
+ /* Breadcrumb */
610
+ .atom-breadcrumb {
611
+ display: flex;
612
+ align-items: center;
613
+ font-size: 0.8125rem;
614
+ }
615
+ .atom-breadcrumb-list {
616
+ display: flex;
617
+ align-items: center;
618
+ gap: 0.5rem;
619
+ list-style: none;
620
+ padding: 0;
621
+ margin: 0;
622
+ }
623
+ .atom-breadcrumb-item a {
624
+ color: var(--atom-text-secondary);
625
+ text-decoration: none;
626
+ transition: color 0.15s ease;
627
+ }
628
+ .atom-breadcrumb-item a:hover {
629
+ color: var(--atom-text-primary);
630
+ }
631
+ .atom-breadcrumb-separator {
632
+ color: var(--atom-text-muted);
633
+ }
634
+ .atom-breadcrumb-current {
635
+ color: var(--atom-text-primary);
636
+ font-weight: 600;
637
+ }
638
+
639
+ /* Separator / Divider */
640
+ .atom-separator {
641
+ background-color: var(--atom-border-subtle);
642
+ }
643
+ .atom-separator-horizontal {
644
+ width: 100%;
645
+ height: 1px;
646
+ margin: 1rem 0;
647
+ }
648
+ .atom-separator-vertical {
649
+ width: 1px;
650
+ height: 100%;
651
+ margin: 0 0.5rem;
652
+ }
653
+ .atom-separator-with-label {
654
+ display: flex;
655
+ align-items: center;
656
+ text-align: center;
657
+ color: var(--atom-text-muted);
658
+ font-size: 0.75rem;
659
+ margin: 1rem 0;
660
+ }
661
+ .atom-separator-with-label::before,
662
+ .atom-separator-with-label::after {
663
+ content: '';
664
+ flex: 1;
665
+ border-bottom: 1px solid var(--atom-border-subtle);
666
+ }
667
+ .atom-separator-with-label span {
668
+ padding: 0 0.75rem;
669
+ }
670
+
671
+ /* Textarea */
672
+ .atom-textarea-group {
673
+ display: flex;
674
+ flex-direction: column;
675
+ gap: 0.35rem;
676
+ width: 100%;
677
+ }
678
+ .atom-textarea {
679
+ width: 100%;
680
+ padding: 0.65rem 0.75rem;
681
+ border-radius: var(--atom-radius-md);
682
+ border: 1px solid var(--atom-border-strong);
683
+ background-color: var(--atom-bg-surface);
684
+ color: var(--atom-text-primary);
685
+ font-size: 0.875rem;
686
+ line-height: 1.5;
687
+ outline: none;
688
+ resize: vertical;
689
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
690
+ }
691
+ .atom-textarea:focus {
692
+ border-color: var(--atom-primary);
693
+ box-shadow: 0 0 0 3px var(--atom-primary-light);
694
+ }
695
+ .atom-textarea-counter {
696
+ align-self: flex-end;
697
+ font-size: 0.75rem;
698
+ color: var(--atom-text-muted);
699
+ }
package/dist/cli.cjs CHANGED
@@ -82,7 +82,7 @@ function showVersion() {
82
82
  const pkg = JSON.parse(fs__default.default.readFileSync(pkgPath, "utf-8"));
83
83
  console.log(`atomsystem v${pkg.version}`);
84
84
  } else {
85
- console.log("atomsystem v0.3.0");
85
+ console.log("atomsystem v0.4.0");
86
86
  }
87
87
  }
88
88
  switch (command) {
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"names":["path","fileURLToPath","fs"],"mappings":"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","file":"cli.cjs","sourcesContent":["#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\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';\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(` ✓ Created ${label} -> ${path.relative(process.cwd(), dest)}`);\n}\n\nfunction handleInit() {\n const cwd = process.cwd();\n console.log('\\n🚀 Initializing AtomSystem in your project...\\n');\n\n // 1. Install AI Agent Skill\n const srcSkill = path.join(PKG_ROOT, 'skills', 'atomsystem.skill.md');\n const destSkill = path.join(cwd, '.agents', 'skills', 'atomsystem', 'SKILL.md');\n if (fs.existsSync(srcSkill)) {\n copyFileSafe(srcSkill, destSkill, 'AI Skill (.agents/skills/atomsystem/SKILL.md)');\n }\n\n // 2. Install Design Guide (.design.md)\n const srcDesign = path.join(PKG_ROOT, 'presets', 'default.design.md');\n const destDesign = path.join(cwd, 'atom.design.md');\n if (fs.existsSync(srcDesign)) {\n copyFileSafe(srcDesign, destDesign, 'Design Guide (atom.design.md)');\n }\n\n // 3. Install UX Pattern Guide (.uxPattern.md)\n const srcPattern = path.join(PKG_ROOT, 'presets', 'uxPattern.md');\n const destPattern = path.join(cwd, 'atom.uxPattern.md');\n if (fs.existsSync(srcPattern)) {\n copyFileSafe(srcPattern, destPattern, 'UX Pattern Guide (atom.uxPattern.md)');\n }\n\n // 4. Install Token JSON (tokens.json)\n const srcToken = path.join(PKG_ROOT, 'tokens', 'token.json');\n const destToken = path.join(cwd, 'tokens', 'token.json');\n if (fs.existsSync(srcToken)) {\n copyFileSafe(srcToken, destToken, 'Token JSON (tokens/token.json)');\n }\n\n console.log('\\n✨ AtomSystem initialization completed!');\n console.log('\\n📌 Next Steps:');\n console.log('1. Import AtomSystem CSS in your app (e.g. layout.tsx, App.vue, index.html):');\n console.log(' import \"atomsystem/css/atom-ui.css\";');\n console.log('2. Ask your AI coding assistant (Antigravity, Cursor, Copilot) to build UI:');\n console.log(' \"atom.design.md와 atom.uxPattern.md를 참고하여 결제 화면 컴포넌트를 만들어줘.\"\\n');\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 AtomSystem assets (AI Skill, design.md, uxPattern.md, token.json)\n help Display this help message\n version Print version info\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.3.0');\n }\n}\n\nswitch (command) {\n case 'init':\n handleInit();\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\n"]}
1
+ {"version":3,"sources":["../src/cli.ts"],"names":["path","fileURLToPath","fs"],"mappings":"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","file":"cli.cjs","sourcesContent":["#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\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';\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(` ✓ Created ${label} -> ${path.relative(process.cwd(), dest)}`);\n}\n\nfunction handleInit() {\n const cwd = process.cwd();\n console.log('\\n🚀 Initializing AtomSystem in your project...\\n');\n\n // 1. Install AI Agent Skill\n const srcSkill = path.join(PKG_ROOT, 'skills', 'atomsystem.skill.md');\n const destSkill = path.join(cwd, '.agents', 'skills', 'atomsystem', 'SKILL.md');\n if (fs.existsSync(srcSkill)) {\n copyFileSafe(srcSkill, destSkill, 'AI Skill (.agents/skills/atomsystem/SKILL.md)');\n }\n\n // 2. Install Design Guide (.design.md)\n const srcDesign = path.join(PKG_ROOT, 'presets', 'default.design.md');\n const destDesign = path.join(cwd, 'atom.design.md');\n if (fs.existsSync(srcDesign)) {\n copyFileSafe(srcDesign, destDesign, 'Design Guide (atom.design.md)');\n }\n\n // 3. Install UX Pattern Guide (.uxPattern.md)\n const srcPattern = path.join(PKG_ROOT, 'presets', 'uxPattern.md');\n const destPattern = path.join(cwd, 'atom.uxPattern.md');\n if (fs.existsSync(srcPattern)) {\n copyFileSafe(srcPattern, destPattern, 'UX Pattern Guide (atom.uxPattern.md)');\n }\n\n // 4. Install Token JSON (tokens.json)\n const srcToken = path.join(PKG_ROOT, 'tokens', 'token.json');\n const destToken = path.join(cwd, 'tokens', 'token.json');\n if (fs.existsSync(srcToken)) {\n copyFileSafe(srcToken, destToken, 'Token JSON (tokens/token.json)');\n }\n\n console.log('\\n✨ AtomSystem initialization completed!');\n console.log('\\n📌 Next Steps:');\n console.log('1. Import AtomSystem CSS in your app (e.g. layout.tsx, App.vue, index.html):');\n console.log(' import \"atomsystem/css/atom-ui.css\";');\n console.log('2. Ask your AI coding assistant (Antigravity, Cursor, Copilot) to build UI:');\n console.log(' \"atom.design.md와 atom.uxPattern.md를 참고하여 결제 화면 컴포넌트를 만들어줘.\"\\n');\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 AtomSystem assets (AI Skill, design.md, uxPattern.md, token.json)\n help Display this help message\n version Print version info\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.4.0');\n }\n}\n\nswitch (command) {\n case 'init':\n handleInit();\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\n"]}
package/dist/cli.js CHANGED
@@ -74,7 +74,7 @@ function showVersion() {
74
74
  const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
75
75
  console.log(`atomsystem v${pkg.version}`);
76
76
  } else {
77
- console.log("atomsystem v0.3.0");
77
+ console.log("atomsystem v0.4.0");
78
78
  }
79
79
  }
80
80
  switch (command) {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":";;;;;AAKA,SAAS,UAAqB,GAAA;AAC5B,EAAI,IAAA;AACF,IAAI,IAAA,OAAO,cAAc,WAAa,EAAA;AACpC,MAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,EAAW,IAAI,CAAA;AAAA;AAErC,IAAM,MAAA,WAAA,GAAc,aAAc,CAAA,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AACjD,IAAA,OAAO,KAAK,OAAQ,CAAA,IAAA,CAAK,OAAQ,CAAA,WAAW,GAAG,IAAI,CAAA;AAAA,GAC7C,CAAA,MAAA;AACN,IAAA,OAAO,QAAQ,GAAI,EAAA;AAAA;AAEvB;AAEA,IAAM,WAAW,UAAW,EAAA;AAC5B,IAAM,IAAO,GAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA;AACjC,IAAM,OAAA,GAAU,IAAK,CAAA,CAAC,CAAK,IAAA,MAAA;AAE3B,SAAS,YAAA,CAAa,GAAa,EAAA,IAAA,EAAc,KAAe,EAAA;AAC9D,EAAM,MAAA,SAAA,GAAY,IAAK,CAAA,OAAA,CAAQ,IAAI,CAAA;AACnC,EAAA,IAAI,CAAC,EAAA,CAAG,UAAW,CAAA,SAAS,CAAG,EAAA;AAC7B,IAAA,EAAA,CAAG,SAAU,CAAA,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA;AAE7C,EAAG,EAAA,CAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACzB,EAAQ,OAAA,CAAA,GAAA,CAAI,CAAe,iBAAA,EAAA,KAAK,CAAO,IAAA,EAAA,IAAA,CAAK,QAAS,CAAA,OAAA,CAAQ,GAAI,EAAA,EAAG,IAAI,CAAC,CAAE,CAAA,CAAA;AAC7E;AAEA,SAAS,UAAa,GAAA;AACpB,EAAM,MAAA,GAAA,GAAM,QAAQ,GAAI,EAAA;AACxB,EAAA,OAAA,CAAQ,IAAI,0DAAmD,CAAA;AAG/D,EAAA,MAAM,QAAW,GAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,UAAU,qBAAqB,CAAA;AACpE,EAAA,MAAM,YAAY,IAAK,CAAA,IAAA,CAAK,KAAK,SAAW,EAAA,QAAA,EAAU,cAAc,UAAU,CAAA;AAC9E,EAAI,IAAA,EAAA,CAAG,UAAW,CAAA,QAAQ,CAAG,EAAA;AAC3B,IAAa,YAAA,CAAA,QAAA,EAAU,WAAW,+CAA+C,CAAA;AAAA;AAInF,EAAA,MAAM,SAAY,GAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,WAAW,mBAAmB,CAAA;AACpE,EAAA,MAAM,UAAa,GAAA,IAAA,CAAK,IAAK,CAAA,GAAA,EAAK,gBAAgB,CAAA;AAClD,EAAI,IAAA,EAAA,CAAG,UAAW,CAAA,SAAS,CAAG,EAAA;AAC5B,IAAa,YAAA,CAAA,SAAA,EAAW,YAAY,+BAA+B,CAAA;AAAA;AAIrE,EAAA,MAAM,UAAa,GAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,WAAW,cAAc,CAAA;AAChE,EAAA,MAAM,WAAc,GAAA,IAAA,CAAK,IAAK,CAAA,GAAA,EAAK,mBAAmB,CAAA;AACtD,EAAI,IAAA,EAAA,CAAG,UAAW,CAAA,UAAU,CAAG,EAAA;AAC7B,IAAa,YAAA,CAAA,UAAA,EAAY,aAAa,sCAAsC,CAAA;AAAA;AAI9E,EAAA,MAAM,QAAW,GAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,UAAU,YAAY,CAAA;AAC3D,EAAA,MAAM,SAAY,GAAA,IAAA,CAAK,IAAK,CAAA,GAAA,EAAK,UAAU,YAAY,CAAA;AACvD,EAAI,IAAA,EAAA,CAAG,UAAW,CAAA,QAAQ,CAAG,EAAA;AAC3B,IAAa,YAAA,CAAA,QAAA,EAAU,WAAW,gCAAgC,CAAA;AAAA;AAGpE,EAAA,OAAA,CAAQ,IAAI,+CAA0C,CAAA;AACtD,EAAA,OAAA,CAAQ,IAAI,yBAAkB,CAAA;AAC9B,EAAA,OAAA,CAAQ,IAAI,8EAA8E,CAAA;AAC1F,EAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,EAAA,OAAA,CAAQ,IAAI,6EAA6E,CAAA;AACzF,EAAA,OAAA,CAAQ,IAAI,iKAAkE,CAAA;AAChF;AAEA,SAAS,QAAW,GAAA;AAClB,EAAA,OAAA,CAAQ,GAAI,CAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAUb,CAAA;AACD;AAEA,SAAS,WAAc,GAAA;AACrB,EAAA,MAAM,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,cAAc,CAAA;AAClD,EAAI,IAAA,EAAA,CAAG,UAAW,CAAA,OAAO,CAAG,EAAA;AAC1B,IAAA,MAAM,MAAM,IAAK,CAAA,KAAA,CAAM,GAAG,YAAa,CAAA,OAAA,EAAS,OAAO,CAAC,CAAA;AACxD,IAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,YAAA,EAAe,GAAI,CAAA,OAAO,CAAE,CAAA,CAAA;AAAA,GACnC,MAAA;AACL,IAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAAA;AAEnC;AAEA,QAAQ,OAAS;AAAA,EACf,KAAK,MAAA;AACH,IAAW,UAAA,EAAA;AACX,IAAA;AAAA,EACF,KAAK,SAAA;AAAA,EACL,KAAK,IAAA;AAAA,EACL,KAAK,WAAA;AACH,IAAY,WAAA,EAAA;AACZ,IAAA;AAAA,EACF,KAAK,MAAA;AAAA,EACL,KAAK,IAAA;AAAA,EACL,KAAK,QAAA;AAAA,EACL;AACE,IAAS,QAAA,EAAA;AACT,IAAA;AACJ","file":"cli.js","sourcesContent":["#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\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';\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(` ✓ Created ${label} -> ${path.relative(process.cwd(), dest)}`);\n}\n\nfunction handleInit() {\n const cwd = process.cwd();\n console.log('\\n🚀 Initializing AtomSystem in your project...\\n');\n\n // 1. Install AI Agent Skill\n const srcSkill = path.join(PKG_ROOT, 'skills', 'atomsystem.skill.md');\n const destSkill = path.join(cwd, '.agents', 'skills', 'atomsystem', 'SKILL.md');\n if (fs.existsSync(srcSkill)) {\n copyFileSafe(srcSkill, destSkill, 'AI Skill (.agents/skills/atomsystem/SKILL.md)');\n }\n\n // 2. Install Design Guide (.design.md)\n const srcDesign = path.join(PKG_ROOT, 'presets', 'default.design.md');\n const destDesign = path.join(cwd, 'atom.design.md');\n if (fs.existsSync(srcDesign)) {\n copyFileSafe(srcDesign, destDesign, 'Design Guide (atom.design.md)');\n }\n\n // 3. Install UX Pattern Guide (.uxPattern.md)\n const srcPattern = path.join(PKG_ROOT, 'presets', 'uxPattern.md');\n const destPattern = path.join(cwd, 'atom.uxPattern.md');\n if (fs.existsSync(srcPattern)) {\n copyFileSafe(srcPattern, destPattern, 'UX Pattern Guide (atom.uxPattern.md)');\n }\n\n // 4. Install Token JSON (tokens.json)\n const srcToken = path.join(PKG_ROOT, 'tokens', 'token.json');\n const destToken = path.join(cwd, 'tokens', 'token.json');\n if (fs.existsSync(srcToken)) {\n copyFileSafe(srcToken, destToken, 'Token JSON (tokens/token.json)');\n }\n\n console.log('\\n✨ AtomSystem initialization completed!');\n console.log('\\n📌 Next Steps:');\n console.log('1. Import AtomSystem CSS in your app (e.g. layout.tsx, App.vue, index.html):');\n console.log(' import \"atomsystem/css/atom-ui.css\";');\n console.log('2. Ask your AI coding assistant (Antigravity, Cursor, Copilot) to build UI:');\n console.log(' \"atom.design.md와 atom.uxPattern.md를 참고하여 결제 화면 컴포넌트를 만들어줘.\"\\n');\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 AtomSystem assets (AI Skill, design.md, uxPattern.md, token.json)\n help Display this help message\n version Print version info\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.3.0');\n }\n}\n\nswitch (command) {\n case 'init':\n handleInit();\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\n"]}
1
+ {"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":"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","file":"cli.js","sourcesContent":["#!/usr/bin/env node\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\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';\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(` ✓ Created ${label} -> ${path.relative(process.cwd(), dest)}`);\n}\n\nfunction handleInit() {\n const cwd = process.cwd();\n console.log('\\n🚀 Initializing AtomSystem in your project...\\n');\n\n // 1. Install AI Agent Skill\n const srcSkill = path.join(PKG_ROOT, 'skills', 'atomsystem.skill.md');\n const destSkill = path.join(cwd, '.agents', 'skills', 'atomsystem', 'SKILL.md');\n if (fs.existsSync(srcSkill)) {\n copyFileSafe(srcSkill, destSkill, 'AI Skill (.agents/skills/atomsystem/SKILL.md)');\n }\n\n // 2. Install Design Guide (.design.md)\n const srcDesign = path.join(PKG_ROOT, 'presets', 'default.design.md');\n const destDesign = path.join(cwd, 'atom.design.md');\n if (fs.existsSync(srcDesign)) {\n copyFileSafe(srcDesign, destDesign, 'Design Guide (atom.design.md)');\n }\n\n // 3. Install UX Pattern Guide (.uxPattern.md)\n const srcPattern = path.join(PKG_ROOT, 'presets', 'uxPattern.md');\n const destPattern = path.join(cwd, 'atom.uxPattern.md');\n if (fs.existsSync(srcPattern)) {\n copyFileSafe(srcPattern, destPattern, 'UX Pattern Guide (atom.uxPattern.md)');\n }\n\n // 4. Install Token JSON (tokens.json)\n const srcToken = path.join(PKG_ROOT, 'tokens', 'token.json');\n const destToken = path.join(cwd, 'tokens', 'token.json');\n if (fs.existsSync(srcToken)) {\n copyFileSafe(srcToken, destToken, 'Token JSON (tokens/token.json)');\n }\n\n console.log('\\n✨ AtomSystem initialization completed!');\n console.log('\\n📌 Next Steps:');\n console.log('1. Import AtomSystem CSS in your app (e.g. layout.tsx, App.vue, index.html):');\n console.log(' import \"atomsystem/css/atom-ui.css\";');\n console.log('2. Ask your AI coding assistant (Antigravity, Cursor, Copilot) to build UI:');\n console.log(' \"atom.design.md와 atom.uxPattern.md를 참고하여 결제 화면 컴포넌트를 만들어줘.\"\\n');\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 AtomSystem assets (AI Skill, design.md, uxPattern.md, token.json)\n help Display this help message\n version Print version info\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.4.0');\n }\n}\n\nswitch (command) {\n case 'init':\n handleInit();\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\n"]}