cursor-kit-cli 1.2.0-beta → 1.2.0-beta.3

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 (92) hide show
  1. package/bin/cursor-reinstall-instance.sh +102 -0
  2. package/dist/cli.cjs +366 -69
  3. package/dist/cli.cjs.map +1 -1
  4. package/dist/cli.js +367 -70
  5. package/dist/cli.js.map +1 -1
  6. package/dist/index.cjs +39 -1
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +9 -1
  9. package/dist/index.d.ts +9 -1
  10. package/dist/index.js +33 -2
  11. package/dist/index.js.map +1 -1
  12. package/package.json +1 -1
  13. package/templates/commands/docs.md +5 -3
  14. package/templates/commands/explain.md +5 -3
  15. package/templates/commands/fix.md +5 -3
  16. package/templates/commands/implement.md +5 -3
  17. package/templates/commands/refactor.md +5 -3
  18. package/templates/commands/review.md +5 -3
  19. package/templates/commands/test.md +5 -3
  20. package/templates/manifest.json +11 -8
  21. package/templates/rules/git.mdc +0 -2
  22. package/templates/rules/toc.mdc +17 -9
  23. package/templates/skills/aesthetic/SKILL.md +121 -0
  24. package/templates/skills/aesthetic/assets/design-guideline-template.md +163 -0
  25. package/templates/skills/aesthetic/assets/design-story-template.md +135 -0
  26. package/templates/skills/aesthetic/references/design-principles.md +62 -0
  27. package/templates/skills/aesthetic/references/design-resources.md +75 -0
  28. package/templates/skills/aesthetic/references/micro-interactions.md +53 -0
  29. package/templates/skills/aesthetic/references/storytelling-design.md +50 -0
  30. package/templates/skills/backend-development/SKILL.mdc +95 -0
  31. package/templates/skills/backend-development/references/backend-api-design.md +495 -0
  32. package/templates/skills/backend-development/references/backend-architecture.md +454 -0
  33. package/templates/skills/backend-development/references/backend-authentication.md +338 -0
  34. package/templates/skills/backend-development/references/backend-code-quality.md +659 -0
  35. package/templates/skills/backend-development/references/backend-debugging.md +904 -0
  36. package/templates/skills/backend-development/references/backend-devops.md +494 -0
  37. package/templates/skills/backend-development/references/backend-mindset.md +387 -0
  38. package/templates/skills/backend-development/references/backend-performance.md +397 -0
  39. package/templates/skills/backend-development/references/backend-security.md +290 -0
  40. package/templates/skills/backend-development/references/backend-technologies.md +256 -0
  41. package/templates/skills/backend-development/references/backend-testing.md +429 -0
  42. package/templates/skills/frontend-design/SKILL.mdc +41 -0
  43. package/templates/skills/frontend-design/references/animejs.md +396 -0
  44. package/templates/skills/frontend-development/SKILL.mdc +399 -0
  45. package/templates/skills/frontend-development/resources/common-patterns.md +331 -0
  46. package/templates/skills/frontend-development/resources/complete-examples.md +872 -0
  47. package/templates/skills/frontend-development/resources/component-patterns.md +502 -0
  48. package/templates/skills/frontend-development/resources/data-fetching.md +767 -0
  49. package/templates/skills/frontend-development/resources/file-organization.md +502 -0
  50. package/templates/skills/frontend-development/resources/loading-and-error-states.md +501 -0
  51. package/templates/skills/frontend-development/resources/performance.md +406 -0
  52. package/templates/skills/frontend-development/resources/routing-guide.md +364 -0
  53. package/templates/skills/frontend-development/resources/styling-guide.md +428 -0
  54. package/templates/skills/frontend-development/resources/typescript-standards.md +418 -0
  55. package/templates/skills/problem-solving/SKILL.mdc +96 -0
  56. package/templates/skills/problem-solving/references/attribution.md +69 -0
  57. package/templates/skills/problem-solving/references/collision-zone-thinking.md +79 -0
  58. package/templates/skills/problem-solving/references/inversion-exercise.md +91 -0
  59. package/templates/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
  60. package/templates/skills/problem-solving/references/scale-game.md +95 -0
  61. package/templates/skills/problem-solving/references/simplification-cascades.md +80 -0
  62. package/templates/skills/problem-solving/references/when-stuck.md +72 -0
  63. package/templates/skills/research/SKILL.mdc +168 -0
  64. package/templates/skills/sequential-thinking/.env.example +8 -0
  65. package/templates/skills/sequential-thinking/README.md +183 -0
  66. package/templates/skills/sequential-thinking/SKILL.mdc +94 -0
  67. package/templates/skills/sequential-thinking/package.json +31 -0
  68. package/templates/skills/sequential-thinking/references/advanced-strategies.md +79 -0
  69. package/templates/skills/sequential-thinking/references/advanced-techniques.md +76 -0
  70. package/templates/skills/sequential-thinking/references/core-patterns.md +95 -0
  71. package/templates/skills/sequential-thinking/references/examples-api.md +88 -0
  72. package/templates/skills/sequential-thinking/references/examples-architecture.md +94 -0
  73. package/templates/skills/sequential-thinking/references/examples-debug.md +90 -0
  74. package/templates/skills/sequential-thinking/scripts/format-thought.js +159 -0
  75. package/templates/skills/sequential-thinking/scripts/process-thought.js +236 -0
  76. package/templates/skills/sequential-thinking/tests/format-thought.test.js +133 -0
  77. package/templates/skills/sequential-thinking/tests/process-thought.test.js +215 -0
  78. package/templates/skills/ui-styling/LICENSE.txt +202 -0
  79. package/templates/skills/ui-styling/SKILL.mdc +321 -0
  80. package/templates/skills/ui-styling/references/canvas-design-system.md +320 -0
  81. package/templates/skills/ui-styling/references/shadcn-accessibility.md +471 -0
  82. package/templates/skills/ui-styling/references/shadcn-components.md +424 -0
  83. package/templates/skills/ui-styling/references/shadcn-theming.md +373 -0
  84. package/templates/skills/ui-styling/references/tailwind-customization.md +483 -0
  85. package/templates/skills/ui-styling/references/tailwind-responsive.md +382 -0
  86. package/templates/skills/ui-styling/references/tailwind-utilities.md +455 -0
  87. package/templates/rules/frontend-design.mdc +0 -48
  88. package/templates/rules/performance.mdc +0 -54
  89. package/templates/rules/react.mdc +0 -58
  90. package/templates/rules/security.mdc +0 -50
  91. package/templates/rules/testing.mdc +0 -54
  92. package/templates/rules/typescript.mdc +0 -36
