SuperCharge Claude Code v1.0.0 - Complete Customization Package
Features: - 30+ Custom Skills (cognitive, development, UI/UX, autonomous agents) - RalphLoop autonomous agent integration - Multi-AI consultation (Qwen) - Agent management system with sync capabilities - Custom hooks for session management - MCP servers integration - Plugin marketplace setup - Comprehensive installation script Components: - Skills: always-use-superpowers, ralph, brainstorming, ui-ux-pro-max, etc. - Agents: 100+ agents across engineering, marketing, product, etc. - Hooks: session-start-superpowers, qwen-consult, ralph-auto-trigger - Commands: /brainstorm, /write-plan, /execute-plan - MCP Servers: zai-mcp-server, web-search-prime, web-reader, zread - Binaries: ralphloop wrapper Installation: ./supercharge.sh
This commit is contained in:
146
skills/agent-pipeline-builder/scripts/validate-pipeline.ts
Executable file
146
skills/agent-pipeline-builder/scripts/validate-pipeline.ts
Executable file
@@ -0,0 +1,146 @@
|
||||
#!/usr/bin/env bun
|
||||
/**
|
||||
* Agent Pipeline Validator
|
||||
*
|
||||
* Validates pipeline manifest and agent definitions
|
||||
* Usage: ./validate-pipeline.ts [pipeline-name]
|
||||
*/
|
||||
|
||||
import { readFileSync, existsSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
|
||||
interface PipelineManifest {
|
||||
name: string;
|
||||
stages: Array<{ name: string; description: string }>;
|
||||
dataFormat?: string;
|
||||
}
|
||||
|
||||
interface AgentDefinition {
|
||||
name: string;
|
||||
description: string;
|
||||
model?: string;
|
||||
}
|
||||
|
||||
function parseFrontmatter(content: string): { frontmatter: any; content: string } {
|
||||
const match = content.match(/^---\n([\s\S]+?)\n---\n([\s\S]*)$/);
|
||||
if (!match) {
|
||||
return { frontmatter: {}, content };
|
||||
}
|
||||
|
||||
const frontmatter: any = {};
|
||||
const lines = match[1].split('\n');
|
||||
for (const line of lines) {
|
||||
const [key, ...valueParts] = line.split(':');
|
||||
if (key && valueParts.length > 0) {
|
||||
const value = valueParts.join(':').trim();
|
||||
frontmatter[key.trim()] = value;
|
||||
}
|
||||
}
|
||||
|
||||
return { frontmatter, content: match[2] };
|
||||
}
|
||||
|
||||
function validateAgentFile(agentPath: string): { valid: boolean; errors: string[] } {
|
||||
const errors: string[] = [];
|
||||
|
||||
if (!existsSync(agentPath)) {
|
||||
return { valid: false, errors: [`Agent file not found: ${agentPath}`] };
|
||||
}
|
||||
|
||||
const content = readFileSync(agentPath, 'utf-8');
|
||||
const { frontmatter } = parseFrontmatter(content);
|
||||
|
||||
// Check required fields
|
||||
if (!frontmatter.name) {
|
||||
errors.push(`Missing 'name' in frontmatter`);
|
||||
}
|
||||
|
||||
if (!frontmatter.description) {
|
||||
errors.push(`Missing 'description' in frontmatter`);
|
||||
}
|
||||
|
||||
// Check for output markers
|
||||
const markerPattern = /<<<(\w+)>>>/g;
|
||||
const markers = content.match(markerPattern);
|
||||
if (!markers || markers.length < 2) {
|
||||
errors.push(`Missing output markers (expected <<<stage>>>...<<<end-stage>>>)`);
|
||||
}
|
||||
|
||||
return { valid: errors.length === 0, errors };
|
||||
}
|
||||
|
||||
function validatePipeline(pipelineName: string): void {
|
||||
const basePath = join(process.cwd(), '.claude', 'agents', pipelineName);
|
||||
const manifestPath = join(basePath, 'pipeline.md');
|
||||
|
||||
console.log(`\n🔍 Validating pipeline: ${pipelineName}\n`);
|
||||
|
||||
// Check if pipeline directory exists
|
||||
if (!existsSync(basePath)) {
|
||||
console.error(`❌ Pipeline directory not found: ${basePath}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Load and validate manifest
|
||||
let stages: string[] = [];
|
||||
if (existsSync(manifestPath)) {
|
||||
const manifestContent = readFileSync(manifestPath, 'utf-8');
|
||||
const { frontmatter } = parseFrontmatter(manifestContent);
|
||||
stages = frontmatter.stages?.map((s: any) => typeof s === 'string' ? s : s.name) || [];
|
||||
}
|
||||
|
||||
// If no manifest, auto-detect agents
|
||||
if (stages.length === 0) {
|
||||
const { readdirSync } = require('fs');
|
||||
const files = readdirSync(basePath).filter((f: string) => f.endsWith('.md') && f !== 'pipeline.md');
|
||||
stages = files.map((f: string) => f.replace('.md', ''));
|
||||
}
|
||||
|
||||
console.log(`📋 Stages: ${stages.join(' → ')}\n`);
|
||||
|
||||
// Validate each agent
|
||||
let hasErrors = false;
|
||||
for (const stage of stages) {
|
||||
const agentPath = join(basePath, `${stage}.md`);
|
||||
const { valid, errors } = validateAgentFile(agentPath);
|
||||
|
||||
if (valid) {
|
||||
console.log(` ✅ ${stage}`);
|
||||
} else {
|
||||
console.log(` ❌ ${stage}`);
|
||||
for (const error of errors) {
|
||||
console.log(` ${error}`);
|
||||
}
|
||||
hasErrors = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Check for scripts
|
||||
const scriptsPath = join(process.cwd(), 'scripts', `run-${pipelineName}.ts`);
|
||||
if (existsSync(scriptsPath)) {
|
||||
console.log(`\n ✅ Pipeline script: ${scriptsPath}`);
|
||||
} else {
|
||||
console.log(`\n ⚠️ Missing pipeline script: ${scriptsPath}`);
|
||||
console.log(` Create this script to orchestrate the agents.`);
|
||||
}
|
||||
|
||||
console.log('');
|
||||
|
||||
if (hasErrors) {
|
||||
console.log('❌ Pipeline validation failed\n');
|
||||
process.exit(1);
|
||||
} else {
|
||||
console.log('✅ Pipeline validation passed!\n');
|
||||
}
|
||||
}
|
||||
|
||||
// Main
|
||||
const pipelineName = process.argv[2];
|
||||
|
||||
if (!pipelineName) {
|
||||
console.log('Usage: validate-pipeline.ts <pipeline-name>');
|
||||
console.log('Example: validate-pipeline.ts ai-news-tweet');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
validatePipeline(pipelineName);
|
||||
Reference in New Issue
Block a user