changed folder structures to make it easier for users

This commit is contained in:
Paul Bakaus
2025-11-16 19:00:27 -08:00
parent 89d179143b
commit 2e5d653273
83 changed files with 66 additions and 49 deletions
+22 -14
View File
@@ -32,17 +32,21 @@ vibe-design-plugins/
│ └── frontend-design.md
├── dist/ # Generated outputs (committed for users)
│ ├── cursor/ # Downgraded (no frontmatter)
│ │ ── commands/*.md
│ │ └── rules/*.md
│ │ ── .cursor/
│ │ ├── commands/*.md
│ │ └── rules/*.md
│ ├── claude-code/ # Full featured
│ │ ── commands/*.md
│ │ └── skills/*/SKILL.md
│ │ ── .claude/
│ │ ├── commands/*.md
│ │ └── skills/*/SKILL.md
│ ├── gemini/ # TOML commands + modular skills
│ │ ├── commands/*.toml
│ │ ├── .gemini/
│ │ │ └── commands/*.toml
│ │ ├── GEMINI.md
│ │ └── GEMINI.*.md
│ └── codex/ # Custom prompts + modular skills
│ ├── prompts/*.md
│ ├── .codex/
│ │ └── prompts/*.md
│ ├── AGENTS.md
│ └── AGENTS.*.md
├── public/ # Website for impeccable.style
@@ -135,33 +139,37 @@ Run: `bun run build`
## Provider Transformations
### 1. Cursor (Downgraded)
- **Commands**: Body only → `dist/cursor/commands/*.md`
- **Skills**: Body only → `dist/cursor/rules/*.md`
- **Commands**: Body only → `dist/cursor/.cursor/commands/*.md`
- **Skills**: Body only → `dist/cursor/.cursor/rules/*.md`
- **Strips**: All frontmatter, all metadata
- **Args**: Not supported, arguments get appended to end of prompt
- **Installation**: Extract ZIP into your project root, creates `.cursor/` folder
### 2. Claude Code (Full Featured)
- **Commands**: Full YAML frontmatter → `dist/claude-code/commands/*.md`
- **Skills**: Full YAML frontmatter → `dist/claude-code/skills/{name}/SKILL.md`
- **Commands**: Full YAML frontmatter → `dist/claude-code/.claude/commands/*.md`
- **Skills**: Full YAML frontmatter → `dist/claude-code/.claude/skills/{name}/SKILL.md`
- **Preserves**: All metadata, all args
- **Format**: Matches [Anthropic Skills spec](https://github.com/anthropics/skills)
- **Installation**: Extract ZIP into your project root, creates `.claude/` folder
### 3. Gemini CLI (Full Featured)
- **Commands**: TOML format → `dist/gemini/commands/*.toml`
- **Commands**: TOML format → `dist/gemini/.gemini/commands/*.toml`
- Uses `description` and `prompt` keys
- Transforms `{{argname}}``{{args}}` (Gemini uses single args string)
- **Skills**: Modular with imports → `dist/gemini/GEMINI.{name}.md`
- **Skills**: Modular with imports → `dist/gemini/GEMINI.{name}.md` (root level)
- Main `GEMINI.md` uses `@./GEMINI.{name}.md` import syntax
- Gemini automatically loads imported files
- **Installation**: Extract ZIP into your project root, creates `.gemini/` folder + skill files
### 4. Codex CLI (Full Featured)
- **Commands**: Custom prompt format → `dist/codex/prompts/*.md`
- **Commands**: Custom prompt format → `dist/codex/.codex/prompts/*.md`
- Uses `description` and `argument-hint` in frontmatter
- Transforms `{{argname}}``$ARGNAME` (uppercase variables)
- Invoked as `/prompts:<name>`
- **Skills**: Modular with routing → `dist/codex/AGENTS.{name}.md`
- **Skills**: Modular with routing → `dist/codex/AGENTS.{name}.md` (root level)
- Main `AGENTS.md` provides routing instructions
- Tells Codex when to read which skill file
- **Installation**: Extract ZIP into your project root, creates `.codex/` folder + skill files
## Key Design Decisions
+28 -21
View File
@@ -98,19 +98,18 @@ After downloading from [impeccable.style](https://impeccable.style) or cloning t
### Cursor
**From Website**: Download the Cursor bundle ZIP from [impeccable.style](https://impeccable.style), unzip, and copy to your project:
**From Website**: Download the Cursor bundle ZIP from [impeccable.style](https://impeccable.style) and extract directly into your project:
```bash
# After unzipping the downloaded bundle
cp -r cursor/commands/* your-project/.cursor/commands/
cp -r cursor/rules/* your-project/.cursor/rules/
# Extract the ZIP directly into your project root
# The ZIP contains a .cursor/ folder ready to use
unzip impeccable-style-cursor.zip -d your-project/
```
**From Repo**: Copy directly from the dist directory:
```bash
cp -r dist/cursor/commands/* .cursor/commands/
cp -r dist/cursor/rules/* .cursor/rules/
cp -r dist/cursor/.cursor .cursor/
```
**Note**: Cursor doesn't support command arguments or frontmatter, so commands work but with simplified functionality.
@@ -121,23 +120,25 @@ cp -r dist/cursor/rules/* .cursor/rules/
### Claude Code
**From Website**: Download the Claude Code bundle ZIP from [impeccable.style](https://impeccable.style), unzip, and copy:
**From Website**: Download the Claude Code bundle ZIP from [impeccable.style](https://impeccable.style) and extract:
```bash
# Global installation
cp -r claude-code/commands/* ~/.claude/commands/
cp -r claude-code/skills/* ~/.claude/skills/
unzip impeccable-style-claude-code.zip
cp -r .claude/* ~/.claude/
# Or project-specific
cp -r claude-code/commands/* .claude/commands/
cp -r claude-code/skills/* .claude/skills/
unzip impeccable-style-claude-code.zip -d your-project/
```
**From Repo**:
```bash
cp -r dist/claude-code/commands/* ~/.claude/commands/
cp -r dist/claude-code/skills/* ~/.claude/skills/
# Global installation
cp -r dist/claude-code/.claude/* ~/.claude/
# Or project-specific
cp -r dist/claude-code/.claude .claude/
```
**Reference**:
@@ -146,20 +147,23 @@ cp -r dist/claude-code/skills/* ~/.claude/skills/
### Gemini CLI
**From Website**: Download the Gemini CLI bundle ZIP from [impeccable.style](https://impeccable.style), unzip, and copy:
**From Website**: Download the Gemini CLI bundle ZIP from [impeccable.style](https://impeccable.style) and extract:
```bash
# Extract and install
unzip impeccable-style-gemini.zip
# Commands (global)
cp -r gemini/commands/* ~/.gemini/commands/
cp -r .gemini/* ~/.gemini/
# Skills (project-specific)
cp gemini/GEMINI*.md ~/your-project-root/
cp GEMINI*.md ~/your-project-root/
```
**From Repo**:
```bash
cp -r dist/gemini/commands/* ~/.gemini/commands/
cp -r dist/gemini/.gemini/* ~/.gemini/
cp dist/gemini/GEMINI*.md ~/your-project-root/
```
@@ -175,20 +179,23 @@ cp dist/gemini/GEMINI*.md ~/your-project-root/
### Codex CLI
**From Website**: Download the Codex CLI bundle ZIP from [impeccable.style](https://impeccable.style), unzip, and copy:
**From Website**: Download the Codex CLI bundle ZIP from [impeccable.style](https://impeccable.style) and extract:
```bash
# Extract and install
unzip impeccable-style-codex.zip
# Prompts (global)
cp -r codex/prompts/* ~/.codex/prompts/
cp -r .codex/* ~/.codex/
# Skills (project-specific)
cp codex/AGENTS*.md ~/your-project-root/
cp AGENTS*.md ~/your-project-root/
```
**From Repo**:
```bash
cp -r dist/codex/prompts/* ~/.codex/prompts/
cp -r dist/codex/.codex/* ~/.codex/
cp dist/codex/AGENTS*.md ~/your-project-root/
```
+4 -3
View File
@@ -8,10 +8,11 @@ import { cleanDir, ensureDir, writeFile, generateYamlFrontmatter } from '../util
* Skills stored in subdirectories with SKILL.md filename.
*/
export function transformClaudeCode(commands, skills, distDir) {
const commandsDir = path.join(distDir, 'claude-code/commands');
const skillsDir = path.join(distDir, 'claude-code/skills');
const claudeDir = path.join(distDir, 'claude-code');
const commandsDir = path.join(claudeDir, '.claude/commands');
const skillsDir = path.join(claudeDir, '.claude/skills');
cleanDir(path.join(distDir, 'claude-code'));
cleanDir(claudeDir);
ensureDir(commandsDir);
ensureDir(skillsDir);
+1 -1
View File
@@ -9,7 +9,7 @@ import { cleanDir, ensureDir, writeFile } from '../utils.js';
*/
export function transformCodex(commands, skills, distDir) {
const codexDir = path.join(distDir, 'codex');
const promptsDir = path.join(codexDir, 'prompts');
const promptsDir = path.join(codexDir, '.codex/prompts');
cleanDir(codexDir);
ensureDir(promptsDir);
+4 -3
View File
@@ -8,10 +8,11 @@ import { cleanDir, ensureDir, writeFile } from '../utils.js';
* Cursor doesn't support arguments or frontmatter.
*/
export function transformCursor(commands, skills, distDir) {
const commandsDir = path.join(distDir, 'cursor/commands');
const rulesDir = path.join(distDir, 'cursor/rules');
const cursorDir = path.join(distDir, 'cursor');
const commandsDir = path.join(cursorDir, '.cursor/commands');
const rulesDir = path.join(cursorDir, '.cursor/rules');
cleanDir(path.join(distDir, 'cursor'));
cleanDir(cursorDir);
ensureDir(commandsDir);
ensureDir(rulesDir);
+1 -1
View File
@@ -9,7 +9,7 @@ import { cleanDir, ensureDir, writeFile } from '../utils.js';
*/
export function transformGemini(commands, skills, distDir) {
const geminiDir = path.join(distDir, 'gemini');
const commandsDir = path.join(geminiDir, 'commands');
const commandsDir = path.join(geminiDir, '.gemini/commands');
cleanDir(geminiDir);
ensureDir(commandsDir);
+6 -6
View File
@@ -66,9 +66,9 @@ async function getCommands() {
function getFilePath(type, provider, id) {
if (type === "skill") {
if (provider === "cursor") {
return join(DIST_DIR, "cursor", "rules", `${id}.md`);
return join(DIST_DIR, "cursor", ".cursor", "rules", `${id}.md`);
} else if (provider === "claude-code") {
return join(DIST_DIR, "claude-code", "skills", id, "SKILL.md");
return join(DIST_DIR, "claude-code", ".claude", "skills", id, "SKILL.md");
} else if (provider === "gemini") {
return join(DIST_DIR, "gemini", `GEMINI.${id}.md`);
} else if (provider === "codex") {
@@ -76,13 +76,13 @@ function getFilePath(type, provider, id) {
}
} else if (type === "command") {
if (provider === "cursor") {
return join(DIST_DIR, "cursor", "commands", `${id}.md`);
return join(DIST_DIR, "cursor", ".cursor", "commands", `${id}.md`);
} else if (provider === "claude-code") {
return join(DIST_DIR, "claude-code", "commands", `${id}.md`);
return join(DIST_DIR, "claude-code", ".claude", "commands", `${id}.md`);
} else if (provider === "gemini") {
return join(DIST_DIR, "gemini", "commands", `${id}.toml`);
return join(DIST_DIR, "gemini", ".gemini", "commands", `${id}.toml`);
} else if (provider === "codex") {
return join(DIST_DIR, "codex", "prompts", `${id}.md`);
return join(DIST_DIR, "codex", ".codex", "prompts", `${id}.md`);
}
}
return null;