package/dist/index.d.cts CHANGED
@@ -16,14 +16,19 @@ declare function dirExists(path: string): boolean;
16
16
  declare function readFile(path: string): string;
17
17
  declare function writeFile(path: string, content: string): void;
18
18
  declare function removeFile(path: string): void;
19
+ declare function copyDir(src: string, dest: string): void;
19
20
  declare function listFiles(dir: string, extension?: string): string[];
21
+ declare function listDirs(dir: string): string[];
20
22
  declare function getCursorDir(cwd?: string): string;
21
23
  declare function getCommandsDir(cwd?: string): string;
22
24
  declare function getRulesDir(cwd?: string): string;
25
+ declare function getSkillsDir(cwd?: string): string;
23
26
  declare function resolveFromCwd(...paths: string[]): string;
24
27
  declare function getPackageJson(cwd?: string): Record<string, unknown> | null;
25
28
  declare function getConflictingFiles(dir: string, files: string[]): string[];
29
+ declare function getConflictingDirs(dir: string, dirs: string[]): string[];
26
30
  declare function getNonConflictingFiles(dir: string, files: string[]): string[];
31
+ declare function getNonConflictingDirs(dir: string, dirs: string[]): string[];
27
32
 
28
33
  declare const REPO_URL = "github:duongductrong/cursor-kit";
29
34
  declare const REPO_REF = "master";
@@ -31,12 +36,15 @@ declare const REPO_RAW_URL = "https://raw.githubusercontent.com/duongductrong/cu
31
36
  declare const CURSOR_DIR = ".cursor";
32
37
  declare const COMMANDS_DIR = "commands";
33
38
  declare const RULES_DIR = "rules";
39
+ declare const SKILLS_DIR = "skills";
34
40
  declare const COMMAND_EXTENSION = ".md";
35
41
  declare const RULE_EXTENSION = ".mdc";
42
+ declare const SKILL_EXTENSION = ".mdc";
36
43
  declare const CONFIG_FILE = ".cursorkit";
37
44
  declare const TEMPLATE_PATHS: {
38
45
  readonly commands: "templates/commands";
39
46
  readonly rules: "templates/rules";
47
+ readonly skills: "templates/skills";
40
48
  };
41
49
 
42
- export { COMMANDS_DIR, COMMAND_EXTENSION, CONFIG_FILE, CURSOR_DIR, REPO_RAW_URL, REPO_REF, REPO_URL, RULES_DIR, RULE_EXTENSION, TEMPLATE_PATHS, bold, dim, dirExists, ensureDir, fileExists, getCommandsDir, getConflictingFiles, getCursorDir, getNonConflictingFiles, getPackageJson, getRulesDir, gradientText, highlight, listFiles, printBanner, printDivider, printError, printInfo, printSuccess, printVersion, printWarning, readFile, removeFile, resolveFromCwd, writeFile };
50
+ export { COMMANDS_DIR, COMMAND_EXTENSION, CONFIG_FILE, CURSOR_DIR, REPO_RAW_URL, REPO_REF, REPO_URL, RULES_DIR, RULE_EXTENSION, SKILLS_DIR, SKILL_EXTENSION, TEMPLATE_PATHS, bold, copyDir, dim, dirExists, ensureDir, fileExists, getCommandsDir, getConflictingDirs, getConflictingFiles, getCursorDir, getNonConflictingDirs, getNonConflictingFiles, getPackageJson, getRulesDir, getSkillsDir, gradientText, highlight, listDirs, listFiles, printBanner, printDivider, printError, printInfo, printSuccess, printVersion, printWarning, readFile, removeFile, resolveFromCwd, writeFile };
package/dist/index.d.ts CHANGED
@@ -16,14 +16,19 @@ declare function dirExists(path: string): boolean;
16
16
  declare function readFile(path: string): string;
17
17
  declare function writeFile(path: string, content: string): void;
18
18
  declare function removeFile(path: string): void;
19
+ declare function copyDir(src: string, dest: string): void;
19
20
  declare function listFiles(dir: string, extension?: string): string[];
21
+ declare function listDirs(dir: string): string[];
20
22
  declare function getCursorDir(cwd?: string): string;
21
23
  declare function getCommandsDir(cwd?: string): string;
22
24
  declare function getRulesDir(cwd?: string): string;
25
+ declare function getSkillsDir(cwd?: string): string;
23
26
  declare function resolveFromCwd(...paths: string[]): string;
24
27
  declare function getPackageJson(cwd?: string): Record<string, unknown> | null;
25
28
  declare function getConflictingFiles(dir: string, files: string[]): string[];
29
+ declare function getConflictingDirs(dir: string, dirs: string[]): string[];
26
30
  declare function getNonConflictingFiles(dir: string, files: string[]): string[];
31
+ declare function getNonConflictingDirs(dir: string, dirs: string[]): string[];
27
32
 
28
33
  declare const REPO_URL = "github:duongductrong/cursor-kit";
