@hobui/viui-cli 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/README.md +138 -139
  2. package/dist/adapters/adapter-registry.d.ts +12 -0
  3. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  4. package/dist/adapters/adapter-registry.js +49 -0
  5. package/dist/adapters/adapter-types.d.ts +20 -0
  6. package/dist/adapters/adapter-types.d.ts.map +1 -0
  7. package/dist/adapters/adapter-types.js +1 -0
  8. package/dist/adapters/aider-adapter.d.ts +3 -0
  9. package/dist/adapters/aider-adapter.d.ts.map +1 -0
  10. package/dist/adapters/aider-adapter.js +8 -0
  11. package/dist/adapters/claude-adapter.d.ts +3 -0
  12. package/dist/adapters/claude-adapter.d.ts.map +1 -0
  13. package/dist/adapters/claude-adapter.js +15 -0
  14. package/dist/adapters/cline-adapter.d.ts +3 -0
  15. package/dist/adapters/cline-adapter.d.ts.map +1 -0
  16. package/dist/adapters/cline-adapter.js +8 -0
  17. package/dist/adapters/copilot-adapter.d.ts +5 -0
  18. package/dist/adapters/copilot-adapter.d.ts.map +1 -0
  19. package/dist/adapters/copilot-adapter.js +20 -0
  20. package/dist/adapters/cursor-adapter.d.ts +3 -0
  21. package/dist/adapters/cursor-adapter.d.ts.map +1 -0
  22. package/dist/adapters/cursor-adapter.js +18 -0
  23. package/dist/adapters/external/bolt-adapter.d.ts +3 -0
  24. package/dist/adapters/external/bolt-adapter.d.ts.map +1 -0
  25. package/dist/adapters/external/bolt-adapter.js +15 -0
  26. package/dist/adapters/external/chatgpt-adapter.d.ts +3 -0
  27. package/dist/adapters/external/chatgpt-adapter.d.ts.map +1 -0
  28. package/dist/adapters/external/chatgpt-adapter.js +14 -0
  29. package/dist/adapters/external/external-adapter-base.d.ts +15 -0
  30. package/dist/adapters/external/external-adapter-base.d.ts.map +1 -0
  31. package/dist/adapters/external/external-adapter-base.js +92 -0
  32. package/dist/adapters/external/gemini-adapter.d.ts +3 -0
  33. package/dist/adapters/external/gemini-adapter.d.ts.map +1 -0
  34. package/dist/adapters/external/gemini-adapter.js +14 -0
  35. package/dist/adapters/external/lovable-adapter.d.ts +3 -0
  36. package/dist/adapters/external/lovable-adapter.d.ts.map +1 -0
  37. package/dist/adapters/external/lovable-adapter.js +14 -0
  38. package/dist/adapters/external/v0-adapter.d.ts +3 -0
  39. package/dist/adapters/external/v0-adapter.d.ts.map +1 -0
  40. package/dist/adapters/external/v0-adapter.js +15 -0
  41. package/dist/adapters/windsurf-adapter.d.ts +3 -0
  42. package/dist/adapters/windsurf-adapter.d.ts.map +1 -0
  43. package/dist/adapters/windsurf-adapter.js +23 -0
  44. package/dist/assets/plugins/viui-conf/apply-theme-body.ts +23 -4
  45. package/dist/assets/plugins/viui-conf/defaults/README.md +2 -0
  46. package/dist/assets/plugins/viui-conf/defaults/app-bar.ts +1 -1
  47. package/dist/assets/plugins/viui-conf/defaults/buttons.ts +1 -1
  48. package/dist/assets/plugins/viui-conf/defaults/by-theme/minimalist-2.ts +1 -1
  49. package/dist/assets/plugins/viui-conf/defaults/cards.ts +1 -1
  50. package/dist/assets/plugins/viui-conf/defaults/expansion-panels.ts +16 -0
  51. package/dist/assets/plugins/viui-conf/defaults/index.ts +3 -0
  52. package/dist/assets/plugins/viui-conf/defaults/inputs.ts +11 -1
  53. package/dist/assets/plugins/viui-conf/design-tokens.ts +135 -0
  54. package/dist/assets/plugins/viui-conf/theme-base.ts +1 -1
  55. package/dist/assets/plugins/viui-conf/v-dark.ts +3 -5
  56. package/dist/assets/plugins/viui-conf/v-light.ts +3 -5
  57. package/dist/assets/plugins/vuetify.ts +36 -0
  58. package/dist/assets/prompt-data/components.json +106 -0
  59. package/dist/assets/prompt-data/tokens.json +83 -0
  60. package/dist/assets/themes/_bento-grid.scss +8 -0
  61. package/dist/assets/themes/_glassmorphism.scss +8 -0
  62. package/dist/assets/themes/_material.scss +8 -0
  63. package/dist/assets/themes/_minimalist-2.scss +375 -0
  64. package/dist/assets/themes/_minimalist.scss +9 -0
  65. package/dist/assets/themes/_neo-brutalism.scss +199 -0
  66. package/dist/assets/themes/bento-grid.scss +4 -0
  67. package/dist/assets/themes/glassmorphism.scss +4 -0
  68. package/dist/assets/themes/index.scss +11 -0
  69. package/dist/assets/themes/material.scss +4 -0
  70. package/dist/assets/themes/minimalist-2.scss +5 -0
  71. package/dist/assets/themes/minimalist.scss +4 -0
  72. package/dist/assets/themes/neo-brutalism.scss +5 -0
  73. package/dist/assets/viui-themes/_neo-brutalism.scss +70 -152
  74. package/dist/cli-paths.d.ts +7 -0
  75. package/dist/cli-paths.d.ts.map +1 -0
  76. package/dist/cli-paths.js +19 -0
  77. package/dist/cli.js +28 -450
  78. package/dist/cli.legacy.d.ts +3 -0
  79. package/dist/cli.legacy.d.ts.map +1 -0
  80. package/dist/cli.legacy.js +597 -0
  81. package/dist/commands/audit.d.ts +3 -0
  82. package/dist/commands/audit.d.ts.map +1 -0
  83. package/dist/commands/audit.js +152 -0
  84. package/dist/commands/config/config-export.d.ts +6 -0
  85. package/dist/commands/config/config-export.d.ts.map +1 -0
  86. package/dist/commands/config/config-export.js +23 -0
  87. package/dist/commands/config/config-health.d.ts +6 -0
  88. package/dist/commands/config/config-health.d.ts.map +1 -0
  89. package/dist/commands/config/config-health.js +42 -0
  90. package/dist/commands/config/config-import.d.ts +6 -0
  91. package/dist/commands/config/config-import.d.ts.map +1 -0
  92. package/dist/commands/config/config-import.js +63 -0
  93. package/dist/commands/config/config-rollback.d.ts +6 -0
  94. package/dist/commands/config/config-rollback.d.ts.map +1 -0
  95. package/dist/commands/config/config-rollback.js +47 -0
  96. package/dist/commands/config/config-setup.d.ts +6 -0
  97. package/dist/commands/config/config-setup.d.ts.map +1 -0
  98. package/dist/commands/config/config-setup.js +103 -0
  99. package/dist/commands/config/config-status.d.ts +6 -0
  100. package/dist/commands/config/config-status.d.ts.map +1 -0
  101. package/dist/commands/config/config-status.js +42 -0
  102. package/dist/commands/config/config-uninstall.d.ts +6 -0
  103. package/dist/commands/config/config-uninstall.d.ts.map +1 -0
  104. package/dist/commands/config/config-uninstall.js +74 -0
  105. package/dist/commands/config.d.ts +6 -0
  106. package/dist/commands/config.d.ts.map +1 -0
  107. package/dist/commands/config.js +19 -0
  108. package/dist/commands/docs.d.ts +3 -0
  109. package/dist/commands/docs.d.ts.map +1 -0
  110. package/dist/commands/docs.js +17 -0
  111. package/dist/commands/doctor.d.ts +3 -0
  112. package/dist/commands/doctor.d.ts.map +1 -0
  113. package/dist/commands/doctor.js +93 -0
  114. package/dist/commands/init.d.ts +3 -0
  115. package/dist/commands/init.d.ts.map +1 -0
  116. package/dist/commands/init.js +183 -0
  117. package/dist/commands/sync.d.ts +3 -0
  118. package/dist/commands/sync.d.ts.map +1 -0
  119. package/dist/commands/sync.js +73 -0
  120. package/dist/commands/theme.d.ts +3 -0
  121. package/dist/commands/theme.d.ts.map +1 -0
  122. package/dist/commands/theme.js +86 -0
  123. package/dist/commands/update.d.ts +3 -0
  124. package/dist/commands/update.d.ts.map +1 -0
  125. package/dist/commands/update.js +97 -0
  126. package/dist/prompts/prompt-builder.d.ts +4 -0
  127. package/dist/prompts/prompt-builder.d.ts.map +1 -0
  128. package/dist/prompts/prompt-builder.js +18 -0
  129. package/dist/prompts/prompt-data-loader.d.ts +11 -0
  130. package/dist/prompts/prompt-data-loader.d.ts.map +1 -0
  131. package/dist/prompts/prompt-data-loader.js +15 -0
  132. package/dist/prompts/prompt-sections/section-code-examples.d.ts +2 -0
  133. package/dist/prompts/prompt-sections/section-code-examples.d.ts.map +1 -0
  134. package/dist/prompts/prompt-sections/section-code-examples.js +36 -0
  135. package/dist/prompts/prompt-sections/section-color-tokens.d.ts +2 -0
  136. package/dist/prompts/prompt-sections/section-color-tokens.d.ts.map +1 -0
  137. package/dist/prompts/prompt-sections/section-color-tokens.js +19 -0
  138. package/dist/prompts/prompt-sections/section-component-map.d.ts +3 -0
  139. package/dist/prompts/prompt-sections/section-component-map.d.ts.map +1 -0
  140. package/dist/prompts/prompt-sections/section-component-map.js +12 -0
  141. package/dist/prompts/prompt-sections/section-typography-spacing.d.ts +2 -0
  142. package/dist/prompts/prompt-sections/section-typography-spacing.d.ts.map +1 -0
  143. package/dist/prompts/prompt-sections/section-typography-spacing.js +29 -0
  144. package/dist/services/backup-service.d.ts +7 -0
  145. package/dist/services/backup-service.d.ts.map +1 -0
  146. package/dist/services/backup-service.js +54 -0
  147. package/dist/services/config-service.d.ts +17 -0
  148. package/dist/services/config-service.d.ts.map +1 -0
  149. package/dist/services/config-service.js +64 -0
  150. package/dist/services/diff-engine.d.ts +13 -0
  151. package/dist/services/diff-engine.d.ts.map +1 -0
  152. package/dist/services/diff-engine.js +59 -0
  153. package/dist/services/ide-detector.d.ts +9 -0
  154. package/dist/services/ide-detector.d.ts.map +1 -0
  155. package/dist/services/ide-detector.js +113 -0
  156. package/dist/services/ide-detector.spec.d.ts +2 -0
  157. package/dist/services/ide-detector.spec.d.ts.map +1 -0
  158. package/dist/services/ide-detector.spec.js +108 -0
  159. package/dist/services/lock-file-service.d.ts +15 -0
  160. package/dist/services/lock-file-service.d.ts.map +1 -0
  161. package/dist/services/lock-file-service.js +74 -0
  162. package/dist/services/mcp-config-reader.d.ts +11 -0
  163. package/dist/services/mcp-config-reader.d.ts.map +1 -0
  164. package/dist/services/mcp-config-reader.js +40 -0
  165. package/dist/services/mcp-config-reader.spec.d.ts +2 -0
  166. package/dist/services/mcp-config-reader.spec.d.ts.map +1 -0
  167. package/dist/services/mcp-config-reader.spec.js +125 -0
  168. package/dist/services/mcp-config-writer.d.ts +11 -0
  169. package/dist/services/mcp-config-writer.d.ts.map +1 -0
  170. package/dist/services/mcp-config-writer.js +98 -0
  171. package/dist/services/mcp-config-writer.spec.d.ts +2 -0
  172. package/dist/services/mcp-config-writer.spec.d.ts.map +1 -0
  173. package/dist/services/mcp-config-writer.spec.js +162 -0
  174. package/dist/services/merge-engine.d.ts +12 -0
  175. package/dist/services/merge-engine.d.ts.map +1 -0
  176. package/dist/services/merge-engine.js +54 -0
  177. package/dist/services/vuetify-scaffold-service.d.ts +5 -0
  178. package/dist/services/vuetify-scaffold-service.d.ts.map +1 -0
  179. package/dist/services/vuetify-scaffold-service.js +67 -0
  180. package/dist/templates/vuetify-plugin.d.ts +90 -0
  181. package/dist/templates/vuetify-plugin.d.ts.map +1 -0
  182. package/dist/templates/vuetify-plugin.js +33 -0
  183. package/dist/types/command-types.d.ts +15 -0
  184. package/dist/types/command-types.d.ts.map +1 -0
  185. package/dist/types/command-types.js +2 -0
  186. package/dist/types/config-types.d.ts +29 -0
  187. package/dist/types/config-types.d.ts.map +1 -0
  188. package/dist/types/config-types.js +10 -0
  189. package/dist/types/ide-types.d.ts +29 -0
  190. package/dist/types/ide-types.d.ts.map +1 -0
  191. package/dist/types/ide-types.js +4 -0
  192. package/dist/types/lock-file-types.d.ts +27 -0
  193. package/dist/types/lock-file-types.d.ts.map +1 -0
  194. package/dist/types/lock-file-types.js +2 -0
  195. package/dist/utils/diff-display.d.ts +18 -0
  196. package/dist/utils/diff-display.d.ts.map +1 -0
  197. package/dist/utils/diff-display.js +61 -0
  198. package/dist/utils/fs-safe.d.ts +9 -0
  199. package/dist/utils/fs-safe.d.ts.map +1 -0
  200. package/dist/utils/fs-safe.js +44 -0
  201. package/dist/utils/logger.d.ts +14 -0
  202. package/dist/utils/logger.d.ts.map +1 -0
  203. package/dist/utils/logger.js +28 -0
  204. package/dist/utils/open-browser.d.ts +3 -0
  205. package/dist/utils/open-browser.d.ts.map +1 -0
  206. package/dist/utils/open-browser.js +13 -0
  207. package/package.json +11 -6
  208. package/dist/assets/cursor/.design-system-version +0 -1
  209. package/dist/assets/cursor/commands/audit-accessibility.md +0 -25
  210. package/dist/assets/cursor/commands/audit-ui.md +0 -35
  211. package/dist/assets/cursor/commands/component.md +0 -18
  212. package/dist/assets/cursor/commands/fix-storybook.md +0 -24
  213. package/dist/assets/cursor/commands/generate-component-from-figma.md +0 -26
  214. package/dist/assets/cursor/commands/generate-page-from-figma.md +0 -26
  215. package/dist/assets/cursor/plans/DESIGN_SYSTEM_PLAN.md +0 -177
  216. package/dist/assets/cursor/plans/PLANS_INDEX.md +0 -35
  217. package/dist/assets/cursor/rules/accessibility-contrast.mdc +0 -38
  218. package/dist/assets/cursor/rules/bem-class-style.mdc +0 -107
  219. package/dist/assets/cursor/rules/component-naming.mdc +0 -57
  220. package/dist/assets/cursor/rules/design-system-component-library.mdc +0 -59
  221. package/dist/assets/cursor/rules/design-system-workflow.mdc +0 -48
  222. package/dist/assets/cursor/rules/figma-mapping.mdc +0 -37
  223. package/dist/assets/cursor/rules/icons.mdc +0 -42
  224. package/dist/assets/cursor/rules/project-structure.mdc +0 -137
  225. package/dist/assets/cursor/rules/storybook-component-template.mdc +0 -103
  226. package/dist/assets/cursor/rules/storybook.mdc +0 -68
  227. package/dist/assets/cursor/rules/tokens.mdc +0 -32
  228. package/dist/assets/cursor/rules/viui-themes.mdc +0 -53
  229. package/dist/assets/cursor/rules/vuetify-layout.mdc +0 -52
  230. package/dist/assets/cursor/skills/accessibility.md +0 -75
  231. package/dist/assets/cursor/skills/design-system-thinking.md +0 -40
  232. package/dist/assets/cursor/skills/figma-interpretation.md +0 -38
  233. package/dist/assets/cursor/skills/vue-vuetify-design-system-architect.md +0 -60
  234. package/dist/assets/cursor/sync-manifest.json +0 -6
  235. package/dist/assets/viui-themes/bento-grid-global.scss +0 -5
  236. package/dist/assets/viui-themes/glassmorphism-global.scss +0 -5
  237. package/dist/assets/viui-themes/material-global.scss +0 -5
  238. package/dist/assets/viui-themes/minimalist-2-global.scss +0 -5
  239. package/dist/assets/viui-themes/minimalist-global.scss +0 -5
  240. package/dist/assets/viui-themes/neo-brutalism-global.scss +0 -5
