Add teach-impeccable and review commands, dynamic placeholders

New commands:
- /teach-impeccable: One-time setup that gathers UX-focused design
  context (explores codebase first, then asks targeted questions)
- /review: UX design review evaluating hierarchy, clarity, emotional
  resonance (complements technical /audit)

Build system improvements:
- Dynamic {{model}}, {{ask_instruction}}, {{config_file}} placeholders
  per provider (Claude/Gemini/GPT/the model)
- context: fork support for Claude Code sub-agents (audit, extract)
- Skill reference auto-added to design commands

Skill refinements:
- Merged Design Thinking and Context Awareness sections
- Removed redundant patterns and technical questions
- More direct feedback guidance (radical candor)

Website updates:
- 17 commands (was 16)
- Review demo showing UX issues (HIERARCHY, NO PRIMARY, DEAD END)
- teach-impeccable in System group of periodic table

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Paul Bakaus
2026-01-07 16:56:08 -08:00
co-authored by Claude Opus 4.5
parent 8186f2a226
commit 0b9c1846a6
96 changed files with 1315 additions and 646 deletions
+7 -20
View File
@@ -1,5 +1,5 @@
import path from 'path';
import { cleanDir, ensureDir, writeFile, generateYamlFrontmatter } from '../utils.js';
import { cleanDir, ensureDir, writeFile, generateYamlFrontmatter, replacePlaceholders } from '../utils.js';
/**
* Generate markdown from structured patterns/antipatterns data
@@ -77,8 +77,8 @@ export function transformCodex(commands, skills, distDir, patterns = null) {
yamlLines.push('---');
// Transform {{argname}} to $ARGNAME for Codex
let body = command.body;
// First replace our placeholders, then transform remaining {{argname}} to $ARGNAME
let body = replacePlaceholders(command.body, 'codex');
body = body.replace(/\{\{([^}]+)\}\}/g, (match, argName) => {
return `$${argName.toUpperCase()}`;
});
@@ -99,22 +99,8 @@ export function transformCodex(commands, skills, distDir, patterns = null) {
...(skill.license && { license: skill.license })
});
let body = skill.body;
// Generate and merge patterns into frontend-design skill
if (skill.name === 'frontend-design' && patterns) {
const patternsMarkdown = generatePatternsMarkdown(patterns);
if (patternsMarkdown) {
const insertPoint = body.indexOf('---\n\n## Domain Reference Files');
if (insertPoint > -1) {
body = body.slice(0, insertPoint) + '\n\n' + patternsMarkdown + '\n\n' + body.slice(insertPoint);
} else {
body += '\n\n' + patternsMarkdown;
}
}
}
const content = `${frontmatter}\n\n${body}`;
const skillBody = replacePlaceholders(skill.body, 'codex');
const content = `${frontmatter}\n\n${skillBody}`;
const outputPath = path.join(skillDir, 'SKILL.md');
writeFile(outputPath, content);
@@ -124,7 +110,8 @@ export function transformCodex(commands, skills, distDir, patterns = null) {
ensureDir(refDir);
for (const ref of skill.references) {
const refOutputPath = path.join(refDir, `${ref.name}.md`);
writeFile(refOutputPath, ref.content);
const refContent = replacePlaceholders(ref.content, 'codex');
writeFile(refOutputPath, refContent);
refCount++;
}
}