29
34
  declare const REPO_REF = "master";
@@ -31,12 +36,15 @@ declare const REPO_RAW_URL = "https://raw.githubusercontent.com/duongductrong/cu
31
36
  declare const CURSOR_DIR = ".cursor";
32
37
  declare const COMMANDS_DIR = "commands";
33
38
  declare const RULES_DIR = "rules";
39
+ declare const SKILLS_DIR = "skills";
34
40
  declare const COMMAND_EXTENSION = ".md";
35
41
  declare const RULE_EXTENSION = ".mdc";
42
+ declare const SKILL_EXTENSION = ".mdc";
36
43
  declare const CONFIG_FILE = ".cursorkit";
37
44
  declare const TEMPLATE_PATHS: {
38
45
  readonly commands: "templates/commands";
39
46
  readonly rules: "templates/rules";
47
+ readonly skills: "templates/skills";
40
48
  };
41
49
 
42
- export { COMMANDS_DIR, COMMAND_EXTENSION, CONFIG_FILE, CURSOR_DIR, REPO_RAW_URL, REPO_REF, REPO_URL, RULES_DIR, RULE_EXTENSION, TEMPLATE_PATHS, bold, dim, dirExists, ensureDir, fileExists, getCommandsDir, getConflictingFiles, getCursorDir, getNonConflictingFiles, getPackageJson, getRulesDir, gradientText, highlight, listFiles, printBanner, printDivider, printError, printInfo, printSuccess, printVersion, printWarning, readFile, removeFile, resolveFromCwd, writeFile };
50
+ export { COMMANDS_DIR, COMMAND_EXTENSION, CONFIG_FILE, CURSOR_DIR, REPO_RAW_URL, REPO_REF, REPO_URL, RULES_DIR, RULE_EXTENSION, SKILLS_DIR, SKILL_EXTENSION, TEMPLATE_PATHS, bold, copyDir, dim, dirExists, ensureDir, fileExists, getCommandsDir, getConflictingDirs, getConflictingFiles, getCursorDir, getNonConflictingDirs, getNonConflictingFiles, getPackageJson, getRulesDir, getSkillsDir, gradientText, highlight, listDirs, listFiles, printBanner, printDivider, printError, printInfo, printSuccess, printVersion, printWarning, readFile, removeFile, resolveFromCwd, writeFile };
package/dist/index.js CHANGED
@@ -52,7 +52,7 @@ function gradientText(text) {
52
52
  }
53
53
 
54
54
  // src/utils/fs.ts
55
- import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, rmSync, statSync } from "fs";
55
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, rmSync, statSync, cpSync } from "fs";
56
56
  import { dirname, join, resolve } from "path";
