mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-14 15:16:35 +03:00
changed folder structures to make it easier for users
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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/
|
||||
```
|
||||
|
||||
|
||||
Vendored
Vendored
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user