@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
@@ -0,0 +1,67 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { logger } from '../utils/logger.js';
4
+ import { ensureDir } from '../utils/fs-safe.js';
5
+ /** Scaffold src/plugins/vuetify.ts from template (wired to viui-conf) */
6
+ export function scaffoldVuetifyPlugin(cwd, assetsDir) {
7
+ const templateSrc = path.join(assetsDir, 'plugins', 'vuetify.ts');
8
+ if (!fs.existsSync(templateSrc)) {
9
+ logger.warn('vuetify.ts template not found in CLI assets');
10
+ return;
11
+ }
12
+ const dest = path.join(cwd, 'src', 'plugins', 'vuetify.ts');
13
+ if (fs.existsSync(dest)) {
14
+ logger.warn('src/plugins/vuetify.ts already exists — skipped (migrate manually if needed)');
15
+ return;
16
+ }
17
+ ensureDir(path.dirname(dest));
18
+ fs.copyFileSync(templateSrc, dest);
19
+ logger.success('Created src/plugins/vuetify.ts (viui-conf wired)');
20
+ }
21
+ /** Patch main.ts to import and use the scaffolded vuetify plugin */
22
+ export function patchMainEntry(cwd) {
23
+ const candidates = ['src/main.ts', 'src/main.js'];
24
+ for (const rel of candidates) {
25
+ const mainPath = path.join(cwd, rel);
26
+ if (!fs.existsSync(mainPath))
27
+ continue;
28
+ let content = fs.readFileSync(mainPath, 'utf8');
29
+ // Already imports our plugin → skip
30
+ if (content.includes('./plugins/vuetify')) {
31
+ logger.dim(`${rel} already imports ./plugins/vuetify — skipped`);
32
+ return;
33
+ }
34
+ // Has inline createVuetify → warn, don't auto-merge
35
+ if (content.includes('createVuetify')) {
36
+ logger.warn(`${rel} has inline createVuetify() — migrate to ./plugins/vuetify.ts manually`);
37
+ return;
38
+ }
39
+ // Add import after last existing import (handles multiline imports)
40
+ const importRegex = /^.*from\s+['"][^'"]+['"]\s*;?\s*$/gm;
41
+ let lastImportEnd = 0;
42
+ let match;
43
+ while ((match = importRegex.exec(content)) !== null) {
44
+ lastImportEnd = match.index + match[0].length;
45
+ }
46
+ const vuetifyImport = "\nimport { vuetify } from './plugins/vuetify'\n";
47
+ if (lastImportEnd > 0) {
48
+ content = content.slice(0, lastImportEnd) + vuetifyImport + content.slice(lastImportEnd);
49
+ }
50
+ else {
51
+ content = vuetifyImport + content;
52
+ }
53
+ // Add app.use(vuetify) before app.mount
54
+ const mountMatch = /app\.mount\s*\(/.exec(content);
55
+ if (mountMatch) {
56
+ const insertPos = mountMatch.index;
57
+ content = content.slice(0, insertPos) + 'app.use(vuetify)\n' + content.slice(insertPos);
58
+ }
59
+ else {
60
+ content += '\n// TODO: Add app.use(vuetify) before app.mount()\n';
61
+ logger.warn('Could not find app.mount() — add app.use(vuetify) manually');
62
+ }
63
+ fs.writeFileSync(mainPath, content, 'utf8');
64
+ logger.success(`Patched ${rel} with vuetify plugin import`);
65
+ return;
66
+ }
67
+ }
@@ -0,0 +1,90 @@
1
+ import 'vuetify/styles';
2
+ import '@mdi/font/css/materialdesignicons.css';
3
+ import { applyViuiThemeBodyClass } from './viui-conf/apply-theme-body';
4
+ /** Re-export for runtime theme switching (e.g. from a settings page). */
5
+ export { applyViuiThemeBodyClass };
6
+ export declare const vuetify: {
7
+ install: (app: import("vue").App<any>) => void;
8
+ unmount: () => void;
9
+ defaults: import("vue").Ref<import("vuetify").DefaultsInstance, import("vuetify").DefaultsInstance>;
10
+ display: import("vuetify").DisplayInstance;
11
+ theme: import("vuetify").ThemeInstance & {
12
+ install: (app: import("vue").App<any>) => void;
13
+ };
14
+ icons: {
15
+ defaultSet: string;
16
+ aliases: Partial<import("vuetify").IconAliases>;
17
+ sets: Record<string, import("vuetify").IconSet>;
18
+ };
19
+ locale: {
20
+ name: string;
21
+ decimalSeparator: import("vue").ShallowRef<string>;
22
+ messages: import("vue").Ref<import("vuetify").LocaleMessages, import("vuetify").LocaleMessages>;
23
+ current: import("vue").Ref<string, string>;
24
+ fallback: import("vue").Ref<string, string>;
25
+ t: (key: string, ...params: unknown[]) => string;
26
+ n: (value: number) => string;
27
+ provide: (props: import("vuetify").LocaleOptions) => import("vuetify").LocaleInstance;
28
+ isRtl: import("vue").Ref<boolean, boolean>;
29
+ rtl: import("vue").Ref<Record<string, boolean>, Record<string, boolean>>;
30
+ rtlClasses: import("vue").Ref<string, string>;
31
+ };
32
+ date: {
33
+ options: {
34
+ adapter: (new (options: {
35
+ locale: any;
36
+ formats?: any;
37
+ }) => import("vuetify").DateInstance) | import("vuetify").DateInstance;
38
+ formats?: Record<string, any>;
39
+ locale: Record<string, any>;
40
+ };
41
+ instance: {
42
+ date: (value?: any) => unknown;
43
+ format: (date: unknown, formatString: string) => string;
44
+ toJsDate: (value: unknown) => Date;
45
+ parseISO: (date: string) => unknown;
46
+ toISO: (date: unknown) => string;
47
+ startOfDay: (date: unknown) => unknown;
48
+ endOfDay: (date: unknown) => unknown;
49
+ startOfWeek: (date: unknown, firstDayOfWeek?: string | number | undefined) => unknown;
50
+ endOfWeek: (date: unknown) => unknown;
51
+ startOfMonth: (date: unknown) => unknown;
52
+ endOfMonth: (date: unknown) => unknown;
53
+ startOfYear: (date: unknown) => unknown;
54
+ endOfYear: (date: unknown) => unknown;
55
+ isAfter: (date: unknown, comparing: unknown) => boolean;
56
+ isAfterDay: (date: unknown, comparing: unknown) => boolean;
57
+ isSameDay: (date: unknown, comparing: unknown) => boolean;
58
+ isSameMonth: (date: unknown, comparing: unknown) => boolean;
59
+ isSameYear: (date: unknown, comparing: unknown) => boolean;
60
+ isBefore: (date: unknown, comparing: unknown) => boolean;
61
+ isEqual: (date: unknown, comparing: unknown) => boolean;
62
+ isValid: (date: any) => boolean;
63
+ isWithinRange: (date: unknown, range: [unknown, unknown]) => boolean;
64
+ addMinutes: (date: unknown, amount: number) => unknown;
65
+ addHours: (date: unknown, amount: number) => unknown;
66
+ addDays: (date: unknown, amount: number) => unknown;
67
+ addWeeks: (date: unknown, amount: number) => unknown;
68
+ addMonths: (date: unknown, amount: number) => unknown;
69
+ getYear: (date: unknown) => number;
70
+ setYear: (date: unknown, year: number) => unknown;
71
+ getDiff: (date: unknown, comparing: unknown, unit?: string | undefined) => number;
72
+ getWeekArray: (date: unknown, firstDayOfWeek?: string | number | undefined) => unknown[][];
73
+ getWeekdays: (firstDayOfWeek?: string | number | undefined, weekdayFormat?: "long" | "narrow" | "short" | undefined) => string[];
74
+ getWeek: (date: unknown, firstDayOfWeek?: string | number | undefined, firstDayOfYear?: string | number | undefined) => number;
75
+ getMonth: (date: unknown) => number;
76
+ setMonth: (date: unknown, month: number) => unknown;
77
+ getDate: (date: unknown) => number;
78
+ setDate: (date: unknown, day: number) => unknown;
79
+ getNextMonth: (date: unknown) => unknown;
80
+ getPreviousMonth: (date: unknown) => unknown;
81
+ getHours: (date: unknown) => number;
82
+ setHours: (date: unknown, hours: number) => unknown;
83
+ getMinutes: (date: unknown) => number;
84
+ setMinutes: (date: unknown, minutes: number) => unknown;
85
+ locale?: any;
86
+ };
87
+ };
88
+ goTo: import("vuetify").GoToInstance;
89
+ };
90
+ //# sourceMappingURL=vuetify-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vuetify-plugin.d.ts","sourceRoot":"","sources":["../../src/templates/vuetify-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,gBAAgB,CAAA;AACvB,OAAO,uCAAuC,CAAA;AAQ9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAKtE,yEAAyE;AACzE,OAAO,EAAE,uBAAuB,EAAE,CAAA;AAElC,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;yBAiBg++G,GAAI;;;;;;;;;;;uBAAzu6G,CAAC;;;;;;wBAA2m7G,CAAC;;;;;;;uDAAoY,CAAC;;;;;;;;;;;;;;;;;;;;;;6DAAu5C,CAAC;wDAAyF,CAAC;wCAAuF,CAAC,4CAA4C,CAAC;mDAA2G,CAAC,6CAA6C,CAAC;;;;;;;;;;;kBAAsnB,CAAC;;;;CADvolH,CAAA"}
@@ -0,0 +1,33 @@
1
+ // src/plugins/vuetify.ts — Auto-generated by viui-cli init
2
+ // Modify freely; viui sync will NOT overwrite this file.
3
+ import 'vuetify/styles';
4
+ import '@mdi/font/css/materialdesignicons.css';
5
+ import { createVuetify } from 'vuetify';
6
+ import { aliases, mdi } from 'vuetify/iconsets/mdi';
7
+ import * as components from 'vuetify/components';
8
+ import * as directives from 'vuetify/directives';
9
+ import LightTheme from './viui-conf/v-light';
10
+ import DarkTheme from './viui-conf/v-dark';
11
+ import { getDefaults, VIUI_DEFAULT_THEME_ID } from './viui-conf/defaults/index';
12
+ import { applyViuiThemeBodyClass } from './viui-conf/apply-theme-body';
13
+ /** Read theme from env, fallback to default (minimalist-2). */
14
+ const themeId = import.meta.env.VITE_VIUI_THEME ?? VIUI_DEFAULT_THEME_ID;
15
+ /** Re-export for runtime theme switching (e.g. from a settings page). */
16
+ export { applyViuiThemeBodyClass };
17
+ export const vuetify = createVuetify({
18
+ components,
19
+ directives,
20
+ defaults: getDefaults(themeId),
21
+ icons: {
22
+ defaultSet: 'mdi',
23
+ aliases,
24
+ sets: { mdi },
25
+ },
26
+ theme: {
27
+ defaultTheme: 'light',
28
+ themes: {
29
+ light: LightTheme,
30
+ dark: DarkTheme,
31
+ },
32
+ },
33
+ });
@@ -0,0 +1,15 @@
1
+ /** Shared types for CLI command results and errors */
2
+ export interface CommandResult {
3
+ success: boolean;
4
+ message: string;
5
+ }
6
+ export interface CommandError {
7
+ code: string;
8
+ message: string;
9
+ details?: string;
10
+ }
11
+ /** Common CLI options shared across commands */
12
+ export interface GlobalOptions {
13
+ verbose?: boolean;
14
+ }
15
+ //# sourceMappingURL=command-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-types.d.ts","sourceRoot":"","sources":["../../src/types/command-types.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB"}
@@ -0,0 +1,2 @@
1
+ /** Shared types for CLI command results and errors */
2
+ export {};
@@ -0,0 +1,29 @@
1
+ /** Schema for viui.config.ts — consumer project configuration */
2
+ export interface PromptConfig {
3
+ /** Disable prompt generation (default: true = enabled) */
4
+ enabled?: boolean;
5
+ /** Override/extend component mapping */
6
+ componentMap?: Record<string, string>;
7
+ /** Extra rules appended to prompt */
8
+ extraRules?: string;
9
+ /** Only generate for specific AI systems (default: auto-detect all) */
10
+ targets?: string[];
11
+ }
12
+ export interface ViuiConfig {
13
+ /** Active theme name (e.g. 'neo-brutalism', 'minimalist-2') */
14
+ theme: string;
15
+ /** Token source package */
16
+ tokens: string;
17
+ /** Style import format */
18
+ styleImport: 'scss' | 'css';
19
+ /** Directory where theme files are output in consumer project */
20
+ outputDir: string;
21
+ /** Auto-configure Vuetify theme integration */
22
+ vuetifyIntegration: boolean;
23
+ /** AI prompt generation config */
24
+ prompts?: PromptConfig;
25
+ }
26
+ /** Available theme IDs shipped with the design system */
27
+ export declare const AVAILABLE_THEMES: readonly ["neo-brutalism", "minimalist-2", "material", "minimalist", "glassmorphism", "bento-grid"];
28
+ export type ThemeId = (typeof AVAILABLE_THEMES)[number];
29
+ //# sourceMappingURL=config-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-types.d.ts","sourceRoot":"","sources":["../../src/types/config-types.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,0BAA0B;IAC1B,WAAW,EAAE,MAAM,GAAG,KAAK,CAAA;IAC3B,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAA;IACjB,+CAA+C;IAC/C,kBAAkB,EAAE,OAAO,CAAA;IAC3B,kCAAkC;IAClC,OAAO,CAAC,EAAE,YAAY,CAAA;CACvB;AAED,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,qGAOnB,CAAA;AACV,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ /** Schema for viui.config.ts — consumer project configuration */
2
+ /** Available theme IDs shipped with the design system */
3
+ export const AVAILABLE_THEMES = [
4
+ 'neo-brutalism',
5
+ 'minimalist-2',
6
+ 'material',
7
+ 'minimalist',
8
+ 'glassmorphism',
9
+ 'bento-grid',
10
+ ];
@@ -0,0 +1,29 @@
1
+ /**
2
+ * ide-types.ts — Kiểu dữ liệu cho tính năng phát hiện và cấu hình IDE
3
+ */
4
+ /** Mã định danh IDE được hỗ trợ */
5
+ export type IdeId = 'vscode' | 'cursor' | 'claude' | 'windsurf' | 'trae' | 'gemini';
6
+ /** Định dạng config JSON theo từng IDE */
7
+ export type IdeConfigFormat = 'vscode' | 'gemini' | 'standard';
8
+ /** Thông tin về một IDE được phát hiện */
9
+ export interface IdeInfo {
10
+ /** Mã định danh nội bộ */
11
+ id: IdeId;
12
+ /** Tên hiển thị cho người dùng */
13
+ name: string;
14
+ /** Có được phát hiện trong project/hệ thống không */
15
+ detected: boolean;
16
+ /** Đường dẫn file cấu hình MCP project-level (tuyệt đối, rỗng nếu không hỗ trợ) */
17
+ configPath: string;
18
+ /** Đường dẫn file cấu hình MCP global (null nếu không hỗ trợ) */
19
+ globalConfigPath: string | null;
20
+ /** Định dạng JSON config: vscode (.vscode/mcp.json), gemini (serverUrl), standard (mcpServers) */
21
+ configFormat: IdeConfigFormat;
22
+ }
23
+ /** Cấu hình MCP server cần ghi vào IDE */
24
+ export interface McpConfig {
25
+ serverUrl: string;
26
+ serverName: string;
27
+ transport: 'http' | 'stdio';
28
+ }
29
+ //# sourceMappingURL=ide-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide-types.d.ts","sourceRoot":"","sources":["../../src/types/ide-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mCAAmC;AACnC,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEnF,0CAA0C;AAC1C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAA;AAE9D,0CAA0C;AAC1C,MAAM,WAAW,OAAO;IACtB,0BAA0B;IAC1B,EAAE,EAAE,KAAK,CAAA;IACT,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAA;IACjB,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,kGAAkG;IAClG,YAAY,EAAE,eAAe,CAAA;CAC9B;AAED,0CAA0C;AAC1C,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;CAC5B"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * ide-types.ts — Kiểu dữ liệu cho tính năng phát hiện và cấu hình IDE
3
+ */
4
+ export {};
@@ -0,0 +1,27 @@
1
+ /** Schema for .viui-lock.json — tracks installed versions and integrity checksums */
2
+ export interface LockFileTokenEntry {
3
+ version: string;
4
+ integrity: string;
5
+ baseVersion: string;
6
+ }
7
+ export interface LockFileThemeEntry {
8
+ version: string;
9
+ integrity: string;
10
+ baseVersion: string;
11
+ }
12
+ export interface LockFileConfig {
13
+ theme: string;
14
+ styleImport: 'scss' | 'css';
15
+ }
16
+ export interface LockFileMetadata {
17
+ cliVersion: string;
18
+ generatedAt: string;
19
+ }
20
+ export interface LockFile {
21
+ lockfileVersion: number;
22
+ tokens: LockFileTokenEntry;
23
+ themes: Record<string, LockFileThemeEntry>;
24
+ config: LockFileConfig;
25
+ metadata: LockFileMetadata;
26
+ }
27
+ //# sourceMappingURL=lock-file-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock-file-types.d.ts","sourceRoot":"","sources":["../../src/types/lock-file-types.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,GAAG,KAAK,CAAA;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,kBAAkB,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAC1C,MAAM,EAAE,cAAc,CAAA;IACtB,QAAQ,EAAE,gBAAgB,CAAA;CAC3B"}
@@ -0,0 +1,2 @@
1
+ /** Schema for .viui-lock.json — tracks installed versions and integrity checksums */
2
+ export {};
@@ -0,0 +1,18 @@
1
+ /** Represents a single line diff */
2
+ interface DiffLine {
3
+ type: 'add' | 'remove' | 'context';
4
+ lineNumber: number;
5
+ content: string;
6
+ }
7
+ /** Generate unified diff lines between two string contents */
8
+ export declare function generateDiffLines(oldContent: string, newContent: string): DiffLine[];
9
+ /** Pretty-print diff lines with color to terminal */
10
+ export declare function printDiff(filePath: string, lines: DiffLine[]): void;
11
+ /** Summary of changes: files added/modified/removed */
12
+ export declare function printDiffSummary(stats: {
13
+ added: number;
14
+ modified: number;
15
+ removed: number;
16
+ }): void;
17
+ export {};
18
+ //# sourceMappingURL=diff-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-display.d.ts","sourceRoot":"","sources":["../../src/utils/diff-display.ts"],"names":[],"mappings":"AAEA,oCAAoC;AACpC,UAAU,QAAQ;IAChB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAA;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,EAAE,CAuBpF;AAED,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAwBnE;AAED,uDAAuD;AACvD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMlG"}
@@ -0,0 +1,61 @@
1
+ import chalk from 'chalk';
2
+ /** Generate unified diff lines between two string contents */
3
+ export function generateDiffLines(oldContent, newContent) {
4
+ const oldLines = oldContent.split('\n');
5
+ const newLines = newContent.split('\n');
6
+ const result = [];
7
+ const maxLen = Math.max(oldLines.length, newLines.length);
8
+ for (let i = 0; i < maxLen; i++) {
9
+ const oldLine = oldLines[i];
10
+ const newLine = newLines[i];
11
+ if (oldLine === undefined && newLine !== undefined) {
12
+ result.push({ type: 'add', lineNumber: i + 1, content: newLine });
13
+ }
14
+ else if (oldLine !== undefined && newLine === undefined) {
15
+ result.push({ type: 'remove', lineNumber: i + 1, content: oldLine });
16
+ }
17
+ else if (oldLine !== newLine) {
18
+ result.push({ type: 'remove', lineNumber: i + 1, content: oldLine });
19
+ result.push({ type: 'add', lineNumber: i + 1, content: newLine });
20
+ }
21
+ else {
22
+ result.push({ type: 'context', lineNumber: i + 1, content: oldLine });
23
+ }
24
+ }
25
+ return result;
26
+ }
27
+ /** Pretty-print diff lines with color to terminal */
28
+ export function printDiff(filePath, lines) {
29
+ const hasChanges = lines.some((l) => l.type !== 'context');
30
+ if (!hasChanges) {
31
+ console.log(chalk.dim(` ${filePath} (no changes)`));
32
+ return;
33
+ }
34
+ console.log(chalk.bold(`\n--- ${filePath}`));
35
+ console.log(chalk.bold(`+++ ${filePath}`));
36
+ for (const line of lines) {
37
+ const num = String(line.lineNumber).padStart(4, ' ');
38
+ switch (line.type) {
39
+ case 'add':
40
+ console.log(chalk.green(`${num} + ${line.content}`));
41
+ break;
42
+ case 'remove':
43
+ console.log(chalk.red(`${num} - ${line.content}`));
44
+ break;
45
+ case 'context':
46
+ console.log(chalk.dim(`${num} ${line.content}`));
47
+ break;
48
+ }
49
+ }
50
+ }
51
+ /** Summary of changes: files added/modified/removed */
52
+ export function printDiffSummary(stats) {
53
+ const parts = [];
54
+ if (stats.added > 0)
55
+ parts.push(chalk.green(`${stats.added} added`));
56
+ if (stats.modified > 0)
57
+ parts.push(chalk.yellow(`${stats.modified} modified`));
58
+ if (stats.removed > 0)
59
+ parts.push(chalk.red(`${stats.removed} removed`));
60
+ console.log(`\nSummary: ${parts.join(', ') || 'no changes'}`);
61
+ }
@@ -0,0 +1,9 @@
1
+ /** Write file safely: write to temp in same dir, then rename (avoids EXDEV cross-device error) */
2
+ export declare function writeFileSafe(filePath: string, content: string): void;
3
+ /** Read and parse JSON file, return null if missing or invalid */
4
+ export declare function readJsonSafe<T>(filePath: string): T | null;
5
+ /** Ensure directory exists */
6
+ export declare function ensureDir(dirPath: string): void;
7
+ /** Copy directory recursively */
8
+ export declare function copyDirRecursive(src: string, dest: string): void;
9
+ //# sourceMappingURL=fs-safe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-safe.d.ts","sourceRoot":"","sources":["../../src/utils/fs-safe.ts"],"names":[],"mappings":"AAIA,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMrE;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAS1D;AAED,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,iCAAiC;AACjC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAYhE"}
@@ -0,0 +1,44 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { logger } from './logger.js';
4
+ /** Write file safely: write to temp in same dir, then rename (avoids EXDEV cross-device error) */
5
+ export function writeFileSafe(filePath, content) {
6
+ const dir = path.dirname(filePath);
7
+ fs.mkdirSync(dir, { recursive: true });
8
+ const tmp = path.join(dir, `.viui-tmp-${Date.now()}-${path.basename(filePath)}`);
9
+ fs.writeFileSync(tmp, content, 'utf8');
10
+ fs.renameSync(tmp, filePath);
11
+ }
12
+ /** Read and parse JSON file, return null if missing or invalid */
13
+ export function readJsonSafe(filePath) {
14
+ try {
15
+ if (!fs.existsSync(filePath))
16
+ return null;
17
+ const raw = fs.readFileSync(filePath, 'utf8');
18
+ return JSON.parse(raw);
19
+ }
20
+ catch (err) {
21
+ logger.warn(`Failed to read ${filePath}: ${err.message}`);
22
+ return null;
23
+ }
24
+ }
25
+ /** Ensure directory exists */
26
+ export function ensureDir(dirPath) {
27
+ fs.mkdirSync(dirPath, { recursive: true });
28
+ }
29
+ /** Copy directory recursively */
30
+ export function copyDirRecursive(src, dest) {
31
+ if (!fs.existsSync(src))
32
+ return;
33
+ fs.mkdirSync(dest, { recursive: true });
34
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
35
+ const srcPath = path.join(src, entry.name);
36
+ const destPath = path.join(dest, entry.name);
37
+ if (entry.isDirectory()) {
38
+ copyDirRecursive(srcPath, destPath);
39
+ }
40
+ else {
41
+ fs.copyFileSync(srcPath, destPath);
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,14 @@
1
+ /** Structured CLI logger with colored output */
2
+ export declare const logger: {
3
+ info(msg: string): void;
4
+ success(msg: string): void;
5
+ warn(msg: string): void;
6
+ error(msg: string): void;
7
+ /** Dim text for secondary information */
8
+ dim(msg: string): void;
9
+ /** Bold header for section titles */
10
+ header(msg: string): void;
11
+ /** Newline separator */
12
+ br(): void;
13
+ };
14
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,gDAAgD;AAChD,eAAO,MAAM,MAAM;cACP,MAAM,GAAG,IAAI;iBAIV,MAAM,GAAG,IAAI;cAIhB,MAAM,GAAG,IAAI;eAIZ,MAAM,GAAG,IAAI;IAIxB,yCAAyC;aAChC,MAAM,GAAG,IAAI;IAItB,qCAAqC;gBACzB,MAAM,GAAG,IAAI;IAIzB,wBAAwB;UAClB,IAAI;CAGX,CAAA"}
@@ -0,0 +1,28 @@
1
+ import chalk from 'chalk';
2
+ /** Structured CLI logger with colored output */
3
+ export const logger = {
4
+ info(msg) {
5
+ console.log(chalk.blue('ℹ'), msg);
6
+ },
7
+ success(msg) {
8
+ console.log(chalk.green('✓'), msg);
9
+ },
10
+ warn(msg) {
11
+ console.log(chalk.yellow('⚠'), msg);
12
+ },
13
+ error(msg) {
14
+ console.error(chalk.red('✗'), msg);
15
+ },
16
+ /** Dim text for secondary information */
17
+ dim(msg) {
18
+ console.log(chalk.dim(msg));
19
+ },
20
+ /** Bold header for section titles */
21
+ header(msg) {
22
+ console.log(chalk.bold(msg));
23
+ },
24
+ /** Newline separator */
25
+ br() {
26
+ console.log();
27
+ },
28
+ };
@@ -0,0 +1,3 @@
1
+ /** Open URL in default browser, cross-platform */
2
+ export declare function openBrowser(url: string): void;
3
+ //# sourceMappingURL=open-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-browser.d.ts","sourceRoot":"","sources":["../../src/utils/open-browser.ts"],"names":[],"mappings":"AAGA,kDAAkD;AAClD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAU7C"}
@@ -0,0 +1,13 @@
1
+ import { exec } from 'node:child_process';
2
+ import { platform } from 'node:os';
3
+ /** Open URL in default browser, cross-platform */
4
+ export function openBrowser(url) {
5
+ const os = platform();
6
+ const cmd = os === 'win32' ? `start "" "${url}"` :
7
+ os === 'darwin' ? `open "${url}"` :
8
+ `xdg-open "${url}"`;
9
+ exec(cmd, (err) => {
10
+ if (err)
11
+ console.error(`Failed to open browser: ${err.message}`);
12
+ });
13
+ }
package/package.json CHANGED
@@ -1,13 +1,19 @@
1
1
  {
2
2
  "name": "@hobui/viui-cli",
3
- "version": "0.0.5",
4
- "description": "CLI to sync i-design-system .cursor (rules, skills, commands) into consumer repos",
3
+ "private": false,
4
+ "version": "0.0.7",
5
+ "description": "CLI for iNET Design System — manage themes, tokens, config",
5
6
  "type": "module",
7
+ "bin": {
8
+ "viui": "./dist/cli.js"
9
+ },
6
10
  "files": [
7
11
  "dist"
8
12
  ],
9
- "bin": {
10
- "viui-cli": "./dist/cli.js"
13
+ "dependencies": {
14
+ "@inquirer/prompts": "^8.4.1",
15
+ "chalk": "^5.4.0",
16
+ "commander": "^13.0.0"
11
17
  },
12
18
  "devDependencies": {
13
19
  "@types/node": "^22.0.0",
@@ -20,8 +26,7 @@
20
26
  "access": "public"
21
27
  },
22
28
  "scripts": {
23
- "postinstall": "node scripts/postinstall-check.cjs",
24
- "build": "tsc && node scripts/copy-cursor.cjs",
29
+ "build": "tsc && node scripts/copy-assets.mjs",
25
30
  "dev": "tsc --watch"
26
31
  }
27
32
  }
@@ -1 +0,0 @@
1
- 0.0.0
@@ -1,25 +0,0 @@
1
- ---
2
- name: audit accessibility
3
- description: Chạy/addon a11y, liệt kê lỗi (contrast, ARIA, keyboard); ưu tiên sửa color-contrast theo accessibility-contrast.mdc.
4
- ---
5
-
6
- Bạn là chuyên gia accessibility cho design system.
7
-
8
- **Nhiệm vụ:** Kiểm tra (audit) accessibility của component hoặc story và đưa ra danh sách lỗi + hướng sửa.
9
-
10
- ## Các bước
11
-
12
- 1. **Xác định phạm vi** — Một story, một component, hay toàn bộ Storybook. Nếu user không chỉ rõ, ưu tiên story/component đang mở hoặc vừa sửa.
13
- 2. **Liệt kê lỗi a11y** — Dựa trên:
14
- - Addon a11y (Storybook) hoặc axe: color-contrast, aria-*, role, label, focus, keyboard.
15
- - Code review: thiếu aria-label, thiếu role, màu chữ/nền không đạt WCAG AA.
16
- 3. **Ưu tiên sửa** — Ưu tiên **color-contrast** (WCAG 2.1 AA): theo `.cursor/rules/accessibility-contrast.mdc` (text.disabled, semantic .text trên nền màu, #000/#fff trên swatch). Sau đó: ARIA, keyboard, focus.
17
- 4. **Đề xuất chỉnh sửa** — Với mỗi lỗi, đề xuất thay đổi cụ thể (file, dòng, token hoặc attribute).
18
-
19
- ## Tham chiếu
20
-
21
- - Rule contrast: `.cursor/rules/accessibility-contrast.mdc`
22
- - Skill a11y (gồm color contrast): `.cursor/skills/accessibility.md`
23
- - AGENTS.md: mục "Color contrast (WCAG AA)"
24
-
25
- Đầu ra: danh sách lỗi (mức độ nếu có) + patch hoặc hướng dẫn sửa từng mục.