package/dist/cli.js CHANGED
@@ -1,453 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @viui/cliSync .cursor (rules, skills, commands) from i-design-system into consumer repo.
4
- * Commands: init, sync, setup, version.
5
- * After `pnpm add @viui/cli`, postinstall runs `setup --postinstall` for step-by-step UX.
3
+ * viui CLI manage themes, tokens, and config for iNET Design System.
4
+ * Commands: init, sync, update, theme, doctor, docs, audit.
6
5
  */
7
- import { parseArgs } from 'node:util';
8
- import { createRequire } from 'node:module';
9
- import path from 'node:path';
10
- import fs from 'node:fs';
11
- import { fileURLToPath } from 'node:url';
12
- import readline from 'node:readline/promises';
13
- const require = createRequire(import.meta.url);
14
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
- const pkg = require(path.join(__dirname, '..', 'package.json'));
16
- function getAssetsCursorDir() {
17
- return path.join(__dirname, 'assets', 'cursor');
18
- }
19
- /** viui-conf bundle path (synced to consumer src/plugins/viui-conf). */
20
- function getAssetsPluginsDir() {
21
- return path.join(__dirname, 'assets', 'plugins');
22
- }
23
- /** viui-themes SCSS bundle path (synced to consumer src/assets/styles/viui-themes). */
24
- function getAssetsViuiThemesDir() {
25
- return path.join(__dirname, 'assets', 'viui-themes');
26
- }
27
- function loadManifest(assetsDir) {
28
- const p = path.join(assetsDir, 'sync-manifest.json');
29
- if (!fs.existsSync(p))
30
- return {};
31
- return JSON.parse(fs.readFileSync(p, 'utf8'));
32
- }
33
- function getDesignSystemVersion(assetsDir) {
34
- const p = path.join(assetsDir, '.design-system-version');
35
- if (!fs.existsSync(p))
36
- return '0.0.0';
37
- return fs.readFileSync(p, 'utf8').trim();
38
- }
39
- function copyRecursive(src, dest, opts) {
40
- if (!fs.existsSync(src))
41
- return;
42
- if (!opts.dryRun)
43
- fs.mkdirSync(dest, { recursive: true });
44
- const entries = fs.readdirSync(src, { withFileTypes: true });
45
- for (const e of entries) {
46
- const srcPath = path.join(src, e.name);
47
- const destPath = path.join(dest, e.name);
48
- if (e.isDirectory()) {
49
- copyRecursive(srcPath, destPath, opts);
50
- }
51
- else {
52
- if (opts.dryRun) {
53
- console.log(`Would copy: ${path.relative(process.cwd(), destPath) || destPath}`);
54
- }
55
- else {
56
- if (opts.backup && fs.existsSync(destPath)) {
57
- const backupPath = destPath + '.backup.' + Date.now();
58
- fs.copyFileSync(destPath, backupPath);
59
- }
60
- fs.copyFileSync(srcPath, destPath);
61
- }
62
- }
63
- }
64
- }
65
- /**
66
- * List all relative paths under dir (files and dirs), with forward slashes.
67
- */
68
- function listRelativePaths(dir, prefix = '') {
69
- if (!fs.existsSync(dir))
70
- return [];
71
- const out = [];
72
- const entries = fs.readdirSync(dir, { withFileTypes: true });
73
- for (const e of entries) {
74
- const rel = prefix ? `${prefix}/${e.name}` : e.name;
75
- out.push(rel);
76
- if (e.isDirectory()) {
77
- out.push(...listRelativePaths(path.join(dir, e.name), rel));
78
- }
79
- }
80
- return out;
81
- }
82
- /**
83
- * Remove from destDir any path that does not exist in sourceSet (mirror bundle).
84
- * Deletes deeper paths first so dirs can be removed after their contents.
85
- */
86
- function removePathsNotInSource(destDir, sourceSet, opts) {
87
- if (!fs.existsSync(destDir))
88
- return;
89
- const destPaths = listRelativePaths(destDir);
90
- const sorted = destPaths.sort((a, b) => b.split('/').length - a.split('/').length);
91
- for (const rel of sorted) {
92
- const relNorm = rel.replace(/\\/g, '/');
93
- if (sourceSet.has(relNorm))
94
- continue;
95
- const destPath = path.join(destDir, relNorm);
96
- if (!fs.existsSync(destPath))
97
- continue;
98
- if (opts.dryRun) {
99
- console.log(`Would remove: ${path.relative(process.cwd(), destPath) || destPath}`);
100
- }
101
- else {
102
- fs.rmSync(destPath, { recursive: true });
103
- console.log('Removed:', path.relative(process.cwd(), destPath) || destPath);
104
- }
105
- }
106
- }
107
- function runInit(cwd, assetsDir, opts) {
108
- const manifest = loadManifest(assetsDir);
109
- const version = getDesignSystemVersion(assetsDir);
110
- const cursorDir = path.join(cwd, '.cursor');
111
- const dirs = ['rules', 'skills', 'commands'];
112
- if (!opts.noPlans)
113
- dirs.push('plans');
114
- if (opts.dryRun) {
115
- console.log('Dry run: would create .cursor and copy:');
116
- for (const key of Object.keys(manifest)) {
117
- if (key === 'plans' && opts.noPlans)
118
- continue;
119
- const src = path.join(assetsDir, manifest[key].dir);
120
- if (fs.existsSync(src)) {
121
- const entries = fs.readdirSync(src, { withFileTypes: true });
122
- entries.forEach(e => console.log(` .cursor/${manifest[key].dir}/${e.name}`));
123
- }
124
- }
125
- console.log(` .cursor/.design-system-version (${version})`);
126
- return;
127
- }
128
- if (!fs.existsSync(cursorDir))
129
- fs.mkdirSync(cursorDir, { recursive: true });
130
- for (const d of dirs) {
131
- const sub = path.join(cursorDir, d);
132
- if (!fs.existsSync(sub))
133
- fs.mkdirSync(sub, { recursive: true });
134
- }
135
- for (const key of Object.keys(manifest)) {
136
- if (key === 'plans' && opts.noPlans)
137
- continue;
138
- const src = path.join(assetsDir, manifest[key].dir);
139
- const dest = path.join(cursorDir, manifest[key].dir);
140
- if (fs.existsSync(src))
141
- copyRecursive(src, dest, { dryRun: false });
142
- }
143
- fs.writeFileSync(path.join(cursorDir, '.design-system-version'), version, 'utf8');
144
- console.log('Initialized .cursor with design system version', version);
145
- // Sync viui-conf (theme + defaults) — trừ vuetify.ts
146
- const viuiConfSrc = path.join(getAssetsPluginsDir(), 'viui-conf');
147
- const viuiConfDest = path.join(cwd, 'src', 'plugins', 'viui-conf');
148
- if (fs.existsSync(viuiConfSrc)) {
149
- if (opts.dryRun) {
150
- console.log('Would sync viui-conf to src/plugins/viui-conf');
151
- }
152
- else {
153
- if (!fs.existsSync(path.join(cwd, 'src', 'plugins')))
154
- fs.mkdirSync(path.join(cwd, 'src', 'plugins'), { recursive: true });
155
- copyRecursive(viuiConfSrc, viuiConfDest, { dryRun: false });
156
- }
157
- if (!opts.dryRun)
158
- console.log('Synced viui-conf to src/plugins/viui-conf');
159
- }
160
- syncViuiThemesAndEntry(cwd, opts.dryRun ?? false);
161
- }
162
- /**
163
- * Sync viui-themes SCSS to consumer and ensure theme SCSS is loaded.
164
- * - Copies dist/assets/viui-themes → src/assets/styles/viui-themes
165
- * - Writes viui-themes-entry.scss that @use's viui-themes/index.scss
166
- * - Injects import into main.scss if present and not already there
167
- */
168
- function syncViuiThemesAndEntry(cwd, dryRun) {
169
- const themesSrc = getAssetsViuiThemesDir();
170
- const stylesDir = path.join(cwd, 'src', 'assets', 'styles');
171
- const themesDest = path.join(stylesDir, 'viui-themes');
172
- const entryPath = path.join(stylesDir, 'viui-themes-entry.scss');
173
- const mainScssPath = path.join(stylesDir, 'main.scss');
174
- const entryImport = "@use './viui-themes-entry' as *;";
175
- if (!fs.existsSync(themesSrc))
176
- return;
177
- if (dryRun) {
178
- console.log('Would sync viui-themes to src/assets/styles/viui-themes');
179
- console.log('Would write src/assets/styles/viui-themes-entry.scss');
180
- console.log('Would ensure main.scss imports viui-themes-entry');
181
- return;
182
- }
183
- if (!fs.existsSync(path.join(cwd, 'src', 'assets')))
184
- fs.mkdirSync(path.join(cwd, 'src', 'assets'), { recursive: true });
185
- if (!fs.existsSync(stylesDir))
186
- fs.mkdirSync(stylesDir, { recursive: true });
187
- copyRecursive(themesSrc, themesDest, { dryRun: false });
188
- console.log('Synced viui-themes to src/assets/styles/viui-themes');
189
- const entryContent = `/**
190
- * ViUi design style themes — auto-loaded when using viui-conf (VITE_VIUI_THEME).
191
- * Do not edit: generated by viui-cli sync. Styles apply when body has .design-style-<id> or wrapper has .design-style-<id>.
192
- */
193
- @use './viui-themes/index.scss' as *;
194
- `;
195
- fs.writeFileSync(entryPath, entryContent, 'utf8');
196
- console.log('Wrote viui-themes-entry.scss');
197
- if (fs.existsSync(mainScssPath)) {
198
- const mainContent = fs.readFileSync(mainScssPath, 'utf8');
199
- const hasEntry = /viui-themes-entry/.test(mainContent);
200
- if (!hasEntry) {
201
- const appended = mainContent.trimEnd() + '\n' + entryImport + '\n';
202
- fs.writeFileSync(mainScssPath, appended, 'utf8');
203
- console.log('Added viui-themes-entry import to main.scss');
204
- }
205
- }
206
- }
207
- function runSync(cwd, assetsDir, opts) {
208
- const manifest = loadManifest(assetsDir);
209
- const version = getDesignSystemVersion(assetsDir);
210
- const cursorDir = path.join(cwd, '.cursor');
211
- console.log('Syncing .cursor at:', path.resolve(cursorDir));
212
- let keys = Object.keys(manifest);
213
- if (opts.rulesOnly)
214
- keys = keys.filter(k => k === 'rules');
215
- if (opts.skillsOnly)
216
- keys = keys.filter(k => k === 'skills');
217
- if (opts.commandsOnly)
218
- keys = keys.filter(k => k === 'commands');
219
- if (opts.dryRun) {
220
- console.log('Dry run: would overwrite:');
221
- for (const key of keys) {
222
- const src = path.join(assetsDir, manifest[key].dir);
223
- if (fs.existsSync(src)) {
224
- const entries = fs.readdirSync(src, { withFileTypes: true });
225
- entries.forEach(e => console.log(` .cursor/${manifest[key].dir}/${e.name}`));
226
- }
227
- }
228
- console.log(` .cursor/.design-system-version (${version})`);
229
- return;
230
- }
231
- if (!fs.existsSync(cursorDir))
232
- fs.mkdirSync(cursorDir, { recursive: true });
233
- for (const key of keys) {
234
- const src = path.join(assetsDir, manifest[key].dir);
235
- const dest = path.join(cursorDir, manifest[key].dir);
236
- if (fs.existsSync(src)) {
237
- if (!fs.existsSync(dest))
238
- fs.mkdirSync(dest, { recursive: true });
239
- copyRecursive(src, dest, { dryRun: opts.dryRun, backup: opts.backup });
240
- const sourceRelPaths = listRelativePaths(src).map(p => p.replace(/\\/g, '/'));
241
- const sourceSet = new Set(sourceRelPaths);
242
- removePathsNotInSource(dest, sourceSet, { dryRun: opts.dryRun });
243
- }
244
- }
245
- fs.writeFileSync(path.join(cursorDir, '.design-system-version'), version, 'utf8');
246
- console.log('Synced .cursor with design system version', version);
247
- // Sync viui-conf (theme + defaults) — trừ vuetify.ts
248
- const viuiConfSrc = path.join(getAssetsPluginsDir(), 'viui-conf');
249
- const viuiConfDest = path.join(cwd, 'src', 'plugins', 'viui-conf');
250
- if (fs.existsSync(viuiConfSrc)) {
251
- if (opts.dryRun) {
252
- console.log('Would sync viui-conf to src/plugins/viui-conf');
253
- }
254
- else {
255
- if (!fs.existsSync(path.join(cwd, 'src', 'plugins')))
256
- fs.mkdirSync(path.join(cwd, 'src', 'plugins'), { recursive: true });
257
- copyRecursive(viuiConfSrc, viuiConfDest, { dryRun: false, backup: opts.backup });
258
- console.log('Synced viui-conf to src/plugins/viui-conf');
259
- }
260
- }
261
- syncViuiThemesAndEntry(cwd, opts.dryRun ?? false);
262
- }
263
- function detectPackageManager(cwd) {
264
- if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml')))
265
- return 'pnpm';
266
- if (fs.existsSync(path.join(cwd, 'yarn.lock')))
267
- return 'yarn';
268
- return 'npm';
269
- }
270
- function addPostinstallScript(cwd, pm) {
271
- const pkgPath = path.join(cwd, 'package.json');
272
- if (!fs.existsSync(pkgPath))
273
- return false;
274
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
275
- const scripts = pkg.scripts ?? {};
276
- const cmd = pm === 'pnpm' ? 'pnpm exec viui-cli sync' : pm === 'yarn' ? 'yarn viui-cli sync' : 'npx viui-cli sync';
277
- if (scripts.postinstall?.includes('viui-cli'))
278
- return false;
279
- scripts.postinstall = scripts.postinstall ? `${scripts.postinstall} && ${cmd}` : cmd;
280
- pkg.scripts = scripts;
281
- fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf8');
282
- return true;
283
- }
284
- async function runSetup(cwd, assetsDir, opts) {
285
- const isPostinstall = opts.postinstall === true;
286
- if (isPostinstall && !process.stdin.isTTY) {
287
- return;
288
- }
289
- if (!fs.existsSync(assetsDir)) {
290
- if (isPostinstall)
291
- return;
292
- console.error('Assets not found. Run "pnpm build" in packages/cli first.');
293
- throw new Error('Assets not found');
294
- }
295
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
296
- const ask = async (q, defaultYes) => {
297
- const def = defaultYes ? 'Y/n' : 'y/N';
298
- const a = await rl.question(`${q} (${def}): `);
299
- const s = a.trim().toLowerCase();
300
- if (s === '')
301
- return defaultYes;
302
- return s === 'y' || s === 'yes';
303
- };
304
- console.log(`\n${pkg.name ?? '@viui/cli'} — Setup i-design-system in this repo\n`);
305
- const runNow = opts.yes || (await ask('Run setup now?', true));
306
- if (!runNow) {
307
- console.log('Skipped. Run later: pnpm exec viui-cli setup');
308
- rl.close();
309
- return;
310
- }
311
- const cursorDir = path.join(cwd, '.cursor');
312
- const hasCursor = fs.existsSync(cursorDir);
313
- if (!hasCursor) {
314
- console.log('Step 1: Initializing .cursor (rules, plans) and src/plugins/viui-conf...');
315
- runInit(cwd, assetsDir, { yes: true, dryRun: false, noPlans: false });
316
- }
317
- else {
318
- const doSync = opts.yes || (await ask('Step 1: .cursor exists. Sync from design system?', true));
319
- if (doSync) {
320
- runSync(cwd, assetsDir, { dryRun: false, backup: false });
321
- }
322
- }
323
- const pm = detectPackageManager(cwd);
324
- const doWeb = opts.yes || (await ask('Step 2: Install @viui/web for Vi* components?', true));
325
- if (doWeb) {
326
- const { execSync } = await import('node:child_process');
327
- const addCmd = pm === 'pnpm' ? 'pnpm add @viui/web' : pm === 'yarn' ? 'yarn add @viui/web' : 'npm install @viui/web';
328
- console.log(`Running: ${addCmd}`);
329
- execSync(addCmd, { cwd, stdio: 'inherit' });
330
- }
331
- const doPostinstall = !isPostinstall && (opts.yes || (await ask('Step 3: Add postinstall to auto-sync on install?', false)));
332
- if (doPostinstall) {
333
- if (addPostinstallScript(cwd, pm)) {
334
- console.log('Added postinstall script to package.json.');
335
- }
336
- else {
337
- console.log('postinstall already contains viui-cli or package.json not found.');
338
- }
339
- }
340
- console.log('\nDone. Use: import { ViButton, ViInput, ... } from \'@viui/web\'');
341
- rl.close();
342
- }
343
- const result = parseArgs({
344
- options: {
345
- help: { type: 'boolean', short: 'h', default: false },
346
- version: { type: 'boolean', short: 'v', default: false },
347
- yes: { type: 'boolean', short: 'y', default: false },
348
- postinstall: { type: 'boolean', default: false },
349
- 'dry-run': { type: 'boolean', default: false },
350
- 'no-plans': { type: 'boolean', default: false },
351
- backup: { type: 'boolean', default: false },
352
- 'rules-only': { type: 'boolean', default: false },
353
- 'skills-only': { type: 'boolean', default: false },
354
- 'commands-only': { type: 'boolean', default: false },
355
- },
356
- allowPositionals: true,
357
- });
358
- const { values } = result;
359
- const positionals = result.positionals ?? [];
360
- const [command] = positionals;
361
- if (values.version && !command) {
362
- console.log(`${pkg.name ?? '@viui/cli'} ${pkg.version}`);
363
- const cwd = process.cwd();
364
- const versionFile = path.join(cwd, '.cursor', '.design-system-version');
365
- if (fs.existsSync(versionFile)) {
366
- console.log('Design system (synced):', fs.readFileSync(versionFile, 'utf8').trim());
367
- }
368
- process.exit(0);
369
- }
370
- if (values.help || !command || command === 'help') {
371
- console.log(`
372
- ${pkg.name ?? '@viui/cli'} — Sync design system .cursor into your repo
373
-
374
- Usage: viui-cli <command> [options]
375
-
376
- Commands:
377
- init Create .cursor and copy rules, skills, commands (run once at repo root)
378
- sync Update .cursor from design system (overwrite)
379
- setup Interactive setup: init/sync .cursor, install @viui/web, optional postinstall (runs after pnpm add ${pkg.name ?? '@viui/cli'})
380
- version Print CLI and design system version
381
-
382
- Setup options:
383
- -y, --yes Non-interactive: run all steps (init/sync, add @viui/web, skip postinstall prompt)
384
- --postinstall Used by postinstall hook; skips wizard when not TTY (e.g. CI)
385
-
386
- Init options:
387
- -y, --yes Skip confirmation
388
- --dry-run Print what would be copied
389
- --no-plans Do not sync plans
390
-
391
- Sync options:
392
- --dry-run Print what would be overwritten
393
- --backup Backup existing files before overwrite
394
- --rules-only Sync only rules
395
- --skills-only Sync only skills
396
- --commands-only Sync only commands
397
-
398
- Global:
399
- -h, --help Show this help
400
- -v, --version Print version
401
-
402
- One-command UX: pnpm add ${pkg.name ?? '@viui/cli'} — then follow the setup steps. Or run: viui-cli setup
403
- `);
404
- process.exit(0);
405
- }
406
- if (command === 'version') {
407
- console.log(`${pkg.name ?? '@viui/cli'} ${pkg.version}`);
408
- const cwd = process.cwd();
409
- const versionFile = path.join(cwd, '.cursor', '.design-system-version');
410
- if (fs.existsSync(versionFile)) {
411
- console.log('Design system (synced):', fs.readFileSync(versionFile, 'utf8').trim());
412
- }
413
- process.exit(0);
414
- }
415
- const assetsDir = getAssetsCursorDir();
416
- const cwd = process.cwd();
417
- if (!fs.existsSync(assetsDir) && command !== 'setup') {
418
- console.error('Assets not found. Run "pnpm build" in packages/cli first.');
419
- process.exit(1);
420
- }
421
- if (command === 'init') {
422
- runInit(cwd, assetsDir, {
423
- yes: values.yes,
424
- dryRun: values['dry-run'],
425
- noPlans: values['no-plans'],
426
- });
427
- process.exit(0);
428
- }
429
- if (command === 'sync') {
430
- runSync(cwd, assetsDir, {
431
- dryRun: values['dry-run'],
432
- backup: values.backup,
433
- rulesOnly: values['rules-only'],
434
- skillsOnly: values['skills-only'],
435
- commandsOnly: values['commands-only'],
436
- });
437
- process.exit(0);
438
- }
439
- if (command === 'setup') {
440
- runSetup(cwd, assetsDir, {
441
- postinstall: values.postinstall,
442
- yes: values.yes,
443
- })
444
- .then(() => process.exit(0))
445
- .catch((err) => {
446
- console.error(err);
447
- process.exit(1);
448
- });
449
- }
450
- else {
451
- console.error(`Unknown command: ${command}. Use --help for usage.`);
452
- process.exit(1);
453
- }
6
+ import { Command } from 'commander';
7
+ import { getCliVersion, getCliName } from './cli-paths.js';
8
+ import { registerInitCommand } from './commands/init.js';
9
+ import { registerSyncCommand } from './commands/sync.js';
10
+ import { registerUpdateCommand } from './commands/update.js';
11
+ import { registerThemeCommand } from './commands/theme.js';
12
+ import { registerDoctorCommand } from './commands/doctor.js';
13
+ import { registerDocsCommand } from './commands/docs.js';
14
+ import { registerAuditCommand } from './commands/audit.js';
15
+ import { registerConfigCommand } from './commands/config.js';
16
+ const program = new Command();
17
+ program
18
+ .name('viui')
19
+ .description(`${getCliName()} — CLI for iNET Design System`)
20
+ .version(getCliVersion(), '-v, --version')
21
+ .option('--verbose', 'Enable verbose output');
22
+ // Register all commands
23
+ registerInitCommand(program);
24
+ registerSyncCommand(program);
25
+ registerUpdateCommand(program);
26
+ registerThemeCommand(program);
27
+ registerDoctorCommand(program);
28
+ registerDocsCommand(program);
29
+ registerAuditCommand(program);
30
+ registerConfigCommand(program);
31
+ program.parse();
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.legacy.d.ts","sourceRoot":"","sources":["../src/cli.legacy.ts"],"names":[],"mappings":""}