57
57
  function ensureDir(path) {
58
58
  if (!existsSync(path)) {
@@ -77,6 +77,9 @@ function removeFile(path) {
77
77
  rmSync(path, { recursive: true });
78
78
  }
79
79
  }
80
+ function copyDir(src, dest) {
81
+ cpSync(src, dest, { recursive: true });
82
+ }
80
83
  function listFiles(dir, extension) {
81
84
  if (!dirExists(dir)) return [];
82
85
  const files = readdirSync(dir);
@@ -85,6 +88,13 @@ function listFiles(dir, extension) {
85
88
  }
86
89
  return files;
87
90
  }
91
+ function listDirs(dir) {
92
+ if (!dirExists(dir)) return [];
93
+ return readdirSync(dir).filter((item) => {
94
+ const itemPath = join(dir, item);
95
+ return statSync(itemPath).isDirectory();
96
+ });
97
+ }
88
98
  function getCursorDir(cwd = process.cwd()) {
89
99
  return join(cwd, ".cursor");
90
100
  }
@@ -94,6 +104,9 @@ function getCommandsDir(cwd = process.cwd()) {
94
104
  function getRulesDir(cwd = process.cwd()) {
95
105
  return join(getCursorDir(cwd), "rules");
96
106
  }
107
+ function getSkillsDir(cwd = process.cwd()) {
108
+ return join(getCursorDir(cwd), "skills");
109
+ }
97
110
  function resolveFromCwd(...paths) {
98
111
  return resolve(process.cwd(), ...paths);
99
112
  }
@@ -110,10 +123,18 @@ function getConflictingFiles(dir, files) {
110
123
  if (!dirExists(dir)) return [];
111
124
  return files.filter((file) => fileExists(join(dir, file)));
112
125
  }
126
+ function getConflictingDirs(dir, dirs) {
127
+ if (!dirExists(dir)) return [];
128
+ return dirs.filter((d) => dirExists(join(dir, d)));
129
+ }
113
130
  function getNonConflictingFiles(dir, files) {
114
131
  if (!dirExists(dir)) return files;
115
132
  return files.filter((file) => !fileExists(join(dir, file)));
116
133
  }
134
+ function getNonConflictingDirs(dir, dirs) {
135
+ if (!dirExists(dir)) return dirs;
136
+ return dirs.filter((d) => !dirExists(join(dir, d)));
137
+ }
117
138
 
118
139
  // src/utils/constants.ts
119
140
  var REPO_URL = "github:duongductrong/cursor-kit";
@@ -122,12 +143,15 @@ var REPO_RAW_URL = "https://raw.githubusercontent.com/duongductrong/cursor-kit/m
122
143
  var CURSOR_DIR = ".cursor";
123
144
  var COMMANDS_DIR = "commands";
124
145
  var RULES_DIR = "rules";
146
+ var SKILLS_DIR = "skills";
125
147
  var COMMAND_EXTENSION = ".md";
126
148
  var RULE_EXTENSION = ".mdc";
149
+ var SKILL_EXTENSION = ".mdc";
127
150
  var CONFIG_FILE = ".cursorkit";
128
151
  var TEMPLATE_PATHS = {
129
152
  commands: "templates/commands",
130
- rules: "templates/rules"
153
+ rules: "templates/rules",
154
+ skills: "templates/skills"
131
155
  };
132
156
  export {
133
157
  COMMANDS_DIR,
@@ -139,20 +163,27 @@ export {
139
163
  REPO_URL,
140
164
  RULES_DIR,
141
165
  RULE_EXTENSION,
166
+ SKILLS_DIR,
167
+ SKILL_EXTENSION,
142
168
  TEMPLATE_PATHS,
143
169
  bold,
170
+ copyDir,
144
171
  dim,
145
172
  dirExists,
146
173
  ensureDir,
147
174
  fileExists,
148
175
  getCommandsDir,
176
+ getConflictingDirs,
149
177
  getConflictingFiles,
150
178
  getCursorDir,
179
+ getNonConflictingDirs,
151
180
  getNonConflictingFiles,
152
181
  getPackageJson,
153
182
  getRulesDir,
183
+ getSkillsDir,
154
184
  gradientText,
155
185
  highlight,
186
+ listDirs,
156
187
  listFiles,
157
188
  printBanner,
158
189
  printDivider,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/branding.ts","../src/utils/fs.ts","../src/utils/constants.ts"],"sourcesContent":["import figlet from \"figlet\";\nimport gradient from \"gradient-string\";\nimport pc from \"picocolors\";\n\nconst cursorGradient = gradient([\"#00DC82\", \"#36E4DA\", \"#0047E1\"]);\n\nexport function printBanner(): void {\n const banner = figlet.textSync(\"Cursor Kit\", {\n font: \"ANSI Shadow\",\n horizontalLayout: \"fitted\",\n });\n\n console.log(cursorGradient.multiline(banner));\n console.log();\n console.log(\n pc.dim(\" \") +\n pc.bold(pc.cyan(\"✦\")) +\n pc.dim(\" Supercharge your Cursor IDE with rules & commands\")\n );\n console.log();\n}\n\nexport function printSuccess(message: string): void {\n console.log(pc.green(\"✓\") + pc.dim(\" \") + message);\n}\n\nexport function printError(message: string): void {\n console.log(pc.red(\"✗\") + pc.dim(\" \") + message);\n}\n\nexport function printInfo(message: string): void {\n console.log(pc.cyan(\"ℹ\") + pc.dim(\" \") + message);\n}\n\nexport function printWarning(message: string): void {\n console.log(pc.yellow(\"⚠\") + pc.dim(\" \") + message);\n}\n\nexport function printDivider(): void {\n console.log(pc.dim(\"─\".repeat(50)));\n}\n\nexport function printVersion(version: string): void {\n console.log(\n pc.dim(\" \") + cursorGradient(`v${version}`) + pc.dim(\" • Made with ♥\")\n );\n console.log();\n}\n\nexport function highlight(text: string): string {\n return pc.cyan(text);\n}\n\nexport function dim(text: string): string {\n return pc.dim(text);\n}\n\nexport function bold(text: string): string {\n return pc.bold(text);\n}\n\nexport function gradientText(text: string): string {\n return cursorGradient(text);\n}\n\n","import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, rmSync, statSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\n\nexport function ensureDir(path: string): void {\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n}\n\nexport function fileExists(path: string): boolean {\n return existsSync(path);\n}\n\nexport function dirExists(path: string): boolean {\n return existsSync(path) && statSync(path).isDirectory();\n}\n\nexport function readFile(path: string): string {\n return readFileSync(path, \"utf-8\");\n}\n\nexport function writeFile(path: string, content: string): void {\n ensureDir(dirname(path));\n writeFileSync(path, content, \"utf-8\");\n}\n\nexport function removeFile(path: string): void {\n if (existsSync(path)) {\n rmSync(path, { recursive: true });\n }\n}\n\nexport function listFiles(dir: string, extension?: string): string[] {\n if (!dirExists(dir)) return [];\n \n const files = readdirSync(dir);\n if (extension) {\n return files.filter((f) => f.endsWith(extension));\n }\n return files;\n}\n\nexport function getCursorDir(cwd: string = process.cwd()): string {\n return join(cwd, \".cursor\");\n}\n\nexport function getCommandsDir(cwd: string = process.cwd()): string {\n return join(getCursorDir(cwd), \"commands\");\n}\n\nexport function getRulesDir(cwd: string = process.cwd()): string {\n return join(getCursorDir(cwd), \"rules\");\n}\n\nexport function resolveFromCwd(...paths: string[]): string {\n return resolve(process.cwd(), ...paths);\n}\n\nexport function getPackageJson(cwd: string = process.cwd()): Record<string, unknown> | null {\n const pkgPath = join(cwd, \"package.json\");\n if (!fileExists(pkgPath)) return null;\n \n try {\n return JSON.parse(readFile(pkgPath));\n } catch {\n return null;\n }\n}\n\nexport function getConflictingFiles(dir: string, files: string[]): string[] {\n if (!dirExists(dir)) return [];\n return files.filter((file) => fileExists(join(dir, file)));\n}\n\nexport function getNonConflictingFiles(dir: string, files: string[]): string[] {\n if (!dirExists(dir)) return files;\n return files.filter((file) => !fileExists(join(dir, file)));\n}\n\n","export const REPO_URL = \"github:duongductrong/cursor-kit\";\nexport const REPO_REF = \"master\";\nexport const REPO_RAW_URL = \"https://raw.githubusercontent.com/duongductrong/cursor-kit/master\";\n\nexport const CURSOR_DIR = \".cursor\";\nexport const COMMANDS_DIR = \"commands\";\nexport const RULES_DIR = \"rules\";\n\nexport const COMMAND_EXTENSION = \".md\";\nexport const RULE_EXTENSION = \".mdc\";\n\nexport const CONFIG_FILE = \".cursorkit\";\n\nexport const TEMPLATE_PATHS = {\n commands: \"templates/commands\",\n rules: \"templates/rules\",\n} as const;\n\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/utils/branding.ts","../src/utils/fs.ts","../src/utils/constants.ts"],"sourcesContent":["import figlet from \"figlet\";\nimport gradient from \"gradient-string\";\nimport pc from \"picocolors\";\n\nconst cursorGradient = gradient([\"#00DC82\", \"#36E4DA\", \"#0047E1\"]);\n\nexport function printBanner(): void {\n const banner = figlet.textSync(\"Cursor Kit\", {\n font: \"ANSI Shadow\",\n horizontalLayout: \"fitted\",\n });\n\n console.log(cursorGradient.multiline(banner));\n console.log();\n console.log(\n pc.dim(\" \") +\n pc.bold(pc.cyan(\"✦\")) +\n pc.dim(\" Supercharge your Cursor IDE with rules & commands\")\n );\n console.log();\n}\n\nexport function printSuccess(message: string): void {\n console.log(pc.green(\"✓\") + pc.dim(\" \") + message);\n}\n\nexport function printError(message: string): void {\n console.log(pc.red(\"✗\") + pc.dim(\" \") + message);\n}\n\nexport function printInfo(message: string): void {\n console.log(pc.cyan(\"ℹ\") + pc.dim(\" \") + message);\n}\n\nexport function printWarning(message: string): void {\n console.log(pc.yellow(\"⚠\") + pc.dim(\" \") + message);\n}\n\nexport function printDivider(): void {\n console.log(pc.dim(\"─\".repeat(50)));\n}\n\nexport function printVersion(version: string): void {\n console.log(\n pc.dim(\" \") + cursorGradient(`v${version}`) + pc.dim(\" • Made with ♥\")\n );\n console.log();\n}\n\nexport function highlight(text: string): string {\n return pc.cyan(text);\n}\n\nexport function dim(text: string): string {\n return pc.dim(text);\n}\n\nexport function bold(text: string): string {\n return pc.bold(text);\n}\n\nexport function gradientText(text: string): string {\n return cursorGradient(text);\n}\n\n","import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, rmSync, statSync, cpSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\n\nexport function ensureDir(path: string): void {\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n}\n\nexport function fileExists(path: string): boolean {\n return existsSync(path);\n}\n\nexport function dirExists(path: string): boolean {\n return existsSync(path) && statSync(path).isDirectory();\n}\n\nexport function readFile(path: string): string {\n return readFileSync(path, \"utf-8\");\n}\n\nexport function writeFile(path: string, content: string): void {\n ensureDir(dirname(path));\n writeFileSync(path, content, \"utf-8\");\n}\n\nexport function removeFile(path: string): void {\n if (existsSync(path)) {\n rmSync(path, { recursive: true });\n }\n}\n\nexport function copyDir(src: string, dest: string): void {\n cpSync(src, dest, { recursive: true });\n}\n\nexport function listFiles(dir: string, extension?: string): string[] {\n if (!dirExists(dir)) return [];\n \n const files = readdirSync(dir);\n if (extension) {\n return files.filter((f) => f.endsWith(extension));\n }\n return files;\n}\n\nexport function listDirs(dir: string): string[] {\n if (!dirExists(dir)) return [];\n \n return readdirSync(dir).filter((item) => {\n const itemPath = join(dir, item);\n return statSync(itemPath).isDirectory();\n });\n}\n\nexport function getCursorDir(cwd: string = process.cwd()): string {\n return join(cwd, \".cursor\");\n}\n\nexport function getCommandsDir(cwd: string = process.cwd()): string {\n return join(getCursorDir(cwd), \"commands\");\n}\n\nexport function getRulesDir(cwd: string = process.cwd()): string {\n return join(getCursorDir(cwd), \"rules\");\n}\n\nexport function getSkillsDir(cwd: string = process.cwd()): string {\n return join(getCursorDir(cwd), \"skills\");\n}\n\nexport function resolveFromCwd(...paths: string[]): string {\n return resolve(process.cwd(), ...paths);\n}\n\nexport function getPackageJson(cwd: string = process.cwd()): Record<string, unknown> | null {\n const pkgPath = join(cwd, \"package.json\");\n if (!fileExists(pkgPath)) return null;\n \n try {\n return JSON.parse(readFile(pkgPath));\n } catch {\n return null;\n }\n}\n\nexport function getConflictingFiles(dir: string, files: string[]): string[] {\n if (!dirExists(dir)) return [];\n return files.filter((file) => fileExists(join(dir, file)));\n}\n\nexport function getConflictingDirs(dir: string, dirs: string[]): string[] {\n if (!dirExists(dir)) return [];\n return dirs.filter((d) => dirExists(join(dir, d)));\n}\n\nexport function getNonConflictingFiles(dir: string, files: string[]): string[] {\n if (!dirExists(dir)) return files;\n return files.filter((file) => !fileExists(join(dir, file)));\n}\n\nexport function getNonConflictingDirs(dir: string, dirs: string[]): string[] {\n if (!dirExists(dir)) return dirs;\n return dirs.filter((d) => !dirExists(join(dir, d)));\n}\n","export const REPO_URL = \"github:duongductrong/cursor-kit\";\nexport const REPO_REF = \"master\";\nexport const REPO_RAW_URL = \"https://raw.githubusercontent.com/duongductrong/cursor-kit/master\";\n\nexport const CURSOR_DIR = \".cursor\";\nexport const COMMANDS_DIR = \"commands\";\nexport const RULES_DIR = \"rules\";\nexport const SKILLS_DIR = \"skills\";\n\nexport const COMMAND_EXTENSION = \".md\";\nexport const RULE_EXTENSION = \".mdc\";\nexport const SKILL_EXTENSION = \".mdc\";\n\nexport const CONFIG_FILE = \".cursorkit\";\n\nexport const TEMPLATE_PATHS = {\n commands: \"templates/commands\",\n rules: \"templates/rules\",\n skills: \"templates/skills\",\n} as const;\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cursor-kit-cli",
3
- "version": "1.2.0-beta",
3
+ "version": "1.2.0-beta.3",
4
4
  "description": "CLI toolkit to manage Cursor IDE rules and commands",
5
5
  "type": "module",
6
6
  "exports": {
@@ -1,7 +1,9 @@
1
1
  Before answering:
2
- - Use `toc.mdc` to pick the most relevant rules (e.g.`frontend-design.mdc`, `performance.mdc` etc..).
3
- - Apply ONLY those selected rules.
4
- - If no rule clearly matches, ignore all rules and answer normally.
2
+ - Use `toc.mdc` to identify the most relevant **Skills** and **Rules** for this task.
3
+ - Skills are comprehensive guides (e.g. `frontend-development`, `ui-styling`, `backend-development`).
4
+ - Rules are concise best practices (e.g. `git.mdc`, `coding-style.mdc`).
5
+ - Apply ONLY the selected skills/rules that match the task context.
6
+ - If no skill or rule clearly matches, ignore all and answer normally.
5
7
 
6
8
  ## Purpose
7
9
  You are a technical writer. Your mission is to create or update documentation that is clear, accurate, and synced with the codebase.
@@ -1,7 +1,9 @@
1
1
  Before answering:
2
- - Use `toc.mdc` to pick the most relevant rules (e.g.`frontend-design.mdc`, `performance.mdc` etc..).
3
- - Apply ONLY those selected rules.
4
- - If no rule clearly matches, ignore all rules and answer normally.
2
+ - Use `toc.mdc` to identify the most relevant **Skills** and **Rules** for this task.
3
+ - Skills are comprehensive guides (e.g. `frontend-development`, `ui-styling`, `backend-development`).
4
+ - Rules are concise best practices (e.g. `git.mdc`, `coding-style.mdc`).
5
+ - Apply ONLY the selected skills/rules that match the task context.
6
+ - If no skill or rule clearly matches, ignore all and answer normally.
5
7
 
6
8
  You are a patient technical educator. Your job is to explain code or concepts clearly.
7
9
 
@@ -1,7 +1,9 @@
1
1
  Before answering:
2
- - Use `toc.mdc` to pick the most relevant rules (e.g. `security.mdc`, `frontend-design.mdc`).
3
- - Apply ONLY those rules.
4
- - If none clearly match, ignore all rules.
2
+ - Use `toc.mdc` to identify the most relevant **Skills** and **Rules** for this task.
3
+ - Skills are comprehensive guides (e.g. `frontend-development`, `ui-styling`, `backend-development`).
4
+ - Rules are concise best practices (e.g. `git.mdc`, `coding-style.mdc`).
5
+ - Apply ONLY the selected skills/rules that match the task context.
6
+ - If no skill or rule clearly matches, ignore all and answer normally.
5
7
 
6
8
  ## Purpose
7
9
  Act as an expert bug fixer. Find the root cause, apply a safe fix, and avoid regressions.
@@ -1,7 +1,9 @@
1
1
  Before answering:
2
- - Use `toc.mdc` to pick the most relevant rules (e.g.`frontend-design.mdc`, `performance.mdc` etc..).
3
- - Apply ONLY those selected rules.
4
- - If no rule clearly matches, ignore all rules and answer normally.
2
+ - Use `toc.mdc` to identify the most relevant **Skills** and **Rules** for this task.
3
+ - Skills are comprehensive guides (e.g. `frontend-development`, `ui-styling`, `backend-development`).
4
+ - Rules are concise best practices (e.g. `git.mdc`, `coding-style.mdc`).
5
+ - Apply ONLY the selected skills/rules that match the task context.
6
+ - If no skill or rule clearly matches, ignore all and answer normally.
5
7
 
6
8
  ## Purpose
7
9
  You are a senior software engineer. Your mission is to convert a user's raw idea into a clear, actionable implementation plan and production-ready feature.
@@ -1,7 +1,9 @@
1
1
  Before answering:
2
- - Use `toc.mdc` to pick the most relevant rules (e.g.`frontend-design.mdc`, `performance.mdc` etc..).
3
- - Apply ONLY those selected rules.
4
- - If no rule clearly matches, ignore all rules and answer normally.
2
+ - Use `toc.mdc` to identify the most relevant **Skills** and **Rules** for this task.
3
+ - Skills are comprehensive guides (e.g. `frontend-development`, `ui-styling`, `backend-development`).
4
+ - Rules are concise best practices (e.g. `git.mdc`, `coding-style.mdc`).
5
+ - Apply ONLY the selected skills/rules that match the task context.
6
+ - If no skill or rule clearly matches, ignore all and answer normally.
5
7
 
6
8
  ## Purpose
7
9
 
@@ -1,7 +1,9 @@
1
1
  Before answering:
2
- - Use `toc.mdc` to pick the most relevant rules (e.g.`frontend-design.mdc`, `performance.mdc` etc..).
3
- - Apply ONLY those selected rules.
4
- - If no rule clearly matches, ignore all rules and answer normally.
2
+ - Use `toc.mdc` to identify the most relevant **Skills** and **Rules** for this task.
3
+ - Skills are comprehensive guides (e.g. `frontend-development`, `ui-styling`, `backend-development`).
4
+ - Rules are concise best practices (e.g. `git.mdc`, `coding-style.mdc`).
5
+ - Apply ONLY the selected skills/rules that match the task context.
6
+ - If no skill or rule clearly matches, ignore all and answer normally.
5
7
 
6
8
  You are a senior code reviewer performing a thorough code review.
7
9
 
@@ -1,7 +1,9 @@
1
1
  Before answering:
2
- - Use `toc.mdc` to pick the most relevant rules (e.g.`frontend-design.mdc`, `performance.mdc` etc..).
3
- - Apply ONLY those selected rules.
4
- - If no rule clearly matches, ignore all rules and answer normally.
2
+ - Use `toc.mdc` to identify the most relevant **Skills** and **Rules** for this task.
3
+ - Skills are comprehensive guides (e.g. `frontend-development`, `ui-styling`, `backend-development`).
4
+ - Rules are concise best practices (e.g. `git.mdc`, `coding-style.mdc`).
5
+ - Apply ONLY the selected skills/rules that match the task context.
6
+ - If no skill or rule clearly matches, ignore all and answer normally.
5
7
 
6
8
  ## Purpose
7
9
  You are a test engineering specialist. Your mission is to generate comprehensive tests for the provided code.
@@ -10,14 +10,17 @@
10
10
  ],
11
11
  "rules": [
12
12
  "coding-style.mdc",
13
- "frontend-design.mdc",
14
13
  "git.mdc",
15
- "performance.mdc",
16
- "react.mdc",
17
- "security.mdc",
18
- "testing.mdc",
19
- "toc.mdc",
20
- "typescript.mdc"
14
+ "toc.mdc"
15
+ ],
16
+ "skills": [
17
+ "aesthetic",
18
+ "backend-development",
19
+ "frontend-design",
20
+ "frontend-development",
21
+ "problem-solving",
22
+ "research",
23
+ "sequential-thinking",
24
+ "ui-styling"
21
25
  ]
22
26
  }
23
-
@@ -1,6 +1,4 @@
1
1
  ---
2
- description: Git commit and branching conventions
3
- globs:
4
2
  alwaysApply: true
5
3
  ---
6
4
 
@@ -2,19 +2,27 @@
2
2
  alwaysApply: true
3
3
  ---
4
4
 
5
- You have multiple specialized rules:
5
+ You have multiple specialized rules organized into **Skills** (comprehensive guides with references) and **Rules** (concise best practices).
6
+
7
+ ## Skills
8
+
9
+ - [Aesthetic](../skills/aesthetic/SKILL.mdc) - Visual design principles, storytelling, and micro-interactions for distinctive interfaces
10
+ - [Backend Development](../skills/backend-development/SKILL.mdc) - API design, architecture, authentication, security, and DevOps patterns
11
+ - [Frontend Design](../skills/frontend-design/SKILL.mdc) - Create distinctive, production-grade interfaces with bold aesthetics (avoid generic AI slop)
12
+ - [Frontend Development](../skills/frontend-development/SKILL.mdc) - React/TypeScript patterns: Suspense, lazy loading, TanStack Query/Router, MUI v7, file organization
13
+ - [UI Styling](../skills/ui-styling/SKILL.mdc) - shadcn/ui components, Tailwind CSS utilities, theming, accessibility, and canvas-based visual design
14
+ - [Sequential Thinking](../skills/sequential-thinking/SKILL.mdc) - Structured problem-solving with revision, branching, and hypothesis verification
15
+ - [Problem Solving](../skills/problem-solving/SKILL.mdc) - Techniques for complexity spirals, innovation blocks, meta-patterns, and scale testing
16
+ - [Research](../skills/research/SKILL.mdc) - Systematic research methodology for technical solutions with report generation
17
+
18
+ ## Rules
6
19
 
7
- - [TypeScript](./typescript.mdc) - TypeScript best practices and code style
8
- - [Frontend Design](./frontend-design.mdc) - Frontend design best practices
9
- - [React](./react.mdc) - React component patterns and best practices
10
- - [Testing](./testing.mdc) - Testing standards and patterns
11
20
  - [Git](./git.mdc) - Git commit and branching conventions
12
- - [Security](./security.mdc) - Security best practices
13
21
  - [Coding Style](./coding-style.mdc) - Coding style and best practices
14
- - [Performance](./performance.mdc) - Performance best practices
15
22
 
16
- Routing guidelines:
23
+ ## Routing Guidelines
24
+
17
25
  1. For each user request, first infer which domains are relevant.
18
- 2. Select 0–3 rules that best match the request, prefer the SINGLE most specific rule when possible.
26
+ 2. Select 0–3 rules/skills that best match the request, prefer the SINGLE most specific one when possible.
19
27
  3. If both security and performance apply, prioritize `security.mdc` first, then `performance.mdc`.
20
28
  4. If no rule clearly matches, ignore all rules and answer normally.
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: aesthetic
3
+ description: Create aesthetically beautiful interfaces following proven design principles. Use when building UI/UX, analyzing designs from inspiration sites, generating design images with ai-multimodal, implementing visual hierarchy and color theory, adding micro-interactions, or creating design documentation. Includes workflows for capturing and analyzing inspiration screenshots with chrome-devtools and ai-multimodal, iterative design image generation until aesthetic standards are met, and comprehensive design system guidance covering BEAUTIFUL (aesthetic principles), RIGHT (functionality/accessibility), SATISFYING (micro-interactions), and PEAK (storytelling) stages. Integrates with chrome-devtools, ai-multimodal, media-processing, ui-styling, and web-frameworks skills.
4
+ ---
5
+
6
+ # Aesthetic
7
+
8
+ Create aesthetically beautiful interfaces by following proven design principles and systematic workflows.
9
+
10
+ ## When to Use This Skill
11
+
12
+ Use when:
13
+ - Building or designing user interfaces
14
+ - Analyzing designs from inspiration websites (Dribbble, Mobbin, Behance)
15
+ - Generating design images and evaluating aesthetic quality
16
+ - Implementing visual hierarchy, typography, color theory
17
+ - Adding micro-interactions and animations
18
+ - Creating design documentation and style guides
19
+ - Need guidance on accessibility and design systems
20
+
21
+ ## Core Framework: Four-Stage Approach
22
+
23
+ ### 1. BEAUTIFUL: Understanding Aesthetics
24
+ Study existing designs, identify patterns, extract principles. AI lacks aesthetic sense—standards must come from analyzing high-quality examples and aligning with market tastes.
25
+
26
+ **Reference**: [`references/design-principles.md`](references/design-principles.md) - Visual hierarchy, typography, color theory, white space principles.
27
+
28
+ ### 2. RIGHT: Ensuring Functionality
29
+ Beautiful designs lacking usability are worthless. Study design systems, component architecture, accessibility requirements.
30
+
31
+ **Reference**: [`references/design-principles.md`](references/design-principles.md) - Design systems, component libraries, WCAG accessibility standards.
32
+
33
+ ### 3. SATISFYING: Micro-Interactions
34
+ Incorporate subtle animations with appropriate timing (150-300ms), easing curves (ease-out for entry, ease-in for exit), sequential delays.
35
+
36
+ **Reference**: [`references/micro-interactions.md`](references/micro-interactions.md) - Duration guidelines, easing curves, performance optimization.
37
+
38
+ ### 4. PEAK: Storytelling Through Design
39
+ Elevate with narrative elements—parallax effects, particle systems, thematic consistency. Use restraint: "too much of anything isn't good."
40
+
41
+ **Reference**: [`references/storytelling-design.md`](references/storytelling-design.md) - Narrative elements, scroll-based storytelling, interactive techniques.
42
+
43
+ ## Workflows
44
+
45
+ ### Workflow 1: Capture & Analyze Inspiration
46
+
47
+ **Purpose**: Extract design guidelines from inspiration websites.
48
+
49
+ **Steps**:
50
+ 1. Browse inspiration sites (Dribbble, Mobbin, Behance, Awwwards)
51
+ 2. Use **chrome-devtools** skill to capture full-screen screenshots (not full page)
52
+ 3. Use **ai-multimodal** skill to analyze screenshots and extract:
53
+ - Design style (Minimalism, Glassmorphism, Neo-brutalism, etc.)
54
+ - Layout structure & grid systems
55
+ - Typography system & hierarchy
56
+ **IMPORTANT:** Try to predict the font name (Google Fonts) and font size in the given screenshot, don't just use Inter or Poppins.
57
+ - Color palette with hex codes
58
+ - Visual hierarchy techniques
59
+ - Component patterns & styling
60
+ - Micro-interactions
61
+ - Accessibility considerations
62
+ - Overall aesthetic quality rating (1-10)
63
+ 4. Document findings in project design guidelines using templates
64
+
65
+ ### Workflow 2: Generate & Iterate Design Images
66
+
67
+ **Purpose**: Create aesthetically pleasing design images through iteration.
68
+
69
+ **Steps**:
70
+ 1. Define design prompt with: style, colors, typography, audience, animation specs
71
+ 2. Use **ai-multimodal** skill to generate design images with Gemini API
72
+ 3. Use **ai-multimodal** skill to analyze output images and evaluate aesthetic quality
73
+ 4. If score < 7/10 or fails professional standards:
74
+ - Identify specific weaknesses (color, typography, layout, spacing, hierarchy)
75
+ - Refine prompt with improvements
76
+ - Regenerate with **ai-multimodal** or use **media-processing** skill to modify outputs (resize, crop, filters, composition)
77
+ 5. Repeat until aesthetic standards met (score ≥ 7/10)
78
+ 6. Document final design decisions using templates
79
+
80
+ ## Design Documentation
81
+
82
+ ### Create Design Guidelines
83
+ Use [`assets/design-guideline-template.md`](assets/design-guideline-template.md) to document:
84
+ - Color patterns & psychology
85
+ - Typography system & hierarchy
86
+ - Layout principles & spacing
87
+ - Component styling standards
88
+ - Accessibility considerations
89
+ - Design highlights & rationale
90
+
91
+ Save in project `./docs/design-guideline.md`.
92
+
93
+ ### Create Design Story
94
+ Use [`assets/design-story-template.md`](assets/design-story-template.md) to document:
95
+ - Narrative elements & themes
96
+ - Emotional journey
97
+ - User journey & peak moments
98
+ - Design decision rationale
99
+
100
+ Save in project `./docs/design-story.md`.
101
+
102
+ ## Resources & Integration
103
+
104
+ ### Related Skills
105
+ - **ai-multimodal**: Analyze documents, screenshots & videos, generate design images, edit generated images, evaluate aesthetic quality using Gemini API
106
+ - **chrome-devtools**: Capture full-screen screenshots from inspiration websites, navigate between pages, interact with elements, read console logs & network requests
107
+ - **media-processing**: Refine generated images (FFmpeg for video, ImageMagick for images)
108
+ - **ui-styling**: Implement designs with shadcn/ui components + Tailwind CSS utility-first styling
109
+ - **web-frameworks**: Build with Next.js (App Router, Server Components, SSR/SSG)
110
+
111
+ ### Reference Documentation
112
+ **References**: [`references/design-resources.md`](references/design-resources.md) - Inspiration platforms, design systems, AI tools, MCP integrations, development strategies.
113
+
114
+ ## Key Principles
115
+
116
+ 1. Aesthetic standards come from humans, not AI—study quality examples
117
+ 2. Iterate based on analysis—never settle for first output
118
+ 3. Balance beauty with functionality and accessibility
119
+ 4. Document decisions for consistency across development
120
+ 5. Use progressive disclosure in design—reveal complexity gradually
121
+ 6. Always evaluate aesthetic quality objectively (score ≥ 7/10)