Consolidate skills + add patterns source file

Major changes:
- Consolidate 8 design skills into single frontend-design skill with 7 reference files
- Add source/patterns.md as single source of truth for patterns/antipatterns
- Patterns are merged into skill during build, served via API for website
- Website now dynamically renders both "What TO Do" and "What NOT to Do" sections
- Update build system to handle directory-based skills with references
- Add /api/patterns endpoint to server
- Refactor website with new Antidote section layout

🤖 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
2025-12-15 14:08:30 -08:00
co-authored by Claude Opus 4.5
parent 99f1091f20
commit 2181137d04
69 changed files with 6658 additions and 4751 deletions
+40 -16
View File
@@ -3,22 +3,23 @@ import { cleanDir, ensureDir, writeFile } from '../utils.js';
/**
* Codex Transformer (Full Featured - Custom Prompts + Modular Skills)
*
*
* Commands: Uses argument-hint format with $VARIABLE placeholders
* Skills: Creates modular files with guiding AGENTS.md
* Reference files are inlined into the main skill file for Codex
*/
export function transformCodex(commands, skills, distDir) {
export function transformCodex(commands, skills, distDir, patterns = null) {
const codexDir = path.join(distDir, 'codex');
const promptsDir = path.join(codexDir, '.codex/prompts');
cleanDir(codexDir);
ensureDir(promptsDir);
// Commands: Transform to Codex prompt format
for (const command of commands) {
const yamlLines = ['---'];
yamlLines.push(`description: ${command.description}`);
// Build argument-hint from args array
if (command.args && command.args.length > 0) {
const hints = command.args.map(arg => {
@@ -27,32 +28,54 @@ export function transformCodex(commands, skills, distDir) {
});
yamlLines.push(`argument-hint: ${hints.join(' ')}`);
}
yamlLines.push('---');
// Transform {{argname}} to $ARGNAME for Codex
let body = command.body;
body = body.replace(/\{\{([^}]+)\}\}/g, (match, argName) => {
return `$${argName.toUpperCase()}`;
});
const content = `${yamlLines.join('\n')}\n\n${body}`;
const outputPath = path.join(promptsDir, `${command.name}.md`);
writeFile(outputPath, content);
}
// Skills: Create modular files (body only)
// Skills: Create modular files (with references inlined)
const skillEntries = [];
let refCount = 0;
for (const skill of skills) {
let content = skill.body;
// Merge patterns body into frontend-design skill (before Domain Reference Files section)
if (skill.name === 'frontend-design' && patterns && patterns.body) {
const insertPoint = content.indexOf('---\n\n## Domain Reference Files');
if (insertPoint > -1) {
content = content.slice(0, insertPoint) + '\n\n' + patterns.body + '\n\n' + content.slice(insertPoint);
} else {
content += '\n\n' + patterns.body;
}
}
// Inline reference files if they exist
if (skill.references && skill.references.length > 0) {
const refSections = skill.references.map(ref => {
refCount++;
return `\n\n---\n\n## Reference: ${ref.name}\n\n${ref.content}`;
});
content += refSections.join('');
}
const outputPath = path.join(codexDir, `AGENTS.${skill.name}.md`);
writeFile(outputPath, skill.body);
writeFile(outputPath, content);
skillEntries.push({
name: skill.name,
description: skill.description,
file: `AGENTS.${skill.name}.md`
});
}
// Create main AGENTS.md that guides Codex to the right skill files
const agentsMd = [
'# Codex Agent Instructions',
@@ -63,7 +86,7 @@ export function transformCodex(commands, skills, distDir) {
'',
'Each skill provides deep expertise in its domain. Use the descriptions below to decide which skill file to read:',
'',
...skillEntries.map(skill =>
...skillEntries.map(skill =>
`### ${skill.name}\n\n**When to use**: ${skill.description}\n\n**Read**: \`${skill.file}\` for complete instructions.\n`
),
'',
@@ -76,9 +99,10 @@ export function transformCodex(commands, skills, distDir) {
'',
'Multiple skills can be combined when the task requires expertise from different domains.'
].join('\n');
writeFile(path.join(codexDir, 'AGENTS.md'), agentsMd);
console.log(`✓ Codex: ${commands.length} prompts, ${skills.length} skills (modular)`);
const refInfo = refCount > 0 ? ` (${refCount} refs inlined)` : '';
console.log(`✓ Codex: ${commands.length} prompts, ${skills.length} skills (modular)${refInfo}`);
}